魔咒任他念,我心不会乱
话剧《红色》里有一段台词像极了我们今天的生活:
好看,美丽,可爱,很好————这就是我们今天的生活,所有一切都很好。我们套上滑稽的鼻子和眼睛,踩在溜滑的香蕉皮上,电视把一切变得快乐,人人都在哈哈大笑,从早到晚,一切都他妈的如此有趣,笑口常开。
这是宪法赋予我们的权利对吗?我们是一个笑脸之国,生活在很好的暴政之下。
你好吗?很好。
最近怎样?很好。
你感觉如何?很好。
你觉得这幅画怎样?很好。
一块吃晚饭吧?很好。
—— 很好
Teach Yourself Programming in Ten Years
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 operation, painting, piano playing, swimming, tennis, and research in 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 before he began to produce world-class music. In another genre, the Beatles 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 hours, not 10 years. Henri Cartier-Bresson (1908-2004) had another metric: "Your 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." Hippocrates (c. 400BC) is known for the excerpt "ars longa, vita brevis", which is 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 playing, and music playing) could all require exactly the same amount of time to 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 talented individuals still need to get to the highest level."
So You Want to be a Programmer
Here's my recipe for programming success:
- Get interested in programming, and do some because it is fun. Make sure
that it keeps being enough fun so that you will be willing to put in your ten years/10,000 hours.
- Program. The best kind of learning is learning
by doing. To put it more technically, "the maximal level of
performance for individuals in a given domain is not attained
automatically as a function of extended experience, but the level of
performance can be increased even by highly experienced individuals as
a result of deliberate efforts to improve." (p. 366)
and "the most effective learning requires a well-defined task with an
appropriate difficulty level for the particular individual,
informative feedback, and opportunities for repetition and corrections
of errors." (p. 20-21) The book
Cognition in Practice: Mind, Mathematics, and Culture in Everyday
Life is an interesting
reference for this viewpoint.
- Talk with other programmers; read other programs. This is more important
than any book or training course.
- 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 education cannot make anybody an expert
programmer any more than 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.
- 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).
- 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.
- Learn at least a half dozen programming languages. Include one
language 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).
- 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.)
- Get involved in a language
standardization effort. It could be the ANSI 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.
- Have the good sense to get off the language standardization effort as
quickly as possible.
-- Peter Norvig