What makes a quality programmer? In a previous post I listed out five "personas" that I believe make an effective programmer: coder, investigator, theorist, logician, communicator. I still believe that each of these traits are essential to being an effective developer, but there's one trait that I left out that might be the single most important factor in determining whether a person will be an successful programmer: the drive to learn.

"Successful" programmers (for whatever that means to you) seem to have that in common; they are self-driven learners. They want to understand everything, want to break apart the black box to study it's insides. They need to know. It's why memes like this are so effective:

Two shots of a programmers, the first captioned "My code doesn't work; I have no idea why" and the second captioned "My code works; I have no idea why."

The joke, of course, being that sometimes we have no idea what we did wrong, or what we did right. But it's only funny because of this kernel of truth: we need to know why things work.

The Way Things Work

I distinctly remember a particular book that my dad got when I was little (about 9 or so) and being fascinated by the pictures and drawings that explained how things worked. The book was The Way Things Work by David Macaulay, and you can get the new edition from Amazon right now.

A screenshot of the book's cover

As a technically-minded young child, the book was fascinating to me in that it took at the things that I thought were simply magic and explained them, even if I didn't completely understand what the explanations meant (the book is written for teenagers). It told me that there was a reason for how things worked, that I could figure out what those reasons were and use them. Machines didn't seem like magic anymore; they seemed like something I could work on some day.

Whaddaya know, I guess today is "some day".

Point is, I wanted to learn about the world. To be fair, this is true of any small child; they have an innate desire to learn and understand the work around them. But my drive, my focus, was on these newfangled (at the time) machines people kept calling "computers". These magic boxes were portals to another world, in the same way that books are. I was spellbound by them, and I couldn't wait to learn more. That, it turned out, was the key to finding out that I enjoyed programming: realizing that I loved the act of learning as much (or more) than the act of coding.

As another anecdotal example, I regularly annoy my wife due to this desire to understand how and why things work. We went to Disneyland before we were married, and after every ride I'd be staring up into the darkened rafters or ahead to the lit tunnels and pathways, wondering what kinds of magic and machinery were up there controlling our ride, thinking about how I could sneak in there and find out just what made them tick. She just wanted the experience; for her, that was the end, but for me, it was only the beginning (sorry, babe).

Need to Know

I need to know. Doesn't matter what it is, I just need to know it. That can be dangerous (or even just time-wasting), but I think it's why I enjoy programming so much; technology changes so fast that there's always something for me to learn, to try, to fiddle with. I have an infinite sandbox where the only limits are time and imagination (and my own personal demons).

Does that make me, personally, a good programmer? Hell if I know. I got fired from my last job after all.

But it does make me enjoy it more. The rush of learning new things, the joy of actually putting what I've learned into practice, the elation of seeing it work for the first time. It's all part and parcel of the programmer's daily grind, and I love it.

I don't think you have to love writing code to be an effective developer. I don't even think the drive to learn is unique to our profession. But I do think that, without the drive to learn, without need to know, eventually you're going to get to a point where what you know isn't enough, and what you can learn won't catch you up. The torrent of new technology makes it easy to get lost in the wake, so we need to be constantly paddling, constantly learning, to keep abreast of the tide.

Question is, will you get swept away, or swept up? I'm aiming for the latter.