Wednesday, January 31, 2007

Less programming, more skill?

I just picked up a copy of Programmers at Work (disclosure: that's a paid Amazon link) and I've been looking forward to reading it. I've only read the Charles Simonyi chapter; I got distracted by other books and other things, but it's sitting there on my nightstand waiting.

So it was pretty cool to see Jeff Atwood quote the book on his blog entry about becoming a better programmer by not programming. I agree with the quote:

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.

And I definitely agree with this from Jeff:

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.

I think he limits it too much, though.

The best thing I ever did for myself was walking away from programming, as best as I could, for 4 years. In 1998, after 3.5 years at Microsoft and 5 years of high-stress programming before that, I was burned out, unsure of what I wanted to do with my life, and fed up with the work I was doing. I cashed out my stock options, put all my belongings in my friend's basement, and set out to hike, bike, and finally get that college degree I'd always wanted.

The day I quit, I started driving to LA. I hiked in Joshua Tree, then went to Canyonlands and hiked for days in the Maze, where I swear I was surrounded by the ghosts of the Anasazi. I flew back to Massachusetts, saw my parents, then took the train to northern Georgia and started hiking home on the Appalachian Trail. I didn't quite make it, but detoured to Washington DC for the 4th of July, hiked some more in Vermont, then went to Olympia for school.

At school, I took classes in forest ecology, evolutionary biology, neuroscience, geography, linguistics, and so on. I learned a bunch, despite the hippies.

Between classes and during breaks, I rode my bike in the mud of Olympia, augmented with road trips to the sandstone of Moab and the dust of Nevada. I met my wife, and during summer vacation, we rode our bikes from northern Montana to Wyoming; we saw bears, and almost got struck by lightning, and saw amazing views and played pool at every dive bar that would let a couple of smelly cyclists in.

Through all of this, I missed programming. I dreamt about it, in good ways.

I didn't miss the long hours or the stress, but I missed being surrounded by lots of really smart people, and sitting down in front of a computer to just crank out code. I did a little bit of contract work, and after a few years I joined a startup with some friends, then ended up back at Microsoft.

Now, 9 years after trying to leave programming behind, I'm working on stuff that gets me as stoked as I was when I was 11 years old and learning Logo, or 13 years old and learning to do psychedelic animation with palette switching, or 16 years old and learning assembly language. There is always something new to learn -- always a new way of looking at a problem you've known about for a while, always a new problem to discover.

But Jeff is saying something a little different than what I'm driving at, I think:

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.

Of course I agree: if you have profound knowledge of the cloud of problems around programming, of the higher level problems you're trying to solve, you'll do a better job programming. This is obvious, and explains why the best programs are always the ones programmers write for themselves, eg. emacs, Google, Visicalc, etc. And it conversely explains why so many programs are so uninspired, too: if you'll never use the feature you're writing, you're not going to imbue it with brilliance, because the brilliance will never occur to you.

And beyond that, if you truly love the entire experience of programming -- not just the act of sitting in front of keyboard, but the planning, and the bug triage, and the promotion of your ideas -- of course you'll do a better job. And yes, this cloud takes some time to master, and for many programmers it's a huge barrier.

But that stuff is necessary but insufficient. If you're gonna implement the killer features you want, you need the chops to bang 'em out. And if those killer features are also gonna be used by a million, or a hundred million, other people, you'd better have the chops to bang out that code rock-freakin'-solid. Those chops don't come in 3 years, as Bill Gates claims, and they don't come from the 97th percentile of programmers, as Jeff alludes:

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 really killer code that's used to build the really killer features come from the programmers with a Z-score of 5 or 6, not 3. Being a natural will get you most of the way there, but unless you're a true prodigy, you need to continually refine your skills over many years. For most people, I think that cultivating expertise and interests outside the scope of programming helps this, as it does with any creative endeavor: as an analogy, if you want to write, read lots and write lots, but also live lots. For me, staying psyched about programming definitely requires lots of extrinsic inspiration; I'm a better programmer when I have time to ride my bike, and run, and play with my daughter, and laugh with my wife.

Being an excellent programmer requires being excellent at the cloud of things directly related to programming -- dealing with people, anticipating problems, having vision about products and features -- of course it does, and of course you should cultivate that. Beyond that, I truly think it requires external stimulation; really, really not programming will let you recharge and be better at programming. I doubt this is limited to programming.


A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.

-Robert A. Heinlein

10 comments:

ArminH said...

Great quote; sums up things I definitely agree to very nicely.

Deltaman said...

Well, I guesss 18 out of 21's not bad...no interest yet in having the con, and not ready to die either wimpering or valiantly. Your guess on the final missing task.

Revence 27 said...

First, before I forget again, turn your RSS back on. Them guys who came here after the Shutdown Menu thing are gone. I keep missing the posts.

Now, on the post: I don't know how many of you now see why I insist that there is no Computer Science. Or, if it exists, outside Intel, it is never of use to those who study it. Computer Art is. Where is the science there?

And, of the things that help one become a good developer, which is not learnt the same way we learn, say, how to speak a language? Or a game? I feel we are learning software development/programming/... the wrong way. Explains they way our stuff ends up ...

I like the Heinlein quote.

Rami said...

Great post. BTW, quiting your job sounded very exciting, I want to quit mine now :)

