Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
How to Choose and Learn a New Programming Language (micahelliott.com)
34 points by Anon84 on March 30, 2009 | hide | past | favorite | 14 comments


He misinterprets Norvig. The author claims that Norvig said: "it takes about ten years to develop expertise in [a programming language]." The author then goes to say Norvig was wrong, and he explains why.

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.


That's also a bit of a misinterpretation - nobody can learn all programming, particularly not in 10 years. Heck, it's basically impossible to keep up with just the programming going on in the Googleplex, because new knowledge is created faster than anyone can learn it. Just keeping up with the new features and best practices for the webserver used on the search property (that's one component of one product) is basically a full-time job.

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.


Get into the semantics and formal methods side of things and you can pretty much "learn" all programming in ten grueling years. Start with lambda calculus, combinators, basic one-step operational semantics to reason about virtual machines, move to large-step operational semantics for the academic hand-waving, taste a little axiomatic logic stuff and proofs, maybe dabble in prolog-type resolution and inference, backward and forward chaining, take a deep breath and study a little syntax theory, mess with turing machines and automata, maybe pickup a little "actual" machine and write a compiler for a clean Algol dialect, say, Scheme (oh no I didn't just call Scheme an Algol dialect!) Yeah, like I was saying, do your first Pascal then do a little Lisp, like Scheme (wtf? didn't I just call scheme an Algol dialect? what is it?)

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]


I was gonna come back with "And then someone asks you to write a GUI...", but then I read your punchline. Well played.

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.


This reads like a core dump -- informative yet dense, verbose, and difficult to parse.


This is the second-most-awesome comment on HN.


Fair enough. I think I consider an expert in programming to effectively know all programming. Granted, they don't know everything, but they understand the fundamentals well enough that they can pick up most anything in a few days.


More generally, they say it takes 10,000 hours to become an expert at anything. If you were to spend half of each 8 hour working day programming (as opposed to other tasks) for 50 weeks a year, that is 1,000 hours per year -- 10 years! Sounds about right to me.


Where do all of you suggest someone to start who is new to programming and interested in web development? I am beginning with Ruby, but would like to know what some of you think. Python would be my second choice.

Any pros/cons in your opinion?


Web development will expose you to the worst parts of programming: bug-compatibility, broken non standard-compliant systems, bad layering of one type system over another incompatible one (session management over state-less HTTP), and finally primitive edit-and-reload development process.

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


Python is more widely used which is a pretty big pro. The semantical differences between the two are pretty arbitrary and not worth debating. One nice thing about Ruby though is it has this great learning IDE available: http://hacketyhack.net/.


Anything with a good REPL: http://en.wikipedia.org/wiki/REPL


I always find that the easiest languages to learn are ones I can get up and running with quickly, and that can solve problems I have. This made Python quite easy for me to learn, and I imagine Ruby would allow for similar ease.

It made Erlang incredibly difficult. :D


I dislike C++, but I like how sometimes it allows me to solve problems that everything else cannot do as efficiently.




Consider applying for YC's Fall 2025 batch! Applications are open till Aug 4

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: