We are recently interviewing quite a lot in anticipation of the great things coming. It is sort of similar task as we did year and something ago, but I enjoy this round much better. This time, rather than "we have to assemble the project team ASAP", we have the luxury of longer term view and focus more on hiring the people that will be great match to the company culture, will be with us for longer period and will grow with the company.
What I really like about interviews is an opportunity talking to smart people, who are usually very interested and passionate about technology. In every one of our meetings, I like to give the candidates a good opportunity to ask questions, not only to answer them. One of questions I got few times, is "given my resume, what technology, programming language, platform, area etc would you recommend me to look at to make progress ?".
I answered it, but after doing it second time, I got back to reviewing and expanding my answers. And because the "given resume's" were not too far apart, I decided to answer it one more time this way. So here we have, Joe Developer, a solid intermediate software engineer with good foundation and few years of Java under his belt. Joe knows the platform quite well, has done some Web application (JSP) but not too large variety of them, and also used Java in non-Web environment, e.g. GUI or some networking stuff. Joe did some scripting, a bit SQL and some basic system administration, but so far did not encounter the "true enterprise" technology jungle.
So, what should I look at, asks Joe ?
Given your solid Java background, build on your strength. Java may not have the sexappeal of the "language of the week" (which seems to be Haskell or F# or Erlang ...), but is solid, very dependable with good market penetration and it is here to stay. Making Java the center of your skillset is a good choice. If you have not look at Java 5, do it. I mean look at the NEW things available like generics, annotations, new API's for concurrency, etc.
In Java Enterprise space, one single most important thing happening is Spring framework. There are way too many frameworks for anything you can imagine so it is risky bet to pick one and rely on its longevity - but Spring is safe bet. Currently in version 2.5, it pretty much sums up all important trends of 2004-2007: inversion of control, aspect oriented programming, design by interface, test driven development, agile design techniques support, extending Java platform by Domain Specific Languages. It does NOT implement everything, but it provides a glue, platform that can be found everywhere. And you can find it pretty much everywhere - from Web applications to rich clients. Solid understanding of principles it represents will make your programs easier to understand, integrate, test and enhance. Spring was even influencer of Java standards - the new, radically different EJB 3 is (roughly speaking) Spring plus ORM - not that I had too high opinion about this EJB idea :-).
In Web application development - if you stay on Java platform - Spring has also much to offer. The Spring own MVC implementation is one of the very clean and extremely flexible approaches available for building your Web layer. Pluggable view technologies (you can mix and match the JSP/JSTL, Freemarker, Velocity, PDF), support for workflows (via Webflow), availability of security enhancements (Aecegi) makes it worthy exploring.
But what else than Java ? There are so many other languages - which are worth the time investment ? My take on this that you should not learn a new language that does not change your views about programming. Unless, of course you have very convincing reason to do so - like having is a long term project with dare need of this skill - this is how I learned VBA back in 1993.
There is a lot of "software enlightement" value to be found in exotic languages, that are often impractical and unsuitable for commercial skill marketplace, such as Lisp, Smalltalk or Prolog. Lot of fun and little money. Good middle ground between educational value, beauty and commercial usability is Ruby. It is real fun to use, gives you power of Perl (without the cryptic syntax), elegance of Python (with added cleanness and consistency). Ruby is also available in JVM implementation (JRuby) and offers an inroad to something really novel and interesting - Rails.
From this point of view, mastering "the other platform" (.NET) will not teach you too much. The C# 2.0 is so close to Java that learning it for experienced Java programmer is a no-issue (of course, mastering libraries and frameworks available is completely different story). The really new additions into Windows development toolkit with .NET framework 3.x are features as LINQ (in many areas - SQL, XML) and WPF (as replacement for Winforms ??). Certainly interesting, but they are often "me too" solutions than something really new. They are not bad, if your projects bind you to .NET platform, they are certainly worth of learning - but IMHO the real fun is elsewhere.
Unfortunately, one cannot avoid the feeling that not too much innovation is coming from Redmond in last couple of years - just check Zune vs iPod, Vista vs OS-x, Windows Live vs. Google offering etc. On the positive side, there is strong market demand for Windows based solutions, from Enterprise point of view, their server products are often better than their reputation. SQL Server 2005 has great price/performance ratio and is generally very good database server, development environments (VS 2005/2008) and comparable and close to what the Java world has (Eclipse, Idea, Netbeans).
In Web development on Windows - aka ASP.NET - an experienced Java developer will feel both surprised (by very rich controls offering) and limited (by not so great pagecentric postback-based navigational model and lack of usable MVC implementation). Compared to richness of Web framework implementations in Java, this is very sobering experience. Currently, even Microsoft seems to feel the need to address this - see Scott Guthrie and first Beta versions of true Model-View-Controller for ASP.NET. It's about time ...
What you need to be aware of is that in long term, Microsoft loves to do these right-angle-technology-turns (RATTs) that will invalidate your investment into mastering particular technology. I learned it the hard way - none of the expertise in MFC and C++, ATL or COM/DCOM has too much market value today. As Joel On Software outlines, I am not alone (read more here). And I have the nagging feeling that maybe transition from Winforms to WPF may be yet another RATT. But I may be wrong, I have not really spent enough time in WPF (unlike in Winforms). To sum it up - from opportunities perspective, Microsoft technologies are good investment and tradeoff for pretty much guarantee of more opportunities coupled with (usually) less fun.
Both Java and C# are language of similar "altitude" or expressive power. Quite often trying to rise your altitude and work with very high level language is quite eye-opening experience. There are many scripting languages out there, I would pick two. First is (obviously) already mentioned Ruby. If you want to stay closer to Java integration, look at Groovy - an in-JVM high level scripting language, with not as pretty syntax, but easier to intermix with Java - although as we know, beauty is in the eye of the beholder. Besides, the Groovy folks seem to be
copying implementing ruby-esque features like crazy, including the killer app, which is in Groovy named Grails :-).
Hmm, looking back, this post is getting pretty long and battery in my MacbookPro is running low (I am typing this in Zavida Coffee which has free WiFi but only few tables where you can plugin your power supply. I guess I finish it tomorrow.
-- to be continued --