Thursday, April 28, 2011

Expanding your toolbox - Picking a new language to learn.

Image: graur razvan ionut / FreeDigitalPhotos.net
One day a developer on my team came up to me and asked, what should he programming language should he learn next to be marketable (and by the way he also thinks that Java is slowly dying).

Well as to whether Java is dying a not, I don't think so, a quick check with TIOBE shows that Java is still ranked among the top few languages and lots of places still runs Java. So i do have a job for the next few years.

But the thought came to me, it is worth learning things that are marketable or should you learn things that broaden your knowledge? What's your take on it? Should you expand your toolbox or have more of the same tools?

Steamhead takes the languages from Seven Languages in Seven weeks and puts it into a nice flow chart. I think all should go check that out and pick something out from that list. After doing quite a lot in Java I begin to appreciate the simplicity of using interpreted languages like  python and php, and the fact that their frameworks are usually simple as compared to Java ones where sometimes we descend into XML configuration hell.

Steve Yegge has a interesting way of categorizing the various languages, he breaks them down into Nouns (Java, C# or OO languages), Verbs (LISP, Clojure or Functional Programming) and Verbs and Nouns (Scala, Ruby, Python, C++ or a Mixture of both).

Well for me I am more for the expand your toolbox model, go learn something that makes you have a new way of looking at things. A lot of people learn languages but they don't really learn design, think stuff like design patterns (Gang of Four, Java EE Design ...), SOLID principles, OO Metrics. Even if you know the syntax, you simply can't write maintainable programs and all you write lacks a certain craftsmanship to it.

By learning a different language and looking at the api, you can have a different idea about how to design your programs. An example will be like in Java. You have Math.abs a static function to get the absolute value of a number, have you ever wonder why its so "un OO" like? Compare with Ruby its just number.abs(), simple and elegant and fits into the OO paradigm.

In short

If you know Java, C# go learn Lisp Dialects (Common Lisp, Clojure), Haskell, Ruby, Python...

If you know Python, Ruby, you are pretty much there, since you straddle the limits between the 2 kingdoms.

If you know Common Lisp, Clojure, dont bother learning any other thing since you will think why in the world Java, C# programmers are typing so much code and configuring so much XML.

If in doubt just learn PHP to be marketable :)