Why I'm The Best Programmer In The World*

August 14, 2004

It's because I'm so humble, obviously. Allow me to illustrate with an excerpt from the personal character chapter of McConnell's Code Complete 2.0:

The intense inwardness of programming makes personal character especially important. You know how difficult it is to put in eight concentrated hours in one day. You've probably had the experience of being burned out one day from concentrating the day before or burned out one month from concentrating too hard the month before. You've probably had days on which you've worked well from 8:00 am to 2:00 pm and then felt like quitting. You didn't quit, though; you pushed on from 2:00 pm to 5:00 pm and then spent the rest of the week fixing what you wrote from 2:00 to 5:00.

Programming work is essentially unsupervisable because no one ever really knows what you're working on. We've all had projects in which we spent 80 percent of the time working on a small piece we found interesting and 20 percent of the time building the other 80 percent of the program.

Your employer can't force you to be a good programmer; a lot of times your employer isn't even in a position to judge whether you're good. If you want to be great, you're responsible for making yourself great. It's a matter of your personal character.

At the top of the list of desirable personal character traits is humility:
Nobody is really smart enough to program computers. Fully understanding an average program requires an almost limitless capacity to absorb details and an equal capacity to comprehend them all at the same time. The way you focus your intelligence is more important than how much intelligence you have

At the 1972 Turing Award lecture, Edsger Dijkstra delivered a paper titled "The Humble Programmer." He argued that most of programming is an attempt to compensate for the strictly limited size of our skulls. The people who are best at programming are the people who realize how small their brains are. They are humble. The people who are the worst at programming are the people who refuse to accept the fact that their brains aren't equal to the task. Their egos keep them from being great programmers. The more you learn to compensate for your small brain, the better a programmer you'll be. The more humble you are, the faster you'll improve.

The purpose of many good programming practices is to reduce the load on your gray cells. You might think that the high road would be to develop better mental abilities so you wouldn't need these programming crutches. You might think that a programmer who uses mental crutches is taking the low road. Empirically, however, it's been shown that humble programmers who compensate for their fallibilities write code that's easier for themselves and others to understand and that has fewer errors. The real low road is the road of errors and delayed schedules.

When interviewing candidates for programming positions, I always look for someone who is brave enough to say "I don't know" when they need to. Candidates who can't or won't do this get red flagged; those types of programmers are dangerous. "Can-do" attitiudes have a superficial allure, but they're actually poison in our field.

Isn't the world of development blogs, an amazing fountain of seemingly endless knowledge-- also incredibly humbling? There are so many people, many of them giants in the field, who are far smarter and just plain better than I will ever be.

But it's not our job to be better than anyone else; we just need to be better than we were a year ago.

* Yes, the title is intended to be ironic. Just in case, I wanted this disclaimer here..

Posted by Jeff Atwood
46 Comments

I couldn't agree with you more, and reading what was on your homepage has definitely "evoked the feeling of suprized recognition" for me, by showing me what I knew, but didnt know that I knew...and here is how.

I've had the pleasure of working with two "can do anything, I know everything, my dad was a hell's angel, I know kung foo, plus I started programming kernels when I was 6" kinda guys who say they are going to do this and that but never actually get anything done, and when they do finish something, all they have really done is create a maintenence knightmare for everyone else because by the time they finish whatever it was they were working on, they are fired because our boss finally figures them out.

On the other hand, I've also had the pleasure of working with 1 guy who is on the other side of the spectrum...and now I realize what exactly it was about him that made him special...he was humble! Of course he was also a good programmer, but it was his personallity I think that made people trust him, and look up to him. The reason you trusted him was because he never failed to do something he said he could do...this is because, I believe that he never said he could do something unless he was absolutely sure that he could. But dont get me wrong, it wasnt that he wasnt confident in his abilities...I believe it was that he was aware of his limitations at the time, and was completely comfortable admitting when they had been reached. To sum it up, with a humble person, you essentially have a guarantee...you can feel confident that if they say something can be done, or can be done in a certain amound of time, it can and will be done, in that amount of time. People that can't admit when they are not qualified for a certain project, or just aren't sure about something, are people who create faulty programs badly, and become so tangled up in their if then else statements that they are finally forced to throw their hands up in despair and blame the clients or the programming language for them not being able to finish the project they said they could do in their sleep.

