I don’t learn new programming languages very often. It simply requires an enormous amount of time to properly understand the local philosophy, community, tools, and ecosystem. But every so often I see a glimmer in an unfamilar language that merits me picking it up.
Very recently I decided to learn Clojure to fulfill my future needs for a high-power language1. Before embarking on this journey, I thought it would be valuable to reflect on how I’ve learned other languages in the past and why I learned them.
My game Dungeons was the most advanced program I wrote in HyperCard. Other kids at National Computer Camp would line up at my computer who wanted to play it. I was very proud.
Neither of these languages were distinctive enough for me to keep using.
I did no major projects in these languages.
I wish I could remember how I internalized pointers and manual memory management, since these are some of the most confusing bits of these languages for beginners. And most annoying for experts.
My Java decompiler decomp4 was the most advanced program I wrote in Java.
Python is currently my favorite language for general purpose programming. Particularly for scripting, data analysis, and other kinds of exploratory work.5
The primary patterns observed in my learning journey above include:
Processing and Racket work okay but have some issues.
Having access to a mentor to check your work is useful but not required.
These primary patterns are coupled with a few secondary patterns:
Note that taking a class isn’t enough by itself. You have to practice on your own outside the class and after the class is finished.
There are a few languages I learned enough of to decide they weren’t worth using in new projects:
Paul Graham’s essays on Lisp and language power are a thought-provoking read. By my assessment the current most-powerful languages out there are Haskell and various members of the Lisp family (ex: Scheme, Racket, Clojure). I’ve decided to pass over Haskell for the time being for a number of reasons, particularly because of its high learning curve. I will probably return to it eventually.↩
RealMediaFixer was a program I wrote that repaired RealMedia (.rm
) files playable in RealPlayer. Such files downloaded over dialup would often get subtlely corrupted. Since downloading a 30-minute video could easily take a day it was more practical to try repairing the broken file rather than redownloading it.↩
I have a huge trove of Java programs from this time period I’d like to publish some day. A very small subset of these programs are listed on my old projects page.↩
DiskSurveyorX was a disk space visualizer program that used similar visualizations as the original DiskSurveyor program for classic Mac OS. It however had some nice usability improvements pulled from my learnings from the information visualization class I took at the Technische Universität München. A modern disk space visualizer that uses a similar visualization is DaisyDisk, which I highly recommend.↩
For desktop GUI development, the Java + Swing combination is still my favorite. Followed closely by the Objective-C + Cocoa + Mac combination. I don’t care about GUI programs on Windows or Linux. However now practically all GUI development is going to the web, where solutions based on HTML + CSS + JavaScript reign supreme.↩