Skill Disparities in Programming

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.


This is a companion discussion topic for the original blog entry at: http://www.codinghorror.com/blog/2004/09/skill-disparities-in-programming.html

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!)

At the risk of being redundant (well, it isn’t that bad in the literary realm :slight_smile: – 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

This 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!

I 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?

As 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.

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…

I’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/

Of 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.

I 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.

…’ 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.

I agree… and I’m using a small bash script to post this comment.

d.

“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.

When 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?

I wonder what the ratio is between us commenters :wink:

Just 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!