|Think about Loose Coupling|
Now, I tend to be a fairly rabid fan of the Pragmatic Programmer book and/or approach. I've adopted most of the techniques in their eponymous book, and it's made me a better hacker. But I don't buy the advice: "Learn at least one new language every year" (p. 14).
I can't think of any language that I've been competent in after a year. C? (Hell no.) Pascal? (Er, did I just admit to knowing Pascal?) SQL? (shudder) Java? (Pshaw.) Common Lisp? (Not even close.) Prolog? (I'm still not competent in Prolog.) Perl? (Well, I was sort-of competent in C at the time, does that count?) Scheme? (Still writing defun, and it's been three years.) Haskell? (What's a monad?) I've been hacking C for a decade or so, and I'm far from C-guru status. Why should I expect to get far after a year of study?
Not counting assembly languages, shells, and one scripting language that shall not be named, that makes nine languages that I "know". After a year's experience with each language I hadn't even scratched the surface of what that language had to offer.
That might've been different if I'd been using the new language exclusively for a year, but who can devote a year's worth of programming to learning an unfamiliar tool? I'm in a better position than most -- I'm a grad student, with flexible deadlines and a tolerant supervisor -- but I'm mostly interested in using the right tool for the job, not in advancing my skills with a nifty language unconnected to my job. I have a feeling that most programmers, Pragmatic or not, are in an even worse position when it comes to learning the ins and outs of a new language - and especially developing a new point of view on programming, which IMO is the best reason to learn a new language.
Not that I think we should stick to the languages we know (although they deserve brain-time, too). Of course we should learn new languages, especially languages that break our brains in useful and creative ways. I know C, C++, Java, and Perl. Learning another procedural/OO language (Objective C is on my hit list) isn't likely to teach me anything world-shatteringly new. Learning a stack-based language like FORTH (or perhaps more usefully PostScript), on the other hand, would probably be a decent idea. (That's on my little list, too.)
I just think that the "one a year" timeframe is misleading. Unless you devote an impractically large chunk of time to that new language, one year isn't enough. Ten years might be closer to the truth. (Who knows? Maybe nine years from now I'll grok continuation-passing style in fullness.) Start learning a new language a year (or every two or three), but don't expect real results for at least two. Crank up a pipeline.
While we're at it, I don't think we should be focusing on languages. Rare is the language that's conceptually different from every other computer language with an open-source cross-platform implementation. Concepts are more important than languages, hands down. It doesn't matter whether I write closure-slinging functional code in Haskell, Common Lisp, OCaml, or Perl, I can express what I want to regardless. The idea of closure-slinging is what's important, not the implementation language.
Programming languages, especially programming languages that teach you something you didn't already know, are too complex to be properly learned in a year. Programming, in general, is hard. Let's keep that in mind.
Edit 2004 Oct 7: Fixed the PragProg link. What's that preview button for, again? sigh