
How to Choose and Learn a New Programming Language - Anon84
http://micahelliott.com/2009/03/how-to-choose-and-learn-a-new-programming-language/
======
smanek
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.

~~~
nostrademons
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.

~~~
mahmud
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]

~~~
nostrademons
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.

------
danielzarick
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?

~~~
mahmud
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

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

