Notes from the Clojure Conj 2012

The following notes were taken while attending the 2012 edition of the Clojure/conj conference. The style is quite succint and compact as it goes with personal notes, but it will be hopefully a nice reading in this blog format as well. You can find the original notes on GitHub.


In his keynote, Rich Hickey focused on the big difference there is between programs and systems: Programs lives in a "bubble" where I/O is someone else's problem, while Systems live in the real world. Failures can only be addressed at the system level.

Joe Armstrong's 2003 Erlang thesis exposes the concept of Making reliable distributed systems in the presence of software errors.

Rich's advice: build simple systems like e.g.: memcached, Zookeper or Amazon S3.

Everything as a value

Several speakers talked about values, i.e.:

  1. do not change the past
  2. do not change in place
  3. register everything in like e.g. git or Datomic

Stuart Halloway showed a simulation based testing approach it was used for Datomic and that will be open sourced soon. It mainly revolves on the equation system testing = real world testing, and that everything is data and is stored forever as an immutable value.

The conceptual steps are:

  1. define the business model ->
  2. generate, record and replay events ->
  3. always store results from system under test as queriable data

Having all historical test data available, if you change the program you can check differences between result sets by simulating the same events. You can go always go back in time and answer the question:

is this problem new or did we previously miss it?

Rich Hickey then shared ideas about codeq. Git does not handle the world outside a single repo, whereas codeq adds the missing higher level: putting together multiple repositories. This is not properly completely defined, so that things like unique naming might be solved through github. Git takes the SHA of a file, and any new SHA is then add to repo. Codeq takes an additional step: a file is a directory of positons, so codeq makes a SHA for each code block in the file. For any new SHA then adda filename + position of the code block in file to the repo. Also, if you add something to codeq you must also add a transaction record to document what you did. As a result, we could have a central codeq-db were you can ask questions like:

what libraries ever used torque?
are they still using it?
show me some use examples

The next step is to get function calls in codeq.

Kovas Boguta showed how the repl-session can also be a value

Antoni Batchelli & Hugo Duncan said they're thinking about moving the pallet config to datomic.


Chris Granger introduced the recent changes in LightTable:

  1. LT uses Roger Wang's node-webkit(node.js + chromium)
  2. LT will use a Component-Entity-System (CES) engine

Bodil Stokke presented a live coding demo using node.js and . She used the catnip editorand cljs-noderepl

Paul DeGrandis talked about using ClojureScript in the browser, and stressed the importance of learning how to use the goog library. Documentation on goog is rare: there's only one book and the newsgroup. Still, its features are still worth it. The goog libary handles browser differences really well, but once you get to the HTML5 stuff it gets tricky. The goog library has two calling conventions that are different to require and call. Still, you need to understand this difference. You can use the protocols and the handy functions in shoreleave to avoid working directly with the goog library. This gives you loosely coupled code and inverted control. If you run into troubles on the client, you can always shift the work to the server. It is of course always fine to use other libraries like jQuery if you need to.

Conrad Barski demonstrated webfui, a client side web development framework. It stored the DOM in atoms using EDN as the representation. It automatically keeps changes in the EDN model in sync with the browser DOM. It allows you to define functions to be run when the state changes.

Alan Dipert did a lightning talk over Functional Reactive Programming (FRP) in ClojureScript using Flapjax.


David Nolen added custom constraints to core.logic he calls this 'open unification'. This helped to make the sudoku solver an order of magnitude faster because you can now define your custom search strategy.

Hugo Duncan gave a demo of ritz-nrepl. It allows you to inspect the locals in your stacktrace (with or without locals clearing), or inspect the forms that raised compiler errors in compile time stacktraces.

Finally, a team of renowned European Clojure practitioners started , they think about planning a training in Amsterdam second half of 2013. They are:

Christophe Grand (enlive, Clojure Programming)
Sam Aaron (overtone)
Edmund Jackson (talk on Machine Learning at Clojure/conj 2012)
Meikel Brandmeyer (vimclojure)

Walter van der Laan is cofounder of Fincite, a pure Clojure startup with a focus on business analysis