A more appropriate title to the post might be "Become an expert programmer in 10 years."
We seem to focus on the poles: no coding skills vs. expert coding skills. You can teach yourself to code in less than 10 years, you just might not be an expert.
The "learn to code" debate might be more productive if we allowed for definitions of competency at the stages leading up to expert. The post does a good job of defining the characteristics of expert competency. What does it mean to be an intermediate? How many hours should you expect to invest to get there?
In most domains, the learning curve ramps up sharply for the first few years and then plains off for a longer period. For example, you might move up 80% of the learning curve in 3 years with an intense effort, but the remaining 20% of the journey might take 7 additional years ... or a life time.
I tend to call myself a 121 programmer: I try to improve the total value of my knowledge base by 1% every 21 days. That's realistic, and those 1%'s add up over time.
MacLeod Sociopaths: 121 programmers who optimize for learning.
MacLeod Clueless: 911 programmers who deal with hideous emergencies and compensate for bad management. (9-1-1 is the US emergency telephone number.)
MacLeod Losers: 501 programmers who are out the door as soon as they can go home.
An interesting implementation of the 'learn X in Y years/hours' concept is here: http://thedanplan.com.
"It’s a project in transformation. An experiment in potential and possibilities. Through 10,000 hours of “deliberate practice,” Dan, who currently has minimal golf experience, plans on becoming a professional golfer. But the plan isn’t really about golf: through this process, Dan hopes to prove to himself and others that it’s never too late to start a new pursuit in life."
After 3 years/4000 hours, he's at a 5 handicap after starting from nothing.
"Think of your many years of procrastination; how the gods have repeatedly granted you further periods of grace, of which you have taken no advantage. It is time now to realize the nature of the universe to which you belong, and of that controlling Power whose offspring you are; and to understand that your time has a limit set to it. Use it, then, to advance your enlightenment; or it will be gone, and never in your power again." (Meditations 2:4)
Isn't it odd and curious and such like that the chunks of time bandied about are units of ten? Coincidentally equal to the number of fingers on our hands. 10 years. 10,000 hours. I'd be willing to bet my granny's dentures that if we had eight fingers on each hand those numbers would be 16 years and 65536 hours (well, I mean it would still be 10 and 10,000 but you know what I mean).
Also, did you know that in many cultures (ancient Greece, Aramaic, Hebrew, Chinese, to name but some) 10,000† just means "a heck of a lot", "more than you can count". So you see, 10,000 is a bit too magical for me to take seriously.
Imprecision (one significant digit) + Benford's law (most numbers start with 1) means most numbers needing citation are of the form 10^n. http://en.wikipedia.org/wiki/Benfords_law
Interestingly, this would be true even if we had 8 fingers per hand. If we had 16 total fingers, 16 (base 10) would be written as "10" (base 16). 15 (base 10) would be a one digit number in base 16.
On the other hand, you'd rather have six fingers. Base 12 would be great because it has whole thirds! Also 12 is divisible by four numbers (2, 3, 4, and 6). 10 is divisible only by only 2 and 5, and fifths are much less common than thirds.
That's why 12 inches in a foot and 3 feet in a yard is a nice way to measure things (though the rest of the imperial system, excepting maybe Fahrenheit, has no excuse!)
Why is that a reason to not take it serious? It's an order-of-magnitude estimate, like Carl Sagan's "billions and billions" of stars, or the Bible's "40"
> Also, did you know that in many cultures (ancient Greece, Aramaic, Hebrew, Chinese, to name but some) 10,000† just means "a heck of a lot", "more than you can count". So you see, 10,000 is a bit too magical for me to take seriously.
That's the salient point. When Norvig says it takes "10 years" to be a programmer, he means it takes a heckuva long time to master the art, not that it takes 87648 hours with a 95% confidence interval. That figure is not meant to be taken at face value.
If you want to become an expert, you have to put in the time. Personally, all I want is to be able to throw some things together and tell good code from bad, but I'm not a programmer.
I think this is pretty applicable everywhere, though. The cycle of challenging yourself, working through it and challenging yourself again is how I learn best, at least.
I am never surprised when this article reoccurs on HN. Don't try to rush it and continue to put in your time, that is the only way to get better at the craft.
As much as I agree with Norvig here, linking to this article in response to the "I want to learn how to code to build my startup" question is not helpful. Entrepreneurs aren't going to wait 10 years before launching their startup.
The difference, of course, is that some people just want to build an MVP, while others want to be a programmer. In that case, I'd rename this essay: "Become a Programmer in Ten Years."
You can become a programmer very quickly. But if you want to teach yourself to become a good one (something that no one else will do for you), you need to put in the time and effort.
The article isnt called 'become an entrepreneur' in ten years. I didnt see it as a response to anything. Its just a good article. One of the 5-6 that regularly get upvotes every year or two.
It is helpful. Probably force them to have at least one real programmer and thus save them from google indexing their private data or some other epic fail like that.
Self-teaching programmer here. Extensive IT background, and have had a CS class or two in public "B School" type university. After Codecademy, Learn x the hard way a little bit, and even command line hacking with REPL's I have been able to conquer my fear of the abstraction layer. And although I am able to look at programs that exist and I use from a programmer's mindset, I still can not understand how to model my ideas and build them out. I think with a better understanding of core CS concepts and a thorough mental whipping I will be in a better shape. My plan is to get through:
1. SICP/SICP Python
2. {Insert famous Data Structures/ Algorithms book here}
3.Find some open source project on Github of what I want to do, and extend it or even better refactor it.
From there I will be ready to feel more like a programmer. Cause I really breeze through these tutorials, but seem lost thereafter. I am not seeking prodigy status, but I know that I can become a very formidable programmer sooner or later.
I just started working with python about 3-4 weeks ago. No experience other than html, css3 and graphic design.
So I started doing some online classes but they were so boring and simple that I finished them within a day or two. I actually started doing Udacity's CS class when they teach you how to design a search engine, however half way through I realized that this can be done twice as faster with tools that already exist.
From there I read some Django docs, installed it but django was the most confusing framework to me (not really sure why, just didn't like it)
I stumbled upon Flask and I fell in love. Without any knowledge of how to program and how things work I simply started coding, working with db (postgres). Within a week or so I designed a small blogging application that lets you register users, each user can upload photos, create docs and delete them.
I try to code very neatly, and comment on everything. There are a couple of solutions for everything so if I find a better solution I comment out the first one and apply another one.
PS. Don't code for 12h straight. Go out.
If I don't know something, I seek for direction, not an answer. I also walk away from my comp and think about a solution, and these tend to be very easy and can be done with a few lines of code. I guess I use my creativity to solve code problems.
Don't forget to intersperse that with random little projects that you start because you enjoy or want to fix something that bothers you.
IMHO the programmer mindset has less to do with knowing exactly how to fix a problem than with "Hey, I bet I can fix that, and it probably wouldn't even be too hard!" (which are also famous last words, but you can ignore that :)
I feel like a noob too, mostly because I started at 18!
That's to say, I started taking programming seriously at 18. I did write a crappy Visual Basic exe when I was 8, and I dabbled a bit in Flash ActionScript in my teenage years, but I don't really count those years, because I was learning by rote then.
I really only started taking programming seriously when I was in college. Writing an RTOS from scratch was one of my biggest coding achievements. A lot of times, I wish I have a job that's more technically challenging than what I'm doing now.
I started at 12 with C++, then I went over to 13 and learnt some Python, then I learnt Lisp at 16 and that's when I started to actually learn programming.
I know this sounds like a "lel Lisp is superior to your blub lang" but it's more of a "I actually went past procedural programming and stupid OO with Lisp and it felt like I finally actually knew something about the stuff I did".
Dunno why I'm typing this out though, oh what the heck, posting it anyway.
yep I can recall after a year or so at my first job I was considered a bit flash because I used mixed case in my FORTRAN hollerith statements just made the prompts look nice on our PDP11's
In fact having basic prompts whit told the user what the next input was was an innovation I refactored some of the senior guys code to add prompts he was a bit sniffy.
"i know what to type when " which is ok for an experiment at 3 foot scale but scaled up to 1:1 where filling the rigs tank cost 20K (about 1/2 the cost of a house at the time) making sure you didn't blow a run was more important.
Ah. This site. I came across this when I was a kid - like 5-6 years ago - I had googled the term "how to become a hacker".
This guy had opened my eyes then - I was 14 then. He still continues to do so. His links are still relevant and an amazing starting point for anyone who wants to learn.
One should probably keep visiting this page like every 6 months or so - just to check whether you are on the right track to learning.
The article makes a good point. But what's more useful is that programmers skills matrix that someone posted to HN about a year ago. It had a row for every area in comp sci, and then it had columns progrssing in order of depth of knowledge. Over the ten years you chould check off each box one by one.
Given the way we shrug people off for using a language we don't like (or not seeming enough of a polyglot), being pessimistic, not working in the past few months, or any number of other silly things, I can't see how a bias against people with less than 10 years would really hurt matters much further.
Um, hasn't this been posted and reposted already? Not trying to be a smartass, but I thought this article was already pretty popular, and generally the standard response to any beginner asking how he could learn X in 10/21 days.
regarding 10,000 hours ... from Moonwalking with Einstein
"What separates experts from the rest of us is that they tend to engage in a very directed, highly focused routine, which Ericsson has labeled “deliberate practice.” Having studied the best of the best in many different fields, he has found that top achievers tend to follow the same general pattern of development. They develop strategies for consciously keeping out of the autonomous stage while they practice by doing three things: focusing on their technique, staying goal-oriented, and getting constant and immediate feedback on their performance. In other words, they force themselves to stay in the “cognitive phase.”...
The best ice skaters spend more of their practice time trying jumps that they land less often, while lesser skaters work more on jumps they’ve already mastered. Deliberate practice, by its nature, must be hard....
Amateur musicians, for example, are more likely to spend their practice time playing music, whereas pros are more likely to work through tedious exercises or focus on specific, difficult parts of pieces...
When you want to get good at something, how you spend your time practicing is far more important than the amount of time you spend. In fact, in every domain of expertise that’s been rigorously examined, from chess to violin to basketball, studies have found that the number of years one has been doing something correlates only weakly with level of performance."
tl;dr
10,000 hours may not make you expert. Constantly increasing the level of difficulty of what you practice/work on might be more important.
I've heard it's both - that you need to constantly increase the level of difficulty of your practice for 10,000 hours. The research, after all, says "10,000 hours of deliberate practice", and deliberate practice is what you describe above.
If you have some talent and enjoy it, you can teach yourself programming to a pretty high level in a few months. But to master it, like any complex craft, takes a lifetime.
Well, this is the single most article, I personally recommend everyone to read. Mr. Norvig writes specifically about programming but this applies to every department like music, painting or photography. The way this article has spread I guess most of the programmers must have glimpsed it, or at least the good ones.
[+] [-] saintx|13 years ago|reply
He replied "Eight hours."
"Eight hours?"
"Yep, eight hours, every day. It's pretty much just like driving a bus. The hard part is keeping your ass in the seat."
Fifteen years and a master's degree later, his advice remains remarkably accurate.
[+] [-] jrmattox1|13 years ago|reply
We seem to focus on the poles: no coding skills vs. expert coding skills. You can teach yourself to code in less than 10 years, you just might not be an expert.
The "learn to code" debate might be more productive if we allowed for definitions of competency at the stages leading up to expert. The post does a good job of defining the characteristics of expert competency. What does it mean to be an intermediate? How many hours should you expect to invest to get there?
In most domains, the learning curve ramps up sharply for the first few years and then plains off for a longer period. For example, you might move up 80% of the learning curve in 3 years with an intense effort, but the remaining 20% of the journey might take 7 additional years ... or a life time.
[+] [-] michaelochurch|13 years ago|reply
I tend to call myself a 121 programmer: I try to improve the total value of my knowledge base by 1% every 21 days. That's realistic, and those 1%'s add up over time.
MacLeod Sociopaths: 121 programmers who optimize for learning. MacLeod Clueless: 911 programmers who deal with hideous emergencies and compensate for bad management. (9-1-1 is the US emergency telephone number.) MacLeod Losers: 501 programmers who are out the door as soon as they can go home.
[+] [-] cenazoic|13 years ago|reply
"It’s a project in transformation. An experiment in potential and possibilities. Through 10,000 hours of “deliberate practice,” Dan, who currently has minimal golf experience, plans on becoming a professional golfer. But the plan isn’t really about golf: through this process, Dan hopes to prove to himself and others that it’s never too late to start a new pursuit in life."
After 3 years/4000 hours, he's at a 5 handicap after starting from nothing.
[+] [-] Androsynth|13 years ago|reply
"Think of your many years of procrastination; how the gods have repeatedly granted you further periods of grace, of which you have taken no advantage. It is time now to realize the nature of the universe to which you belong, and of that controlling Power whose offspring you are; and to understand that your time has a limit set to it. Use it, then, to advance your enlightenment; or it will be gone, and never in your power again." (Meditations 2:4)
[+] [-] hello_newman|13 years ago|reply
"Everyone on this planet is given the same 24 hours in the day. The question is: what do you choose to do with yours?” - Anno Sensei
[+] [-] igravious|13 years ago|reply
Also, did you know that in many cultures (ancient Greece, Aramaic, Hebrew, Chinese, to name but some) 10,000† just means "a heck of a lot", "more than you can count". So you see, 10,000 is a bit too magical for me to take seriously.
† Here's a wikipedia entry but I think I read about this in a history of mathematics book, cannot remember which one, sorry. http://en.wikipedia.org/wiki/10000_(number)
[+] [-] adamtj|13 years ago|reply
Interestingly, this would be true even if we had 8 fingers per hand. If we had 16 total fingers, 16 (base 10) would be written as "10" (base 16). 15 (base 10) would be a one digit number in base 16.
On the other hand, you'd rather have six fingers. Base 12 would be great because it has whole thirds! Also 12 is divisible by four numbers (2, 3, 4, and 6). 10 is divisible only by only 2 and 5, and fifths are much less common than thirds.
That's why 12 inches in a foot and 3 feet in a yard is a nice way to measure things (though the rest of the imperial system, excepting maybe Fahrenheit, has no excuse!)
[+] [-] gehar|13 years ago|reply
[+] [-] yen223|13 years ago|reply
That's the salient point. When Norvig says it takes "10 years" to be a programmer, he means it takes a heckuva long time to master the art, not that it takes 87648 hours with a 95% confidence interval. That figure is not meant to be taken at face value.
[+] [-] jotux|13 years ago|reply
[+] [-] ameister14|13 years ago|reply
I think this is pretty applicable everywhere, though. The cycle of challenging yourself, working through it and challenging yourself again is how I learn best, at least.
[+] [-] zdgman|13 years ago|reply
[+] [-] pekk|13 years ago|reply
[+] [-] keiferski|13 years ago|reply
The difference, of course, is that some people just want to build an MVP, while others want to be a programmer. In that case, I'd rename this essay: "Become a Programmer in Ten Years."
[+] [-] Androsynth|13 years ago|reply
The article isnt called 'become an entrepreneur' in ten years. I didnt see it as a response to anything. Its just a good article. One of the 5-6 that regularly get upvotes every year or two.
[+] [-] unknown|13 years ago|reply
[deleted]
[+] [-] guard-of-terra|13 years ago|reply
[+] [-] ghettoeinstein|13 years ago|reply
1. SICP/SICP Python 2. {Insert famous Data Structures/ Algorithms book here} 3.Find some open source project on Github of what I want to do, and extend it or even better refactor it.
From there I will be ready to feel more like a programmer. Cause I really breeze through these tutorials, but seem lost thereafter. I am not seeking prodigy status, but I know that I can become a very formidable programmer sooner or later.
[+] [-] viame|13 years ago|reply
I just started working with python about 3-4 weeks ago. No experience other than html, css3 and graphic design.
So I started doing some online classes but they were so boring and simple that I finished them within a day or two. I actually started doing Udacity's CS class when they teach you how to design a search engine, however half way through I realized that this can be done twice as faster with tools that already exist.
From there I read some Django docs, installed it but django was the most confusing framework to me (not really sure why, just didn't like it)
I stumbled upon Flask and I fell in love. Without any knowledge of how to program and how things work I simply started coding, working with db (postgres). Within a week or so I designed a small blogging application that lets you register users, each user can upload photos, create docs and delete them. I try to code very neatly, and comment on everything. There are a couple of solutions for everything so if I find a better solution I comment out the first one and apply another one.
PS. Don't code for 12h straight. Go out. If I don't know something, I seek for direction, not an answer. I also walk away from my comp and think about a solution, and these tend to be very easy and can be done with a few lines of code. I guess I use my creativity to solve code problems.
Also write everything in small chunks and reuse.
[+] [-] unknown|13 years ago|reply
[deleted]
[+] [-] kbenson|13 years ago|reply
IMHO the programmer mindset has less to do with knowing exactly how to fix a problem than with "Hey, I bet I can fix that, and it probably wouldn't even be too hard!" (which are also famous last words, but you can ignore that :)
[+] [-] jisaacstone|13 years ago|reply
[+] [-] stared|13 years ago|reply
[+] [-] alpb|13 years ago|reply
[+] [-] orangethirty|13 years ago|reply
[+] [-] yen223|13 years ago|reply
That's to say, I started taking programming seriously at 18. I did write a crappy Visual Basic exe when I was 8, and I dabbled a bit in Flash ActionScript in my teenage years, but I don't really count those years, because I was learning by rote then.
I really only started taking programming seriously when I was in college. Writing an RTOS from scratch was one of my biggest coding achievements. A lot of times, I wish I have a job that's more technically challenging than what I'm doing now.
[+] [-] emiljbs|13 years ago|reply
I know this sounds like a "lel Lisp is superior to your blub lang" but it's more of a "I actually went past procedural programming and stupid OO with Lisp and it felt like I finally actually knew something about the stuff I did".
Dunno why I'm typing this out though, oh what the heck, posting it anyway.
[+] [-] walshemj|13 years ago|reply
In fact having basic prompts whit told the user what the next input was was an innovation I refactored some of the senior guys code to add prompts he was a bit sniffy.
"i know what to type when " which is ok for an experiment at 3 foot scale but scaled up to 1:1 where filling the rigs tank cost 20K (about 1/2 the cost of a house at the time) making sure you didn't blow a run was more important.
[+] [-] michaelwww|13 years ago|reply
[+] [-] nekopa|13 years ago|reply
[+] [-] charlieflowers|13 years ago|reply
[+] [-] thenduks|13 years ago|reply
[+] [-] jmmcd|13 years ago|reply
[+] [-] wavelander|13 years ago|reply
One should probably keep visiting this page like every 6 months or so - just to check whether you are on the right track to learning.
[+] [-] Tycho|13 years ago|reply
[+] [-] tianyicui|13 years ago|reply
[+] [-] zzzeek|13 years ago|reply
[+] [-] pekk|13 years ago|reply
[+] [-] wonderzombie|13 years ago|reply
[1]: http://www.kitchensoap.com/2012/10/25/on-being-a-senior-engi...
[+] [-] ValentineC|13 years ago|reply
http://news.ycombinator.com/item?id=43243
http://news.ycombinator.com/item?id=3439772
[+] [-] sn0v|13 years ago|reply
[+] [-] yen223|13 years ago|reply
Anyway I'm not complaining. This is one of those articles which ought to be required reading for any aspiring programmer.
[+] [-] wahnfrieden|13 years ago|reply
[+] [-] riggins|13 years ago|reply
"What separates experts from the rest of us is that they tend to engage in a very directed, highly focused routine, which Ericsson has labeled “deliberate practice.” Having studied the best of the best in many different fields, he has found that top achievers tend to follow the same general pattern of development. They develop strategies for consciously keeping out of the autonomous stage while they practice by doing three things: focusing on their technique, staying goal-oriented, and getting constant and immediate feedback on their performance. In other words, they force themselves to stay in the “cognitive phase.”...
The best ice skaters spend more of their practice time trying jumps that they land less often, while lesser skaters work more on jumps they’ve already mastered. Deliberate practice, by its nature, must be hard....
Amateur musicians, for example, are more likely to spend their practice time playing music, whereas pros are more likely to work through tedious exercises or focus on specific, difficult parts of pieces...
When you want to get good at something, how you spend your time practicing is far more important than the amount of time you spend. In fact, in every domain of expertise that’s been rigorously examined, from chess to violin to basketball, studies have found that the number of years one has been doing something correlates only weakly with level of performance."
tl;dr
10,000 hours may not make you expert. Constantly increasing the level of difficulty of what you practice/work on might be more important.
[+] [-] nostrademons|13 years ago|reply
[+] [-] davidroberts|13 years ago|reply
[+] [-] shubhamjain|13 years ago|reply