http://norvig.com/21-days.html
Why is everyone in such a rush?
Walk into any bookstore, and you'll see how to Teach Yourself Javain 7 Days alongside endless variations offering to teach VisualBasic, Windows, the Internet, and so on in a few days or hours. I didthe following power search at Amazon.com:pubdate: after 1992 and title: days and (title: learn or title: teach yourself)and got back 248 hits. The first 78 were computer books (number 79was LearnBengali in 30 days). I replaced "days" with "hours"and got remarkably similar results: 253 more books, with 77 computerbooks followed by TeachYourself Grammar and Style in 24 Hours at number 78. Out ofthe top 200 total, 96% were computer books.
The conclusion is that either people are in a big rush to learnabout computers, or that computers are somehow fabulously easier tolearn than anything else. There are no books on how to learnBeethoven, or Quantum Physics, or even Dog Grooming in a few days.Felleisen et al.give a nod to this trend in their book How to Design Programs, when they say"Bad programming is easy. Idiots can learn it in 21 days,even if they are dummies.
Let's analyze what a title like Learn C++ in Three Dayscould mean:
- Learn: In 3 days you won't have time to write severalsignificant programs, and learn from your successes and failures withthem. You won't have time to work with an experienced programmer andunderstand what it is like to live in a C++ environment. In short, youwon't have time to learn much. So the book can only be talking about asuperficial familiarity, not a deep understanding. As Alexander Pope said,a little learning is a dangerous thing.
- C++: In 3 days you might be able to learn some of the syntax ofC++ (if you already know another language), but you couldn'tlearn much about how to use the language. In short, if you were, say, aBasic programmer, you could learn to write programs in the style ofBasic using C++ syntax, but you couldn't learn what C++ isactually good (and bad) for. So what's the point? AlanPerlis once said: "A language that doesn't affect the way youthink about programming, is not worth knowing". One possible point isthat you have to learn a tiny bit of C++ (or more likely, somethinglike JavaScript or Flash's Flex) because you need to interface with anexisting tool to accomplish a specific task. But then you're notlearning how to program; you're learning to accomplish that task.
- in Three Days: Unfortunately, this is not enough, as the nextsection shows.
Teach Yourself Programming in Ten Years
Researchers ( Bloom(1985), Bryan & Harter (1899), Hayes(1989), Simmon & Chase (1973)) have shown ittakes about ten years to develop expertise in any of a wide variety ofareas, including chess playing, music composition, telegraphoperation, painting, piano playing, swimming, tennis, and research inneuropsychology and topology. The key is deliberativepractice: not just doing it again and again, but challenging yourselfwith a task that is just beyond your current ability, trying it,analyzing your performance while and after doing it, and correctingany mistakes. Then repeat. And repeat again. There appear to be noreal shortcuts: even Mozart, who was a musical prodigy at age 4, took13 more years before he began to produce world-class music. Inanother genre, the Beatles seemed to burst onto the scene with astring of #1 hits and an appearance on the Ed Sullivan show in 1964.But they had been playing small clubs in Liverpool and Hamburg since1957, and while they had mass appeal early on, their first greatcritical success, Sgt. Peppers, was released in 1967. MalcolmGladwell reports that a study of students at the Berlin Academy ofMusic compared the top, middle, and bottom third of the class andasked them how much they had practiced:Everyone, from all three groups, started playing at roughly the sametime - around the age of five. In those first few years, everyonepractised roughly the same amount - about two or three hours aweek. But around the age of eight real differences started toemerge. The students who would end up as the best in their class beganto practise more than everyone else: six hours a week by age nine,eight by age 12, 16 a week by age 14, and up and up, until by the ageof 20 they were practising well over 30 hours a week. By the age of20, the elite performers had all totalled 10,000 hours of practiceover the course of their lives. The merely good students had totalled,by contrast, 8,000 hours, and the future music teachers just over4,000 hours.
So it may be that 10,000 hours, not 10 years, is the magic number.(Henri Cartier-Bresson (1908-2004) said "Your first 10,000 photographs are your worst,"but he shot more than one an hour.)Samuel Johnson (1709-1784) thought ittook even longer: "Excellence in any department can beattained only by the labor of a lifetime; it is not to be purchased ata lesser price." And Chaucer (1340-1400) complained "the lyf so short, the craftso long to lerne." Hippocrates (c. 400BC) is known for the excerpt "ars longa,vita brevis", which is part of the longer quotation "Ars longa, vitabrevis, occasio praeceps, experimentum periculosum, iudiciumdifficile", which in English renders as "Life is short, [the] craftlong, opportunity fleeting, experiment treacherous, judgmentdifficult." Although in Latin, ars can mean either art orcraft, in the original Greek the word "techne" can only mean "skill", not "art".
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 surethat 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 learningby doing. To put it more technically, "the maximal level ofperformance for individuals in a given domain is not attainedautomatically as a function of extended experience, but the level ofperformance can be increased even by highly experienced individuals asa result of deliberate efforts to improve." (p. 366)and "the most effective learning requires a well-defined task with anappropriate difficulty level for the particular individual,informative feedback, and opportunities for repetition and correctionsof errors." (p. 20-21) The book Cognition in Practice: Mind, Mathematics, and Culture in EverydayLife is an interesting reference for this viewpoint.
- Talk with other programmers; read other programs. This is more importantthan any book or training course.
- If you want, put in four years at a college (or more at agraduate school). This will give you access to some jobs that requirecredentials, and it will give you a deeper understanding of the field,but if you don't enjoy school, you can (with some dedication) getsimilar experience on your own or on the job. In any case, book learning alone won'tbe enough. "Computer science education cannot make anybody an expertprogrammer any more than studying brushes and pigment can makesomebody an expert painter" says Eric Raymond, author of The NewHacker's Dictionary. One of the best programmers I ever hired hadonly 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 programmeron 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 inspireothers with your vision. When you're the worst, you learn what themasters do, and you learn what they don't like to do (because theymake you do it for them).
- Work on projects after other programmers. Understand a program written by someone else. See what it takes tounderstand and fix it when the original programmers are notaround. Think about how to design your programs to make it easier forthose who will maintain them after you.
- Learn at least a half dozen programming languages. Include onelanguage that supports class abstractions (like Java or C++), one thatsupports functional abstraction (like Lisp or ML), onethat supports syntactic abstraction (like Lisp), onethat supports declarative specifications (like Prolog or C++templates), one that supports coroutines (like Icon or Scheme), andone that supports parallelism (like Sisal).
- Remember that there is a "computer" in "computer science". Knowhow long it takes your computer to execute an instruction, fetch aword 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 languagestandardization effort. It could be the ANSI C++ committee, or itcould be deciding if your local coding style will have 2 or 4 spaceindentation levels. Either way, you learn about what other peoplelike in a language, how deeply they feel so, and perhaps even a littleabout why they feel so.
- Have the good sense to get off the language standardization effort asquickly as possible.
Fred Brooks, in his essay No Silver Bullet identified a three-part plan for finding greatsoftware designers:
- Systematically identify top designers as early as possible.
- Assign a career mentor to be responsible for the development of the prospect and carefully keep a career file.
- Provide opportunities for growing designers to interact and stimulate each other.
So go ahead and buy that Java/Ruby/Javascript/PHP book; you'llprobably get some use out of it. But you won't change your life, oryour real overall expertise as a programmer in 24 hours, days, oreven weeks. How about working hard to continually improve over 24 months?Well, now you're starting to get somewhere...
References
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Chase, William G. & Simon, Herbert A. "Perception in Chess"Cognitive Psychology, 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in EverydayLife, Cambridge University Press, 1988.
AnswersApproximate timing for various operations on a typical PC:
Appendix: Language ChoiceSeveral people have asked what programming language they should learn first.There is no one answer, but consider these points:
Appendix: Books and Other ResourcesSeveral people have asked what books and web pages they should learnfrom. I repeat that "book learning alone won't be enough" but I canrecommend the following:
NotesT. 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. |