How to Choose and Learn a New Programming Language
micahelliott.com
micahelliott.com
Norvig really said that it takes ten years to learn programming. There is a difference. Norvig explicitly includes learning half a dozen languages (including one OO language, one functional language, one with macros, one with coroutines, one with parallelism, and so on). Norvig's 10 years is how long it takes to learn all programming. After following his program, you should have expertise in pretty much every major paradigm and style, and be able to pick up any new language quickly.
Rather, 10 years is how long it takes to become an expert in programming. Someone who's base of knowledge is broad and deep enough that he can form new connections between subject areas that advance the state of the art. Basically, the amount of time it takes to do useful, creative, original work.
Expertise in a bunch of programming languages is a necessary but not sufficient part of that. Hell, I know at least half a dozen languages, including OO, functional, macros, coroutines, parallelism, etc. I've been working seriously at being a programmer for about 5 years (plus dabbling with occasional programs since I was 10 - that's another 12 years). But Norvig's definition also includes significant domain knowledge, and having experienced all phases of the lifecycle of a project, and knowing what other people value in code, and fundamental algorithm knowledge, and plenty of other stuff besides languages.
By now you're pretty much ready to mess with early Lambda papers, but before you start, grab Wilson and read up on Uniprocessor garbage collection techniques. Yeah, you pretty much ignored languages without automatic memory allocation, but you aren't missing much; ones with block structure and no heap allocation can be done with a strict stack discipline, pick up Hennesy and Patterson and play with SPIM, you targeted MIPS in your early pascal compiler right? right? And Algol type languages that need dynamic allocation usually need it for datastructures, and not executable code, so you wont have to worry about closures, again, read up on Wilson and implement that with the Unix brk(2) system call. Big boy! (or girl!)
It's time mess with a few real systems; you look at GCC and it's a mess, you opt for LCC and it's a well documented toy, you get bored with C and discover Common Lisp. Without even trying, you pretty much learned a bunch of scripting languages and tool syntaxes just to get things done. CMUCL keeps you busy for about 2 years during which you realize you're not really done with programming. So you "learn" denotational semantics. No one ever learns denotational semantics, not even Scott and Strachey. As a matter of fact, you didn't even learn lambda calculus when you said you learned earlier. Time for Barendregt! the big yellow book that falls apart in your hand. Worst binding ever. You spend six months in the first two chapters.
By now you have memorized CiteSeer, you have grown an afro and you're pretty much feral. You go back to fuck with combinators and you're side tracked to term-rewriting and all that jazz, stuff wacko British guys come up to milk Red-Brick institutions for grant money. Graph reduction is your next step and by now you're tethered to your last neuron, stretched thin. You're sick to your stomach of all this theory. You think more than you feel, so you go back to the basics and learn yourself mathematics .. but your ten years are almost over and you're still not a programmer. You know everything and nothing. You can hack on machines that haven't been invented yet.
All this hasn't prepared you for a career in web development, and now you're a lamer in SitePoint forums begging people to teach you CSS and Photoshop. The joys of being a startup hacker.
[Edit: inserted line-breaks for the meek]
The irony is that your post basically describes what I did in college while avoiding my physics homework. I learned Lisp, lambda calculus, Haskell, denotational semantics, SICP, continuations, 4 different ways of implementing continuations, multimethods, a bunch of different garbage collection algorithms, implemented a bunch of Scheme variants, combinator graph reduction, Ocaml, JoCaml and the join calculus, operational transformations, STM, and Erlang. And then I went out into the real world and became a UI programmer. The first thing I've gotta do when I get into work tomorrow is make this nifty JavaScript hack work with IE8.
Any pros/cons in your opinion?
If you start with desktop application programming, even console programming, you will see what the fuss is really about. Once you have had your few years of honey moon doing stuff for fun and learning proper systems engineering, you can move on to developing web applications.
Ahhh fuckit, just learn PHP and you will be gainfully employed for a very long time, plus you will make useful things for other people. Also, avoid talking to people like me :-P
It made Erlang incredibly difficult. :D