Teach Yourself Programming in Ten Years
Teach Yourself Programming in Ten Years
Peter Norvig
Teach Yourself: In 24 hours you won't have time to write several significant
programs, and learn from your successes and failures with them. You won't
have time to work with an experienced programmer and understand what it
is like to live in a C++ environment. In short, you won't have time to learn Chinese
much. So the book can only be talking about a superficial familiarity, not a (Xiaogang Guo)
deep understanding. As Alexander Pope said, a little learning is a dangerous
thing.
C++: In 24 hours you might be able to learn some of the syntax of C++ (if
you already know another language), but you couldn't learn much about how Croatian
to use the language. In short, if you were, say, a Basic programmer, you (Tvrtko Bedekovic)
could learn to write programs in the style of Basic using C++ syntax, but
you couldn't learn what C++ is actually good (and bad) for. So what's the
point? Alan Perlis once said: "A language that doesn't affect the way you
think about programming, is not worth knowing". One possible point is that
you have to learn a tiny bit of C++ (or more likely, something like Esperanto
JavaScript or Processing) because you need to interface with an existing tool (Federico Gobbo)
to accomplish a specific task. But then you're not learning how to program;
you're learning to accomplish that task.
Researchers (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon &
Chase (1973)) have shown it takes about ten years to develop expertise in any of a
wide variety of areas, including chess playing, music composition, telegraph German
operation, painting, piano playing, swimming, tennis, and research in (Stefan Ram)
neuropsychology and topology. The key is deliberative practice: not just doing it
again and again, but challenging yourself with a task that is just beyond your
current ability, trying it, analyzing your performance while and after doing it, and
correcting any mistakes. Then repeat. And repeat again. There appear to be no real
shortcuts: even Mozart, who was a musical prodigy at age 4, took 13 more years Hebrew
before he began to produce world-class music. In another genre, the Beatles (Eric McCain)
seemed to burst onto the scene with a string of #1 hits and an appearance on the Ed
Sullivan show in 1964. But they had been playing small clubs in Liverpool and
Hamburg since 1957, and while they had mass appeal early on, their first great
critical success, Sgt. Peppers, was released in 1967.
Malcolm Gladwell has popularized the idea, although he concentrates on 10,000 Hindi
hours, not 10 years. Henri Cartier-Bresson (1908-2004) had another metric: "Your (Vikash Tiwari)
first 10,000 photographs are your worst." (He didn't anticipate that with digital
cameras, some people can reach that mark in a week.) True expertise may take a
lifetime: Samuel Johnson (1709-1784) said "Excellence in any department can be
attained only by the labor of a lifetime; it is not to be purchased at a lesser price."
And Chaucer (1340-1400) complained "the lyf so short, the craft so long to lerne." Hungarian
Hippocrates (c. 400BC) is known for the excerpt "ars longa, vita brevis", which is (Marton Mestyan)
part of the longer quotation "Ars longa, vita brevis, occasio praeceps,
experimentum periculosum, iudicium difficile", which in English renders as "Life
is short, [the] craft long, opportunity fleeting, experiment treacherous, judgment
difficult." Of course, no single number can be the final answer: it doesn't seem
reasonable to assume that all skills (e.g., programming, chess playing, checkers Indonesian
playing, and music playing) could all require exactly the same amount of time to (Tridjito Santoso)
master, nor that all people will take exactly the same amount of time. As Prof. K.
Anders Ericsson puts it, "In most domains it's remarkable how much time even the
most talented individuals need in order to reach the highest levels of performance.
The 10,000 hour number just gives you a sense that we're talking years of 10 to 20
hours a week which those who some people would argue are the most innately Italian
talented individuals still need to get to the highest level." (Fabio Z. Tessitore)
Talk with other programmers; read other programs. This is more important
than any book or training course. Polish
(Kuba Nowak)
If you want, put in four years at a college (or more at a graduate school).
This will give you access to some jobs that require credentials, and it will
give you a deeper understanding of the field, but if you don't enjoy school,
you can (with some dedication) get similar experience on your own or on the
job. In any case, book learning alone won't be enough. "Computer science Portuguese
education cannot make anybody an expert programmer any more than (Augusto Radtke)
studying brushes and pigment can make somebody an expert painter" says
Eric Raymond, author of The New Hacker's Dictionary. One of the best
programmers I ever hired had only a High School degree; he's produced a lot
of great software, has his own news group, and made enough in stock
options to buy his own nightclub. Romanian
(Ştefan Lazăr)
Work on projects with other programmers. Be the best programmer on
some projects; be the worst on some others. When you're the best, you get to
test your abilities to lead a project, and to inspire others with your vision.
When you're the worst, you learn what the masters do, and you learn what
they don't like to do (because they make you do it for them). Russian
(Konstantin Ptitsyn)
Work on projects after other programmers. Understand a program written
by someone else. See what it takes to understand and fix it when the original
programmers are not around. Think about how to design your programs to
make it easier for those who will maintain them after you.
Serbian
Learn at least a half dozen programming languages. Include one language (Lazar Kovacevic)
that emphasizes class abstractions (like Java or C++), one that emphasizes
functional abstraction (like Lisp or ML or Haskell), one that supports
syntactic abstraction (like Lisp), one that supports declarative specifications
(like Prolog or C++ templates), and one that emphasizes parallelism (like
Clojure or Go). Spanish
(Carlos Rueda)
Remember that there is a "computer" in "computer science". Know how
long it takes your computer to execute an instruction, fetch a word from
memory (with and without a cache miss), read consecutive words from disk,
and seek to a new location on disk. (Answers here.)
Slovak
Get involved in a language standardization effort. It could be the ANSI (Jan Waclawek)
C++ committee, or it could be deciding if your local coding style will have 2
or 4 space indentation levels. Either way, you learn about what other people
like in a language, how deeply they feel so, and perhaps even a little about
why they feel so.
Turkish
Have the good sense to get off the language standardization effort as quickly (Çağıl Uluşahin)
as possible.
With all that in mind, its questionable how far you can get just by book learning.
Before my first child was born, I read all the How To books, and still felt like a
clueless novice. 30 Months later, when my second child was due, did I go back to
the books for a refresher? No. Instead, I relied on my personal experience, which Ukranian
turned out to be far more useful and reassuring to me than the thousands of pages (Oleksii
written by experts. Molchanovskyi)
Fred Brooks, in his essay No Silver Bullet identified a three-part plan for finding
great software designers:
This assumes that some people already have the qualities necessary for being a
great designer; the job is to properly coax them along. Alan Perlis put it more
succinctly: "Everyone can be taught to sculpt: Michelangelo would have had to be
taught how not to. So it is with the great programmers". Perlis is saying that the
greats have some internal quality that transcends their training. But where does the
quality come from? Is it innate? Or do they develop it through diligence? As
Auguste Gusteau (the fictional chef in Ratatouille) puts it, "anyone can cook, but
only the fearless can be great." I think of it more as willingness to devote a large
portion of one's life to deliberative practice. But maybe fearless is a way to
summarize that. Or, as Gusteau's critic, Anton Ego, says: "Not everyone can
become a great artist, but a great artist can come from anywhere."
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Bryan, W.L. & Harter, N. "Studies on the telegraphic language: The acquisition of
a hierarchy of habits. Psychology Review, 1899, 8, 345-375
Answers
Approximate timing for various operations on a typical PC:
Use your friends. When asked "what operating system should I use,
Windows, Unix, or Mac?", my answer is usually: "use whatever your friends
use." The advantage you get from learning from your friends will offset any
intrinsic difference between OS, or between programming languages. Also
consider your future friends: the community of programmers that you will
be a part of if you continue. Does your chosen language have a large
growing community or a small dying one? Are there books, web sites, and
online forums to get answers from? Do you like the people in those forums?
Keep it simple. Programming languages such as C++ and Java are designed
for professional development by large teams of experienced programmers
who are concerned about the run-time efficiency of their code. As a result,
these languages have complicated parts designed for these circumstances.
You're concerned with learning to program. You don't need that
complication. You want a language that was designed to be easy to learn and
remember by a single new programmer.
Play. Which way would you rather learn to play the piano: the normal,
interactive way, in which you hear each note as soon as you hit a key, or
"batch" mode, in which you only hear the notes after you finish a whole
song? Clearly, interactive mode makes learning easier for the piano, and also
for programming. Insist on a language with an interactive mode and use it.
Notes
T. Capey points out that the Complete Problem Solver page on Amazon now has
the "Teach Yourself Bengali in 21 days" and "Teach Yourself Grammar and Style"
books under the "Customers who shopped for this item also shopped for these
items" section. I guess that a large portion of the people who look at that book are
coming from this page. Thanks to Ross Cohen for help with Hippocrates.
14 Comments norvig.com
1 Login
LOG IN WITH
OR SIGN UP WITH DISQUS ?
Name
i come here to decide whether to jump and into the field or not, actually
for personal use, and not as a profession. Now it seem to be a long
unknown path. Should I hire somebody to accomplish my programming
needs? Still a question.
3△ ▽ • Reply • Share ›