(This is a snapshot of my old weblog. New posts and selected republished essays can be found at raganwald.com.)

Monday, April 24, 2006
  Why do we resist the idea that programming might be hard?

Don’t blame me for the fact that competent programming, as I view it as an intellectual possibility, will be too difficult for ‘the average programmer’, you must not fall into the trap of rejecting a surgical technique because it is beyond the capabilities of the barber in his shop around the corner.
Edsger Dijkstra
Programming something even half decent requires considerable intellectual ability. That’s not all there is to it, but if you’re not smart, it will be much harder for you to be a decent programmer. We’re mostly in denial about this and would like to believe that programming can be done by anyone or can be made somehow unnecessary. It’s the opposite view we take to managerial or executive ability, where we pay through the node for talent. Yet it’s been known since we started building software that some programmers are much better than others. Maybe all disciplines are like this, but it is very obvious in programming. Naturally this intelligence makes people who don't have it uncomfortable, particularly if that person is supposed to lead or organize very smart people to do something that they don't fully understand, even though that person is probably better paid, more socially equipped and has nothing to worry about.

As with meat-markets this is not something we like to talk about a lot. It’s not egalitarian and intelligence is something we’re sensitive about culturally. But consider that it’s not controversial to say being a good musician or athlete requires a level of ability, some of which is innate. Or that our educational systems are based around being ranked smarter than the next person anyway. So we should get over ourselves a bit and accept the fact the good software requires more than stringent process; it requires well-above average intelligence to create it.
Bill de hÓra

The statements that make people mad are the ones they worry might be believed. I suspect the statements that make people maddest are those they worry might be true.
—Paul Graham, What You Can't Say


I have recieved a few emails and comments suggesting that anyone can become a good programmer with sweat and dedication. Here're my personal feelings:

I don't believe that anyone can become a good programmer with dedication, practice, and experience. In case you haven't guessed from the third quote above, my interest is not in whether there is an innate talent involved with programming, but in people's state of denial.

Let's look at what it means to improve and to be good.

I suppose there's some room for argument about whether almost any infant or toddler, if exposed to the right stimuli, can become a good programmer. Our knowledge of genetics and early brain development is primitive.

However, by the time people reach their teen years, I believe that much of their potential has been established.

With dedication and practice, people can improve almost anything, however in most fields this improvement shows diminishing returns. It may be aymptotic, so in theory they may eventually become a good programmer or a chess master, but in practice this may take longer than the number of productive years available.

With respect to everyone who has emailed to say that anyone can be a great programmer, how many of you play Bridge or Chess? These are fields where no serious practitioner believes that round the clock study and fanatic devotion will take you to the top: winning requires both potential and the will to fulfill that potential.

Likewise, how many of you who write or email play a musical instrument and especially compose music? Many people have fanatic devotion to practice, yet every generation yields remarkably few geniuses that will stand the test of time.

Why do people consider fields like Bridge, Chess, Athletics, and Music different from programming?

I think the salient distinction is that we habitually consider games like Bridge, Chess and Athletics very competetive. And if you're paying close attention, we consider Classical Music and Jazz equally competitive, if not more so (where do you think we got the word "Diva"?).

When something is competitive, it's irrelevant how good you can become through practice. If someone else can become even better with the same amount of practice, you will be unable to surpass them.

Of course, you can still surpass those that don't study, practice, or learn from their mistakes. That's important. But if the field is desirable enough that there are a significant number of innately talented people willing to study, practice, and learn, then only those with innate talent will occupy the top spots.

I believe that if programming jobs were more demanding and that if the industry were more competitive, we would rapidly lose all pretensions to egalitarianism.

But what do I know?

If you found this interesting, you may want to read How to make programming hard for yourself.

Labels: ,


Comments on “Why do we resist the idea that programming might be hard?:
Programming can be mastered by anyone. But just like playing
basketball or golf, it takes practice, experience and
dedication to become a master of it. The same can be said of
any occupation, profession or field of knowlegde. I also
don't believe there's anything innate about talents. All the
talented athletes, artists and musicians I know put an
obscene amount of time into mastering their trade, so much
so that they can be categorized as obsessed with their
talent. It is true writing good software requires good
developers. But it requires good developers that have learnt
the painful lessons of writing bad software via experience.
Regardless of your programming prowess and talent,
experience will always continue to school you. By the way, I
know many smart/intelligent mathematicians/programmers, who
happen to be horrible software developers.
Mystilleef, I'm going to disagree with you. Perseverence, practice and experience do count for a lot, but someone who lacks the natural ability will never become a "master".