Although humbleness does not mean kick ass programmer, it does at least assure you that the person is probably reliable. So when giving interviews, don't be fooled by a person who adamently claims they are not an "expert" in java. After all, one the smartest people ever claimed that he didnt really know anything, and therefore in a way was one of the most humble people ever.

Thanks for the insight,

Mike

mike on April 17, 2005 4:29 AM

did not get this humble guy a job

srinath on April 20, 2005 6:05 AM

did not get this humble guy a job

Believe me, you're better off not taking that job if they can't accept an occasional "I don't know". I suppose if you were looking for a very narrow, specialized field of knowledge in a candidate, but that's rare.

Jeff Atwood on April 20, 2005 7:49 AM

This is really enlighting as most companies don't like to hear "I don't know". There is a difference between "can do" attitude and "i know i can do". Some people are just so arrogant that they will never admit that they "cannot do it" and "can do" is something which comes out of them without thinking.

Everyone has to deal with such people but "I don't know" are much better because they at-least give you an opportunity to decide what you need to do! In the end, you cannot force anyone to do something which they cannot do or they don't want to do. Best to stick with people who are honest about it rather than the ones who drag you into trouble like the first kind descripbed by mike.

Imran on June 19, 2005 6:22 AM

I wish I could communicate to people that humility is a good primary *motivator* for improving your skills.

The reason that people get into Design Patterns, and iterators, and dynamic functions, and languages with macros ... the reason you do this is because you simply don't trust yourself to be able to -- or instance -- MANAGE and MAINTAIN duplicate code, in the same projects or across projects.

And I hate when people misapply this Humble Programmer principle! It's arguing that it's arrogance to rely on your own brain, instead of a powerful abstraction that allows you to think about the problem in much simpler terms. Many people actually try to use the essay to argue against advanced coding techniques! That's not "humble", it's some kind of prima-donna, look-down-on-other-coders thing, right?

How do you get THROUGH to these people?!?

Whereas many a "can-do", "80's guy" programmer will gleefully blast through reams of duplication-heavy code, copy-paste at the ready, producing hundreds of files and folders and tables, very productive, look at that tangible output ... I feel, I KNOW, that I would be unable to keep my code from devolving into chaos. For one thing, I know I suck at keeping track of changes and making them in more than one place; it kicks my ass. In fact, I am less able to maintain non-orthogonal code than almost anyone else I know. I can't manage several hundred different but similar stored procedures for a variety of domain objects, even using tools like code generation. It kicks my ass and I know it, and that's why I went the extra mile, learned how to address the bigger problem, and now use a capable ORM library like Hibernate, and write only a small amount of specialized SQL -- like Nested Sets insert triggers, etc, which is just to support specific data structures.

A program is going to change. Since I don't trust myself to be able to redo all of this code later -- or even to remember what it was about -- I put a ton of effort into ensuring that my programs are very loosely coupled.

In so many industries, it would be difficult for me to succeed, because I have a terrible memory and a low ability to store much in my head at a time. Don't get me wrong, the stuff I do can be pretty powerful, but I HAVE to keep the programs and interfaces simple and elegant. Otherwise, I'm doomed.

In so many industries, the fact that the quality of my output varies drastically would bar me from working. In programming, if I just think about a problem for slightly longer than the time it takes to copy googled code and paste/adapt it to my needs, I know that I can always work with my best thoughts. And so the quality of my output can be consistently high.

mr_luc on August 22, 2005 3:27 AM

you see, programming is not just writing anything, it's about writing lines of codes that looks good to not just you but to so many people out there. You are not a good programmer because of the number of lines you wrote but because of the creative manner you wrote it. I just dont know what one can use in measuring how good a programmer is but all i know is that all programmers are GOOD irrespective of what language that use.

Moshood on December 23, 2005 11:57 AM

You really have a point here. My switch to get a humble programmer lasted years. Starting by lying to yourself and somewhat ending by not telling the "subtle untruth" about projects I wanted to have (no, I did not actually lie). And in a way I wrote about humbleness without knowing it of my own on my page (comparing programmer levels).

Keep on supplying us with that kind of blog entries! ;-)

Georgi

Georgi on October 19, 2006 8:47 AM

But what is "humility"? It's tricky because always saying "No, I don't know, I can't do that" isn't humility, it's false modesty. I see the following basic concrete instantiations of humility, some mentioned, some not. Please feel free to add more.

* The already-mentioned ability to say "I don't know" without it being a crushing blow to your ego.

* The recognition that there is code beyond your ability to manage, so you learn how to write code that isn't that complicated, as mr luc talked about.

