Deliberate Software

With deliberate practice come consistent results

Learning Lisp Was Hard

Several times in the last week people have lamented to me that they “just don’t get Lisp”. After hearing it for the third time, I thought back to my experience learning a Lisp.

When I set out to learn a Lisp, I expected it would be easy.

I figured, “I am pretty awesome at PHP, and have worked professionally in Perl, Python, and Java, this should be a cakewalk!”. I’d read Paul Graham’s essays on how Lisp is his secret weapon, and figured I needed to get into this secret weapon stuff. My ego said, “since Paul is amazing, and I am too, I’ll be a natural!”

I expected to tinker around with “Lisp” (I didn’t know there was more than one) and shortly master it to be able to ship a website with it.

What happened instead took me a little longer…

  • 05/11 – 06/11 – ~15 Hrs Attempted Land Of Lisp (gave up)
  • 04/12 – 08/12 – ~60 Hrs Rewrote a PHP side project in Clojure
  • 08/12 – 08/12 – ~5 Hrs Attempted Let Over Lambda (gave up)
  • 08/12 – 09/12 – ~10 Hrs Read Clojure Programming twice
  • 09/12 – 12/12 – ~30 Hrs Took CS173 Programming Languages online at Brown University
  • 05/13 – 07/13 – ~50 Hrs Worked through Let Over Lambda
  • 05/13 – 07/14 – ~250 Hrs Worked through SICP
  • 07/14 – Shipped production Clojure code

This shows only the major events: books and large projects, but doesn’t show all the countless blogs, tutorials, and tiny projects that also filled in the gaps.

I think Lisps started to “click” for me around mid 2013, about two years after deciding that I’d “tinker around” for a bit before “mastering” it. I was approximately 170 hours in at that point. The book that finally made it all click was Let Over Lambda, but it took me two attempts and almost a year of pre-learning to be able to understand enough to internalize the material.

All said and done, I spent approximately 420 hours between Common Lisp, Racket, Typed Racket, and Clojure before I felt confident enough to suggest shipping Clojure at work. I don’t claim to be a fast learner at all, and I fully expect some people will snort with derision at how much time it took me – which is kind of the point of this post.

This timeline should show those who are struggling that what you are feeling is normal. Learning anything new is hard. The more “new” it is, the harder it will be. Clojure, macros, emacs, and a repl workflow are all very different from everything I was used to and significantly more powerful than I would’ve guessed. It took a long time for that to become normal, and for that power to sink in and become a tool I anticipated having.

If you are struggling and feel like a failure, understand there is no wrong way. It might take you a long time of repeated exposure before the alien tooling starts to look familiar, and then comfortable. Maybe that book you are struggling with actually IS too advanced, so find an easier one, and circle back to the harder book later. Maybe, like me, you need some part of many different books, tutorials, side projects, and katas.

If you are struggling learning and in the Philly area, I am happy to meet up to chat. I am also happy to help over the wire as well. I understand how demoralizing the constant battle is to learn something new, especially when it feels like your ego is on the line and the whole internet is pressuring you to learn new things. Don’t give up, it’s not impossible.

Was it worth it?

I can anticipate the follow up question: “was it worth it?” Absolutely yes. I now feel a fluid comfort with my current professional stack (C#, F#, Clojure, and JS) that previously I did not have. I am significantly more productive at programming, regardless of the language. Work that was previously challenging is now trivial, and work that was previously “impossible” now feels fun and challenging. Was it learning Lisp specifically that caused all those changes? Probably not, but I believe it was learning something far outside my normal comfort zone that made the difference. I think I would have had equivalent experiences had I invested that time learning Scala (the ML parts), Haskell, Idris, J, R, Forth, etc.