I dont know if I can make a convincing example with regards to programming, but. I've joined a martial arts club a little while ago. A couple of people that joined at the same time have left me in the dust skill wise and I do put in just as much effort as they do. The reason for their incredible speed in acquiring this art is talent. Not only are they more flexible and quicker then me, they just seem to "get it" faster. I feel that with time and effort I'll be a proficient fighter, just not a "martial artist". This is fine by me, I think. The same argument, I feel, can be applied to programming. Without talent you'll be a good proficient programmer, you just won't be an "artist".
(posting anonymously because this comment has a bit of a bragging tone to it, though that's obviously not the intent)

This sort of debate is difficult because there's a chicken and egg problem. I think a good bit of my skill comes from the amount of time I've put into programming, mostly just for fun. The question is, do I code for fun because it's enjoyable to do something that I'm good at? Or is it the other way around, am I good at it because I do it for fun enough to be experienced?

Another thing that makes this a difficult question to answer is the way that having a bit of obscure knowledge can mean the difference between scratching your head for three hours and having it work perfectly the first time. That makes the difference between someone with more experience look like a genius, even if generally the two individuals aren't especially different in terms of raw talent or intelligence.

I'm not really going to weigh in on this debate though, because there are a lot of confounding factors, and a number of people posting here are likely to have much more experience with a range of different developers than I have.
"I don't believe that anyone can become a good programmer with dedication, practice, and experience."
"I do put in just as much effort as they do."

There is more to developing any skill then, dedication, practice, experience and even effort. Skills which are often thought as innate, absorbing information(Memorizing raw data), adapting ones perceptions, the skill of learning quickly(Making vital connections and weeding out unimportant information) and others, are no more innate then basic reading or writing and in my opinion when an individual possesses great amounts of the aforementioned skills causes the false impression of genius by innate talent.

Innate talents well may exist, however I doubt they are observable though casual observation of the everyday world in most cases.
I had a lot to say, but it's mostly already been said. <=/

No one wants to hurt feelings, especially their own. It's really frustrating to work hard, and still be bested by someone who's clearly better than you. I think it's comforting to imagine that that person maybe is "obsessed with their
talent", and just works harder than you. I know I've felt that way many times playing Ultimate frisbee.

Also, so many talented people with different backgrounds, successfully writing software, makes it trivially easy to point to an exception to any general statement.

It would be good if everyone posting remembered that "Our knowledge of genetics and early brain development is primitive."
i think "talent" basically IS the rate at which you can learn something.

personally, i am a very quick learner, and it has meant i have been able to jump-start myself into various roles. however, competency is not mastery, and i have tended to know when to quit when i reach a point where i am going to be butting heads with people who have

1) devoted much more time than myself to an area,
2) received highly specialized instruction/acquired highly specialized skills, and
3) (as someone said) you hit a point where the desirability and the rewards on offer mean that competition has installed an elite who have achieved mastery (and good luck to them).
4) employers are not likely to want to employ someone who has not gone through the educational path that the masters take (this is why you don't expect an interview if you have sold hot dogs and the other guy went to MIT)
5) simply have much higher levels of natural talent

i have done some computer programming and it demands a mode of thought that, if someone has some affinity for it, can certainly be developed. and, of course, not everything has to be developed from scratch, there are enormous resources to plug into that aid development, in exactly the same way musicians improve their playing by listening.

however, unless you are a master on an atypical path, it's likely that you will discover your limits sooner rather than later. that doesn't mean that you can't reside on a plateau quite happily. it also doesn't mean that people who are not masters have no appreciation for the great feats that brilliant programmers are capable of. it's good to have that sympathetic audience out there, because their enthusiasm helps in the take-up of new ideas.

i went to art school and one day a professor said privately, "you know, i don't expect many students here to practice as artists professionally. but what concerns me is to create an audience for those that do."

lastly, if "intelligence" is going to be advanced as something to not be ashamed of, i think that needs to be qualified. put simply, it's not about being intelligent, it's about being a brilliant programmer. brilliant programmers may all be intelligent, but they represent a tiny subset of the intelligent people in society.

