Raganwald posted an interesting article on learning programming languages; “When learning a new language or tool, do not shy away from things that seem different, weird, confusing, counter-intuitive, or unfamiliar. Do not put them off because you can work around them. Learn them, try them, and persist with them until you discover why they make sense. This is the true road to teaching yourself a new language. And in today’s fast-moving industry, it’s a road we all share.” – raganwald, The challenge of teaching yourself a programming language
My current role requires me to screen and interview people coming into the R+D team. We look for smart, passionate people and developers in our team are expected to know both C# and Java which apparently is relatively rare. We don’t screen if you only know one, but we make it pretty clear that you’d be expected to learn whichever you didn’t currently know. For some candidates this is a big deal, not because of language favouritism, but the fact that it seems learning is a big deal for them. That tends to not bode well and they tend to follow through with poor responses to non language specific algorithmic and design questions (How would you move mount fuji style). I think one great commonality shared by the guys on the team is that they’re all very clued in and are prepared to jump right in. They look for new solutions to novel problems, and languages, many hammers, is a requirement I think. Some have even had great success and written their own language. I tend to think it’s a good signal for passion for the profession in general. My feeling is that smart people tend to relish challenges and being encouraged and given the opportunity to learn a new language the commonality between them is that they jump at the chance. Learning languages is something that developers just do and the more you do it the easier it becomes.
For R+D or product companies I think hiring people purely for a particular language skill is in the medium to long term is a destructive strategy. My guess is the peak language span is about an average of 10 years following the technology adoption curve. Code depreciates and rots over time. I think that includes languages. Over time classes of problems become more efficient to solve due to the language features. This is one of the fundamental reasons I think cheap meta languages are such a ground shaking concept because your language can evolve as your problems do, but that’s another post. For development/products shipping organisations unless you have people driving the product forward underneath, then relatively to your competitors and new upstarts, you’re going backwards. It is chaotic, and when you’ve got a group of smart passionate people all pushing it can be like herding cats, but the upside is innovative and game changing software. My view is great software engineers can’t stand imperfect solutions, it grates, and languages, with different paradigms and lessons are a way of finding the most efficient solution for the problem. Problem solving is fundamentally a good chunk of what successful software engineering means today. (and well hopefully in the past as well :). That means, having someone on the team that is only prepared to deal with problems with a single hammer will inevitably hold the team back. Pragmatism is required, but people need to be able to make the jump.
At least in the market in which we’re operating at the moment (Australia) it seems there a lot of people coming from overseas and doing their masters, or even Australians are coming through the undergrad program and missing fundamentals. For undergrad study in Australia it used to be more like a US masters but that’s changing very rapidly to become a US style system and I think this will only compound the problem of fundamentals and specific field depth. I think a lot of uni’s are now essentially vocational programs and are becoming single language courses which is not good for the profession. At the uni I went to we never programmed on windows machines, it was always a Unix variant. The business and commerce side had windows labs but not for IT. It was made abundantly clear that for marketable skills you would be expected to learn to do that on your own time and that’s the way the world worked.
Software engineering is a profession where aggressive learning is a requirement for your entire career and my gut feeling at the moment is that there isn’t enough people taking up the challenge. The current state of play in software is fundamentally due to progress from standing on the shoulders of giants and to take part, that means learning and learning from languages.