I am hardly the world's best programmer. I'll be the first to tell you that there are tons of developers out there better than I am. But here's the thing: in the ten years I've been gainfully employed as a so-called professional programmer, I can count the number of truly great programmers I've worked with on one hand. I know this probably sounds like hopeless elitism, but hear me out: there's something unique about our profession that leads to an unusually profound disparity in skill.
In programming specifically, many studies have shown order of magnitude differences in the quality of the programs written, the sizes of the programs written, and the productivity of the programmers. The original study that showed huge variations in individual programming productivity was conducted in the late 1960s by Sackman, Erikson, and Grant (1968). They studied professional programmers with an average of 7 years' experience and found that the ratio of intitial coding time between the best and worst programmers was about 20:1; the ratio of debugging times over 25:1; of program sizes 5:1; and of program execution speed about 10:1. They found no relationship between a programmer's amount of experience and code quality or productivity. (Code Complete, page 548)In other words, the good developers are really good, and the bad developers are atrociously bad. You really never know what you're going to get when you arrive on a job: statistically, you've got a fifty/fifty chance of working with either a genius or a jackass. Isn't that reassuring?
Wouldn't you expect a truck driver with twenty years of driving experience to perform better than a rookie with less than a year of road time under his belt? Of course you would. And shouldn't a grizzled ten year veteran of dozens of software projects-- like, say, myself-- perform better than some punk kid directly out of college? Well, you might think so, but in the bizarro world of software development, that logic doesn't apply:
[In the analysis of Coding War Games results, 1977 - 1986, we found that] people who had ten years of experience did not outperform those with two years of experience. There was no correlation between experience and performance except that those with less than six months' experience with the languages used in the exercise did not do as well as the rest of the sample. (Peopleware, p. 47)
In a study with similar findings, Bill Curtis presented a group of 60 professional programmers with what he characterized as a "simple" debugging task ("Substantiating Programmer Variability," Proceedings of the IEEE, vol. 69, no. 7, 1981). In spite of its simplicity, 6 of the professional programmers weren’t able to complete the task, and data on their performance was excluded from the results of the study. Curtis observed order of magnitude differences among the programmers who were able to complete the task. (Steve McConnell)
What the hell kind of profession generates so much data supporting the hypothesis that there is no correlation between experience, performance, and skill? Where do we go from there? I don't have any answers, but I do have two suggestions.
Posted by Jeff Atwood View blog reactions
« Development is Inherently Wicked The Wisdom of Sells »
That's EXACTLY what I am thinking! I am glad you pointed that out! I think you should publish this blog entry on EVERY major news site, so people GET it and we get rid of those crappy programmers who prog just for the money (implying that they are not as good as programmers who LOVE to develop software!)
Hermann Klinke on September 4, 2004 04:04 AMAt the risk of being redundant (well, it isn't that bad in the literary realm :) -- my thoughts, exactly. For me, programming is more of an art form and I truly enjoy it, and this is more than paying mere lip service.
By that, I mean reading several technical magazines, buying and *reading* lots of books, attending conferences like the PDC (paid my own fare last year), browsing blogs and spelunking around w/ the copious Beta stuff that MS keeps churning out, etc...
Of course, you won't always be rewarded coz people seldom judged by sheer technical skill alone -- especially if you work for a large (non software) company where you have a lot of other BS -- but as someone put it, the reward is the journey itself.
And that, my friends, is the Zen of a true programmer...
Atul
Atul on September 6, 2004 01:48 PMThis is exactly what I've observed in my professional experience. Most of my career has been at one (fairly large) company, but I wasn't sure if this phenomenon was just local to my city. Thanks for posting some real research on the subject!
Bryan Creel on September 7, 2004 10:35 AMI think you are right if you are good you would not fight about competetion. You do your job and forget about outsourcing. If you company wants to lose you you know there are missing some thing value able.
./thanks
ilaiy
Throughout my career, I have been considered several times more productive than my fellow programmers. Where I last worked I was the last employed developer for 2 years in a Fortune 500 company, everyone else was offshored. The CIO decided that I had to get to boot to fit his agenda (even though I was several times more productive than the offshore people), so now I am looking for a job, but everyone has told me not to mention how productive I am on my resume because is sounds like I am cutting down my former fellow employees. My resume now makes me look mediocre. Any ideas?
GomerDomer on December 31, 2005 10:39 AMAs a person who loves to code, sometimes I feel like an artist who creates the Mona Lisa only to present it to a group of kindergarteners.
With larger pieces of code being shipped offshore, the overall level of code quality can only decrease.
"You're already spending your own personal time on professional development."
No I'm not - I'm burning my company's time. But they don't have much for me to do right now anyway. That's why I went to an interview earlier today and am reading blogs now.
AC on January 30, 2007 04:05 PMI've read the Curtis paper, and Steve McConnell's statement is inaccurate. There were 54 coders (not 60) and only one person couldn't finish the task in the time allowed (not six). See the original paper at
http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=1456356
I also have a problem with how people phrase the productivity difference, as a ration of the best to worst. I am a million times more productive than an elephant or emu. I am at least a thousand times more productive than a human infant. Those are silly comparisons, but so is the best:worst ratio, because there is a huge long tail on time-to-complete-a-task.
What I've seen from analyzing the (scarce) academic literature on the subject is that the difference between the best and the median is about 3x-4x on any one task. Note, however, that as you start to look at multiple tasks, the difference gets smaller.
You can see some of my analysis and pretty graphs and so on at
http://www.webfoot.com/blog/category/programmer-productivity/
I've analyzed the academic literature carefully, and I get a very different message from it than what you report.
First, the best:worst ratio is a bad measure. It can be totally skewed by one outlier and the outlier can be infinitely bad. (I write code infinitely faster than an emu or grizzly bear, for example.) A much more realistic/practical measure is the ratio between the median and the best.
Second, the Sackman study is taken out of context. Sackman et al were trying to quantify the productivity gains of timesharing systems over batch, and that's where the productivity difference comes in. If you go back to the source data and look at it more realistically, you more like a 2:1 difference in productivity between the fastest and median coder. See
http://nothing.tmtm.com/archives/date/2002/09/28#a309
Third, what McConnell says about the Curtis study is inaccurate. There were 54 coders (not 60). They were given two tasks, and only one person didn't finish in the allowed time (not six). See my analysis at
http://www.webfoot.com/blog/2006/12/07/programmer-productivity/
Fourth, DeMarco and Lister did a study in 1985 that showed a stunning correlation in time-to-complete-a-task of people who worked at the same company. They speculate that the office environment is a major influence on productivity, with some pretty stunning data to back that up. Meanwhile, they have a time-to-complete histogram that shows that the ratio between the mean time and fastest time is between 2 and 3. See my analysis at
http://www.webfoot.com/blog/2007/02/16/demarco-and-lister/
Fifth, the academic literature mostly shows time to complete one task. Because of regression to the mean (i.e. the more trials you have at a probabilistic event, the closer you are likely to find yourself at the expected value), the difference between median and fastest is probably not going to be as large as for any one trial. Andrew Ko recently published a study where he asked people to do five tasks and the variation between the fastest coder *overall* and the median coder *overall* was less than 2x. See my analysis at
http://www.webfoot.com/blog/2006/12/15/programmer-productivity-part-2/
hmmm, I assumed that I misfired somehow the first time I posted, but I still don't see a post. I presume that you're moderating, in which case take whichever one of my two postings you like better. I think the second one is a little better, but YMMV.
and you probably shouldn't keep this postlet...
Kaitlin Duck Sherwood on February 16, 2007 05:37 PMOf course, the tough part (starting out as a teenage Python programmer) is to figure out which category I'm in. I've made what looks like a fairly cool CMS design, but making a parser for a UTF-8 based language in C++ completely kicked my second-most-important-asset.
I agree! But what makes a truly good programmer? I have enough experience to know that I fall into that category and am married to one who is even better. How do you recruit the great programmers? What gives them that edge? We've come up with a few traits:
Attention to detail: This one is big, and it's required for non-programmers: DBAs, network admins, testers, etc. If someone's code, database, etc. looks like a teenager's room, forget it.
Ability the see the big picture: Seems like the opposite of the above, but absolutely required as well. The programmer has to be able to translate everything he is doing into the real world and relate it to the requirements, and vice versa.
Ability to self-teach quickly: Imperative if you want to keep up or even are just trying to stay in one spot. Good programmers also figure out their best method of self-learning. I'm one of the oddballs that reads the entire manual. Note that this has nothing to do with academic success--someone with an unconventional learning style might be able to translate that into effective self-teaching.
Ability to think in an ordered fashion and translate that: This one is arcane, but again, necessary. The "ordered fashion" may vary significantly. Personally, I think in English, in long, complete sentences (the verbosity of this post is completely in character). I translate that into code. My husband thinks visually and all of his design scratchings are diagrams of things linked together. It's a completely different approach.
Problem-solving: A skill necessary in almost all technical fields, from medicine to engineering. I think this skill can be taught more easily than some of the others. But you have to have some open-mindedness to find the source of the problem and its solution.
Synthesis: Possibly the most important, hardest to define skill necessary. A great programmer is able to synthesize code from requirements. He can make something that just wasn't there before. This is the "art" of programming. Mediocre programmers almost never have this skill. I don't think experience can yield this skill where it was missing, but this one gets a lot better with experience.
Well, that's my list. I've been keeping it informally for years. Most people don't like to hear about mediocre programmers, and it does seem "elitist" to put myself above them, but my work speaks for itself.
...' There are a hundred thousand well educated Indian developers who will do what you do at a fraction of the price, '...
The fact is, even here in India, most of the people who are well educated but are programming all the while thinking of the paycheck @ month-end rather than about the true joy of programming. They have become mere coders. http://timesofindia.indiatimes.com/Opinion/Sunday_Specials/Review/A_myth_called_the_Indian_programmer/articleshow/msid-1633868,curpg-1.cms
Irony, i would say, that a nation with plenty of software engineers, never brought out a remarkable product yet.
_raghava_ on June 5, 2007 06:50 AMI am a new programmer. I just got out of school, october of 06. I have been with a small software company for the last few months, and the disparity I have seen between academic coding and professional coding is incredible.
In the academic world, they harped on us all day to design first. Flow charts, UML, Class diagrams, DFD's and a host of other visio driven diagrams. These were the tools of the programmer they said.
But from what I have seen and heard from coworkers, so far is a bunch of half formed ideas, presented via powerpoint at a partially attended meeting. When this is all translated into code, these half formed ideas are strewn all over the program and of course not a one is commented.
Now I wouldn't presume to say that I know better than someone who has been designing and coding major applications for the last decade but to me it seems like people treat programming to much like work and not enough like art.
There was a running joke at my college that we are learning to be code poets. I like that, we are creating, we are breathing life into lifeless lumps of code. Each whitespace, each comment is helping to bring personality to that one line and vicariously to the whole program. Each application you design from the smallest address book, to the grandest operating system, should have the feel and personality of those associated with it. Sterile code leads to sterile programs.
Code Monkey on June 5, 2007 01:50 PM"there's something unique about our profession that leads to an unusually profound disparity in skill."
This is completely false. I'm a theoretical physicist who has worked closely also with mathematicians and theoretical computer scientists. The differences you describe are tiny compared with the difference between the very top theoretical physicists and even an average theoretical physicist. On accasion, I've seen the top people do in a minute or two what an average theorist would require months to do, or simply never be able to do.
Michael Nielsen on February 5, 2008 05:54 AMWhen you use the word "statistically" (as in "statistically, you've got a fifty/fifty chance of working with either a genius or a jackass"), what do you think that word means?
Chris Pine on February 5, 2008 07:31 AMI wonder what the ratio is between us commenters ;)
Stephane Grenier on February 5, 2008 07:33 AMJust like making a burger at BK, anything can be done with artistic attention. Coding/developing/netwoking all are no different than flipping burgers or installing cable TV. The tech world applies insane names to long-used common practices then only use the acronym to confuse the outsiders even more (thats what your paying for with your college degree).
The most important thing I've learned in my ten years of successful, lucrative, artistic application development? Without the acronyms and the egos, we're flipping burgers and anyone who decides to look past the BS we spew can start flipping for money. Sure, maybe they don't have hamburger talent but they can assemble the pieces. It's they BK employee who puts the attention into his burger that I celebrate!
Reality on February 5, 2008 07:44 AMhmmm, I assumed that I misfired somehow the first time I posted, but I still don't see a post. I presume that you're moderating, in which case take whichever one of my two postings you like better. I think the second one is a little better, but YMMV.
and you probably shouldn't keep this postlet...
http://nurmagomedov.blogspot.com/
I'm probably a crappy programmer. However owning my own business and the 10k other tasks I have to do seem to overwhelm the fun of programming. I guess when the only fun you have is breaking out that old 486 laptop and doing some C++ for DOS, you know you've missed out on the fun of development.
Rob on February 5, 2008 09:11 AMWhat I'm surprised about is with all this talk of programmers and their attention to detail, no one has mentioned that the pragmatic programmers link is 404.
I can has job now?
Newman Hunter on February 5, 2008 09:14 AM"Unless you truly enjoy programming you should seek another profession."
This is totally wrong. Sometimes developers are valuable because they write ok code, but also have solid communication skills and work well with others. How many of your 'super-coders' are borderline autistic uber-nerds?
The reality is that the pure coders are the most likely to get outsourced. If you're not working for a software company, chances are mgmt has no idea how good your code is. But they know if you play well with others.
I find it interesting that in this industry there is so much arrogance and the assumption that 'I' am a genious while my coworkers are idiots. Code quality is extremely subjective which reinforces these kind of opinions.
Robert Perkins on February 5, 2008 09:49 AMI for one, fall into the crappy programmer category. If you think you don't, think again. And again. And again.
As to:
...' There are a hundred thousand well educated Indian developers who will do what you do at a fraction of the price, '...
I would imagine they have the same problem. I'd be interested in the relative shapes of the curves though... I've seen a bit of off-shore code in my time and, with *very* few exceptions, it was crap.
spanky on February 5, 2008 09:52 AM"They studied professional programmers with an average of 7 years' (sic) experience and found ... no relationship between a programmer's amount of experience and code quality or productivity"
I don't think linking experience solely to time is the right way to approach this. In order for a programmer to gain experience, they have to code DIFFERENT things. Having a multitude of projects under your belt helps you learn the pitfalls of our craft because the variety stretches your preconceived design models past the point of breaking. If you have a person working on the SAME task for 7 years, then that's all they're going to be able to see when they focus on a new task. IMO this pretty much puts them on the same plate as someone that hasn't been programming for very long.
To me, the best way for you to learn about code quality and productivity is to be involved at all parts of the lifecycle. If you just repair bugs in certain modules that have been assigned to you, you start to lose sight of the product's big picture. Then, you stop understanding how "Input A" + "Mouseclick C" == "BSOD D." However, if you can reach that moment of "Wow, I would have never thought of this", you truly learn something (again IMO).
I would redo these studies and stratify the programmers (subjects) based on their understanding of a wide variety of code snippets. I'm willing to bet the understanding is going to relate pretty strongly to the quality of the things they generate.
I agree... and I'm using a small bash script to post this comment.
d.
dengel on February 5, 2008 02:15 PMGood advice. Except I am from the thrid world and the jobs are coming to my country. My problem is different I have trouble finding people who really love programming/coding/hacking and work mostly with people who just work to cash the check. It it wasn't for blogs like this and other places in the internet where people who really to improve and be a great programmer congregate, I think I'd just stay in school! Great post!
Neoryder on February 5, 2008 10:37 PMDo not assume blog readers are good programmers. I've read enough blogs to know otherwise.
In Fire on February 6, 2008 12:27 AMI don't believe INDIAN programmers are good, I still think american programmers,russian and europeans are good. I've seen these guys work and they are just a bunch of EGO-CRAP. By the way I'm a filipino.
If you think INDIANS are good well how come they haven't develop anything that's totally unique or amazing?
Well If you think about it they are just "COPY and PASTE" type of programmers if you know what I mean.
AnargeeK77 on February 6, 2008 05:21 AMThe first quote is on p. 682 of my edition of Code Complete. The link is broken too. The home page of the 2nd ed. is
Stephan on February 6, 2008 11:56 AM> 1. Unless you truly enjoy programming you should seek
> another profession. Be realistic: are you programming
> to collect a paycheck, or are you programming because
> you are driven to?
That doesn't really follow from your argument. A programmer can be really good but still be in it for the paycheck. I am usually writing code for money, and I am not always excited about what I'm writing, because it is rarely interesting or challenging. Still I'm fairly confident I'm writing better code than an eager but untalented programmer would write.
> There are a hundred thousand well educated Indian
> developers who will do what you do at a fraction of
> the price, and thousands more coming of age in other
> third world countries.
And almost all of them will be mediocre, if they follow the same pattern as American and European programmers do. They may be well-educated but they won't have the real-world business experience or the years of working on multi-programmer projects that I have, and working remotely isn't going to give them that experience. I'm not too worried. Outsourcing only threatens the mediocre, not the talented; if that was what you meant I'm sorry for not reading it that way.
> If you're reading this blog (and by this blog, I mean
> any programming blog at all), the above almost certainly
> does not apply to you. You're already spending your
> own personal time on professional development.
Actually we're probably spending our employer's time reading your blog.
> I'm not saying you should spend every waking moment
> in front of a computer like I do-- it's unhealthy--
> but the only way to keep our jobs is to actively keep
> improving. Treat your job like what it is: a highly
> skilled engineering profession that takes ongoing study.
True, but if you're one of the geniuses you don't need to spend all that much time honing your skills, because software technology moves pretty slow (I'm not referring to fads, which come and go). If you're untalented no amount of study is likely to make you a lot better. My experience has been that the mediocre programmers are missing a gene or something and no amount of study or practice makes them much better at programming.
Why you are worry about INDIAN Programmer ? They are still good enough to develop a software as well as hardware base product. I have designed I/O Controller(Ethernet, SATA, E1,T1, SDH frammer/deframmer) through VLSI(Design ,programming ,probing) and like linux I designed a Real Time Operating System much faster than linux and occupy lesser space than linux approx 3.5 KWord. Writing Code is still hubby for indian. Ok I will ask a qestion for you In linux suppose we design a process P1 and P1 having a system call sleep(10); Ok My question is being a programmer /designer ? how kernel will handle this delay to the process P1, Lin. Trovald known the complication to develop the delay syscall on multitasking system.
Ex.
processP1()
{ :
:
:
sleep(10);
:
:
}
Ex2.
void fx()
{
static int x=10;
:
:
}
Can any of one you tell me "static int x=10" is a imperative or declarative statement in C ?where x will go ?why x is initaize once? If you are strong in compiler design & its issues then you will able to code in optimize way. We indian are still investing our much of income into buying books & investing on inovation work "Ghost rider".
We are still not investing on showing what we have done. We are building our as Nation Strong as other developed country.
The post from Pravas indicates one problem I've seen with Indians, which is how they mangle the English language. It's a pity the Brits ever ruled India, because now so many Indians think they can speak English. On the programming side, there is a very serious issue. Yes, most Indians are horrible programmers - they produce buggy, uncommented code, they can't design large-scale projects, and so on. But the real problem is that now there is an Indian mafia of middle managers and even higher, and they are now in hiring positions in the U.S. They are only hiring other Indians or other 3rd world people. They will never hire an American. How will situation change? It won't, because Americans programmers are too docile and too unorganized. Yes, Americans will complain on blogs, and perhaps start a 'guild', but they won't band together and take serious action against the Indian enemy. And make no mistake, these Indians, who swarm out of their breeding grounds and infest our country, are the enemy. They are sucking the life's blood out of American programming.
Lee on May 2, 2008 12:36 PM| Content (c) 2008 Jeff Atwood. Logo image used with permission of the author. (c) 1993 Steven C. McConnell. All Rights Reserved. |