January 29, 2007
Last year in Programmers as Human Beings, I mentioned that I was reading Programmers At Work. It's a great collection of interviews with famous programmers circa 1986. All the interviews are worth reading, but the interview with Bill Gates has one particular answer that cuts to the bone:
Does accumulating experience through the years necessarily make programming easier?
Bill Gates: No. I think after the first three or four years, it's pretty cast in concrete whether you're a good programmer or not. After a few more years, you may know more about managing large projects and personalities, but after three or four years, it's clear what you're going to be. There's no one at Microsoft who was just kind of mediocre for a couple of years, and then just out of the blue started optimizing everything in sight. I can talk to somebody about a program that he's written and know right away whether he's really a good programmer.
We already know there's a vast divide between those who can program and those who cannot.
But the dirty little secret of the software development industry is that this is also true even for people who can program: there's a vast divide between good developers and mediocre developers. A mediocre developer can program his or her heart out for four years, but that won't magically transform them into a good developer. And the good developers always seem to have a natural knack for the stuff from the very beginning.
I agree with Bill. From what I've seen, there's just no crossing the skill chasm as a software developer. You've either got it, or you don't. No amount of putting your nose to the grindstone will change that. But if you accept that premise, it also presents us with a paradox: if experience doesn't make you a better programmer, what does? Are our skill levels written in stone? Is it impossible to become a better programmer?
To answer that question, you have to consider the obsessive nature of programming itself. Good developers are good at programming. Really good at programming. You might even say fanatically good. If they're anything like me, they've spent nearly every waking moment in front of a computer for most of their lives. And naturally, they get better at it over time. Competent software developers have already mastered the skill of programming, which puts them in a very select club. But if you're already in the 97th percentile for programming aptitude, what difference does a few more percentile points really make in the big scheme of things?
The older I get, the more I believe that the only way to become a better programmer is by not programming. You have to come up for air, put down the compiler for a moment, and take stock of what you're really doing. Code is important, but it's a small part of the overall process.
This piece in Design Observer offers a nice bit of related advice:
Over the years, I came to realize that my best work has always involved subjects that interested me, or -- even better -- subjects about which I've become interested, and even passionate about, through the very process of doing design work. I believe I'm still passionate about graphic design. But the great thing about graphic design is that it is almost always about something else. Corporate law. Professional football. Art. Politics. Robert Wilson. And if I can't get excited about whatever that something else is, I really have trouble doing a good work as a designer. To me, the conclusion is inexcapable: the more things you're interested in, the better your work will be.
Passion for coding is a wonderful thing. But it's all too easy to mindlessly, reflexively entrench yourself deeper and deeper into a skill that you've already proven yourself more than capable at many times over. To truly become a better programmer, you have to to cultivate passion for everything else that goes on around the programming.
Bill Gates, in a 2005 interview, follows up in spirit to his 1986 remarks:
The nature of these jobs is not just closing your door and doing coding, and it's easy to get that fact out. The greatest missing skill is somebody who's both good at understanding the engineering and who has good relationships with the hard-core engineers, and bridges that to working with the customers and the marketing and things like that. And so that sort of engineering management career track, even amongst all the people we have, we still fall short of finding people who want to do that, and so we often have to push people into it.
I'd love to have people who come to these jobs wanting to think of it as an exercise in people management and people dynamics, as well as the basic engineering skills. That would be absolutely amazing.
And we can promise those people within two years of starting that career most of what they're doing won't be coding, because there are many career paths, say, within that Microsoft Office group where you're part of creating this amazing product, you get to see how people use it, you get to then spend two years, build another version, and really change the productivity in this very deep way, take some big bets on what you're doing and do some things that are just responsive to what that customer wants.
You won't-- you cannot-- become a better programmer through sheer force of programming alone. You can only complement and enhance your existing programming skills by branching out. Learn about your users. Learn about the industry. Learn about your business.
The more things you are interested in, the better your work will be.
Posted by Jeff Atwood
I'm a formally trained software engineer... but first became interested in programming at a young age (on a Commodore VIC-20); what really prompted me to pursue a career in software development is my inherent inquisitive nature.
My personal and business-related interests are fairly diverse, yet I recognised early on that I wasn't so much interested in the technical capabilities of computers, but more so the potential [that computers offered] for me to gain a far greater insight into an entire other world, beyond the computer realm.
Programming does form a small part of what I do now, and I still enjoy it very much, but what I enjoy far more is the opportunity to learn about other industries, business processes, systems, etc.
If anything, I view programming as a formal means of gaining an insight into areas of everyday life that I wouldn't have previously been granted, had I not had the thirst for knowledge that I possess and the discipline to teach myself programming in the first place.
Absolutely true. I like developing software, but I also like spending time with my family, working out, writing music, reading, etc., etc. If all I did was code, I'd have a very limited perspective and my problem solving skills would deteriorate rapidly.
It's all about the niche of programming. Programmers are problem-solvers. It's what I do 95% of the time. I like doing it. I perfer to do it with code, but sometimes it requires an email, a conversation, a new roof, etc. My family expects me to solve their problems, my coworkers and customers do as well.
These visionary types are about seeing and creating new problems. This is what I'm not very good at and don't like to do. I can build the taj mahal, if you tell me you want a very nice house, but I can't figure out that you want the taj mahal through some spark of intuition or while we're talking about the cubbies.
Would I be a better programmer if I did more of the idea-work? I don't think so. I think my skills would rust because I've stopped solving problems. We've got some genius idea people (who are/were programmers) that know how to express and describe an idea to anyone, but it would take them 50x as long to write the solution. Bring me the problem, you take the glory. Works for me.
After re-reading this a few times, I think I agree, but it'd be very easy to draw some wrong conclusions from what you've written.
At 3 or 4 years, a programmer has demonstrated if they've got the innate ability to program, but programming skill becomes dated very quickly. Being a good programmer also requires being current in your skills, and that only happens through practice. Most programmers demonstrate their aptitude at 3 or 4 years, but they demonstrate their potential as a programmer (mind you, I'm just talking about their skill as a programmer) when the first big industry shift hits, and they need to update their skills. Then they demonstrate it again when the second shift hits. Then they demonstrate it by realizing that the whole thing is constantly shifting, and they come up with ways to keep their skills constantly up to date.
As an example - If I had to hire a developer today for a 2 month website project, I'd pick Scott Guthrie over Bill Gates. Why? Bill has demonstrated exceptional programming ability and is likely more informed on a lot of things, but his skills probably aren't as current as Scott's. Scott has a blog and posts code. I don't know, but I'm guessing that Bill could only talk at a high level about many of the essential elements of programming circa 2007. I'm not saying Bill isn't accomplished as a software professional (an untenable position if ever there was one), but my guess is that he's no longer a great programmer.
As someone mentioned above, running makes a good counterpoint. It's easy to tell in a few years if someone has the body to be a good runner, but if a runner stops running regularly, they won't continue to be a good runner for very long.
"Therefore, if you are *already* a great programmer, and you want to distinguish yourself even further, you should learn complementary disciplines, rather than going for the 99.5th percentile skill level of greatness."
I think the counterpoint that a few people are making is that if you go after these complementary disciplines you might lose that 98% greatness and fall back into the masses. It may only take you a few months/minutes to get back to full developing speed, but there is a transition there between being an advocate/"business" type person and a code slinger. If you don't write code anymore you're not a great programmer. It's like saying Michael Jordan is a great basketball player. Michael Jordan WAS a great player. Now he's an incredibly rich and successful something else. But I don't code for riches or fame, I code because it's what I would do for fun if my full time job was gas station attendant. And because I do it for me, I don't care if no one else cares that I'm in the 90 percentile. It matters to me. That's not to say those other things are inferior (it certainly pays as if it were more important), I just wouldn't go around thinking I'm an 98% great programmer if I was actually a 98% great writer, a 75% great speaker, and an 85% great programmer.
I agree with Bill. I am just amazed to find out how many people disagree with Bill.
From a midocre programmer who will never be a "good" programmer and who is quite happy to be a "mediocre" programmer, but a good human being, which I think is better than being a good programmer and suck at being a decent human.
Thanks for the wonderful words of encouragement. However, I know pretty well that I am a mediocre programmer, mostly because I am lazy enough to avoid complex problems, but also because I am unable to resolve certain complex problems.
Having said that, I have the impression that for a lot of good programmers, the whole idea of being a good programmer is to tell everyone how bad or "mediocre" everyone else is, and they make a point that being mediocre is like having a disease of some sort.
All I am suggesting that it is not. Mediocre programmers fulfill their roles in the organization in a lot of ways and they are just a great bunch of people to hang around with.
Programming is immaterial.
The entire group of development related professions is problem solving and abstraction with different scopes and different focus.
If you are a good problem solver, the language doesn't matter. A new language is just a different API and rule set (with the implied limitations and pit falls). If you are a good problem solver and good at abstract thinking, the scope doesn't matter either. Programmer, architect, analyst, CTO - solve some set of problems, different scope, different focus, different tools.
I think that what is happening is that those who are good at problem solving and abstraction rise quickly, many others are content where their abilities are (some because they think that they are much higher up the food chain than they are), and never strive to become better at these base skills. There are some that recognize that they are lacking, and directly or indirectly improve their abstraction and problem solving abilities and therefor get better. This is an uphill climb, I am sure - looking at and interpreting the world in a different way is not easy, but can be done.
Jeff- if you think that someone is immediately "better than mediocre" because they read a tech blog, you are sorely mistaken. Ability to read != ability to solve problems.
Agreed with Andy:
You can be anything you want to be. Whatever you set out to achieve you can do if you really decide to and really work at it. You've heard this pep talk before, I know, but it happens to be true.
The guys who try to tell you that you can't cut it simply have their own ax to grind. Either they tried and failed, or they have some vested interest in your failure. Don't believe any of it.
andy on January 30, 2007 1:29 AM
Hey, I don't know if this posts are still up and running seeming that the last message was 2009. But I'm a graduate and much interested in programming, been reading mostly all comments and agree to some more than others. The common saying practise makes perfect is prob the best way to describe progression as many people have stated within this article.
I've been studying C through Uni and now have started learning C# and find this language ever so interesting, but having said that although I'm still learning C# and cant program like a proper programmer would I be classed as a "not a good programmer", and should give up noW? or given time through learning the concepts and techniques of OO C# language will I learn to adapt through practise of writing coding?
I hate to read that someone may say your either a programmer or not, because its like saying I should spoke english fluently when I was 2 years old....
Anyway hope someone could get back to me, give a new programmer some "programmer to programmer" advise ;)
Yea, you made some good points. This could really be applied in a lot of areas in life. I think what most programmers need is some confidence around women. It sounds kinda trivial and unrelated, but it really isn't. There's a clean little blog ( http://blog.instantinfatution.com ) that I own. Solid advice- no ads, no scams, no sales. Check it out- you might learn something, and even further your talents and grow your skills.
-Tristen Ryan Royal
I don't believe in talent in the "handy wavy" way that people sometimes talk about it. Really it comes down to some basic and fundamental skills that give people a disposition for doing that task really well.
For example when I was a child I spent a lot of my time improving my spacial recognition skills by playing certain children games. This allowed me to develop my ability draw very rapidly and allowed me to pick up guitar later in my life.
These fundamental skills that are the building blocks to higher order thinking are what make people great at what they do. You can stop and analyze the fundamental cognitive skills make people great a programming. These are the fundamentals you want to practice. It's not an all or nothing thing. It's not "you got it" or "you don't."
You just don't understand what "it" is and so you extrapolate your theory over some empirical evidence and call it fact. But you're wrong.
And your right.
When Bill Gates says that four years shows the extent of what a programmer can do he is following a rule of thumb that proves correct for finding good talent. But he's not in the business of improving people's programming skills to make everyone rock stars. It's obvious by his method of selection.
So yes people can predictably show what level of skill they will peak at without guidance and working on the right things but that doesn't mean it will stay that way. The human mind is an amazing thing and not easily corralled.
Well, this showed up on HN again... can you become a better X by not doing X? IME, rest is as vital as practice. When first learning some skill, you make huge gains by not doing it. Playing Dance Dance Revolution obsessively your first day will get you some advancement, but it's not until coming back to it the next day that you discover you've leveled up somehow. Likewise with weight lifting: you can't lift at your limit every day and expect to improve. It's more like 2-3x a week that's the maximum effective rate. Same with running: the couch to 5K program is designed to be run thrice weekly, with a resting day between each run.
Taking a step out of the work of "coding" to look at the philosophy and consider the decisions you're making--and those that were made for you by your language--are definitely something that will help more than cranking out more lines of your everyday language. As will stepping away from the computer and organizing the requirements and design on paper. Jumping straight to the keyboard tends to thread a half-broken implementation through previously-working code, which then takes extra work to half-revert and fix.
I think Gates' comment is quite invalid. In general, "you either have it or you don't" things do not quite exist. As much as i can empathize with developing an interest in programming instantaneously (you having it in you), I think acquiring the skill (say on the lines of optimization) is something that happens over time(and can only happen that way).
How do i know what is optimized code, how to optimize code and why it must be optimized in the first place? These are questions that will be answered only as you accumulate knowledge which is a function over time.
So developing an interest in programming can be you got it or you don't thing but certainly not the skill itself. And the fact that you developed the interest is really because of a sequence of events in your life that resulted in you being able to appreciate programming and accept the knowledge when it came your way. Call it coincidence or chaos theory.
When you boil it down your argument is the age-old one about the value of a universal education. What Bill Gates seemed to be talking about in 1986, and more so in 2005, is the total creative potential of a coder when they look beyond the logical challenges presented by coding. I think the truth in Gates' remarks is that you can be highly skilled technically -- all the way up from language syntax, to design patterns and algorithms -- but lack a richer creative perspective that comes from seeing the need for a piece of software, before anyone has seen it, or even dreamed of it before. I think his remarks get bogged down a bit in managerese about vision, product, customer satisfaction, etc., but the principle is basically one of paradigm shift.
The debate between the value of universal education versus specific education has raged since universities, but I think universal education wins the day if your priority is 'paradigm shift'. Experience in both the arts and the sciences shows the real benefits of learning another completely different discipline, and I suspect it boils down to the fact that really valuable creative work doesn't happen in one part of the brain, but emerges when various mental faculties are developed in parallel. I don't think it's frivolous to improve your coding by taking up the brush or the piano because our monkey brains think logically and sensually.
I've found that a wonderful way of doing this is teaching others how to program. So you spend time just programming small snippets... and thinking/reflecting...
Your link to http://www.designobserver.com/archives/011848.html seems to be broken, which is as shame as I really wanted to follow that up.
I've said for years that one of the interesting things about programming is you rarely just program, you normally program about something so you always learn new stuff.
I've certainly seen situations where otherwise decent programmers proposed stuff that just wouldn't work, and if they had a better knowledge of the field in question they would have know that.
Jeff, yes I too believe I'm still passionate about graphic design. But the great thing about graphic design is that it is almost always about something else. There are no semicolons but just pixels and colors.
This is what happen in the industry especially in the service oriented organization.If a person enter in the organization as a newbie after 5 years he will not remember any development work except excel sheet and managing the people and project.