A personal programming language roadmap

Lately I’ve become increasingly sensitive to how little time I have left to learn new technologies. It’s not that I’m nearing death: I’m not, at least not by 21st century baseline human standards. It’s more a matter of the impossible and ever-expanding variety of tech that is out there to be learned. That, coupled with the limited time that that my work commitments and my family commitments leave me with; a spare few hours a week at most.

There are lots of reasons to learn new technologies.  Probably the most common reason is job-related necessity: land a C# gig, learn C#. I’m fortunate in that I don’t have to let work dictate what I learn at this point. I get to pick and choose how I will fill my limited research time based on other criteria.

I’ve always been a programming language hobbyist. I’ve always kept lists in my head, lists of languages that I “totally want to play around with one of these days”. Long lists. But it’s time to get realistic about what I can actually accomplish in the time I have.

Since time is precious, I don’t want to be haphazard. I don’t want to dabble. I have some vague ideas about how I’d like to contribute to the field of software development, and toward that end I want to maximize the utility of the time I spend in study.

So today I sat down, and took a look at my bookshelf. I thought about all the programming languages I have queued up in my mental “it would be fun to learn…” or “it would be fun to spend more time with…” lists. And I did some painful triage.

I came up with a list of programming languages I want to make a concerted to learn, because I think they will expand my skill and understanding in important ways. Ways that will hopefully equip me to explore some new directions I’ve been thinking about.

Here’s the list:

  • Smalltalk (in the form of Pharo) because I need to understand Alan Kay’s ideas better.
  • Elixir/Erlang, because I need to grok using agents and CSP in practice
  • Rust, because I need a better C++ for certain plans, and one finally exists.
  • Clojure, because I need to have hands-on experience with an industrial-strength lisp, persistent data structures, property testing, and the various asynchrony facilities it offers.
  • Elm, because I need to understand the reactive model better.
  • Emacs Lisp, because for greater efficiency I need to become more fluent in reworking my programming environment.
  • Io, because I need to understand how prototype-based objects influence program design.
  • Scheme, because I still want to work my way through SICP some day. Also, Chicken looks like fun.

This implicitly means there is a much longer list of languages that are off the table for now. It was tough letting go of some of these. A few notables include:

  • Node.js, because it offers nothing new.
  • Dart, TypeScript: Because as interesting as they are, they just aren’t relevant to what I’m doing.
  • Go, because I don’t need a better C.
  • Haskell: this hurts, because I badly want to do more with Haskell. But Haskell already expanded my brain once, and I need to expand my brain in different directions now.
  • Common Lisp: I really want to be able to say that I know Common Lisp. But realistically, modern lisp projects are going to be started in Clojure, not CL. The only reason I might go back on this is to understand CLOS better, so I can steal ideas from it.
  • Idris: there’s a future in stronger static analysis, but I don’t think it’s my future. I’m more interested in improving dynamic analysis.
  • Java 8: There’s nothing there for me that I don’t already have.
  • C# 6: A lot of neat ideas here, but none that will expand my horizons substantially.
  • C++11/14: Too little, too late, with too much baggage. Especially now that Rust is stable.
  • Scala: Mainly of interest from a Functional and Reactive point of view, and I think I have that covered between Clojure and Elm.
  • TCL: Part of me still wants to return to TCL and have some more fun with it. But it’s not going to move me forward in any meaningful way.
  • Modern Perl: Same discussion as TCL.
  • Python: a fine language, but too similar to Ruby to be worth re-acquainting myself at this point.
  • UPDATE: Factor, because unique as it is I haven’t seen anything to suggest that it will teach me things I need to know. I might be persuaded otherwise, however.
  • UPDATE: Julia, for the same reasons and with the same caveat as Factor.
  • UPDATE: Prolog, because I’m not solving that sort of problem. I may revisit this one.
  • UPDATE: Lua, because I don’t need to embed a super fast and simple scripting language in anything just now.

Of course, there’s a lot more to programming technology than just languages. But that’s a list for another day.

This is my roadmap, defined by some very particular and personal forces. It should not be your roadmap. But I thought I’d share it, as a source of ideas.