From what I've seen, there's just no crossing the skill chasm as a software developer. You've either got it, or you don't. No amount of putting your nose to the grindstone will change that.
What a scary thought. Good thing it's not true.
One of the many reasons I became a programmer was that the sky was the limit. Still is. Want to learn something new? Learn it. Want to build something cool? Build it. The only real limitations are your belief that you can do it and your willingness to perservere until you do.
We are not like basketball players or musicians or chess masters where only the extremely gifted (who also work hard) can rise to the top of their craft. With few exceptions, we all can.
I didn't always think this way. I had a college math professor who once said, "Many of my students are simply not suited for the sciences." And I was stupid enough to believe him! In retrospect, his comment said more about his weakness as a teacher than anything about his students.
How do I know this? Because I learned the hard way. When working with my first mentor, I was always too quick to blame someone else for their limitations slowing progress. Until he said, "So teach them!" He believed that almost anyone can learn and get good at almost anything. This seemed counterintuitive but after a while, I was able to adopt this belief system, and it has made all the difference.
There are many reasons why so many programmers suck, but "not being able to cross the chasm" isn't one of them. Just a few of the real reasons:
- They never learned right in the first place.
- They never built anything of real substance.
- They were a tiny cog in a machine and never saw the big picture.
- They got pigeon-holed into a small area for a long time.
- Other things in their life took over.
- They had shitty teachers.
- They had to build on top of pre-existing shit and couldn't do it right.
- They were stuck in environments where excellence never mattered.
- They went into management too soon.
- They got trapped into old technologies and methodologies.
- They made too much money to make a career u-turn.
- They just didn't care enough.
- <add your own>
My programming has always gotten better every year. Sometimes I read my old code and can't believe I wrote it. And I still have tons of room for improvement.
I'm firmly convinced that almost any of us can get better, much better. And even become "elite", whatever that means. Please don't listen to anyone else who tells you otherwise.
We are not like basketball players or musicians or chess masters where only the extremely gifted (who also work hard) can rise to the top of their craft. With few exceptions, we all can.
I have no idea why, in the same breath as you disclaim the necessity of inborn talent for computer programming, you reaffirm that necessity for some arbitrary skills that you plucked out of nowhere. You have exactly the same amount of evidence supporting your claim that anyone can become a great programmer that I do to support the claim that anyone can be a chess master.
The highest ranked player in the world is twenty years old. Any local chess club is full of people who have studied the game for years but failed to break 1400. I've taught people who were just incapable of the most rudimentary strategic thinking and people who just naturally saw things that it took me years to learn.
The evidence is clear that there are people in the world who just can't solve FizzBuzz, many of them people with degrees in CS. Some people just seem unable to grok the basic abstraction of programming. What if that isn't a binary state, but just one extreme of a spectrum?
I can run 10k in 40 minutes any day of the week, but I sprint like an asthmatic Samoan. I just have distance genes, nothing I can do to change it. No amount of training would ever make me a competitive sprinter. I've got too little fast twitch fibre, I'm too short, too lean, my heart and lungs are too small. Is it completely implausible to suggest that there are cognitive equivalents that would pertain to programming?
Why couldn't mental stamina be as genetically ingrained as physical stamina? There are obviously natural geniuses in our field, why not natural dunces?
I have. Some people were nearly incapable of grasping the matter. Others could do it as easily as buttering a sandwich. I do not believe it is always a question of circumstance, but a question of an innate, inbuilt ability. Some people can and did rise above their personal weakness, through hard work and study.
I can relate this to a game of Table Tennis. A guy I know played lousy for two decades, his technique never improved. Then one day he got hold of a masterful neighbor who taught him how to play, hit top spins, do spin serves, hit chops. He participates in amateur tournaments now and does fairly well.
It's funny how someone like Bill Gates or your college math professor can make the observation that many people just aren't as good at some thing as others and you decide they're simply idiots, but you, who have accomplished so much and acquired so much wisdom, know differently.
When I was a kid, I played soccer every day, as often as I could. I loved it. And I never got particularly good. But when I started programming I was soon better than my peers, my teachers, and anyone I knew or could find to talk to.
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.
I've been experiencing such a crisis of confidence recently around the idea that I lack talent, so much so that I've felt like there was no point in trying to improve things beyond where they are, or to even risk being criticised that it's totally frozen me up.
I'm firmly convinced that almost any of us can get better, much better.
I'm totally in agreement with you about that. However, for professional success in many fields (not just sports), the game is relative ability. While I'm convinced everyone can get better, what really matters in the context of finding jobs is whether you are catching up with everyone else or sliding further behind.
I'd like to believe this, but it's not my experience. There are people for who it comes effortlessly, while it's a real uphill battle for others.
Most of your listed problems are part of 'not being able to cross the chasm'.
The whole idea that we try so hard to believe in "Everybody is born equal and we are the masters of our destiny" maybe be evolutionary in nature .I was reading a book introducing evolution (and I forget the name but can dig it up if somebody wants the source) that individuals of a species sometimes start working together in such cohesion that they no longer are really individuals but are combined into one "social organism" if you will.
For example Bees ,though they are made up of individual bees they don't cross compete but actually work together to protect the whole group and it makes sense to look at the group as one entity instead of a bunch of individual bees.
The author of the book argued that human beings also have crossed that line from being individual members of a species to being a "social organism" that functions as one and in this scenario it really hurts to have a few select individuals born "better" than the rest.This is because we no longer are cross competing but are trying to optimize as a whole and it doesn't makes sense when you are doing that to have some people have better chances of survival etc as it will ruin the cohesion
Now I highly doubt if we are really born equal but that is just my opinion, from what I have seen around some people clearly were better than the rest in certain things even with other factors being more or less alike
I'd like to agree but do you honestly believe someone like, say, Paris Hilton could become a good programmer? Because unless I'm mistaken, it seems you are arguing for that.
I believe sometimes, some people, just aren't suited for a particular craft. And there's nothing wrong with that. It's a good thing that everyone has skills and interests in different areas.
To be a good programmer, there are a lot of pre-requisites one needs to learn first - skills such as a passion for self-learning, ability to think logically, ability to receive feedback and improve on that, etc. If someone begins as a programmer without these pre-reqs they will have a very difficult time getting to the stage where they can be a good developer.
I recently worked with a junior programmer that just wouldn't listen. I would try to advise him but he would completely ignore it and just go back to copying and pasting code and hoping it would work. Even walking through code line-by-line it was clear he had trouble understanding simple assignments.
Now, maybe that is my fault as a mentor but, IMO, he needed to first learn how to listen and receive feedback before he could move on to the next step. Unfortunately, some people are just too stubborn and will not change. For those people, I don't see how they could become great programmers.
> One of the many reasons I became a programmer was that the sky was the limit. Still is. Want to learn something new? Learn it. Want to build something cool? Build it. The only real limitations are your belief that you can do it and your willingness to perservere until you do.
That's not what he's saying.
He's divided the world into two peoples: those with the capacity to program and those who cannot regardless of effort.
These groups are often confused because people can program, but only may do so badly. Yet even being a poor programmer puts you in group A, and effort will make you a better programmer.
On the other hand, there are those who cannot program: cannot write a loop, cannot use variables, cannot create a working algorithm even with copy and paste.
The may perhaps be able to do simple math, but when it comes to composing equations or functions together into an interdependent process...they are simply unable.
They may try if they're so inclined to learn programming, but they'd die of old age before they can even begin to reach a standard that we'd call mediocre.
That is what he is say. Agree or disagree with it, but misunderstanding it skews the discussion.
True. And not. Continuing with the sports analogy I think the comparison of sprinters and marathon runners is an apt one. It's been found (http://sportsmedicine.about.com/od/anatomyandphysiology/a/Mu...) that sprinters have a muscle metabolism that is much more anaerobic than normal from birth (you never exhale during a 100m dash), so good sprinters are pretty much born rather than made. On the other hand, although good genes do help (why are marathon winners generally from Africa?) you can train your muscles to have more efficient aerobic metabolism and be a top-notch marathoner.
So Gates is right in that top talent is probably born, there's nothing you can do to attain that level (which is true for most things, btw). But you can become a damn good programmer by practice.
I agree with everything you said. It is scary that somebody believes something like what Jeff Atwood said. It is actually very toxic thinking. Don't know what more to say other than experience and observation of a lot of people has taught me that what Jeff Atwood says is false. On the other hand, if you believe it is true, then it will just become a self fullfiling prophecy.
Many of these reasons are the same: inability to pivot and adapt to adverse circumstances. For example, you cited "they had to build on top of pre-existing shit and couldn't do it right" as a creator of bad programmers. You sound like a college student on this one, because this is the norm in the software industry. Every programmer (good and bad) has faced this one several times. The difference between bad and good programmers is that good programmers make the extra effort to learn the lessons that no one will explicitly teach them (i.e. figure out why the "pre-existing shit" got all fucked up in the first place) whereas bad programmers just accept it as-is or, worse yet, learn the wrong lessons and conclude that the pre-existing shit is how it should be (i.e. people who believe that C++ or Common Lisp, warts and all, are infallible languages, immune to reproach or change).
Having mentors, supportive management, and interesting work is great. But these are not the norm anywhere and they're certainly uncommon in the first few years in the software industry. A career average of 25% on these, for one's first 10 years, is probably about par. The good programmers are those who figured out how to get better in spite of these setbacks.
If I were going to put it into simple terms, the problem with the worst of the bad programmers (the deserving underclass) is that they don't expect much of themselves. They're happy to chug along at 100 lines/month on uninspiring work, and they do just enough not to get fired, but they don't achieve enough to offset the complexity load they create by modifying code while not knowing what they're doing, and by imposing resistance-to-change on the organization they inhabit. That's Class #1 of bad programmers, the ones who've been powerless for too long and are now just passing through. It probably comprises 65% of bad programmers out there.
Class #2 is the do-the-wrong-thing-well type. These are the ones who are generally very intelligent but narrow-minded. For example, they optimize for runtime performance at the expense of code readability, or who use the wrong languages, or who eschew databases because "SQL is a mess; let's just use the filesystem". They tend to be really, really good at some small subset of programming and tend to want to use that set of tools and skills even when not appropriate. These are the people who annotate an O(n^2) sorting algorithm as "WRONG!!" even when it's sorting a collection of 20 elements, because to them, not optimized == wrong. Their learning rates were too high, and now they're stuck at suboptimal local maxima. That's 15% of bad programmers.
Class #3 of bad programmer (15%) is the rock star, the kind who writes lots of code quickly, uses fancy "metaprogramming" features, but no one can understand the code (much less the rock star) a week after it's written. They tend to be parasitic, appearing highly productive but actually generating lots of unpleasant work (externalized costs) for the rest of the team. The call sign of the rockstar is the tendency to change interfaces willy-nilly and expect everyone else to adapt to his changes.
Those numbers add up to 95%. I'm going to leave 5% open to acknowledge that there are species of bad programmers I haven't met yet.
So many sentences in bold, yet so little substance. What he seems to be saying is that to be a better interface between development and customers/management/etc requires more than pure programming ability. Yeah, ok. And maybe this is beneficial for business or, if there really is a lack of this talent, for career prospects. But it's not being a better programmer. The pithy title is not very relevant to the content.
As regards the pithy title though, and the earlier part of the article, I disagree. Programmers can and do develop. There is a large difference in ability between people who stick with the craft for a large number of years (and actively develop their abilities), and those who are new to it. When I was younger I would have probably agreed, yeah, programmers are just good or bad (and I'm good). But I wasn't good. I've become better since. And there's still a lot to learn and pursue. It takes time.
Having said that, it's definitely possible not to progress as a developer despite programming every day. It requires some amount of contemplation.
This article just confirms my notion that in the debate about "what makes a great programmer" there is a fundamental disconnect between the concepts of being "a programmer" and being "a maker of software".
Making software consists of way more than just programming, and in that respect I agree with Atwood. However, that ignores two other things I consider to be proven truths:
1. You don't have to be a great programmer to make great software. Some of the best products are build from horrible code, not just by people who deliberately rushed things, but by people who simply didn't know any better.
2. You can definitely become a better programmer by simply practicing the craft a lot, even after many years. It doesn't however make you a better "maker of software", just a better coder.
This is such a good point. I've noticed that the personality style of "algorithm obsessed, Knuth worshiping, all about optimization, hardcore coder" doesn't have a lot in common with "creative, new software, good UI, unique application builder" personality. While its important to have some of the former under your belt, its the latter that gets shit done and makes things. I consider myself a maker, not a coder or a computer scientist. I'm getting a little sick of the attitude that you need to be this hotshot coder to be into software. Its just this geek macho poseur mentality that's harmful. A mediocre coder with a few good ideas is all it takes. I'd rather see a slow python app or a simple web app that's unique than some super-fast C or low-level me-too implementation.
I feel this dichotomy is typical of geeks. My poor metaphor is we learn the notes, scales, and do our practices, but at the end of the day we're supposed to be writing songs, not waxing philosophic on music theory or who makes the best pianos. Geeks are just too prone to being "technically correct, the best kind of correct!" and those of us who want to create unique things really need to think more like artists than engineers half the time. Oh well, back to our typical barrage of "Why PHP sucks" and "real coders walk like this..." articles
It's the difference between a musician and a composer. They overlap often and both are absolutely essential to the performance. But practicing one doesn't necessarily carry over to the other.
But he's not talking about becoming a better programmer. He's talking about becoming great.
Not all software can afford to be made out of crappy code either. There are many fields in which being a good programmer is the same thing as being able to write good software.
The web might be the exception here.
"I agree with Bill. From what I've seen, there's just no crossing the skill chasm as a software developer. You've either got it, or you don't. No amount of putting your nose to the grindstone will change that."
This is a very condescending look on humanity and I did not know that Jeff had said such things.
To anyone thinking the same, let me introduce you to the concept of deliberate practice (how to really improve a skill) and please, even if it wasn't published then, read "Talent Is Overrated" by Geoff Colvin. This will probably change your perception on things like excellence, creativity, so-called "talent" and whether it's true that you must be born a genius to become one.
And by the way, that does not mean that everything is an american dream and that anyone can become a self-made person. Geoff shows through many examples and studies in his book that superstars in music, sports, and science had an exceptional learning environment in their childhood. They did not suffer from hunger and extreme poverty. He also talk about a study that demonstrated that ordinary people could increase their short term memory (remembering up to 100 items if I recall correctly, no pun intended) by doing deliberate practice.
When I was first starting as a programmer, I would have agreed with you. But over the years I've learned that it is 100% accurate that some people can program while others simply cannot.
But it's not a matter of stupid/smart. It's actually the same reason why Paul Graham's 'Hackers and Painters' analogy is so apt. The reality is that some people can think in abstract terms, while others cannot.
Someone who can think in abstract terms can be a graphic artist or a programmer. Consider that even in mathematics, the most concrete things are numbers, which are completely abstract. If you understand that, then guess what? You can think in abstract terms.
The author of that also uses a great deal of selective evidence, flat out ignoring genetic research in relationship to music, for example. Specific genetic sequences have been linked both to perfect pitch and to success in classical music. If you can't find it via a quick google search, I'll be happy to provide citations.
Evidence for the role of genetics in running, swimming and a variety of other sports is equally overwhelming. In short, he (and others like him such as gladwell) sell a fantasy that millions, possibly billions would like to believe. It's an excellent strategy for selling books and developing a base of hard-core fans, but it's just not true.
"When, in the late sixties, it became abundantly clear that we did not know how to program well enough, people concerned with Programming Methodology tried to figure out what a competent programmer's education should encompass. As a result of that effort programming emerged as a tough engineering discipline with a strong mathematical flavour. This conclusion has never been refuted, many, however, have refused to draw it for the unattractiveness of its implications, such as
1. good programming is probably beyond the intellectual abilities of today's "average programmer"
2. to do, hic et nunc, the job well with today's army of practitioners, many of whom have been lured into a profession beyond their intellectual abilities, is an insoluble problem
3. our only hope is that, by revealing the intellectual contents of programming, we will make the subject attracting the type of students it deserves, so that a next generation of better qualified programmers may gradually replace the current one.
The above implications are certainly unattractive: their social implications are severe, and the absence of a quick solution is disappointing to the impatient. Opposition to and rejection of the findings of programming methodology are therefore only too understandable. We should remember that the conclusion about the intrinsically mathematical nature of the programming task has been made on technical grounds, and that its rejection is always for political or emotional reasons."
Some of the most productive programmers I've known toss code together in a horrifying slapdash fashion but somehow get great things done. And sometimes people with far more precise and mathematical minds just get mired in their beautiful architectures. The common trait I've seen in all exceptional programmers is an ability to keep a tremendous number of details in memory at one time. Most real world code is not lambda calculus but a barely controlled mess.
Humanizing technology is a bigger win than technologizing humans, IMO.
You may have a certain aptitude or talent for software development. However talent without discipline fizzles out or produces wildly varying results. Talent is like that.
What makes a good programmer, mathematician, sports player, etc is discipline. The love of the craft/sport/etc that pushes a person to believe that all the discipline and hard work is worth it. People are naturally lazy. However if they really believe in something they will work on it and become better.
Why people are so focused on the top x% of something? I really don't see the point. Sometimes what you need is a person with great ideas, not a top x% that believes to be some sort of god.
I make the distinction between "Programming" and "Development" in my own head. In fact, I try to avoid using the phase programming, I call it coding. i.e. putting the code on the screen with a keyboard.
I see Jeff talking more about "development" here - coders get better at coding by writing and reading more code. But there's no point being good at putting code on the screen if it doesn't do the thing your end users need to do.
I agree with Bill. From what I've seen, there's just no crossing the skill chasm as a software developer. You've either got it, or you don't. No amount of putting your nose to the grindstone will change that.
Not true with the current neuroscience. Well, in reality, that's what is happening. But do you know why? I'll tell you: Because I'm obsessed with programming. The typical programmer that is not obsessed will just make use of the skills he got while programming and learning. These skills are limited to the time he spent learning/coding.
I'm obsessed; I learn and code even when I'm not in front of the computer.The time of my experience expand. Add to that, the fact that I'm obsessed. I'll brainstorm code/ideas/tricks/google... to get that thing working. I'll make any opportunity in life to learn more about programming. This gives me advantage over that typical programmer that disconnects when he quits his job.
What bill is talking about programmers at MS or any big company like facebook, google etc just like super start sports person or musician, but in general there are lots of requirement of programmers who don't need to those kind of super programming skill but programming with business value.
Comparing programming with sports is not a good idea because you are comparing super start sport person with avg programmers.
Even in sports or other fields there are people who were avg or above avg sport person but latter they become great coach .
So it is quite subjective.
If your heart say you can become programmer and you are doing enough for the same and you are improving day by day then you are on right track.
In my view just writing code is defiantly not going to make good programmer. Code, understanding end user and domain is going to make you better software maker.
I think this article says more about the corporate culture where programmers work than about their capacity. What happens in Microsoft, as in most other companies, is that they make a decision about what a person can do in about 1 to 3 years. After that period, they will no longer give exciting assignments to the programmer and he will be forever viewed by management as doing the same old job. Many times this happens because of lack of determination from the part of the employee, but frequently because he didn't have the right opportunities and didn't know how to look for them.
Usually when this happens, either the employee will leave the company in a short period, looking for better opportunities, or resign itself to do the same thing until retirement (or until he gets lucky).
Part of the controversy with this article is that it is combining two separate ideas into one concept, blurring the differences.
Implementing software is something you can absolutely get better at with experience, discipline, and practice. You only need to look at your old code for evidence of this.
Designing software takes imagination and creativity. Experience and practice may give you a tool chest of preconceived ideas to use when designing your own software, but it isn't going to help you conceive completely new ideas yourself. That requires thinking outside of the box, and it's not something you learn by studying the nuances of implementation. It's not even something you learn by studying programming. IMO this is what Atwood is talking about.
Well, I may not be a great programmer, but after programming for 30 years, I'm a hell of a lot better than I was after programming for three or four years. The story of my evolution as a programmer is at http://lists.canonical.org/pipermail/kragen-tol/2007-March/0....
Even after 25 years, I was doing things that I didn't have the knowledge or skill to do five years before. (On the other hand, sometimes I look at kragen-hacks posts from ten years ago and say, "Whoever did that must be a lot smarter than I am ---" before remembering it was me.)
Maybe 4 years at Microsoft is enough to tell if you have what it takes, but I doubt it. If you work elsewhere you can find yourself moving backwards if you're surrounded by poor practises, particularly early on in your career.
My programming wasn't much cop to begin with and declined in the first 4 years of my career. After 8 years it leaped forward when I read Code Complete (by Steve McConnell). Only later on, when I was maintaining other peoples code rather than writing from scratch, did I realise the pain I had been inflicting on others earlier on.
Another leap occurred when I found myself as the most senior programmer in a (small) company - when the buck stops with you, you're forced to stretch. My every day programming has also been improved by my attempts at architecture.
Its taken me about 15 years to feel reasonably confident and I can't be the only slow learner out there. So although I disagree with Jeff Atwood that you either have it or you don't, I suppose he does have a point - it was largely non-programming tasks that were the break-throughs.
It can be tempting to write-off a junior programmer as having no hope but I was that guy once and I came right eventually - there is hope for everybody.
There's definitely a confusion between "product designer" and "programmer". Sometimes they are the same thing, other times not. So I don't think it's a useful metric. There are truly great programmers... Andrew Appel, SPJ, McCarthy etc who have no need or interest in making "products", yet that doesn't disqualify them from being great. Sure, communication skills are important, especially writing, but I wouldn't push the idea much further.
I'll just keep the "You won't-- you cannot-- become a better programmer through sheer force of programming alone. You can only complement and enhance your existing programming skills by branching out. Learn about your users. Learn about the industry. Learn about your business." quote. I think that's the main point of the article. Also, the article is more than four years old, I'd like to read what he thinks now or five more years from now.
The fact that programmers tend to not get better has little to do with programmers' inherent worth or talent. It has everything to do with how programmers are trained. Employers are doing less and less to train their technical staffs, which has fostered a generation of programmers who believe that the right way to learn something is by Googling it or experimenting randomly on their own. Of course you're not going to get better this way.
[+] [-] edw519|14 years ago|reply
What a scary thought. Good thing it's not true.
One of the many reasons I became a programmer was that the sky was the limit. Still is. Want to learn something new? Learn it. Want to build something cool? Build it. The only real limitations are your belief that you can do it and your willingness to perservere until you do.
We are not like basketball players or musicians or chess masters where only the extremely gifted (who also work hard) can rise to the top of their craft. With few exceptions, we all can.
I didn't always think this way. I had a college math professor who once said, "Many of my students are simply not suited for the sciences." And I was stupid enough to believe him! In retrospect, his comment said more about his weakness as a teacher than anything about his students.
How do I know this? Because I learned the hard way. When working with my first mentor, I was always too quick to blame someone else for their limitations slowing progress. Until he said, "So teach them!" He believed that almost anyone can learn and get good at almost anything. This seemed counterintuitive but after a while, I was able to adopt this belief system, and it has made all the difference.
There are many reasons why so many programmers suck, but "not being able to cross the chasm" isn't one of them. Just a few of the real reasons:
My programming has always gotten better every year. Sometimes I read my old code and can't believe I wrote it. And I still have tons of room for improvement.I'm firmly convinced that almost any of us can get better, much better. And even become "elite", whatever that means. Please don't listen to anyone else who tells you otherwise.
[+] [-] mquander|14 years ago|reply
We are not like basketball players or musicians or chess masters where only the extremely gifted (who also work hard) can rise to the top of their craft. With few exceptions, we all can.
I have no idea why, in the same breath as you disclaim the necessity of inborn talent for computer programming, you reaffirm that necessity for some arbitrary skills that you plucked out of nowhere. You have exactly the same amount of evidence supporting your claim that anyone can become a great programmer that I do to support the claim that anyone can be a chess master.
[+] [-] jdietrich|14 years ago|reply
The highest ranked player in the world is twenty years old. Any local chess club is full of people who have studied the game for years but failed to break 1400. I've taught people who were just incapable of the most rudimentary strategic thinking and people who just naturally saw things that it took me years to learn.
The evidence is clear that there are people in the world who just can't solve FizzBuzz, many of them people with degrees in CS. Some people just seem unable to grok the basic abstraction of programming. What if that isn't a binary state, but just one extreme of a spectrum?
I can run 10k in 40 minutes any day of the week, but I sprint like an asthmatic Samoan. I just have distance genes, nothing I can do to change it. No amount of training would ever make me a competitive sprinter. I've got too little fast twitch fibre, I'm too short, too lean, my heart and lungs are too small. Is it completely implausible to suggest that there are cognitive equivalents that would pertain to programming?
Why couldn't mental stamina be as genetically ingrained as physical stamina? There are obviously natural geniuses in our field, why not natural dunces?
[+] [-] pnathan|14 years ago|reply
I have. Some people were nearly incapable of grasping the matter. Others could do it as easily as buttering a sandwich. I do not believe it is always a question of circumstance, but a question of an innate, inbuilt ability. Some people can and did rise above their personal weakness, through hard work and study.
Chess and programming are cousins in thought.
[+] [-] ayanb|14 years ago|reply
I can relate this to a game of Table Tennis. A guy I know played lousy for two decades, his technique never improved. Then one day he got hold of a masterful neighbor who taught him how to play, hit top spins, do spin serves, hit chops. He participates in amateur tournaments now and does fairly well.
[+] [-] podperson|14 years ago|reply
When I was a kid, I played soccer every day, as often as I could. I loved it. And I never got particularly good. But when I started programming I was soon better than my peers, my teachers, and anyone I knew or could find to talk to.
But I guess my soccer coach was just an idiot.
[+] [-] Jabbles|14 years ago|reply
WHAT IS THE DAN PLAN?
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.
http://thedanplan.com/blog/
[+] [-] singular|14 years ago|reply
I've been experiencing such a crisis of confidence recently around the idea that I lack talent, so much so that I've felt like there was no point in trying to improve things beyond where they are, or to even risk being criticised that it's totally frozen me up.
Thank you.
[+] [-] lutorm|14 years ago|reply
I'm totally in agreement with you about that. However, for professional success in many fields (not just sports), the game is relative ability. While I'm convinced everyone can get better, what really matters in the context of finding jobs is whether you are catching up with everyone else or sliding further behind.
[+] [-] cloudhead|14 years ago|reply
[+] [-] bo_Olean|14 years ago|reply
I agree with this statement. But haven't accepted it as the fact yet.
You managed to learn "new things" quickly has not always meant "they" (as you said) will.
[+] [-] bgurupra|14 years ago|reply
For example Bees ,though they are made up of individual bees they don't cross compete but actually work together to protect the whole group and it makes sense to look at the group as one entity instead of a bunch of individual bees.
The author of the book argued that human beings also have crossed that line from being individual members of a species to being a "social organism" that functions as one and in this scenario it really hurts to have a few select individuals born "better" than the rest.This is because we no longer are cross competing but are trying to optimize as a whole and it doesn't makes sense when you are doing that to have some people have better chances of survival etc as it will ruin the cohesion
Now I highly doubt if we are really born equal but that is just my opinion, from what I have seen around some people clearly were better than the rest in certain things even with other factors being more or less alike
[+] [-] mattm|14 years ago|reply
I believe sometimes, some people, just aren't suited for a particular craft. And there's nothing wrong with that. It's a good thing that everyone has skills and interests in different areas.
To be a good programmer, there are a lot of pre-requisites one needs to learn first - skills such as a passion for self-learning, ability to think logically, ability to receive feedback and improve on that, etc. If someone begins as a programmer without these pre-reqs they will have a very difficult time getting to the stage where they can be a good developer.
I recently worked with a junior programmer that just wouldn't listen. I would try to advise him but he would completely ignore it and just go back to copying and pasting code and hoping it would work. Even walking through code line-by-line it was clear he had trouble understanding simple assignments.
Now, maybe that is my fault as a mentor but, IMO, he needed to first learn how to listen and receive feedback before he could move on to the next step. Unfortunately, some people are just too stubborn and will not change. For those people, I don't see how they could become great programmers.
[+] [-] true_religion|14 years ago|reply
That's not what he's saying.
He's divided the world into two peoples: those with the capacity to program and those who cannot regardless of effort.
These groups are often confused because people can program, but only may do so badly. Yet even being a poor programmer puts you in group A, and effort will make you a better programmer.
On the other hand, there are those who cannot program: cannot write a loop, cannot use variables, cannot create a working algorithm even with copy and paste.
The may perhaps be able to do simple math, but when it comes to composing equations or functions together into an interdependent process...they are simply unable.
They may try if they're so inclined to learn programming, but they'd die of old age before they can even begin to reach a standard that we'd call mediocre.
That is what he is say. Agree or disagree with it, but misunderstanding it skews the discussion.
[+] [-] Jun8|14 years ago|reply
So Gates is right in that top talent is probably born, there's nothing you can do to attain that level (which is true for most things, btw). But you can become a damn good programmer by practice.
[+] [-] steauengeglase|14 years ago|reply
-They are trying too hard.
On a daily basis, this hurts me more than anything else.
[+] [-] felipemnoa|14 years ago|reply
[+] [-] Swannie|14 years ago|reply
[+] [-] michaelochurch|14 years ago|reply
Having mentors, supportive management, and interesting work is great. But these are not the norm anywhere and they're certainly uncommon in the first few years in the software industry. A career average of 25% on these, for one's first 10 years, is probably about par. The good programmers are those who figured out how to get better in spite of these setbacks.
If I were going to put it into simple terms, the problem with the worst of the bad programmers (the deserving underclass) is that they don't expect much of themselves. They're happy to chug along at 100 lines/month on uninspiring work, and they do just enough not to get fired, but they don't achieve enough to offset the complexity load they create by modifying code while not knowing what they're doing, and by imposing resistance-to-change on the organization they inhabit. That's Class #1 of bad programmers, the ones who've been powerless for too long and are now just passing through. It probably comprises 65% of bad programmers out there.
Class #2 is the do-the-wrong-thing-well type. These are the ones who are generally very intelligent but narrow-minded. For example, they optimize for runtime performance at the expense of code readability, or who use the wrong languages, or who eschew databases because "SQL is a mess; let's just use the filesystem". They tend to be really, really good at some small subset of programming and tend to want to use that set of tools and skills even when not appropriate. These are the people who annotate an O(n^2) sorting algorithm as "WRONG!!" even when it's sorting a collection of 20 elements, because to them, not optimized == wrong. Their learning rates were too high, and now they're stuck at suboptimal local maxima. That's 15% of bad programmers.
Class #3 of bad programmer (15%) is the rock star, the kind who writes lots of code quickly, uses fancy "metaprogramming" features, but no one can understand the code (much less the rock star) a week after it's written. They tend to be parasitic, appearing highly productive but actually generating lots of unpleasant work (externalized costs) for the rest of the team. The call sign of the rockstar is the tendency to change interfaces willy-nilly and expect everyone else to adapt to his changes.
Those numbers add up to 95%. I'm going to leave 5% open to acknowledge that there are species of bad programmers I haven't met yet.
[+] [-] yaongi|14 years ago|reply
As regards the pithy title though, and the earlier part of the article, I disagree. Programmers can and do develop. There is a large difference in ability between people who stick with the craft for a large number of years (and actively develop their abilities), and those who are new to it. When I was younger I would have probably agreed, yeah, programmers are just good or bad (and I'm good). But I wasn't good. I've become better since. And there's still a lot to learn and pursue. It takes time.
Having said that, it's definitely possible not to progress as a developer despite programming every day. It requires some amount of contemplation.
[+] [-] rickmb|14 years ago|reply
Making software consists of way more than just programming, and in that respect I agree with Atwood. However, that ignores two other things I consider to be proven truths:
1. You don't have to be a great programmer to make great software. Some of the best products are build from horrible code, not just by people who deliberately rushed things, but by people who simply didn't know any better.
2. You can definitely become a better programmer by simply practicing the craft a lot, even after many years. It doesn't however make you a better "maker of software", just a better coder.
[+] [-] drzaiusapelord|14 years ago|reply
I feel this dichotomy is typical of geeks. My poor metaphor is we learn the notes, scales, and do our practices, but at the end of the day we're supposed to be writing songs, not waxing philosophic on music theory or who makes the best pianos. Geeks are just too prone to being "technically correct, the best kind of correct!" and those of us who want to create unique things really need to think more like artists than engineers half the time. Oh well, back to our typical barrage of "Why PHP sucks" and "real coders walk like this..." articles
[+] [-] gaius|14 years ago|reply
[+] [-] cloudhead|14 years ago|reply
Not all software can afford to be made out of crappy code either. There are many fields in which being a good programmer is the same thing as being able to write good software. The web might be the exception here.
[+] [-] St-Clock|14 years ago|reply
This is a very condescending look on humanity and I did not know that Jeff had said such things.
To anyone thinking the same, let me introduce you to the concept of deliberate practice (how to really improve a skill) and please, even if it wasn't published then, read "Talent Is Overrated" by Geoff Colvin. This will probably change your perception on things like excellence, creativity, so-called "talent" and whether it's true that you must be born a genius to become one.
And by the way, that does not mean that everything is an american dream and that anyone can become a self-made person. Geoff shows through many examples and studies in his book that superstars in music, sports, and science had an exceptional learning environment in their childhood. They did not suffer from hunger and extreme poverty. He also talk about a study that demonstrated that ordinary people could increase their short term memory (remembering up to 100 items if I recall correctly, no pun intended) by doing deliberate practice.
[+] [-] silverbax88|14 years ago|reply
But it's not a matter of stupid/smart. It's actually the same reason why Paul Graham's 'Hackers and Painters' analogy is so apt. The reality is that some people can think in abstract terms, while others cannot.
Someone who can think in abstract terms can be a graphic artist or a programmer. Consider that even in mathematics, the most concrete things are numbers, which are completely abstract. If you understand that, then guess what? You can think in abstract terms.
[+] [-] Troll_Whisperer|14 years ago|reply
Evidence for the role of genetics in running, swimming and a variety of other sports is equally overwhelming. In short, he (and others like him such as gladwell) sell a fantasy that millions, possibly billions would like to believe. It's an excellent strategy for selling books and developing a base of hard-core fans, but it's just not true.
[+] [-] szany|14 years ago|reply
1. good programming is probably beyond the intellectual abilities of today's "average programmer"
2. to do, hic et nunc, the job well with today's army of practitioners, many of whom have been lured into a profession beyond their intellectual abilities, is an insoluble problem
3. our only hope is that, by revealing the intellectual contents of programming, we will make the subject attracting the type of students it deserves, so that a next generation of better qualified programmers may gradually replace the current one.
The above implications are certainly unattractive: their social implications are severe, and the absence of a quick solution is disappointing to the impatient. Opposition to and rejection of the findings of programming methodology are therefore only too understandable. We should remember that the conclusion about the intrinsically mathematical nature of the programming task has been made on technical grounds, and that its rejection is always for political or emotional reasons."
EWD611 (http://www.cs.utexas.edu/users/EWD/transcriptions/EWD06xx/EW...)
[+] [-] cageface|14 years ago|reply
Humanizing technology is a bigger win than technologizing humans, IMO.
[+] [-] agentultra|14 years ago|reply
You may have a certain aptitude or talent for software development. However talent without discipline fizzles out or produces wildly varying results. Talent is like that.
What makes a good programmer, mathematician, sports player, etc is discipline. The love of the craft/sport/etc that pushes a person to believe that all the discipline and hard work is worth it. People are naturally lazy. However if they really believe in something they will work on it and become better.
[+] [-] cloudhead|14 years ago|reply
[+] [-] viandante|14 years ago|reply
[+] [-] gwern|14 years ago|reply
[+] [-] philjr|14 years ago|reply
I see Jeff talking more about "development" here - coders get better at coding by writing and reading more code. But there's no point being good at putting code on the screen if it doesn't do the thing your end users need to do.
[+] [-] csomar|14 years ago|reply
Not true with the current neuroscience. Well, in reality, that's what is happening. But do you know why? I'll tell you: Because I'm obsessed with programming. The typical programmer that is not obsessed will just make use of the skills he got while programming and learning. These skills are limited to the time he spent learning/coding.
I'm obsessed; I learn and code even when I'm not in front of the computer.The time of my experience expand. Add to that, the fact that I'm obsessed. I'll brainstorm code/ideas/tricks/google... to get that thing working. I'll make any opportunity in life to learn more about programming. This gives me advantage over that typical programmer that disconnects when he quits his job.
[+] [-] geek_silk|14 years ago|reply
Comparing programming with sports is not a good idea because you are comparing super start sport person with avg programmers.
Even in sports or other fields there are people who were avg or above avg sport person but latter they become great coach .
So it is quite subjective. If your heart say you can become programmer and you are doing enough for the same and you are improving day by day then you are on right track.
In my view just writing code is defiantly not going to make good programmer. Code, understanding end user and domain is going to make you better software maker.
[+] [-] coliveira|14 years ago|reply
Usually when this happens, either the employee will leave the company in a short period, looking for better opportunities, or resign itself to do the same thing until retirement (or until he gets lucky).
[+] [-] snarfy|14 years ago|reply
Implementing software is something you can absolutely get better at with experience, discipline, and practice. You only need to look at your old code for evidence of this.
Designing software takes imagination and creativity. Experience and practice may give you a tool chest of preconceived ideas to use when designing your own software, but it isn't going to help you conceive completely new ideas yourself. That requires thinking outside of the box, and it's not something you learn by studying the nuances of implementation. It's not even something you learn by studying programming. IMO this is what Atwood is talking about.
[+] [-] kragen|14 years ago|reply
Even after 25 years, I was doing things that I didn't have the knowledge or skill to do five years before. (On the other hand, sometimes I look at kragen-hacks posts from ten years ago and say, "Whoever did that must be a lot smarter than I am ---" before remembering it was me.)
[+] [-] Revisor|14 years ago|reply
[+] [-] usedtolurk|14 years ago|reply
My programming wasn't much cop to begin with and declined in the first 4 years of my career. After 8 years it leaped forward when I read Code Complete (by Steve McConnell). Only later on, when I was maintaining other peoples code rather than writing from scratch, did I realise the pain I had been inflicting on others earlier on.
Another leap occurred when I found myself as the most senior programmer in a (small) company - when the buck stops with you, you're forced to stretch. My every day programming has also been improved by my attempts at architecture.
Its taken me about 15 years to feel reasonably confident and I can't be the only slow learner out there. So although I disagree with Jeff Atwood that you either have it or you don't, I suppose he does have a point - it was largely non-programming tasks that were the break-throughs.
It can be tempting to write-off a junior programmer as having no hope but I was that guy once and I came right eventually - there is hope for everybody.
[+] [-] unknown|14 years ago|reply
[deleted]
[+] [-] montages|14 years ago|reply
[+] [-] cloudhead|14 years ago|reply
[+] [-] riledhel|14 years ago|reply
[+] [-] jeffreymcmanus|14 years ago|reply
[+] [-] cloudhead|14 years ago|reply