PeterNorvig's guide to becoming a programmer. http://www.norvig.com/21-days.html '' from the site ...'' Researchers have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. 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, appearing on the Ed Sullivan show in 1964. But they had been playing since 1957, and while they had mass appeal early on, their first great critical success, Sgt. Peppers, was released in 1967. Some notable writers think it takes longer: : "Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price." : -- SamuelJohnson : "the lyf so short, the craft so long to lerne." : -- Chaucer ''And Chaucer was only talking about the craft of spelling!'' (Sorry Ward, I couldn't resist. - wm) Chaucer was probably thinking 'ArsLongaVitaBrevis'. ---- "A smart programmer requires only ten years to learn that you should not do things the wrong way, even if you are sure it will not matter." -- MarkJasonDominus ---- ''Parenthetically, the answers to the quiz on machine timings aren't all correct.'' ---- Unfortunately, many companies won't allow programmers with ten years of experience to keep programming. Experienced people are forced to become managers or salespeople. InexperiencedTeamsAreRampant. ---- In other industries, are people with five years of experience considered to be "senior level"? If not, why is it so in the IT world? ---- OK, so you're on track for being a GoodProgrammer. What other skills do you need to learn, while you're going along? We can probably rate chess playing and music composition over painting or swimming. Martial arts and the philosophy behind them also seem to be useful. But there are other skills, which many non-programmers take for granted. It is assumed you would pick them up if you could, but it may take more effort than that. PaulGraham's article "Why nerds are unpopular" (http://www.paulgraham.com/nerds.html , 6000 words, but don't let that put you off) points out that you probably didn't play the BeingPopularGame full-time [PlayTheGameFullTime] like the other kids. In an office the rules are different and usually softer, but some PeopleSkills would probably be handy. Apparently I have some catching up to do. Maybe I can cheat if I ThrowMoneyAtTheProblem now. ---- Interesting - I'd place painting (for improvement of visualization abilities and visual memory) and swimming (for very good physical exercise, which increase concentration and increase brain capacity) over chess playing (exercise of specific pattern recognition ability and some training of ability to choose to look at things strategically) and music composition (training of audial memory and recognition capacity). Why did you place these in the opposite order? I would rate the following skills high: * General oral communication and "people skills". I use projection ("How would I feel in a similar situation?"), talking to a lot of different people (I explicitly chose to be interested in people - and voila, they turned out to be interesting), and NeuroLinguisticProgramming for this. * Visualization. Painting, as above. * Understanding business. Go through various sides of running a business, to be able to get some feel for where expenses come in, etc. Knowing business lets you talk to managers in their own language - invaluable :-) * Project management. Pick up some books, and try to interact with your project manager. * Physical exercise. Find something you like to do, and make sure you actually do it. * SpeedReading. Being able to pick up a book and read it fast gives you both better reading comprehension, more pleasure out of the book, and the ability to FeedYourBrain. * Memory skills. There are a bunch of tricks for improving memory - use them, and train your memory. -- AnonymousDonor Music composition appears to me as declaratively programming a temporal system; a formal language that probably strikes a chord with programmers. Whereas painting is more about seeing and composing patterns and semantics and abstracting them into a form that makes other people see what I want them to see. Then again, writing literature could be described as programming people to think in a certain manner, bad writers being bad programmers. Now where was that nail again... -- AnonymousDonor ---- Is it just me, or is chess an exception to this seeming rule? Costin, can you speak to this? -- GarryHamilton I doubt it. Chess is vastly simpler than much of the above, so that helps a bit at the beginning. I suspect that chess prodigies still take about 10 years to get to the top of their game. Certainly seems to be true of more complicated games, such as go. ''Chess also takes at least 10 years to reach the top of the game (for world champions and top grand masters). In any case with the right amount of effort (i.e. forget about school) children can reach a GM level in 5-6 years, which is in my fuzzy estimate a better intellectual performance level than say your (100K$ , >10 yr experience) senior programmer in the industry.'' ''On the other hand, while searching for some kind of objective evidence rather than everybody's "it must be so" kind of feeling, I remembered that IcfpProgrammingContest was won in 2004 by a team of students who didn't look like having ten years of programming, most certainly they didn't have ten year of programming for bread. Yet, the programming art they displayed was outstanding. Therefore, the correct answer is ItDepends. I happen to believe that in programming, just like in chess, there are accelerated paths to achieve outstanding performance, it depends on one's commitment, effort and sacrifices invested in the process.'' Are you sure of that? A lot of top undergrad coders have about 10 years experience, and have written a lot of code. In some ways, although they are usually not usually putting in full time hours since childhood (but sometimes they are, again these are the top few, not average students), the sort of coding they do can be pedagogically much better than full time `for bread'. I suspect the wrong sort of full time programming job will probably make you a worse programmer, after a few years. Also, think about how much time you spend on extraneous activities during a typical week.... ---- By this argument, programmers with nearly 10 years of experience who become managers, will take another 10 years to become good at it. Could be right. How long to not suck badly? ---- Yikes. : Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal). Is he for real? Does this reflect the experience of users of this site? (I am reminded inevitably of SpecializationIsForInsects.) * I think he missed a few critical entries, such as support for constraint/logic programming and support for distributed programming. * ''Truth. Become skilled in at least one intellectually related field as well, such as music, mathematics, carpentry, vehicle repair, writing or cooking. These will expand your brain in a way that pure coding cannot. Ten years is nowhere near enough, either. I've spent thirty years coding almost every day to reach a level of ability that I consider tolerable; in another thirty years, I might actually be good. Ten years might be enough to attain guru status in any typical coding job; it shouldn't be considered anything but mere apprenticeship compared to what programming, as a craft, should be. Mastery of programming is the most complex and difficult creative process a human can undertake, therefore we should not expect true expertise to be achieved in anything less than multiple decades of continuous and dedicated discipline.'' ''Half a dozen languages with diverse approaches to programming? Personally, I think, yes, this is quite realistic in order to consider yourself well-versed in programming techniques. Anything less will leave you blind to numerous opportunities. And yes, I think there are a lot of users on this site who have this much experience and more. But probably not too many that would consider themselves ''experts'' in each of these languages. (The only place I come up short on this list is parallelism, although I vaguely remember spending a little time looking at Occam.)'' Turing Completeness only guarantees mathematical equivalence between languages. How can you be certain that you are using the tool best suited for you, your job and your problem at hand, if you are not at least minimally aware of the alternatives? ---- ''See also: FirstLanguageLearned''