Programming ability is more like athletic ability than most people want to admit. Some guys just get better, faster. Some guys can't ever break certain plateaus, no matter how hard they try. In golf, it's probably possible for anyone to go from a duffer to a scratch golfer. But it might take 20 years of work for someone who isn't set up with the right natural gifts. Quality and amount of instruction and practice will determine some of the pace. But some people will just get it faster than others. And even "elite" golfers simply won't be as good as Tiger Woods, ever.
I used to be a good skateboarder. There were guys I skated with who could learn the tricks 5 times faster than I could. I don't know why. We all skated the same amount... in fact, some of the guys who were better than me skated a lot less than I did. They just had something clicking that I didn't have.
I'm a proponent of self-improvement. I think most average people can develop skills far and beyond what they give themselves credit for. I hate to be the guy who is arguing for mystical innate ability. However, it seems naive to claim that it doesn't exist.
To end this comment on a useful note, the one thing I noticed both with the good skateboarders and the good programmers I know, is that they would 'go big' when practicing. the skaters would try something hard and figure it out until they got it. They wouldn't just sit around and do the same kickflip in a parking lot over and over again.
Likewise, the good programmers I knew would always be seriously challenging themselves. For practice programs, they wouldn't just write a dumb fibonacci generator. They'd write a full blown throttling distributed network file copier, or a scheme compiler in postscript. Serious, hard projects for practice. Most programming is mundane and you can go for years without getting any better. The best guys I know are never complacent with doing the same boring shit all day - they'd always challenge themselves.
I think it may be more that there are certain mental blocks that can hold you back completely, but once you get over them, your skills improve rapidly. Some people are fortunate enough to start with the "right" way of thinking about those, and so they just sail over the blocks with ease. Others need a mental shift in perspective before they can understand the fundamentals, and so they're "stuck" for a long time with virtually no progress.
I sailed through math and physics and chemistry in high school. I suspect this is because my dad was a nuclear chemist. I didn't have to learn how to think scientifically, because it was ingrained in me from the age of 3, and it never occurred to me to think any other way. But I'm now in my late 20s, and it's the other kids in my high school class, the ones who struggled through everything, that are now finishing their chem Ph.Ds. Because they decided consciously that chemistry was something they wanted to be good at, while I decided my interests lay elsewhere and didn't bother breaking through all the other mental blocks that crop up when you do college-level hard sciences.
I think a lot of skills have this same pattern - hard skills that can take forever to learn, followed by a bunch of easy and flashy tricks that come easily once you master the basics. My violin tone improved markedly and rapidly once I learned to use "arm weight" instead of simply pressing hard on the string. When I was doing whitewater kayaking, the experienced kayakers would say "Once you learn to roll, your skills just shoot up, because you aren't afraid of trying things any more." Last Olympics, there was a video interview with the U.S. women's gymnastics team where they asked each of them "What was the hardest skill to learn?" Shawn Johnson replied, "The hardest skill for me was my kip." (For non gymnastics fans, the kip is basically a prerequisite for all bars moves, and is usually learned around age 7.) There's an Olympic champion, but if you looked at her gymnastics in elementary school, she spent well over a year on a really basic, fundamental skill that some people get in three tries!
I think this may be why a lot of software engineers ask about pointers and recursion as interview questions. Those skills themselves are rarely useful. But they are hard mental blocks that often weed out a lot of prospective programmers. And once you've got them, a bunch of other algorithms and data structures open up for you. If you understand pointers and recursion, you can learn about linked lists, balanced trees, dynamic programming, hashtables, and all those other fundamentals in short order. If you don't, you might forever be stuck using frameworks that other people put together for you.
I'm actually skeptical of "natural ability," and I find it... a cop-out to ascribe learning rates to it. I think presence of mind matters. All practice is good, but some practice is better than others. People who are continually conscious of their performance, and who actively try to figure out how to improve will probably learn faster than someone who practices passively and hopes to improve "by accident."
No one's figured out a grand unified theory of Physics either but they still have a lot more useful conclusions and solid research than we do on ability.
I used to be a good skateboarder. There were guys I skated with who could learn the tricks 5 times faster than I could. I don't know why. We all skated the same amount... in fact, some of the guys who were better than me skated a lot less than I did. They just had something clicking that I didn't have.
I'm a proponent of self-improvement. I think most average people can develop skills far and beyond what they give themselves credit for. I hate to be the guy who is arguing for mystical innate ability. However, it seems naive to claim that it doesn't exist.
To end this comment on a useful note, the one thing I noticed both with the good skateboarders and the good programmers I know, is that they would 'go big' when practicing. the skaters would try something hard and figure it out until they got it. They wouldn't just sit around and do the same kickflip in a parking lot over and over again.
Likewise, the good programmers I knew would always be seriously challenging themselves. For practice programs, they wouldn't just write a dumb fibonacci generator. They'd write a full blown throttling distributed network file copier, or a scheme compiler in postscript. Serious, hard projects for practice. Most programming is mundane and you can go for years without getting any better. The best guys I know are never complacent with doing the same boring shit all day - they'd always challenge themselves.