This week I had the good fortune to be in San Francisco for a meeting of the Bay Area Clojure Meetup. This meeting was a special event since Clojure's creator, Rich Hickey, was in town for the big JavaOne conference. We ended up packing out the room with sixty people, which made it probably the largest gathering of Clojure programmers ever.
The meeting began with a handful of so-called "lightning talks" (of various lengths) on all sorts of topics. A few highlights were Amit Rathore's Swarmiji clustering library and George Jahad's talk on decompiling Clojure with jdb, which showed tools to get a new perspective on how your code gets compiled.
After these Rich gave a talk on the recent work he's been doing on chunked sequences. Basically when a seq wraps a vector or vector-like collection, rather than every first/rest invocation breaking the vector down piece by piece, the seq can break a chunk of the vector off to work on all at once and keep its own internal counter that points to the current position in the chunk. The motivation here was that while you generally can rely on the seq abstraction to map over each element in a vector in a functional manner, sometimes performance concerns force you to use a more imperative-style loop instead. With the chunking in place, the map approach is even more performant than the less-idiomatic loop, so there's one fewer reason to stray from the functional approach. It's really encouraging to see that Rich is making this a priority—he wants to make sure that you never get penalized for doing things the elegant way.
After this Rich hosted a Q&A session, from which two main points stuck in my mind. He mentioned that before the 1.0 release, he asked what people thought would be a good set of short-term goals for the project, to which the response was overwhelmingly "move off SVN to git". Since the project was still fresh of a jump from SourceForge to Google Code, he was reluctant at first, but he seems to have been convinced that the distributed approach is what's best for the community. He promised us that the move will happen. He's currently experimenting with GitHub and making sure for himself that tool support is good enough.
The other question of particular interest was that of tests. Rich doesn't write tests for Clojure. The community has contributed a test suite, but it's kept in a separate repository and doesn't offer full coverage. Rich's opinion is that tests are for finding bugs, and that he is able to avoid bugs by reasoning out the problem up front, so it's not a wise use of his time for him to write his own tests, though he does appreciate and run the community-provided suite. This made me very nervous at first, but the next day I read Out of the Tarpit [PDF], a paper he recommended at the meeting. The paper makes a strong case for informal reasoning being a suitable substitute for test cases in codebases that exhibit referential transparency. While I still prefer TDD for its help in the design phase of coding, I'm much more ready to accept the notion that thinking through the problem up front and verifying it with manual tests is actually a feasible approach to getting working code in functional languages, though of course in situations where mutability is the norm it leads to disastrous results.
Update: Videos are up! (Unfortunately flash-only; sorry!)