This question has come up over and over again. From putting together the core team for a startup company to recruiting intern candidates for a multi-million dollar firm, patterns emerge and recurring data points are evident once you look closely enough.
Let’s take a look at the Top 10 characteristics of a great software engineer. Sure, top notch technical chops are a prerequisite, but beware, some of these items may surprise you.
Passion for technology. Ok, so no controversy here. A great software engineer is always learning, investigating new trends, tools, and better ways to solve problems. A "great software" engineer I worked with shortly used to joke that he was pretty much throwing out what he’d learned every 6 months or so. At the risk of dating myself terribly, during one 6 month stretch he used C, Smalltalk, PowerBuilder, SQL Server, and an Object Database in developing internal software solutions for a real estate investment and management firm in Chicago.
Craftsmanship. Great software engineers sweat the details and build solutions that are meant to last. There is an innate elegance to their solutions that when analyzed after the fact seems almost obvious in their simplicity. Invariably I find myself thinking, “Is that all there is to this?” and marvel at the succinctness and crispness of the code. Ditto for durability and extendibility - well-crafted code lasts for years and accommodates additional features and changes without significant rewrites or increased brittleness.
The ability to break a large, complex problem into a number of solvable small problems. I’ve been fortunate to have worked with a number of these types of individuals who can look at a Gordian Knot of a problem and find a path to a solution by decomposing it into discrete elements and addressing each of those elements.
Pragmatic. I think this characteristic is one of the more controversial on this list. Or maybe “controversial” is the wrong word. Perhaps “overlooked” is a better descriptor. Great software engineers strike the delicate balance between their drive for perfection and practicality. They know when to compromise and implement something less elegant that their inner voice is telling them to implement. Nowhere is this trait more important than in a startup company. Time to market is critical and there are a number of plane crash metaphors (e.g. not enough runway, clipping the treetops) that underscore the fact that you can’t spend 2 weeks on a kick-ass sorting algorithm.
Methodical thought process. Abstract thinking is so in-grained in great software engineers that I don’t think they even realize it sets them apart from most people. Applying the scientific method, thinking through all the possible scenarios of an algorithm, challenging assumptions, and asking probing questions are all key attributes of the thought process of great software engineers.
Add value at every step. Great software engineers immerse themselves in the domain so they always know what problem the project is trying to solve and who is going to be using the software. They use a specification as a roadmap, not a bible, frequently ask questions, and are not afraid to pull the emergency cord to stop a project from going off the rails.
Make everyone on the team better. Whether it is transferring knowledge, mentoring, tool building, or simply taking time to listen to a colleague talk through a coding problem, great software engineers find ways to improve the skills and knowledge of other team members. I’ve been fortunate to be with people who have made me better simply by seeing how they approach analyzing problems or picking up tips and tricks in their coding style.
Skeptical. Great software engineers never take anything they are told at face value. Reliable data drives decisions for these folks; they like logical conclusions. Great software engineers look beyond fixing the bug that is in front of them and determine if it is a symptom of some larger problem. Great software engineers foster an environment of healthy disagreement, often taking the “devil’s advocate” position to challenge a colleague’s design for the betterment of the product while not making it a personal attack on the person’s attitude or competence.
Reasonable. Being able to change his/her mind in the face of solid evidence is a key characteristic of a great software engineer. This may seem a no-brainer, but I have known scores of software engineers who get trapped in their own dogma and have such a fierce pride of ownership that it blinds them to alternative solutions that are better in the long run than the solution they have implemented. Great software engineers have a built-in humility, respecting others’ opinions and knowing that their own way is not always the best way.
Good Communicators. What? I need someone that can bang out 2,000 lines of code a day! Not so. Gone is the stereotypical Mountain Dew-fueled loner walled off from other team members. Being able to write and speak clearly are of paramount importance to great software engineers. They must be able to synthesize and explain complex information to non-technical people as well as articulate a design to technical team members. On the flip side, they must be great listeners, picking up on nuances or uncertainties in what they are told and drilling down with questions to clarify the problem that needs to be solved.
Most companies function just fine with good software engineers, especially if the domain is well-defined and the problems are not unique. The process may take longer but they’ll get there. If, on the other hand, you are starting a business, you don’t know if something can be built, money is tight, and you may need to pivot sharply, you need great software engineers. I can count on one hand, excluding my thumb, the number of times with a room full of superbly talented people we’ve had to say, “That can’t be done.”