I just read this post by Joel Hughes.  I agree with the sentiment, but I would disagree with his categorization of languages. Joel lists,

  • Interpreted, procedural
  • Compiled, procedural
  • Functional, concurrent

From a learning perspective, it doesnt matters if the languages are compiled or interpreted.  Programming style and the typing system are more important.  The way I have tried to keep my skill set relevant is by ensuring that I have at least a rudimentary understanding of,

  • An imperative statically typed language – C#
  • A functional language – F#
  • A dynamically typed language – IronPython

I have been meaning to make some forays into a language with concurrency built into the core of the language (Erlang or Scala) but so far I have struggled to get started.  I need to find a real app to work on.  Languages for creating DSL’s are also something to consider (Oslo and Boo for example).

Ian Cooper  recently posted about a similar topic on CodeBetter titled ‘Should you learn frameworks or principals’.  He writes,

As someone who interviews people I look more for understanding of the principles than the minutiae. The problem is that there will always be a new 'better' framework, a new popular paradigm. There is always the possibility that a new language comes along that we want to use instead for a given project. People who understand the principles can adapt. People who focus on the detail are intransigent to change, because they have too much invested in the framework that they have become an expert in.

I agree with this wholeheartedly.  If you are proficient in a dynamic language and can articulate the differences between statically typed and dynamic language features, I would consider you eligible for any job programming in a dynamic langauge (ie. the fact that they may not know the syntax of Ruby is largely irrelevant if you have a deep understanding of Python).