so if you're going to talk about hard, how hard? rocket science hard? surgeon hard? astronaut hard? set a level by all means, but you have to distinguish between the typical programmer's skillset and those that apply to the absolute top jobs, as there are gradations, just as bus driver is not comparable to NASCAR racer.
There are things that a certain portion of people can not master.

I was a child prodigy mathematician. I got my undergrad degree at age 19, easily, and did a few more years of graduate work before quitting the field.

I learned some Algebraic Geometry... barely. It's pretty obvious to me at this point that no amount of time or effort, no other circumstances, nothing but innate talent, could have made me learn it any better. I certainly can't learn it Also, I'm pretty sure the majority of people in the world can't learn it at all no matter what.
Correction to above:

I certainly can't learn it as well as the stars of the subject.
Practice and dedication will only get you so far in any field. Bruce Lee, Jimi Hendrix, and Michael Jordan had innate talent in their fields that led to mastery. Not just anyone can attain such skill. Why couldn't the same be said about programming?
I've never seen any indication that this is true. Indeed it has always been the opposite in my opinion.

Excuses are easy to make after you have given up.
What you're saying is that there aren't many people with the potential to be the best programmer in the world. Fair enough. But I don't think it's exclusively a matter of "intelligence" or "talent".

I think a more important factor is obsession: does this person do anything else with their time? Or are they 100% programmer, thinking about their problems in the shower, dreaming about it in their sleep?

Basically, not everyone has the mindset to be the best programmer in the world. Like being the best athelete, it will require more dedication than most people would consider healthy.
You start with a good Djikstra quote and go downhill from there. Don't get me wrong, I think good programming is difficult. And I don't think that if I practice every day, I'll be playing in the NBA (or in any national sports league!) any time soon.

What I do think is that with practice, coaching, and experience, most people can become *competent* in most endeavours.

You're talking about the stars in a field, which I think is a red herring. Just because an architect couldn't design the Taj Mahal or St. Peter's doesn't mean they can't do good, high quality, work.

I think the programming world really suffers from its adolescent, "I'm so clever, they're so dumb" self-aggrandizement.

