Continuing my series of micro-interviews with Clojure hackers I present Technomancy (aka Phil Hagelberg). Phil continues the theme of prolific coders having brought us a series of fantastic projects. Most notable among his Clojure output is the (increasingly ubiquitous) Leiningen build tool. However, the story of his mad output does not end there as the Emacs Starter Kit, clojure-http-client, and my personal favorite Robert Hooke attest. Additionally, he is maintaining both clojure-mode.el and Swank/Slime for Clojure. As if that were not enough, Phil is also a contributor to the Duby programming language and to Clojure itself – and all of this[^slacker] is without mentioning his Ruby contributions! Finally, Phil works for Sonian, which is the Avengers[^avengers] of the Clojure community.
I started programming with QBasic in 7th grade, and I got into writing Zork-style text adventures. Of course I didn’t understand data structures, so my games were very much copy/paste affairs. I wanted to put together a tool that could create text adventures, but I ended up trying to do this by outputting the whole source (with hard-coded rooms, gotos, etc) to .BAS files on disk instead of separating out data and logic. As you can imagine it didn’t work very well, but it got me thinking.
In college I realized I’d have to make the choice at some point between Emacs and vi. I gave them each a brief shot, but the default vi key bindings are designed to work with a QWERTY layout and are nonsense on Dvorak, (yes, I realize now you can fix this) so I ended up going with Emacs. Once I got going with Elisp I realized it had the magic “programs writing programs” property that I’d been looking for since 7th grade, and that sealed the deal for me.
Of course, you can’t do that much with Elisp, at least if you want to get paid, so I toyed around with Common Lisp. My background was in web programming at that point, and so naturally I thought, “I know, I’ll port my blog to it!” That lasted about a month—it was so awkward at the time just to find a decent HTTP server, so CL still has this aura of the 1980s associated with it in my head, complete with big hair and Tears For Fears playing in the background. (Having VAX filesystem support included in the language spec certainly doesn’t help with that image.)
I got into Ruby in 2005 since it felt “close enough to lisp” to keep my interest, and the money was certainly good. But when I watched Rich’s Clojure for Lisp Programmers videos one weekend in November of 2008 it became clear that you could really use it for everyday tasks. So the pragmatic angle really pulled me in, though the immutability was what caught my eye to begin with.
I’ll probably sell a kit, Altair-style and let hackers put them together themselves. I wouldn’t want to deprive them of the hands-on fun of assembly. I think they’re great, but I fully acknowledge that I’m on the lunatic fringe of input and interface mechanisms.
At first I misread this as “how do you manage to avoid starting any given project”. My answer for that is more interesting, so I’ll start there.
It used to be that I was limited by coming up with names; naming projects is really hard. But these days I’ve decided on a policy of naming all my projects after literary characters, which has led me to the opposite problem—I need to make sure my projects are good enough for the names I’ve got in mind. I’ve got this silly 25-line test coverage hack that I want to release, but calling it “Orestes” seems like it doesn’t do Æschylus’s work justice. So I’m limited by the rate at which I read new fiction—I need to stumble across some minor characters with names that do a better job at reflecting my humbler hacks.
As for avoiding starving any given project—well, just ask anyone who’s sent me patches: I simply don’t. It’s disgraceful. I really try to focus on one project at a time, but that means patches can wait for three months before getting applied if they’re for a project I’m not focusing on.
I try to improve this situation by giving more people commit access so I don’t become a bottleneck, but this is tricky. I guess people don’t feel like they’re qualified, which is totally bogus. I’m certainly not “qualified” to maintain Swank Clojure. I got into it because of my background in Emacs, but it turns out you really need to understand its Common Lisp background. I have only a superficial understanding of the codebase.
I like to think of myself more as the “steward” of that code rather than the “maintainer”. But I get the patches applied, fix a few bugs, and get the releases pushed out. It’s something you can ease your way into, so I encourage readers to help out with projects they’re interested in. Don’t be intimidated.
Well, I used to work in downtown Seattle, so I spent a lot of time on the bus. I got a copy of The Little Schemer and wanted to play around with the ideas in it, so I started Bus Scheme (in Ruby) with the stipulation that all implementation must happen while riding the bus. I had a lot of fun with that. It never got continuations or hygienic macros, but I had the basics of the interpreter working fine and put together a simple CL-style macro system.
I recommend it as an exercise to folks interested in the nuts and bolts of language implementation. It’s much less work than it sounds for a language as small as Scheme, and to people who haven’t done their own implementation (potential employers perhaps?) it sounds really impressive. I certainly learned a lot about parsing and lexical scope as well.
One of these days I’ll move on to Unicycle Java, but I’ve got enough on my plate right now.
I really like Camping