loty time again scala or clojure
In 2007 I established several professional development goals (and later reported my progress on these), one of which was to learn Groovy and Grails. This goal stemmed from the continually referenced idea from The Pragmatic Programmer to “learn a new language every year.” This idea has become so ubiquitous that it even has it's own four-letter acronym, LOTY (Language of the Year).
Since establishing and reporting on these goals, I've had several things get in the way of fully realizing all of them. However, I can safely say that in the last two years I have mastered enough Groovy and Grails that they no longer fit in the LOTY category. At this point they're really not showing my anything that is causing any paradigm shifts for me. They're comfortable. When I learn a new feature, it just seems to make sense, and nothing surprises me anymore. Languages like these aren't good LOTY candidates because one of the purposes of learning a LOTY is to challenge and change your ideas about programming. Groovy doesn't do this for me anymore. It's time to move on (not to say that I'm dropping Groovy and Grails as a tool - I'm using them more now than ever - they're just not a learning tool for me anymore).
So, at this point I want to delve into a language that attempts to tackle the concurrent/multicore programming challenge. I'd like to stay on the JVM because I appreciate the benefits that it brings as a platform, so for now Erlang is out. The two leading candidates in the JVM/concurrent/multicore arena seem to be Scala and Clojure. An added benefit of both of these languages is that they support the functional paradigm, something I haven't really played with since my computer science education days and a very interesting language named Haskell.
Scala is a multiparadigm language, supporting both object-oriented and functional constructs. It is statically typed, yet offers very nice type inference. Clojure, on the other hand, is a functional Lisp derivative with almost no OO constructs that is dynamically typed. Both are designed to enable concurrent programming. Which one do I choose? I open the floor for comments.