(And strangely enough, I play Bridge, Ultimate, and Chess (well I not much anymore, I like bridge *way* more) and I think I'm pretty clever. But I also think, "so what?")

When people say that "Anyone can be a good programmer" what they really mean is "Jesus, anyone could write better code than the crap I have to fix up on a daily basis"

They're not saying that just anyone can become a master, merely that just about anyone could do better than more than half of the idiots who are making a living at it right now.

When my friends ask if they could maybe do it, I say "yeah, sure, you can't be much worse than most of the folks I interview when I'm looking to employ someone"
In response to "Just because an architect couldn't design the Taj Mahal or St. Peter's doesn't mean they can't do good, high quality, work.":

With respect, this argument is misleading. Just because an architect who can't design the Taj Mahal or St. Peter's might be able to do good, high quality, work doesn't mean that every, any, or even the majority of architects actually do good, high quality work.

It might be a matter of taste, but it is obvious to me that Sturgeon's Revelation applies to software development. I'm not saying I don't fall into the 90%: quite possibly I have the taste to distinguish good from bad but lack the undefined whatsis to produce anything good.

Good programming is difficult. I have not observed some vast plentitude of competent programmers. If, indeed, the vast majority of programmers have the theoretical potential to be competent, I say that "The gap between theory and practice is narrower in theory than it is in practice."
I find it hard to believe that people don't accept the fact that some people are better at some things than other people. Surely this is what human life is all about. I mean, if we were all equally naturally good everything, then surely we'd just be a bunch of clones. Those saying that being good at something is merely a matter of dedication, may or may not be correct. But this is irrelevant, since if you haven't got the (natural?) dedication to work at a specific task, surely you're not naturally good at it!

Having said that, just because you're a genius programmer, doesn't mean you're a good software developer. There's far more to sw development than merely programming. Many really intelligent people have problems explaining their ideas to others. And it is not always the case that this is because the others can't understand what the genius is saying. After all, Einstein managed to explain his theories of relativity to others. If he had not been able to do this, they may never have been acknowledged.

I read somewhere that most programmers think they are above average...
The whole debate is pointless. Talented people (like Dijkstra) know to understand and appreciate talent in others, and they know how much difference it makes in programming or any other intellectual/creative activity.

There are limits to how much expertise you can achieve by pure dedication, practice, training etc. For starters, the amount of time at your disposal is limited to 24 hours/day. Talented people just get more output from their time and efforts.

Genius mind is typically characterized by a phenomenal speed of thinking, as one smart guy noticed. I would also add the nonstandard thinking patterns. Plus all the dedication, practice, training etc.
Instead of making a statement about who can & can't program, I would say that programming is much harder than people want & assume it to be. It's not something you can pick up and learn "in 21 days"; 10 years is more like it (http://www.norvig.com/21-days.html).
I agree with the author, to be an artist you have to have the talent, whether it is programming or any other field for that matter. But generally people can survive with lesser talent, like paprazzi photographers who can make a living but may never have their own photo exhibition put up.

But in the real world, things need to be get done faster, lot many things do not require masters, example you do not require to visit a ENT surgeon for fixing common cold. The same way with programmers, the commercial world mostly does not need an artist programmer. Nonetheless, the importance of gifted programmers is never reduced, they will always be in need, to guide, innovate, think beyond the obvious, mentor etc.
Modern software development is very hard because it is very complex. Every manager I have ever had gives me credit for doing something they know is tough - developers do get the respect they deserve.

There are varying levels of ability among scientists, writers, artists, musicians, teachers and politicians. To assert there is something 'special' about the software developers is pure vanity, we're just engineers doing a job, that some people do it better then others is so obvious as to be unworthy of comment.
Lets use a java ByteBuffer as an analogy:

Your current skill at programming is your position in the ByteBuffer.

The combination of your current study, experience, persistence, inspiration, perspiration, etc. sets the limit as to how far you can move your position.

If you spend too much time blogging, your position will decrease. If you work hard and focus you might be at your limit on a good day.

By changing one of the many elements that determine your limit, you can raise or decrease your limit.

HOWEVER, the ByteBuffer has a constant capacity. A limit beyond which you cannot move your limit.

Different people have different capacities, determined by talent, intelligence, logical thinking and many other things, things you either have or don't. You might be able to improve one or two of them, but it is the combination that counts.

Only a small percentage of programmers have the capacity to be really good at programming. Accept it and move on.
There is a quote from Paul Graham in the blog, but there is another good point that he makes in Hackers and Painters that applies to this subject. I do not have the book in front of me, but the the point is made using someone who works for the city to cut down tree brances away from power lines.

If one of these workers is far superior (works harder, stronger, etc.) to the average one, he is on the order of 1.5 to 2 times more productive. It is not until there is a paradigm shift, a new way of solving the problem, that a worker becomes 10 times more productive. In this case, when workers started using cherry pickers, rather than climbing trees, they became much more productive.

In programming, this idea is greatly extended. A talented programmer can come up with creative solutions to problems that can make him 10 times (or perhaps 100 times) more productive than the average. This is where "talent" far outshines "knowledge" aquired though practice or study.
I think we should distingish between types of programming.

Some programming involves extensive requirements gather, verbos syntax (e.g. J2EE), integration, and a lot of debugging. For this kind of programming, practice makes all of the difference. This is often the only kind of programming you'll find in firms that don't specialize in software.

Another type of program involves implementing and inventing algorithms. It's harder to improve at this type of programming.
Those who can program do. Those who can't use python.
Those who can barely program do so... In Visual Basic.
Those who can comprehend the beauty of a good program, but not the beauty of software engineering, do so in C or assembly.
Those who prefer to leverage their abilities, but only a little, and don't "get" software engineering as a way to create large-scale, rugged programs, and don't understand the importance of readability, these folks wallow in the never ending filth of C++, Java, C#, or the other flavor-of-the-day languages.

Learn Ada. It's how real software engineers produce real projects.
Verbose syntax? Use code generators. Part of how those 10x programmers work is they write programs to write their programs, instead of laboriously coding them all by hand. The key to being a top programmer isn't just speed, or learning ability, or even a high-capacity working memory (which definitely helps)...it's being able to function at a higher level of abstraction.

This is a skill that can be developed, if you've got enough potential. Learning languages like Lisp and Ruby can help a lot. If you want to see if you've really "got it," try reading Structure and Interpretation of Computer Programs, which is the introductory programming textbook at MIT and a lot of other top schools. The really good programmers love this book, the also-rans hate it.

If you want to become a jedi, create your own compiler...it's the programming equivalent of building your own lightsaber.

The majority of business programmers I know are not up to this stuff, no matter how hard they try. Some of them have to be spoonfed every new skill, and work by rote from then on. Others have the potential, but not the will to learn advanced skills by studying books like SICP. Me, I seem to have just enough potential that I can get it, but not enough so it's easy...I'm starting to think at a higher level, but I've been a long time getting to this point.
What is a "business programmer"? Do you mean an experienced professional, rather then a hobbyist?

A good software engineer does not possess some mystic endowment of skillz. A good software engineer is not some academic sitting in a room making up yet another sorting algorithm. If a developer writes scalable, maintainable and readable code (in time spans they estimate accurately), if a developer works well with architects, other developers and clients and knows how to ask the right questions and document what needs to be documented, then they are a good developer, because they are actually getting the job done right.

Also: anyone who thinks C++ and Java are "flavour-of-the-day" languages and that Ada is how "real software engineers produce real projects" is obviously one of these hobbyists real programmers use the tools appropriate to the job.
(same anon as grandparent): I am a business programmer. I'm not in academia, I'm not a student, and I build mainstream database-backed applications for corporate clients, not fancy AI stuff or shrinkwrap.

If I'm handling the things you mentioned as well as you, but my accurate estimate is a third what yours is because I'm that much faster at writing code....who's going to get the business?

If I can write code that is shorter and clearer and less repetitive, compared to someone who hasn't studied the stuff I mentioned...who's going to have better maintainability and reliability?

I've been doing this work for eight years, and studying the advanced stuff just for the last two. It's been an eye-opener. If you don't believe me, keep ignoring it...you can still be a good developer. You just might not be as productive as you could be.
Everyone has their own idea about what constitutes programming. Some people consider writing HTML to be programming. Other people consider changing a configuration file to be programming. On the opposite end, some people only consider you to be a real programmer if you're close to the metal, coding in either assembly or C. I once heard someone say "Real programmers use Magnets" (think about it). IMO, it really doesn't matter, because you can write crap in any language.

There are 2 reactions you can get when you say to someone "I'm a developer". The first is "Wow. You must be really smart". That's kind of good for the ego, but these comments often come from people who know nothing, so the statement doesn't hold much weight behind it. You'll need to look somewhere else if you want to go on a ego trip. Perhaps you could go on a geek cruise and join in with other developers as they pour scorn on the "average programmer" and their lack of 31337 skillz. Afterall, we're all in the top 2% (at least we think we are).

The second reaction, which is unfortunately growing, is the total opposite. If you say that you're a web developer, someone may say "My son does that and he's, like, 10". There seems to be a desire to bring your ego down, and make you feel like you're just another modern day factory worker (the implication is even more stinging since there is a ring of truth to it).

But the difference between the professional and the amateur programmer is akin to someone who can play three blind mice on a piano Vs a concert pianist. The amateur web designer pops out non-standard web sites in Front Page (engineered by Satan), without understanding the code behind it. The amateur DB developer uses a wizard in Access to create their database for them. God help them if they need to change anything.

In a nutshell, programming effective, readable, optimised, maintainable, robust, well-architected and re-usable code has never been that easy, and probably never will be. Innate talent will help, but hard work will win the day. The professional developer is a very different beast to the hobbyist programmer.
Two points:

i) See "How to be an expert" for some research findings about how large differences in performance can come about from small original differences in ability or circumstances.

Link here: http://headrush.typepad.com/creating_passionate_users/2006/03/how_to_be_an_ex.html

ii) Unlike chess grandmasters or concert pianists, the world needs rather a lot of software developers.