* The ability to accept feedback from *anybody*. You may be the Senior Architect for your company, but programming being the tricky, hard thing that it is, the lowliest intern may have valuable feedback about your design. (I find the best feedback comes in the "customer is always right" sense, where the intern is a "customer" of your design. If they feel like something is more complicated than it ought to be, there's a reasonable chance they are right, even though their identification of the "root problem" may be laughably wrong. And even if they are completely wrong and it really does have to be that complex, a humble designer should not immediately resort to "Because I said so", but should at least try to explain why. ("Because I said so" does sometimes end up the final answer in our hierarchial work environments, I just don't think it should be the first resort.))

* Accepting that you can't do everything, and that others are capable of producing good code.

Jeremy Bowers on October 19, 2006 10:10 AM

I have said this for years, and it feels good to be agreed with. Programmers who can't admit to their mistakes will suck forever and make the same mistakes forever. Programmers who can't let someone else rip their code to shreds without getting defensive will suck forever and cause problems for their team.

One of the reasons I love TDD so much is that it supports humility. How do I write this feature? I don't know yet, but the tests will prove my hunches right or wrong.

The scary thing is realising how poorly I understood object oriented design until unit tests showed me the way.

Flinky Wisty Pomm on December 19, 2006 2:26 AM

Hey, If you don't know anything, should you say I don't know or I will try to do this.

Shalini on April 27, 2007 12:36 PM

The full E. W. Dijkstra archives are here:

http://www.cs.utexas.edu/users/EWD/welcome.html

Jeff Atwood on May 4, 2007 10:42 AM

I don't see why you compare "I don't know" with "can do"... For me, both are true. I am the type who says "I don't know yet, but I am sure I can do it" and I find this a very contructive attitude. This is what got me this far and what will probably get me further. I think that I can do anything if I try (and this is not true just for me).
I think it's wrong to say "I know", but I see only good in "can do".

daniel on May 11, 2007 3:04 AM

I totally agree with you. It's better to know that you know nothing and question what you don't know in order to understand it rather than believe you know everything and learn nothing.

psyphen on May 25, 2007 1:24 PM

Awesome entry, will probably help me when I'm out for a job after the university. Keep up the good work!

Echuu on July 24, 2007 3:50 AM

very interesting forums, for my self, if i'm facing problem or something that I don't know yet, I will just say I don't know, but I will try to find out. I believe wherever there's will we can do 'almost' everything.

Dang on July 27, 2007 2:50 AM

I agree wholeheartedly with the original article, and what was said about this argument being misused to justify simplifying languages. I think languages should be complicated so I can write shorter code. Write one complicated compiler, and millions of smaller programs rather than the other way round.

It really pains me to have to read Java code because it can be so much more unneccasarily verbose (and therefore harder to maintain) than more powerful languages like C++, Smalltalk or Lisp.

I really wish someone would give me a language with all of C++'s power but adding "modern" features such as (a natively supported) garbage collector, (intrinsic) delegates, (possibly) a "managed" environment, modules instead of headers, and a larger standard library. D doesn't seem quite mature enough, or rigourous enough to stand the test of time. C# is proprietry, and moving in the wrong direction. C++ development itself seems glacial and suffers from too much historic cruft.

Alex on July 28, 2007 6:28 AM

I entirely support your argument. Many of my friends who consider themselves to be great programmer "because they have been writing code since they were 8" never wrote code which could be maintained by others. And as a result never built a maintainable software or an extensible software. And even if they did ... (only once !!) that could not be understood by anyone themselves included.
I am not as great as them though I earn my humble bread by writing clear easy to understand code.

sanjay ghosh on September 4, 2007 7:46 AM

Personally, idont know what it takes to be a good programmer coz am a fresher in that field.But i would like to thank you for giving me an eye
openner

Mark on December 13, 2007 3:56 AM

programming is all about knowing when to boil the orange sponge donkey across the phillipines with an orangutang gorilla crossed with a ham sandwich to the fourth power of twelve across the nile with an awful headache from the previous night when all of alfred's naughty jalapeno peppers frog-marched the nordic elves across the loom-lined geronimo induced swamp donkey over and above the fortran fortified kilomanjaro fence past the meticulously crafted anti disgusting sponge cake scenario where all the hats doth quoteth the milk which is not unlike the super werewolf from the infinite realm of ninja-step. it's hard to define, really.

hello on December 17, 2007 6:11 AM

dont know how to translate into english,.. but:

