As many of the luminaries of programming say, you should learn a new programming language every new year. That’s what I’ve been doing for several years now. Maybe not that strictly to start on January 1st with a completely new language and lose all interest in it on December 31st, but learning new things (including new languages) is one of my favorite things to do. And since I can probably list more languages that I think I “know” than I have spent years as a professional programmer (whatever that means), I think I’ve been true to above mentioned rule.
I’m not a big fan of New Year’s Resolutions — in fact I’m closer to the opposite of being a fan — but since the last language I learned well enough is now the language I use at work (Ruby), this would be a good moment to try to wrap my head around something new. That does not mean I’m going to stop learning Ruby. Working with it on a daily basis and subscribing to several Ruby related blogs is guaranteed to provide enough experience points.
Which language should I choose? I don’t know yet but I have some candidates. And I hope that some nice people will make some nice suggestions in comments. But first a list of languages I will certainly not choose, because I know them to such extent that I don’t think I need any more training (which of course does not mean I know them well): Ruby, Java, C, C++, SQL, Perl, Python, assembly languages. Another category is languages that I simply don’t like: C#, BASIC, PHP, Pascal. It should be practical and useful in real-world projects, so joke languages like INTERCAL, Brainf**k, Whitespace are right out (although I deeply admire their humoristic values). For obvious reasons I also reject to learn fossils like Cobol, Algol or Fortran. And APL is way too exotic.
Most of the other languages should be OK, provided they have some significant user base, working and free tools (preferably for both Windows and Mac) and some future before them. This does not mean that I’m looking for a language that will find me a new job, as it wasn’t the case with Ruby either. I first learned it, then started to look for a Ruby job.
So, my candidates are (in no particular order):
Scala may be too similar to Java, but it’s nice to see how much can be improved in Java. I’ve already read one book about it, so I know (and like) the basic stuff. Another language that is an improved version of Java is Nice (mostly concentrated on adding syntactic sugar, but nice anyway), but it seems that its development stalled in alpha phase somewhere around 2003.
D is C++ improved. It looks very interesting, enhancing C++ with a huge number of features known from higher level languages, e.g. garbage collection or closures while retaining its low level and speed. But it’s been such a long time since I’ve done anything in such a low level language that I’m not sure if I will like it.
Some functional language
Probably Haskell or Erlang. Functional languages are known to be mind twisting devices, but “a language that doesn’t affect the way you think about programming, is not worth knowing.” (Alan J. Perlis). Haskell is known for optimizing the code through lazy evaluation and similar techniques, and there are several known applications written in it, including application server. Erlang is mostly known for its light-weight concurrency support, so with the emergence of multi-core processors, some say it might be the language of the future.
Another language that I know basics of. A language that both Java and Ruby were at least inspired on. The syntax is a little bit strange at first and the OO paradigm is implemented a little bit too tightly for my tastes, but those are not show-stoppers. My interest in Smalltalk returned, when I have read about Seaside — it really looks interesting.
Lisp or Scheme
If I could only get past the awful syntax (or: the awful lack of syntax)…
So, which one to choose? So many languages, so little time… I’d greatly appreciate any comments and ideas.