Only the top 200 chess players are able to make a reasonable living from playing chess.

If the world's needs for software are going to be satisfied, it can't be by reliance on the software equivalent of grandmasters. Most of the work is going to be done by people that are average-bright, not the super-intelligent, super-dedicated, super-trained few.
The link above got chopped by Blogger. It's How to be an expert
The fact that your comments are more or less correct says a lot about the state of the tech we're using. When I compare what it takes to be a competent J2EE programmer or competent C++ DCOM Windows programmer to what it took to be a competent COBOL - CICS programmer - yikes. It's like needing an 8th grade education (CICS) vs. needing an Doctorate from a tier-1 school. We've allowed tools vendors to make all of this too hard on ourselves.
The question boils down to "can I become more creative with practice?"
One important thing to note here is that western culture emphasizes the importance of innate talent to a person's success, whereas other cultures, particularly in Asia, emphasize the role of hard work.

The result of this is a profound difference in educational culture, and it's a primary reason for the performance gap between American and Asian students.

A recent study has shown that if you tell a child they are smart, then they will give up faster on difficult tasks--they are scared of looking dumb. But if you praise them by telling them they worked really hard on something, then they will ultimately accomplish more. It's not that talent doesn't matter, it's that a belief about one's talent level is counter-productive.

I think the culture in American public schools is a perfect example of this. The kids who really work their ass off are in the minority. Meanwhile there are plenty of smart kids who coast along because the lowest common denominator is so low. Then there are the kids who plan to fail because they think they're stupid.

