I’ve been thinking (again) about what it is that makes some coders special, and have come up with the following idiosyncratic, completely unscientific, my-employer-does-not-endorse-my-views classification. It should go without saying (but won’t) that not only is this graph not to scale, but that it’s a pretty scary power function as you move up the pyramid.
It’s a joy to work with a team that clusters near the top of the pyramid. A whole set of common problems are magically erased, leaving only the challenges specific to the work at hand. I’ve written before about the skills that make “senior” software engineers different, and it seems to me that there are three general categories. The first are all of the critical foundational skills – coding, problem solving, CS knowledge, debugging, etc. The thing is, you can hit a ceiling here – you can continue to learn new skills, discover new and exciting tools and debugging techniques, etc., but unless you’re also developing the other two categories, you’re basically tapped out at “good, solid, fast.”
The second category is soft skills – communication, sense of ownership, reliability, organization, and so on. By themselves, these won’t get you as far as the previous category – there’s nothing specific to techies about these skills – but you’re going to be limited without them.
The third category is special. It’s the ability know what to do to get from here to there, and sometimes where “there” even is. Sometimes you have to work within the existing framework. Sometimes you have to make a one-off exception. Sometimes you have to throw it all out and start from scratch. Sometimes, even though time is at a premium and the project is already late, you have to do some research. It’s a combination of creativity, strength of character, experience, and judgment – coding street smarts, if you will.
There are people who are amazingly adept at coding once they’ve been told the basic approach, and there are architects for whom everything seems to require a dynamic configuration-driven factory with dependency injection that composes multiple interfaces and (you get the picture)… There are great coders who can’t focus, communicate, or reliably complete projects without getting sidetracked. And there are people who are great at all the normal projects, and who can be relied on in a pinch, but who tend to stay inside the box with their designs. You don’t have to be a Carmack, Dean, Torvalds, or Kernighan to fit into the “Special” category, but you do need to have mastered the core skills, most of the soft skills, and have the ineffable savoir faire of the master coder.
I’ve written about mastery before. The reason I’m obsessed with the question is that as a coder, I’ve always known that I’m not at the tip of the pyramid. And as a manager, I’ve wanted to figure out ways to help people to the next level, and to identify great candidates. Once you’re at a certain point, it isn’t hard to solve an algorithmic challenge, learn a new programming language, or figure out a new API. These are the bare minimum requirements for being a competent programmer, but they won’t get you to “special,” or even “great.” Developing the third category requires a particular drive, understanding born of acute observational skills, great mentors, and a wide variety of experience on difficult projects, many of them self-defined (the great don’t turn off the computer, MakerBot, Arduino, MindStorm robots, etc. when they get home).
This is a huge time commitment, but top coders are like the nerdy equivalents of gym rats, getting an endorphin rush off of forking interesting github projects, picking up new programming languages, or posting helpful responses on developer forums. In some sense, the most important qualities are interest and enjoyment. If you like coding, you can become a good coder. If you like drawing, you can become a good artist. If you like playing the cello, then there’s a place for you in your local community orchestra. But it you’re obsessed beyond all reasonable measure, then, well, you have a shot at special.