KaranJude said...

its funny , but more i look i feel that many jobs dont really exploit computer science (D degree) , all i see is frameworks , n lot of them n people talkin about languages . Dont u think languages are a means to an end ?? .. what exactly defines an awesome programmers .. an algorithmist , a pattern guy .. what , thats d answer m seekin

Mike G said...

I originally wrote a comment that became too large, so I put it into a post on my own blog. The thrust of it is that the "what makes a good programmer" question is too vague, and that a "good programmer" in one context is actually a "bad programmer" in another. The article is linked from my name above should you wish to read it.

Peter said...

Very nice article. I can't agree more. The difference between a 97th percentile programmer and a 99.9th percentile programmer is not 2.9%, it's something like 10,000%, and that difference is only magnified when you've got teams of programmers.

Computer Science really doesn't cover programming, and neither would Computer Art. There is no comparable profession. Painting and perhaps writing are both close, but both of those lack the intense technical aspect.

It's as though a painter had to not only know how to paint, but also be an expert chemist in order to really get anywhere.

Anonymous said...

i'm not so sure i agree with these comments. excellence can be learned if the student is willing.

i admit i began life as a properly educated yet poorly performing programmer. i'm a much better coder now. am i the best? no. am i the worst? no.

programming is like any other field - those who approach it humbly and work like hell will see success.

anyone over 35 who claims they were "all done" in four or five years is fooling themselves, as the entire industry of web programming has only evolved over the last decade. everyone has to learn. you can go from being the 99th percentile to the 1st percentile if you stop learning, no matter who you are.

Keith said...

"And it conversely explains why so many programs are so uninspired, too: if you'll never use the feature you're writing, you're not going to imbue it with brilliance, because the brilliance will never occur to you."

that right there is really my entire view of corporate software.

in the past year (after 5 years of making "business" software) i've come to realize that software meant to only serve a bottom line, and not impact people's lives, is emotionally empty and can never be as good as the alternative.

after my mini-epiphany, i've begun looking for jobs in the SF bay area (yahoo, google, etc) rather than houston, where all software revolves around the oil/gas industry.

Tony2007 said...

Ah, I love 'ol Heiny. So brave and bold and so, so wrong all the time.

Well, not all the time.

I don't know the first thing about programming, but I find what you have to say interesting. The way it seems Gates, et al describe it, programming is rather like art in that the talented ones, the ones with the true inclination and instinct, distinguish themselves early on and grow into their natural talent as a matter of course. You can't teach someone to be a great painter, or a great novelist, or from what it seems a great programmer. Inborn talent has to account for something.

I spent four years in college dreaming of being an English professor, and then another year in graduate school dreaming of not being in school. Now, after four years spent teaching Composition and Intro to Lit. courses, I'm working at a PC/IT company and having a ball. I always loved computers, and I never figured I could get a job working on them. I've also discovered a talent for troubleshooting problems and finding a solution.

So I think the moral here is that you have to find your inborn instincts, because we all have them. Programming seems like one of those things where you take enough courses, you get this and that certification, and instantly people think you're a genius. I know that's how I've always looked at it. Thank you for correcting this outlook!