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.