Hackers are cool. Described and celebrated by luminaries such as Eric Raymond and Paul Graham, they’re the self-styled “rock stars” and “ninjas” of the industry. Indeed, who wouldn’t want to be the next Wozniak, Torvalds, Carmack, Jeff Dean? Who wouldn’t give their right shift key for entry into The Guild? Hackers are min-maxers – working late into the night, consuming large quantities of caffeine and junk food, sometimes sacrificing important parts of their lives to their passionate, obsessive craft. They’re individualistic, independent, and can have difficulty communicating, working in teams, and staying on task (or rather, on tasks assigned to them by other people). At some level, they don’t respect non-coders, non-coding managers least of all. Their primary goal is to create something new and interesting. At heart, they’re hobbyists.
Software engineers, by comparison, are solid and steady, tortoises to the Hacker’s hare. Competent. Reliable. Doing a good day’s work, then going home for dinner, tucking the kids in, maybe watching a little TV before turning in. They don’t have many heroes, but if they did, they would be people like Fred Brooks, Steve McConnell, and Jeff Dean. Software engineers communicate regularly, document their code, write unit tests, and work collaboratively to plan out projects. They may sometimes work extra hours, but in general they try to minimize overtime. They enjoy their work, but it doesn’t define them. Their primary aim is to meet business objectives, and to write code that is stable, robust, and maintainable. Working with non-coders doesn’t bother them. At heart, they’re professionals.
Some people start as hackers, and stay hackers all their lives. They can be phenomenally productive as individual contributors, technical leads, architects, CTOs. They’re always working on side projects, both at home and at work. Indeed, the two are frequently indistinguishable. They love to code, hate meetings, and tolerate software engineers as best they can. They can be both the top contributors of code and invisible to other team members, due to shifted hours and a tendency to shut the world out and focus. At their best they can act as a mentor for other team members, and will lead the team technically, providing a powerful safeguard against bad code entering “their” codebase. But at their worst they can be anti-social, focusing on non-essential (but personally interesting) tasks, the worst perpetrators of “not invented here.”
Most people who start out as software engineers stay software engineers all their lives. They major in computer science when they get to college, complete the classes, get the degree, and do the work. They don’t love the code, don’t do side projects, and despite their protestations don’t particularly mind meetings. They aren’t stand-out coders, and try to make up for what they lack in skill with process. If and when they become managers, they give up coding entirely, because it’s no longer necessary for their success and was never something they enjoyed for its own sake. After a remarkably short period of time, they can no longer remember how. They lead rich, full lives outside of work.
Lastly, there are the software engineers who started out as hackers. This is the most interesting group – the hard-core coders who mastered the technical domain on their own terms, but ultimately learned to work in a more reliable, team-oriented, maintainable way. Some become managers, but usually in a mixed role that also includes coding. Some become team leads, and help the team balance demands for rapid development, timely delivery, code quality, automated testing, maintainability, etc. Some avoid leadership roles entirely, and merge their joie de coding with a disciplined, software engineering approach to their work (and sometimes home) projects.
It’s difficult to make this transition, and I suspect that there’s frequently a catalyst for change – the birth of a child, a change in the needs of a startup as it transitions from plucky underdog to established company, just getting older. At some point the body can no longer handle the junk food and long hours, the need for non-work-related time increases, projects get bigger, and you realize that you’ll be the primary beneficiary of any work to increase maintainability. Or you just get tired of writing another damn string library.
In the end, a hacker can best be thought of as the larval form of a great software engineer, a necessary but insufficient first step. Hackers who don’t make the leap are missing out on an important step in their personal evolution (though they may be having a lot of fun). And software engineers who skipped ahead without learning to love the moment-to-moment act of coding will never be able to understand, or measure up to, the hackers in their midst.