Quick! Answer the following question without thinking about it:
How would you rate your programming skills? (Below Average, Average, or Above Average)
Based on psychological studies across many different groups, about 90% of all programmers will answer “Above Average”.
Of course, that can’t possible be true. In a group of 100 people, 50 are above average, 50 are below average. This effect is known as Illusory Superiority. It’s been documented in many domains and even if you’re aware of it, you’ll probably still answer the question above as “Above Average”.
For even more fun, try asking that question to every programmer you know. Don’t ask them in a group, ask them one-on-one to get more ‘honest’ answers. You’ll get similar results, even from people who you know can’t program their way out of a wet paper bag (this is the Dunning-Kruger effect, but it’s related). It’s an epidemic in our profession.
Now, let’s suppose for a second that you’re right–you are actually above average. You are da man. A rock star. God like capacities amongst mere mortals. Keyboards bow in reverence to you as you approach. Trumpets sound on high when you commit on GitHub.
If you’re above average, then chances are you’re an expert at what you do. Calling yourself an expert sounds quite compelling–you get respect, deference, and prestige by being one.
Being an expert means you know it all about your subject. Unfortunately, it also means you’re going to get lazy. It means you’re going to eventually rest on your laurels and sit around thinking you’re better than everyone else instead of actually working to get there. Your expertise will become a liability because you stop trying to learn. Maybe not today, but soon enough.
Instead, why not consider the more likely possibility? You’re average, or heaven forbid, below average. Aside from the personal stigma you might suffer here, think for a second about the real benefits of doing this:
- By assuming you’re not at the top of the pack, you now have incentive to get there
- By assuming you’re not the smartest person in the group, you now have the opportunity to learn something
- By assuming you’re not the best at what you do, you’re going to work harder to improve yourself
Perhaps you’ve heard of beginner’s mind? Summed up by a zen master in classic koan-brevity:
In the beginner’s mind there are many possibilities, in the expert’s mind there are few.
The trap of calling yourself ‘expert’ at software development means that you pigeonhole yourself into some language (Java, Ruby, PHP), some industry (medical devices, social networking, games), or some specialty (embedded programming, enterprise software). Once you establish that expertise, fear of failure arises when you consider going outside that comfort sphere. With your golden hammer of experience, everything appears to you a nail. You stop thinking about screwdrivers and all other possible relevant tools because they’re no longer inside your ‘expertise’.
This is why starting out in software you wonder why “experienced programmers” can’t get X, when you just learned X in a matter of days. X could be anything: closures, object-oriented programming, Ruby on Rails framework, Haskell programming. It doesn’t matter in the end, the expert’s mind is cluttered with old knowledge. The beginner’s mind is open, free of hindrances.
It’s harder to learn when you’re an expert. And this is why being the ‘expert programmer’ is dangerous.
So what’s the number one thing you can do to be the best programmer out there? Start by considering yourself below average. Step out of your comfort zone. Be the averagest.
A master never stops learning, and neither should you.
28 Replies to “The Problem With ‘Above Average Programmers’”
There are so many possible responses to this article. Yes, there is a “Lake Woebegon Effect” (where all the children are above average), but I’d like to make a few other observations.
1. Headhunters and hiring managers are looking for above-average programmers. If you say you’re “average”, you disqualify yourself.
2. An individual may well be above-average in one or two areas and average in others. How should he answer the question?
3. Contrary to your assertion, there is a vast difference between being “above average” and “expert”. A better grading scale would go from 1 to 10, with 5 being “average”. I suppose Linus or ESR in their prime was an 11. Most of us are mere mortals.
Having expressed my reservations, allow me to say that your observation “the expert’s mind is cluttered with old knowledge. The beginner’s mind is open, free of hindrances” is spot on.
Don’t confuse “self-improvement thinking” (my hypothesis) with good marketing (your assertion about headhunters). Clearly you don’t want to represent yourself as the below average guy. But if you think you’re the expert in a certain area, you’ll get lazy. That’s the point I’m trying to drive home here.
I think you’re confusing the average and the median (as many people do).
It is very much possible that 90% are above average (though unlikely). For example, the average of [1,2,2,2,2,2,2,2,2,2] is 1.9, and 10% of the numbers are below this, and 90% are above it.
In contrast, it is always true that at least 50% of the numbers are less than or equal to the median, and at least 50% of the numbers are greater than or equal to the median.
Fair enough. Sloppy language, my bad. But in a given group of people, there is a median of expertise, and half will be above, half below it. That’s the point I’m trying to make, albeit without the proper statistical background. 🙂
“It doesn’t matter in the end, the expert’s mind is cluttered with old knowledge. The beginner’s mind is open, free of hindrances.”
I would not go as far as saying that the expert mind is cluttered with old knowledge.
As a programmer I am happy to let go something I know for another thing more efficient, as should anyone.
Lets take one example:
Beginner rarely go in large optimization spree, and here lie one problem, your years of experience gave you optimizations knowledge that young hipster has yet to have. And have yet to use in real live programming. It’s one thing to do “perfect example”, it is another to use it in real cases.
Still I think your point is solid, we live in a world of competition where you need to produce rapidly good code, you want to be seen as an expert, you might not even understand why you are not an expert
anyway, I am an expert! 😛
“The Problem With ‘Above-Median Programmers’” doesn’t sound nearly as catchy.
In common usage, “average” is perfectly understood to have the sense “in the middle.” Yes, if you’re writing for statisticians, you’ll want to use “median”. But for the larger audience, “average” is more likely to get across the intended meaning.
I’m an expert programmer. Says it on my job level, right there in the HR records. Says it by the kinds of tasks I get (not so much programming anymore 🙁 ). Says it by my managers.
However, I love to program. I love the nitty-gritty semi-colons syntax errors. I love the elation I get when I get a complicated thing done.
I also like to learn new stuff – so I keep on doing it, both “hard-core” programming, meta-programming (how to think about… how to develop strategies of design…) and non programming tasks (ITIL, Effective management, computer hardware and its effect on software).
For example, I’ve just finished listening to a fantastic GoogleIO 2010 lecture about GWT/Roo/Spring integration and activity based programming. The chances I’ll ever use it – small. The chances I’ll use it in the next 2 years – closer to nil. But it’s fun, it’s intriguing, it’s exciting, it opens a new world of possibilities (I like to compare it to a “limit” action in math – you get to places you couldn’t go before because you had too much code to write / manage / maintain).
But I digress – I’m an expert. But I also love to program. Not just develop software – program. I do it in my spare time, I stay at work late to complete “hobby” projects in the product. I’m not an average by far, but I’m not complacent either.
While there obviously is a base level of code competence to begin with, after that, I feel that attitude and motivation is far more important.
I’ve been inexperienced and highly motivated, and years later at a job I didn’t care for, much more experienced and much less motivated. I’d probably call the former version of myself the better coder. All the code knowledge in the world is useless until it’s used.
>>Being an expert means you know it all about your subject. Unfortunately, it also means you’re going to get lazy.
This is a generalization you are asserting as a fact. “If expert -then- you will become lazy”.
So, you’re confident in saying, that 100% of all experts in programming in the world are, or will soon be lazy. (maybe we need to define “soon”)
That someone who is a bona-fide expert in something, cannot resist the laziness urge.
And that no person is an expert in 2 things – because, they would have become lazy prior to attaining 2nd experthood?
He’s not writing for a larger audience. He’s writing for programmers, group of individuals that most likely have some basic statistics background.
(Over)confidence does seem to breed smugness, and no one learns when they think they’re the best.
I’ve been programming professionally for about a decade now, and it seems that the more I know, the more I don’t know.
There are people better than I am at programming, and there are people worse. I wouldn’t know where to start at rating myself against the rest of the population; all I know is that I have to keep learning or I’ll become useless.
People keep talking about this as if programmer ability fell along a Gaussian distribution, where the mean and the median and the mode all fall in the middle.
It doesn’t. Programmer ability – by any measure – falls along a Rayleigh distribution. There is a 10-1 difference in ability, but the best programmers are perhaps twice as good as the median programmer, and the worst programmers being only one-fifth as good.
The mean is skewed, by the long tail of inept programmers, to be well below the median, and most programmers are, in fact, above average.
Most of the developers I work with are an incredibly humble lot, but I guess we all like to think we’re good at what we do.
“In the beginner’s mind there are many possibilities, but no ideas as to which work. In the expert’s mind there are even more possibilities, but the expert knows most of them do not work.”
Fixed it for ya.
Don’t confuse expertise with complacency. I’m happy to recognise myself as an “above average programmer” as a generalism, and even be recognised as a close to an expert in very specific areas. Does that mean I’ve stopped wanting to learn more about those areas? Absolutely not. Does it mean I’m not interested in learning about other areas? Crikey no.
By all means encourage people to keep learning – and keep challenging what they’ve learned in the past. That’s *very* different from encouraging people to develop an inferiority complex.
I fully agree with the observation that thinking one is above average is a profound problem in our profession. One other nasty effect of this is that it tends to make programmers arrogant and grumphy.
Years ago I worked in a team under a lead developer who really was an expert. Decent education, years of experience, intelligent and always busy with studying new stuff. The kind of guy that probably toured the country during weekends to engage in programming competitions, attend conferences, etc.
Then there were this 2 guys in our team who were quite decent, but just not at his level. For some reason however they thought the were at his level or even beyond. So they proposed making some changes to the architecture, they became furious when the lead told them those changes were ‘maybe not the best approach’. It was basically like some random programmer knocking on Linus’ door and demanding to complete reverse the inner working of the Linux kernel, and then getting mad when Linus doesn’t immediately complies.
Somehow however these guys kept believing they were better and that their ideas were being ignored for no good reason, and if only they were in charge things would really change for the better.
This went on and on and a third guy joined and also thought he knew way better, and eventually the lead threw in towel and resigned. The guy with the biggest mouth now being the lead promissed to change things and improve stuff, but half a year later nothing substantial came out of his hands. His supposedly superior design tactics were nothing more than a few vague use case diagrams and a few absolutely trivial class diagrams. His ‘fully thought out planning’ was nothing more than 3 bullet points: first day: start of work, second day: busy, third day done. The day his new code went live, our system had its first major crash in 7 years. I personally left half a year later. Last I heard is that the guys who thought they were so much better have found work in ‘others professions’…
Interesting, but I don’t agree with everything.
If somebody is really “above average”, it is because they coded a lot, but also because they took time to study, learn new things, deepen their knowledge. What makes you think they will stop now they reached this “high level” of expertise? Most of the time they learn because they like what they do and so won’t stop there.
“the expert’s mind is cluttered with old knowledge”
Why “cluttered”? Behind knowing several fields and being able to connect them (applying functional language paradigm to Java coding for example) might be what makes you an expert.
It is like stating that experience is useless, “better hire two cheap enthusiastic and clueless programmers avid to learn than a costly seasoned coder that will code slowly” (but perhaps writing better code, needing less maintenance…).
This is retarded reasoning. It would seem that this is more of an issue with the person’s persona rather than his expertise. Resorting to such facetious gimmicks to refresh one’s passion for programming is absolutely ridiculous in my opinion. Consider people like Linus Torvalds, Bjarne Stroustrup, Richard Stallman and on the other end of the spectrum, Ken Thompson, Guy Steele, Donald Knuth and others. The first set – genius dicks. The second set – genius and affable. Still great programmers with no delusion of their own greatness.
I think you’re describing “teenage” coders. They’ve learned enough to think they know something and are lazy. When they mature, they’ll get to the point Steve describes where they’ll understand how much they don’t know.
I’ve been programming professionally for about 14 years. I am an expert in a couple areas, but I know there are tons of things I don’t know and am constantly pushing myself to learn new things. I’m listening to podcasts and reading blog posts from people who are better than me. I’m in the middle of at least 5 books on new programming languages and techniques. Five years ago I was probably in this lazy mode that you describe, but I matured past that point.
Also, anyone who’s taking the time to read this blog most likely IS above average. But also is most likely not in the lazy phase that you describe.
Just like in life, there are some people who never mature past being a lazy teenager. It’s very sad. However, most people grow up and get hungry again.
thank you, I like your post so much that I decided to translate it to Russian.
This is transletaed article on a popular russian IT-related site:
As you see, there is a lot of comments (137 by now).
Just one thing i would like to add,
that is dont write that your are average in your mid year review ;-).
You want to learn by considering yourself as an average or below average, will be perfectly fine. You should be have this in your mind not in your work or in your review!
I’m not a programmer, although I do a little bit here and there when necessary. I’m considered by others to be an technical expert in other things – one person once called me brilliant.
My strengths are the ability to define problems, the ability to figure out solutions and the persistence to get the problems fixed. I find the harder I work, the more it appears that I’m smart and am an expert.
Thanks for the nice thought provoking post.
My opinion is slightly different. I have an open mind. I let the world / people I work with decide what is my status as a programmer/problem solver/designer.
I think ( and this is solely my thinking ) – that once a person thinks that he is an expert – he can take 2 steps – become complacent and relish the aura round him OR he can take steps to get to the next level. For example – he can start contributing to open source projects, start new open source projects, deliver lectures/talks on conferences, meet more people / peers and may be teach in colleges/univ etc. This opens up the avenues for further learning the moment you expose yourself to a wider group of learned people and also start teaching. Teaching makes one a more expert and helps one to identify ones’ problems / weakness / shortcomings.
So I think it is also dependent a lot on the individual – how hungry the concerned person is for more knowledge/education/learning.
What do you think ?
Spasibo, Andrei. 🙂 (Sorry, no Cyrillic keyboard mapping here!)
All I can say is: I’m a mean programmer!
Comments are closed.