It's clear that some people have more talent than others, but thinking about such things is surely a waste of time for someone who is trying to develop their skill.
Just my two cents ... Firstly I do agree to the fact that programming is a difficult job in real world, especially when you have to consider factors which affect the performance of the program.With that being said anyone can master programming if they comprehend the basics of the architecture and operating systems they are working on. The only advantage that some people have is that they can think more abstractly than most.
If the world's needs for software are going to be satisfied, it can't be by reliance on the software equivalent of grandmasters. Most of the work is going to be done by people that are average-bright, not the super-intelligent, super-dedicated, super-trained few.

This is a strong argument for the adoption of higher-level programming languages: it is more efficient for the "few" to be focussing on programming language design and implementation, and for application programmers to make use of the high-level abstractions these languages provide to (drastically) reduce the amount of code they need to write.

<< Home
Reg Braithwaite

Recent Writing
Homoiconic Technical Writing / raganwald.posterous.com

What I‘ve Learned From Failure / Kestrels, Quirky Birds, and Hopeless Egocentricity

rewrite_rails / andand / unfold.rb / string_to_proc.rb / dsl_and_let.rb / comprehension.rb / lazy_lists.rb

IS-STRICTLY-EQUIVALENT-TO-A / Spaghetti-Western Coding / Golf is a good program spoiled / Programming conventions as signals / Not all functions should be object methods

The Not So Big Software Design / Writing programs for people to read / Why Why Functional Programming Matters Matters / But Y would I want to do a thing like this?

The single most important thing you must do to improve your programming career / The Naïve Approach to Hiring People / No Disrespect / Take control of your interview / Three tips for getting a job through a recruiter / My favourite interview question

Exception Handling in Software Development / What if powerful languages and idioms only work for small teams? / Bricks / Which theory fits the evidence? / Still failing, still learning / What I’ve learned from failure

The unary ampersand in Ruby / (1..100).inject(&:+) / The challenge of teaching yourself a programming language / The significance of the meta-circular interpreter / Block-Structured Javascript / Haskell, Ruby and Infinity / Closures and Higher-Order Functions

Why Apple is more expensive than Amazon / Why we are the biggest obstacles to our own growth / Is software the documentation of business process mistakes? / We have lost control of the apparatus / What I’ve Learned From Sales I, II, III

The Narcissism of Small Code Differences / Billy Martin’s Technique for Managing his Manager / Three stories about The Tao / Programming Language Stories / Why You Need a Degree to Work For BigCo

06/04 / 07/04 / 08/04 / 09/04 / 10/04 / 11/04 / 12/04 / 01/05 / 02/05 / 03/05 / 04/05 / 06/05 / 07/05 / 08/05 / 09/05 / 10/05 / 11/05 / 01/06 / 02/06 / 03/06 / 04/06 / 05/06 / 06/06 / 07/06 / 08/06 / 09/06 / 10/06 / 11/06 / 12/06 / 01/07 / 02/07 / 03/07 / 04/07 / 05/07 / 06/07 / 07/07 / 08/07 / 09/07 / 10/07 / 11/07 / 12/07 / 01/08 / 02/08 / 03/08 / 04/08 / 05/08 / 06/08 / 07/08 /