Only stupid people think they are smart.
Because smart people know how much there is to know.
Smart people know they are stupid.

anyway, good post jeff.

Peter Palludan on December 17, 2007 6:23 AM

Being humble is key to improvement.if you don't want to suck forever be humble. :)

gogole on February 3, 2008 1:50 AM

"Only stupid people think they are smart."

Smart people agree that they are stupid... and consider others even more stupid. :)

Aare on February 6, 2008 11:37 AM

does anyone know where dijkstra used this
"Object-oriented programming is an exceptionally bad idea which could only have originated in California." i'd like to see the context;) it is supposed to be his words. i was not able to find it anywhere.

xchmelmilos on April 22, 2008 1:15 PM

Uhhh... I read your twitter. That's not spam, man.

Daniel Talsky on June 7, 2008 12:11 PM

Programmers tend to expect a rule of thumb for everything, sometimes failing to understand that it is not a matter of ALWAYS saying "I know" or "I don't know". While humbleness is an admirable attribute, one doesn't have to be always modest; instead, I think it's more important to know your own limits and be honest with your assessments.

This reminded me of an interesting article from Harwell Thrasher in which he identifies four different learning stages (http://www.makingitclear.com/newsletters/newsletter21.html#article), he does a good job on breaking down the whole idea of "we don’t know what we don’t know" and so on, reinforcing the importance of being constantly learning.

(excuse my little fan moment) Jeff, I enjoy reading your posts a lot! Thanks for giving us good stuff to think about!

Tati on June 8, 2008 3:05 AM

That bizzare comment looks like it came from someone playing with the surrealist compliment generator:

http://www.madsci.org/cgi-bin/cgiwrap/~lynn/jardin/SCG/

It's probably something that tries to subvert the anti-spam stuff, but if there were no URL's in there then no idea why it was sent, unless the perpetrator was just seeing if they could get past the gatekeeper.

Francis Fish on June 9, 2008 3:46 AM

"I don't know but I know how to find out" got me a job making TV commercials for a multinational Ad agency in the 90's.

A modest level of confidence and no BS has always served me well and when it didn't, hell I didn't belong there anyway.

CADbloke on June 23, 2008 9:39 AM

always send latest achievement in programing world to me

busayo adeshakin on September 28, 2008 1:53 PM

always send the latest achievement in the programing world to me.

busayo adeshakin on September 28, 2008 1:56 PM

no life no money i'm developper programmer java but i have nothing

chamchoum on November 28, 2008 1:36 AM

The prob is....
When I said 'I dont know'
I really dont know
Will you still take me then?
I think egoistic and confident are two different things.
So it is better 'I think it can be done, just let me try'
Explorative, dont you think so?

kaka on January 28, 2009 8:58 AM

Being humble is key to improvement.if you don't want to suck forever be humble. :)
http://megavibor.ru/

Oskar on February 7, 2009 1:51 AM

#include
using neamespace std;
int main()

ghdfhfghfgfd on February 28, 2009 8:18 AM

totally fake

Anup on March 30, 2009 6:12 AM

Personally, idont know what it takes to be a good programmer coz am a fresher in that field.But i would like to thank you for giving me an eye
openner
http://goldyacht.ru

Hitroglaz on May 14, 2009 10:52 AM

I don't know functional programming, and I use to get confused with my own ideas :(

yelinna on May 20, 2009 2:41 AM

yo, good men!

Apuabi Oladapo on June 26, 2009 3:18 AM

this one of my most favorite most visited blog posting ever.

Stan Rozenberg on July 8, 2009 12:54 PM

Yup i m 1005 agree with you , programming is very difficult and as a student of third semester i personelly feel that i can not be a good programmer but still i am trying to do my best.


Anum Shahid on August 16, 2009 5:29 AM

yup i m 100% agree because as a student i personelly feel that programming is a full time attention job and no one can be a good programmer without humbleness n hardwork.

Anum Shahid on August 16, 2009 5:36 AM

Wow! Now I see the difference between me and most of other students at school. Great blog! It was really an enlightenment.

David Mifsud on August 20, 2009 2:48 AM

i donno, but i always say "can do" meaning we can try, cuz i dont want any good design to be suspended/cancelled without trying.
i feel red flagged haha.

Albert on August 20, 2009 12:11 PM

Being humble or that " I don't know " attitude does not guarantee that one should be any better programmer. But at least being humble would leverage more possible potential to learn more or dig in to the subject more.Concentrating at the intricacies of the computing applications across many distant, wide and futuristic verticals , by one person , would rather be an exhaustive and daunting task, so its difficult to say who the best programmer is.Nevertheless , there have been quite a few people who have changed the face of our life altogether,by developing great applications and practical ideas - should be the good contenders to this list, but who outweighs the rest and emerge to be the winner- let them battle out themselves.

Reach4vin on June 7, 2010 11:59 AM

I'm VERY arrogant,
I'm VERY condescending,
I'm VERY intellectually conceited,
I'm constantly belittling the mental laziness of others,
and I'm ashamed of how often I find myself referring to others as monkeys.

But I'm also the most ruthlessly honest adult person I've ever known personally (closely). I never misrepresent my skills, or knowledge. That goes for everything in general, but also of programming. I freely admit, my knowledge and skills in programming are woefully inadequate for a person who has been programming at least 10 years now, to earn his living.

This doesn't make me all THAT unique, but there's more to it. There's a horrible irony to my condition.

I happen to be a life-time student, having found myself more comfortable in academia than elsewhere. And I've been paying for my decades of useless "book-larnin" by working with computers and software as I mentioned above. So you'd think that I'd be quite proficient in at least one compiled language by now, right? --- wrong! Other than a small handful of ultr-small projects I did WITH HELP FROM OTHERS, I couldn't program my way out of a wet paper bag, in any compiled language (and I'm including .NET here). I'm still stuck googling my way through each and every line of code I ever write, even simple VBscripts and such. I'm like a spineless suck-up whenever I meet a person with "real programming" skills, trying to earn points with them, for the inevitable day I'll need serious help.

Sometimes, when I'm feeling less self-destructive than usual, I might blame the constant backlog of senseless basic 'support' stuff I do, which mental midgets lump together in the same barrel as fun 'tough' things, that are more dynamic or interactive, but usually lower priority (and may just get abandoned altogether, as a result).

But there is no doubt, a huge part of the problem is that I can't recall the syntactical grammar of languages. I think maybe it's partially genetic -- that I've got crappy memory, despite deep capacity for understanding and analysis. But it's also exaggerated by my life-long insomnia and related susceptibility to distraction. Maybe I'm just prone to multi-tasking mania?

I can't even remember my Google Voice number, which is on every single one of my emails (of which I send many, per day). I've stopped at least 3 times now, and repeated it to myself thinking "now, don't forget it again!".

Many eons ago, as a young undergrad student, I bought some crazy big memory "systems" (like audio tapes and stuff) to help me improve my memory --- at prob at that time, was 2nd year organic chemistry formulas, and other stuff. Nope. Didn't help one bit. I had to really struggle over the easy memorization stuff, but the complex folding stuff was cake! I taught myself differentials and integrals (calculus) in 3 days by reading a short book on it over the weekend when I found out that my 2nd year physics class required it, and of course, I aced that class as if I actually had that pre-req. But then, that stuff all connects together, in the ONLY way possible, like a puzzle where no other logical piece can fit. It virtually constructs itself, like the flow of a story.

So why can't random rules governing glyphs algorithms imprint on my memory? Am I really to be expected to create some crazy story linking together the components, for EVERY SINGLE string of symbols or rules I meet, from here to eternity? What dark angel has planned this for me, to be without employable skills worth a reasonably high rate, in any field other than technology, and yet, at this late hour of my life, I cannot recall those silly patterns that govern arbitrarily the names, numbers, and their order in synthetic taxonomies?

And, if you've made it this far through this enormous comment, there's one last cherry on the top. Despite the paradoxical lack of programming skills I find myself trying to scrape a living out of, constantly undermined by a colossal ego, and stupidly honest tongue, I LOVE TO PROGRAM SOFTWARE CODE. Crazy huh? I think if I really desperately needed to (if my kids need surgery or something), I could resort to wearing a suite and tie, go around telling innocent 'white lies', and make lots of cash like the monkeys I poke fun at. But I don't think that would be as fun. It's almost like an addiction, the initial problem, followed by the grudging relentless pursuit to unravel the "how" and the final unveiling of the working code.

Paul Richardson on August 17, 2010 12:41 PM

This is really a great post :)

Reportingavatar on January 23, 2011 9:30 AM

I wish I had read this way earlier. I will stop aiming to be the best or the guru and just focus on learning better techniques. Just keep going....

Jjk3 on March 21, 2011 9:15 PM

The comments to this entry are closed.