├── .gitignore ├── Andera-Namespaces-Symbols-Vars.zip ├── Bedra-TheGenerativeGeneration.pdf ├── Brubacher-Cascalog.pdf ├── CLJS_clojure-west-FOGUS.pdf ├── Caputo-ContinuousTestingInClojure ├── .gvimrc ├── .help ├── .vimrc ├── 01 ├── 02 ├── 02b ├── 02c ├── 02d ├── 02e ├── 02z ├── 03.clj ├── 04 ├── 05 ├── 06 ├── 07 ├── 08 ├── 08z ├── slides.notes └── slides.vroom ├── Corfield-Boring.pdf ├── Cross-Prismatic.pdf ├── Crossley-Introducing-Immutant.pdf ├── Dipert-ProgrammingWithValues.pdf ├── Duey-DSLs.pdf ├── Gabriel-EngineeringScienceIncommensurability.pdf ├── Hagelberg-SwarmCoding.org ├── Hagelberg-SwarmCoding.pdf ├── Hagelberg-SwarmCoding ├── athens.jpg ├── heroku.pdf └── whale.jpg ├── Halloway-EvidentCodeAtScale.pdf ├── McNeil-MacrosAreHard.zip ├── Patterson-RealWorldAPIs.pdf ├── README.md ├── Rathore-Runa.pdf ├── Rohner-JRuby.pdf ├── Senior-PracticalCoreLogic.zip ├── Solano-Gómez-Crunching-Numbers-with-Clojure.pdf ├── StackTraces-Longbottom-Chouser.pdf ├── StackTraces-Longbottom-Chouser.svg ├── Taming_of_The_Deftype_Baishampayan_Ghose.pdf ├── Tellman-Distilling-Java-Libraries.pdf ├── VanderHart-Domina.zip ├── bootstrapping_clojure_at_groupon.pdf ├── cemerick-what-sucks-about-clojure-and-why-youll-love-it-anyway.pdf ├── deGrandis-ClojurePoweredStartups.pdf ├── kriger-load_testing_with_clojure.tbz ├── lynaghk_statistical_graphics_clojurescript.pdf ├── marz-storm.pdf ├── monadWritingDesk.pdf ├── slagyr-clojure-in-the-clouds.pdf ├── tbatchelli-pallet-devops-for-the-jvm.pdf ├── trptcolin-SOLID-Clojure.pdf └── whitaker-helping-adhd-kids.pdf /.gitignore: -------------------------------------------------------------------------------- 1 | /Hagelberg-SwarmCoding.tex 2 | -------------------------------------------------------------------------------- /Andera-Namespaces-Symbols-Vars.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Andera-Namespaces-Symbols-Vars.zip -------------------------------------------------------------------------------- /Bedra-TheGenerativeGeneration.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Bedra-TheGenerativeGeneration.pdf -------------------------------------------------------------------------------- /Brubacher-Cascalog.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Brubacher-Cascalog.pdf -------------------------------------------------------------------------------- /CLJS_clojure-west-FOGUS.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/CLJS_clojure-west-FOGUS.pdf -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/.gvimrc: -------------------------------------------------------------------------------- 1 | " Values from slides.vroom config section. (under 'gvimrc') 2 | set fuopt=maxhorz,maxvert 3 | set nonumber 4 | set guifont=Inconsolata:h18 5 | 6 | 7 | " Overrides from /Users/bcaputo/.vroom/gvimrc 8 | 9 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/.help: -------------------------------------------------------------------------------- 1 | 2 | Advance 3 | Go back 4 | 5 | ?? Help 6 | QQ Quit Vroom 7 | 8 | RR Run slide as a program 9 | VV vroom --vroom 10 | EE Edit file under cursor 11 | OO Open file under cursor (Mac OS X) 12 | 13 | 14 | (Press SPACE to leave Help screen and continue) 15 | 16 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/.vimrc: -------------------------------------------------------------------------------- 1 | " This .vimrc file was created by Vroom-0.23 2 | map :n:gg 3 | map :N:gg 4 | map R :!vroom -run % 5 | map RR :!vroom -run % 6 | map VV :!vroom -vroom 7 | map QQ :q! 8 | map OO :!open 9 | map EE :e 10 | map !! G:!open 11 | map ?? :e .help 12 | set laststatus=2 13 | set statusline=%-20f\ Vroom! 14 | 15 | " Overrides from /Users/bcaputo/.vroom/vimrc 16 | 17 | 18 | " Values from slides.vroom config section. (under 'vimrc') 19 | function! GetNextIdx(indexIncrement) 20 | let l:absIdx = argidx() + a:indexIncrement 21 | let l:absIdx = l:absIdx < 0 ? 0 : l:absIdx 22 | let l:absIdx = l:absIdx >= argc() ? (argc() - 1) : l:absIdx 23 | return l:absIdx 24 | endfunction 25 | 26 | function! ExecuteCommand(cmd) 27 | exe ':silent !' . a:cmd 28 | endfunction 29 | 30 | function! TransitionCommand(idx) 31 | return 'transition.' . argv(a:idx) . '.sh' 32 | endfunction 33 | 34 | function! NotesCommand(idx) 35 | return 'cp ' . 'notes.' . argv(a:idx) . ' notes.txt' 36 | endfunction 37 | 38 | function! RunTransitionHook(increment) 39 | call ExecuteCommand(TransitionCommand(GetNextIdx(a:increment))) 40 | endfunction 41 | 42 | function! WriteNotes(increment) 43 | call ExecuteCommand(NotesCommand(GetNextIdx(a:increment))) 44 | endfunction 45 | 46 | 47 | set nonumber 48 | map :call WriteNotes(1):call RunTransitionHook(1):n:gg 49 | map :call WriteNotes(-1):call RunTransitionHook(-1):N:gg 50 | 51 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/01: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | continuous testing in clojure 10 | 11 | bill caputo (@logosity) 12 | drw trading 13 | 14 | . 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/02: -------------------------------------------------------------------------------- 1 | what is continuous testing? 2 | 3 | "We seek, not to build guard rails, but to paint lines on the road [...] You still have to know how to drive." 4 | ~ Ben Rady, "Continuous Testing with Ruby." 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/02b: -------------------------------------------------------------------------------- 1 | what is continuous testing? 2 | 3 | "We seek, not to build guard rails, but to paint lines on the road [...] You still have to know how to drive." 4 | ~ Ben Rady, "Continuous Testing with Ruby." 5 | 6 | * executable documentation 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/02c: -------------------------------------------------------------------------------- 1 | what is continuous testing? 2 | 3 | "We seek, not to build guard rails, but to paint lines on the road [...] You still have to know how to drive." 4 | ~ Ben Rady, "Continuous Testing with Ruby." 5 | 6 | * executable documentation 7 | 8 | * constant feedback 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/02d: -------------------------------------------------------------------------------- 1 | what is continuous testing? 2 | 3 | "We seek, not to build guard rails, but to paint lines on the road [...] You still have to know how to drive." 4 | ~ Ben Rady, "Continuous Testing with Ruby." 5 | 6 | * executable documentation 7 | 8 | * constant feedback 9 | 10 | * flow 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/02e: -------------------------------------------------------------------------------- 1 | what is continuous testing? 2 | 3 | "We seek, not to build guard rails, but to paint lines on the road [...] You still have to know how to drive." 4 | ~ Ben Rady, "Continuous Testing with Ruby." 5 | 6 | * executable documentation 7 | 8 | * constant feedback 9 | 10 | * flow 11 | 12 | * speed not completeness 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/02z: -------------------------------------------------------------------------------- 1 | what is continuous testing? 2 | 3 | "We seek, not to build guard rails, but to paint lines on the road [...] You still have to know how to drive." 4 | ~ Ben Rady, "Continuous Testing with Ruby." 5 | 6 | * executable documentation 7 | 8 | * constant feedback 9 | 10 | * flow 11 | 12 | * speed not completeness 13 | 14 | - clojure: 181 expectations 47 ms 15 | - ruby: 23 expectations 18 ms 16 | - jruby: 30 expectations 1.081 seconds (hey, it's jruby) 17 | - javascript: 712 expectations 2.225 seconds 18 | -------------------------------------------- 19 | - total: 946 expectations 3.371 seconds 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | . 31 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/03.clj: -------------------------------------------------------------------------------- 1 | under the hood... 2 | 3 | (defproject clojure-west "1.0.0-SNAPSHOT" 4 | :description "Sample code and slides for CT talk" 5 | :dependencies [[org.clojure/clojure "1.3.0"]] 6 | :dev-dependencies [[expectations "1.3.6"] 7 | [lein-autoexpect "0.0.3"]] 8 | :repl-init repl.west) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | . 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/04: -------------------------------------------------------------------------------- 1 | 2 | an example... 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | . 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/05: -------------------------------------------------------------------------------- 1 | 2 | an example... 3 | 4 | 5 | +------------------+ 6 | | | 7 | | Thing One. | 8 | | | 9 | | | 10 | | | 11 | | | 12 | +------------------+ 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | . 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/06: -------------------------------------------------------------------------------- 1 | 2 | an example... 3 | 4 | ...3 months later... 5 | 6 | 7 | +------------------+ +--------------------+ 8 | | | | | 9 | | Thing One. | | Thing Two. | 10 | | | | | 11 | | |<-------------+| | 12 | | | | | 13 | | | | | 14 | +------------------+ +--------------------+ 15 | 16 | 17 | 18 | 19 | 20 | . 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/07: -------------------------------------------------------------------------------- 1 | 2 | an example... 3 | 4 | +------------------+ 5 | | | 6 | | Thing One. | 7 | | | 8 | +--------->| |<-----------+ 9 | | | | | 10 | | | | | 11 | | +------------------+ | 12 | + + 13 | +------------------+ +--------------------+ 14 | | | | | 15 | | Thing Three. | | Thing Two. | 16 | | | | | 17 | | | | | 18 | | | | | 19 | | | | | 20 | +------------------+ +--------------------+ 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/08: -------------------------------------------------------------------------------- 1 | 2 | in summary... 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/08z: -------------------------------------------------------------------------------- 1 | 2 | in summary... 3 | 4 | 5 | thank you. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | . 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/slides.notes: -------------------------------------------------------------------------------- 1 | ***** make sure tabs are set up before starting 2 | ***** make sure cd into right directory 3 | 4 | start vroom; :tabe; :lcd ..; ,t thing-one ,t thing-two, etc. 5 | 6 | ^01 1.5 minutes 7 | Hello and Welcome to Continuous Testing in Clojure 8 | I'm me 9 | programmer at DRW; 10 | Been using clojure in anger for about 8 months 11 | Been writing code test-first for about 13 years. 12 | 13 | Why this talk? 14 | * Team of 5, adopted clojure in the past 6 months 15 | * Already writing code in: Javascript, Ruby, Python, Bash & Java (living the polyglot dream) 16 | * Long-time TDD practictioners and already using continuous testing practices 17 | * As we immersed ourselves in repl-based programming then added CT back in... 18 | * I was struck by: 19 | - differences in workflow (loved the repl!) 20 | - similarities in workflow (the focus on iteration) 21 | 22 | We found CT Complemented the REPL, it didn't replace it (or vice versa) 23 | The repl makes some TDD practices less important 24 | tests allow us to capture things we learn for later 25 | So what is CT? 26 | 27 | ^02 3.5 minutes (need 5 minutes) 28 | Seek to write "executable documentation" 29 | Not about correnctness 30 | make assumptions explicit 31 | just as lisp is language for building languages 32 | CT a language for building a dictionary for those languages (for concepts that don't have a name) 33 | 34 | When implementing mathematical and computer science concepts (things with names) this is less important/uneccessary 35 | e.g. Least Common Multiple 36 | ...BUT building a language for a business domain, you do need a dictionary (and a correct implementation)because: 37 | defs are loose 38 | they change over time 39 | often in conflict with one another 40 | and finding that out now, not in production or even later in your dev cycle 41 | 42 | Constant feedback 43 | Every save, tests are run 44 | Every save, all code is exercised 45 | (tools might narrow scope for some runs) 46 | 47 | Flow 48 | We don't want to stop and run tests, we want to code 49 | CT handles the context switching for us... if they pass you don't notice 50 | 51 | And finally: Favor speed over completeness 52 | We're not going to hit databases, or exercise the network 53 | We're not going to ensure every edge is covered... 54 | ...just the ones where we know our assumptions 55 | -for reference: 56 | 57 | read each line (make jruby snark) 58 | read totals... 3 seconds & we've captured almost 1000 assumptions about our code. 59 | 60 | ... 61 | 62 | rest of the talk is a simple workflow demo 63 | that (Hopefully!) conveys these ideas 64 | Before we do that... 65 | 66 | ^03 1 minute 67 | this is a basic leiningen setup just: 68 | lein new 69 | add expectations and lein-autoexpect 70 | add the repl-init file 71 | lein deps 72 | 73 | Now on to the example... 74 | 75 | ^04 8 minutes 76 | The example... 77 | 78 | here's the setup: 79 | we use vim + vimclojure (w/slime) with a repl and the tests 80 | which I'll start up here below vim... 81 | 82 | our workstations have two monitors and the layout varies by preference, 83 | but hopefully you get the idea. 84 | OK... 85 | 86 | 87 | 88 | We need to create comma-delimited strings 89 | We need empty strings when sequence are empty 90 | 91 | -I'm gonna code right in the files, but in practice I often use the Scratch plugin for vim that gives me a scratch buffer 92 | 93 | -interpose? 94 | -doc interpose 95 | -str...apply? 96 | (apply str (interpose "," coll)))) 97 | -use expectations 98 | (expect "1,2,3" (make-csv [1 2 3])) 99 | (expect "" (make-csv [])) 100 | -forget to remove the hard-coded collection (we're all stupid at times... or at least I am) 101 | -rename foo to make-csv 102 | -replace interpose with clojure.string/join 103 | -so Craig Andera comes in and says "why not string/join?" 104 | (:use [clojure.string :only (join)]) 105 | (join \, coll) 106 | 107 | (expect "" (make-csv 1)) 108 | -don't generally do this last one (we know what happens when interpose doesn't get a seq), 109 | -but if your scenario has an expectation that might happen, then sure document it 110 | 111 | ^05 6 minutes 112 | ...3 months later 113 | Thing-Two wants to use make-csv 114 | and has a new expectation: 115 | that when lists are empty we get back nils 116 | so, let's drive out thing-two's use of make-csv... 117 | 118 | (ns clojure-west.thing-two 119 | (:use [clojure-west.thing-one :only [make-csv]])) 120 | 121 | -remember to use r-all (so I have this little function in the repl file...) 122 | 123 | (filter identity (map make-csv [[1 2 3] [] [:a :b :c]])) 124 | (expect ["1,2,3" ":a,:b,:c"] (bar [[1 2 3] [:a :b :c]])) 125 | -tests can be wrong, there's no autopilot... 126 | (expect ["1,2,3" ":a,:b,:c"] (bar [[1 2 3] [] [:a :b :c]])) 127 | 128 | -how do we check for an empty list? 129 | -seq is an idiomatic to test for this (send it to the repl) so... 130 | -great let's wrap that in a when... 131 | (defn make-csv [coll] 132 | (when (seq coll) 133 | (apply str (interpose "," coll)))) 134 | 135 | -and... thing-two's test passes, while *thing-one's* test fails... 136 | -great so change thing-one's test, except... 137 | 138 | ^06 2 minutes 139 | -make-csv is also being used by thing-three. 140 | -were not going to go into thing-three here, 141 | -but this happens all the time: two different clients need incompatible behaviors 142 | -but now you're aware of it and you (and only you in the context of the situation) can decide: 143 | -should thing-three change too? 144 | -should thing-two not use make-csv? 145 | -does make-csv belong with thing-one? 146 | -is this overly complected? 147 | -etc 148 | 149 | -whether this is a wise choice is context dependent 150 | 151 | It's not about knowledge of Clojure... or the domain, or your skill as a programmer, 152 | it's about not having to keep the entire model of how the system interacts in your 153 | head 3 months later when you are working on only one part of it... 154 | 155 | ^07 2 minutes 156 | Communication. With others and with future "me" 157 | that's what CT helps us do effectively. 158 | It's not a substitute for good judgment, 159 | or language knowledge 160 | or your repl 161 | but it does make for a better driving experience 162 | -------------------------------------------------------------------------------- /Caputo-ContinuousTestingInClojure/slides.vroom: -------------------------------------------------------------------------------- 1 | ---- config 2 | # Basic config options. 3 | title: Vroom! 4 | indent: 5 5 | height: 24 6 | width: 125 7 | skip: 0 8 | vimrc: | 9 | function! GetNextIdx(indexIncrement) 10 | let l:absIdx = argidx() + a:indexIncrement 11 | let l:absIdx = l:absIdx < 0 ? 0 : l:absIdx 12 | let l:absIdx = l:absIdx >= argc() ? (argc() - 1) : l:absIdx 13 | return l:absIdx 14 | endfunction 15 | 16 | function! ExecuteCommand(cmd) 17 | exe ':silent !' . a:cmd 18 | endfunction 19 | 20 | function! TransitionCommand(idx) 21 | return 'transition.' . argv(a:idx) . '.sh' 22 | endfunction 23 | 24 | function! NotesCommand(idx) 25 | return 'cp ' . 'notes.' . argv(a:idx) . ' notes.txt' 26 | endfunction 27 | 28 | function! RunTransitionHook(increment) 29 | call ExecuteCommand(TransitionCommand(GetNextIdx(a:increment))) 30 | endfunction 31 | 32 | function! WriteNotes(increment) 33 | call ExecuteCommand(NotesCommand(GetNextIdx(a:increment))) 34 | endfunction 35 | 36 | 37 | set nonumber 38 | map :call WriteNotes(1):call RunTransitionHook(1):n:gg 39 | map :call WriteNotes(-1):call RunTransitionHook(-1):N:gg 40 | # map b 41 | # map :call WriteNotes(1):call RunTransitionHook(1):n:gg 42 | # map :call WriteNotes(-1):call RunTransitionHook(-1):N:gg 43 | # The following options are for Gvim usage. 44 | vim: gvim 45 | # set guioptions=egmLtT 46 | gvimrc: | 47 | set fuopt=maxhorz,maxvert 48 | set nonumber 49 | set guifont=Inconsolata:h18 50 | # set guicursor=a:blinkon0-ver25-Cursor 51 | # colorscheme default 52 | 53 | ---- center 54 | == continuous testing in clojure 55 | 56 | 57 | bill caputo (@logosity) 58 | drw trading 59 | 60 | 61 | 62 | 63 | . 64 | ---- left 65 | what is continuous testing? 66 | 67 | "We seek, not to build guard rails, but to paint lines on the road [...] You still have to know how to drive." 68 | ~ Ben Rady, "Continuous Testing with Ruby." 69 | 70 | +* executable documentation 71 | 72 | +* constant feedback 73 | 74 | +* flow 75 | 76 | +* speed not completeness 77 | 78 | + - clojure: 181 expectations 47 ms 79 | - ruby: 23 expectations 18 ms 80 | - jruby: 30 expectations 1.081 seconds (hey, it's jruby) 81 | - javascript: 712 expectations 2.225 seconds 82 | -------------------------------------------- 83 | - total: 946 expectations 3.371 seconds 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | . 95 | ---- clojure,i4 96 | 97 | under the hood... 98 | 99 | ---- include ../project.clj 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | . 115 | ---- left 116 | an example... 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | . 135 | ---- left 136 | an example... 137 | 138 | 139 | +------------------+ 140 | | | 141 | | Thing One. | 142 | | | 143 | | | 144 | | | 145 | | | 146 | +------------------+ 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | . 155 | ---- left 156 | an example... 157 | 158 | ...3 months later... 159 | 160 | 161 | +------------------+ +--------------------+ 162 | | | | | 163 | | Thing One. | | Thing Two. | 164 | | | | | 165 | | |<-------------+| | 166 | | | | | 167 | | | | | 168 | +------------------+ +--------------------+ 169 | 170 | 171 | 172 | 173 | 174 | . 175 | ---- left 176 | an example... 177 | 178 | +------------------+ 179 | | | 180 | | Thing One. | 181 | | | 182 | +--------->| |<-----------+ 183 | | | | | 184 | | | | | 185 | | +------------------+ | 186 | + + 187 | +------------------+ +--------------------+ 188 | | | | | 189 | | Thing Three. | | Thing Two. | 190 | | | | | 191 | | | | | 192 | | | | | 193 | | | | | 194 | +------------------+ +--------------------+ 195 | ---- left 196 | in summary... 197 | 198 | 199 | +thank you. 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | . 215 | -------------------------------------------------------------------------------- /Corfield-Boring.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Corfield-Boring.pdf -------------------------------------------------------------------------------- /Cross-Prismatic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Cross-Prismatic.pdf -------------------------------------------------------------------------------- /Crossley-Introducing-Immutant.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Crossley-Introducing-Immutant.pdf -------------------------------------------------------------------------------- /Dipert-ProgrammingWithValues.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Dipert-ProgrammingWithValues.pdf -------------------------------------------------------------------------------- /Duey-DSLs.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Duey-DSLs.pdf -------------------------------------------------------------------------------- /Gabriel-EngineeringScienceIncommensurability.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Gabriel-EngineeringScienceIncommensurability.pdf -------------------------------------------------------------------------------- /Hagelberg-SwarmCoding.org: -------------------------------------------------------------------------------- 1 | #+TITLE: Swarm Coding 2 | #+AUTHOR: Phil Hagelberg 3 | #+EMAIL: technomancy@gmail.com 4 | #+DATE: 2012-03-17 5 | #+DESCRIPTION: Hands-on collaborative coding for user groups 6 | #+KEYWORDS: 7 | #+LANGUAGE: en 8 | #+OPTIONS: H:3 num:t \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t 9 | #+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc 10 | #+INFOJS_OPT: view:nil mouse:underline buttons:0 path:http://orgmode.org/org-info.js 11 | #+EXPORT_SELECT_TAGS: export 12 | #+EXPORT_EXCLUDE_TAGS: noexport 13 | #+startup: beamer 14 | #+LaTeX_CLASS: beamer 15 | #+LaTeX_CLASS_OPTIONS: [bigger] 16 | #+BEAMER_HEADER_EXTRA: \usetheme{Marburg}\usecolortheme{default} 17 | #+LATEX_HEADER: \usefonttheme{serif} 18 | 19 | # This uses org-mode; open it in Emacs and hit C-c C-e d to render a PDF 20 | 21 | * Who am I? 22 | ** Phil Hagelberg (http://technomancy.us) 23 | - Soli Deo Gloria 24 | - Hacker-Errant, Heroku 25 | - Second-tallest man in Clojure 26 | 27 | \vskip10pt 28 | 29 | #+ATTR_LaTeX: width=.4\linewidth 30 | [[./Hagelberg-SwarmCoding/heroku.pdf]] 31 | 32 | * Who am I? 33 | ** Relevant qualification: 34 | - Founded Seajure, Seattle Clojure Group 35 | # small group, 8-12 generally 36 | # distilling our experiences 37 | 38 | * User groups 39 | ** What are we trying to achieve? 40 | - Social 41 | - Learning (teaching?) 42 | 43 | * User groups 44 | ** The lecture model 45 | - What's going in this room here 46 | - But not sustainable 47 | - Not even a particularly good way of learning 48 | # knowledge transfer 49 | 50 | * User groups 51 | ** The lecture model works if... 52 | - Audience is sufficiently alert, caffeinated, etc 53 | - Presenter can keep your attention. 54 | - good jokes 55 | - cat pictures 56 | 57 | * Learning 58 | [[./Hagelberg-SwarmCoding/athens.jpg]] 59 | # Classical education background: I've got opinions! 60 | 61 | * Learning by discussion 62 | ** Socratic dialog 63 | ** Discussion among a small group 64 | ** Asking questions, not giving answers 65 | # Results in totally different depth of understanding 66 | # Degrees of "leading questions" 67 | # Leader must be attuned to the level of expertise of the group 68 | # Leading vs co-discovering? 69 | 70 | * Learning by shared models 71 | ** Computer Communications 72 | - by J.C.R. Licklider and Robert Taylor 73 | - Creative communication 74 | - distinct from simply data transfer 75 | \pause 76 | ** Communication: collaborative modeling 77 | 78 | * Learning by shared models 79 | ** Computer Communications 80 | ** Communication: collaborative modeling 81 | \begin{quote} 82 | Any communication between people about the same thing is a common 83 | revelatory experience about informational models of that thing. 84 | \end{quote} 85 | # Bringing two independent models in line with each other 86 | \pause 87 | ** Computers bring immediacy over distance 88 | ** Computers remove ambiguity 89 | 90 | # Licklider was giddy about the idea of producing a network that would 91 | # enhance human communication via collaborative modeling. He was 92 | # excited at the prospect of such a system being available for 93 | # researchers at a mere $12/hour. We have so much more. 94 | 95 | * A REPL process as a shared model 96 | # Licklider was talking about engineering projects and scientific 97 | # research. Programmers have a huge advantage! 98 | ** Interactive programs 99 | - Able to act directly on that substance 100 | - Dispensing with intermediate modeling steps 101 | - (Modeling still happens in your head) 102 | 103 | * The technology 104 | ** SSH as a shared user 105 | # - Distribute keys beforehand 106 | # - Use .local addresses if possible 107 | # - Disable agent forwarding 108 | ** \texttt{tmux attach} 109 | ** \texttt{lein new hack-project} 110 | ** Emacs/Vim 111 | 112 | * Criteria for a hack project 113 | ** Short, accessible 114 | ** Contrived vs practical (harder, more interesting) 115 | ** Start by doing a fresh project each time 116 | 117 | * Running a session 118 | :PROPERTIES: 119 | :BEAMER_envargs: [<+->] 120 | :END: 121 | ** Start with everyone introducing themselves 122 | - Ascertain skill levels 123 | ** Hold a "tooling workshop" session first 124 | ** Explain the project, goals 125 | ** Pass around control 126 | ** By the end, hope to have produced something 127 | - Push to Github/Clojars/Heroku 128 | 129 | * Let's try it out 130 | ** Groups of up to ten 131 | ** Project ideas 132 | - Chat log analysis 133 | http://www.raynes.me/logs/irc.freenode.net/ 134 | - Dependency trees (Clojuresphere data) 135 | http://git.io/melange 136 | - Github rankings 137 | https://github.com/Raynes/tentacles 138 | - Group web site (members, projects listed) 139 | - Games 140 | - Mastermind 141 | - Tic-tac-toe 142 | * Let's try it out 143 | ** To host: 144 | - Create separate "swarm" user 145 | - Setup script: http://git.io/swarmup.sh 146 | ** To join: 147 | - Use the SSH key http://git.io/id_swarm 148 | - \texttt{ssh swarm@host.local} 149 | - \texttt{tmux attach} 150 | -------------------------------------------------------------------------------- /Hagelberg-SwarmCoding.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Hagelberg-SwarmCoding.pdf -------------------------------------------------------------------------------- /Hagelberg-SwarmCoding/athens.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Hagelberg-SwarmCoding/athens.jpg -------------------------------------------------------------------------------- /Hagelberg-SwarmCoding/heroku.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Hagelberg-SwarmCoding/heroku.pdf -------------------------------------------------------------------------------- /Hagelberg-SwarmCoding/whale.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Hagelberg-SwarmCoding/whale.jpg -------------------------------------------------------------------------------- /Halloway-EvidentCodeAtScale.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Halloway-EvidentCodeAtScale.pdf -------------------------------------------------------------------------------- /McNeil-MacrosAreHard.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/McNeil-MacrosAreHard.zip -------------------------------------------------------------------------------- /Patterson-RealWorldAPIs.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Patterson-RealWorldAPIs.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This repo holds slides from the [Clojure/West 2012](http://clojurewest.org) conference. All slides are copyright the speaker and unless otherwise specified by the author, all rights are reserved by the author. Links to video will be added as they are released. 2 | 3 | Enjoy! 4 | 5 | Alex Miller 6 | 7 | 8 | # Keynotes 9 | 10 | * The Datomic Architecture and Data Model - Rich Hickey 11 | * [Engineering(,) A Path to Science: "I don’t want to die in a language I can’t understand"](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Gabriel-EngineeringScienceIncommensurability.pdf) - Richard Gabriel 12 | * [Why Prismatic Goes Faster with Clojure](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Cross-Prismatic.pdf) - Bradford Cross 13 | * [Evident Code, at Scale](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Halloway-EvidentCodeAtScale.pdf) - Stuart Halloway 14 | 15 | # Sessions 16 | 17 | ## Friday 18 | 19 | * [Macros are Hard!](https://github.com/strangeloop/clojurewest2012-slides/raw/master/McNeil-MacrosAreHard.zip) - David McNeil 20 | * [Namespaces, Symbols, and Vars, Oh My!](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Andera-Namespaces-Symbols-Vars.zip) - Craig Andera 21 | * [Knockbox, an Eventual Consistency Toolkit](http://reiddraper.github.com/knockbox-slides/) - [Reid Draper](https://twitter.com/#!/reiddraper) 22 | * [clojure@runa :: dynamic pricing through DSLs](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Rathore-Runa.pdf) - Amit Rathore 23 | * [Programming with Values in Clojure](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Dipert-ProgrammingWithValues.pdf) - Alan Dipert 24 | * [What sucks about Clojure...and why you'll love it anyway](https://github.com/strangeloop/clojurewest2012-slides/raw/master/cemerick-what-sucks-about-clojure-and-why-youll-love-it-anyway.pdf) - Chas Emerick 25 | * [The Taming of the Deftype](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Taming_of_The_Deftype_Baishampayan_Ghose.pdf) - Baishampayan Ghose 26 | * [Introducing Immutant](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Crossley-Introducing-Immutant.pdf) - Jim Crossley 27 | * [Load testing with Clojure](https://github.com/strangeloop/clojurewest2012-slides/raw/master/kriger-load_testing_with_clojure.tbz) - Andy Kriger 28 | * [Pallet, DevOps for the JVM - Antoni Batchelli](https://github.com/strangeloop/clojurewest2012-slides/raw/master/tbatchelli-pallet-devops-for-the-jvm.pdf) - Toni Batchelli 29 | * [Building User Interfaces with Seesaw](http://darevay.com/talks/clojurewest2012) - [Dave Ray](http://twitter.com/darevay) 30 | * [The generative generation](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Bedra-TheGenerativeGeneration.pdf) - Aaron Bedra 31 | * [Building tools to help kids fight ADHD](https://github.com/strangeloop/clojurewest2012-slides/raw/master/whitaker-helping-adhd-kids.pdf) - [Alan Whitaker](http://twitter.com/#!/digiduke) 32 | * [Clojure in the Clouds](https://github.com/strangeloop/clojurewest2012-slides/raw/master/slagyr-clojure-in-the-clouds.pdf) - [Micah Martin](http://twitter.com/slagyr) 33 | * [Adopting Continuous Testing in Clojure](https://github.com/strangeloop/clojurewest2012-slides/tree/master/Caputo-ContinuousTestingInClojure) - Bill Caputo 34 | * [Clojure-powered Startups: a three-part story](https://github.com/strangeloop/clojurewest2012-slides/raw/master/deGrandis-ClojurePoweredStartups.pdf) - [Paul deGrandis](https://twitter.com/ohpauleez) 35 | * [Accessing Real-World APIs from Clojure](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Patterson-RealWorldAPIs.pdf) - [Pat Patterson](http://twitter.com/metadaddy) 36 | * Thinking in Data - Stuart Sierra 37 | * [Bootstrapping Clojure at Groupon](https://github.com/strangeloop/clojurewest2012-slides/raw/master/bootstrapping_clojure_at_groupon.pdf) - Tyler Jennings 38 | * [Why is a Monad Like a Writing Desk?](https://github.com/strangeloop/clojurewest2012-slides/raw/master/monadWritingDesk.pdf) - [Carin Meier] (https://twitter.com/carinmeier) 39 | 40 | ## Saturday 41 | 42 | * [Scalable Realtime Computation with Storm's Clojure DSL](https://github.com/strangeloop/clojurewest2012-slides/raw/master/marz-storm.pdf) - Nathan Marz 43 | * [Distilling Java Libraries](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Tellman-Distilling-Java-Libraries.pdf) - Zach Tellman 44 | * [Clojure, JRuby on Rails, and You](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Rohner-JRuby.pdf) - Allen Rohner 45 | * [Distributed Apps: The Joys of Testing and Debugging](https://github.com/strangeloop/clojurewest2012-slides/raw/master/StackTraces-Longbottom-Chouser.svg) - Chris Houser 46 | * [SOLID Clojure](https://github.com/strangeloop/clojurewest2012-slides/raw/master/trptcolin-SOLID-Clojure.pdf) - Colin Jones 47 | * [Real World Cascalog: Past, Present, Future](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Brubacher-Cascalog.pdf) - Federico Brubacher 48 | * [Real World Clojure - Doing Boring Stuff With An Exciting Language](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Corfield-Boring.pdf) - [Sean Corfield](http://corfield.org) 49 | * [Composing Statistical Graphics On the Web](https://github.com/strangeloop/clojurewest2012-slides/raw/master/lynaghk_statistical_graphics_clojurescript.pdf) - Kevin Lynagh 50 | * [Swarm Coding](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Hagelberg-SwarmCoding.pdf) - Phil Hagelberg 51 | * [Crunching Numbers With Clojure](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Solano-Gómez-Crunching-Numbers-with-Clojure.pdf) - Daniel Solano Gómez 52 | * Beyond Ninjas: DOM manipulation with ClojureScript and Domina - Luke VanderHart 53 | * [DSLs in Clojure](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Duey-DSLs.pdf) - Jim Duey 54 | * [Building Libraries for ClojureScript - Learning to Love Google Closure](http://ckirkendall.github.com/Presentations/ClojureWest/) - [Creighton Kirkendall](http://twitter.com/crkirkendall) 55 | * [ClojureScript Anatomy](https://github.com/strangeloop/clojurewest2012-slides/raw/master/CLJS_clojure-west-FOGUS.pdf) - Michael Fogus 56 | * [Practical core.logic](https://github.com/strangeloop/clojurewest2012-slides/raw/master/Senior-PracticalCoreLogic.zip) - Ryan Senior 57 | * Laziness: the Good, the Bad, and the Ugly - Paul Stadig 58 | -------------------------------------------------------------------------------- /Rathore-Runa.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Rathore-Runa.pdf -------------------------------------------------------------------------------- /Rohner-JRuby.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Rohner-JRuby.pdf -------------------------------------------------------------------------------- /Senior-PracticalCoreLogic.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Senior-PracticalCoreLogic.zip -------------------------------------------------------------------------------- /Solano-Gómez-Crunching-Numbers-with-Clojure.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Solano-Gómez-Crunching-Numbers-with-Clojure.pdf -------------------------------------------------------------------------------- /StackTraces-Longbottom-Chouser.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/StackTraces-Longbottom-Chouser.pdf -------------------------------------------------------------------------------- /Taming_of_The_Deftype_Baishampayan_Ghose.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Taming_of_The_Deftype_Baishampayan_Ghose.pdf -------------------------------------------------------------------------------- /Tellman-Distilling-Java-Libraries.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/Tellman-Distilling-Java-Libraries.pdf -------------------------------------------------------------------------------- /VanderHart-Domina.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/VanderHart-Domina.zip -------------------------------------------------------------------------------- /bootstrapping_clojure_at_groupon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/bootstrapping_clojure_at_groupon.pdf -------------------------------------------------------------------------------- /cemerick-what-sucks-about-clojure-and-why-youll-love-it-anyway.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/cemerick-what-sucks-about-clojure-and-why-youll-love-it-anyway.pdf -------------------------------------------------------------------------------- /deGrandis-ClojurePoweredStartups.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/deGrandis-ClojurePoweredStartups.pdf -------------------------------------------------------------------------------- /kriger-load_testing_with_clojure.tbz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/kriger-load_testing_with_clojure.tbz -------------------------------------------------------------------------------- /lynaghk_statistical_graphics_clojurescript.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/lynaghk_statistical_graphics_clojurescript.pdf -------------------------------------------------------------------------------- /marz-storm.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/marz-storm.pdf -------------------------------------------------------------------------------- /monadWritingDesk.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/monadWritingDesk.pdf -------------------------------------------------------------------------------- /slagyr-clojure-in-the-clouds.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/slagyr-clojure-in-the-clouds.pdf -------------------------------------------------------------------------------- /tbatchelli-pallet-devops-for-the-jvm.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/tbatchelli-pallet-devops-for-the-jvm.pdf -------------------------------------------------------------------------------- /trptcolin-SOLID-Clojure.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/trptcolin-SOLID-Clojure.pdf -------------------------------------------------------------------------------- /whitaker-helping-adhd-kids.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strangeloop/clojurewest2012-slides/06decb4eb625f959a7617d722bc4fb9e2e7f9265/whitaker-helping-adhd-kids.pdf --------------------------------------------------------------------------------