This is the firstĀ in a series of articles on Hiring Engineers by Jocelyn Goldfein, Angel, Advisor. Formerly: Engineer @ Facebook, VMware, Startups, Trilogy.
ByĀ Jocelyn Goldfein, Angel and Advisor
Welcome to the second in my series on hiring software engineers! This post describes the zeroāth step in hiring: figuring out what youāre looking for in the first place.
How to Hire Engineers:
- Step 0: What to Look For (this article!)
- Step 1: Sourcing
- Step 2: Filtering
- Step 3: Screening
- Step 4: Assessing & Deciding
- Step 5: Closing
I might as well confess this up front: unlike most āwhat to look forā posts, Iām not going to tell you what to look for. I donāt know you, your company, your product, or your team. But Iāll let you in on a few things I wish someone had told me before I started.
I see two frequent mistakes from hiring managers when defining their needs. Either they get too skills-centric (āI need an iOS engineer and a junior python guyā) or too superlative-centric (āWe only hire ninja rockstar 10X badasses!ā)
The first one is (usually) just wrong, and has been debunked by many others before me. The basic point is this: technology changes fast. Your product and technology choices are guaranteed to change in response to user needs and the moving target of the technology ecosystem. Youād much rather have a competent full-stack engineer who can pick up python than someone whose skill at python defines their resume.
The other end of the spectrum tosses the baby with the bathwater: āForget python, just hire rockstars!ā runs the battlecry.
I want to challenge you to do better than that. Yes, you should hire for overall quality, not technology buzzwords. But what does ābestā mean in the first place? The implication is that āgreat engineer-nessā is a single quality that can be measured, and we can make hires when the value crosses a magical thresholdā¦. the hiring bar!
Thatās a dangerous fallacy, because ābeing a great engineerā comes from a multitude of traits that canāt be collapsed.
Here are just a few of the qualities Iāve seen in extraordinarily successful engineers:
- coding speed and fluency
- ability to solve difficult problems
- motivation and passion
- work ethic
- teamwork and communication skills
- creativity and skepticism
- breadth of knowledge
- depth of knowledge in a valuable discipline
- ability to āfinishā
- quick to learn new skills or absorb new information
- introspective, self-motivated to constantly improve
- perseverance, scrappy in the face of setbacks, doesnāt āget blockedā
- systems design ability
- API design ability
- product and UI design ability
- empathy for users
- experience shipping a 1.0
- religious about testing
- takes pains to write readable and maintainable code
- passionate about tooling & work environment
- methodical and analytical: can diagnose the most mysterious bugs or find the source of performance bottlenecks
- ego-less, will work on whatever needs doing
- leadership, can articulate a vision and bring other engineers along with it
The problem with collapsing them all into one rubric of ābeing a great engineerā is that they arenāt particularly correlated with one another. Great engineers frequently possess more than their fair share of these traits, but thatās not correlation, thatās survivorship bias. Finding one or two of these qualities is not going to predict the rest.
For that matter, no two great engineers have the exact same mix of traits. Some are bold and some are careful. Some āclutchā engineers produce huge volumes of code in a hurry to make your deadline, others work at their own pace but what they produce is bullet-proof, or solves a problem few other engineers could tackle. These engineers are all great and they are not the same as one another.
If you say you want to hire āthe bestā without specifying what that means to you, then you are leaving it up to the imaginations of every recruiter and interviewer, at which point youāre exercising no quality control at all. In fact, most actually great engineers will know that you donāt know what ābestā means, and avoid you like the plague.
One of my guilty secrets is that I love complexity, even though I know itās wrong. In my ideal (but complicated) world, ābestā would be defined by hiring managers thinking through that laundry list of traits, deciding how much they value strength in each area (must have, valuable but optional, donāt care), designing a sequence of interviews to assess each quality, and then defining ābestā as the maximum total area under the curve with no showstoppers.
Depending on my values system, someone who just meets my minimum standards for coding speed but with brilliant problem solving skills and testing religion might be a better hire than a faster coder with zero empathy for users, even if generally I consider coding speed a rather important signifier of a strong engineer.
See what I mean about complexity? If you can make this work for yourself and your interview team, you have my blessings (and Iād love to hear the implementation details.)
However, for normal human beings, too many instructions are just as useless as too few, so most good hiring managers end up picking 2ā3 traits that really matter, and perhaps a showstopper to avoid. Joel Spolsky famously chose āsmart and gets things done.ā At Facebook, it was roughly: coding fluency + systems design, donāt hire jerks.
There are real shortcomings to simplification: if you focus on the same few things with every hire, your team will become more and more alike. Overlapping strengths is fine (who wouldnāt want every engineer to be a highly fluent coder? Maybe scrappiness is a core company value that every hire must share!) but youāll quickly develop shortages of other traits that matter.
For example, at Facebook, we started noticing that engineers with great product instincts were in constant demand. Just one of these engineers was a massive accelerant to a new effort, and product teams were constantly tussling over the few we had. We wondered, why so few? The answer was sort of obvious in hindsight: we were not recruiting or hiring for this traitāāāso we added it to the set of interview questions and started hiring more engineers whose excellence in this area outweighed a more average performance on systems design.
A second and more subtle shortcoming of simplifying your hiring criteria is that if you donāt assess all of a candidateās relevant strengths, even if you offer her a job, she may feel under-appreciated and you may fail to make a great hire.
Perhaps the most contrarian thing I have to say about your hiring criteria is this: donāt get wedded to it. Focusing on a few traits is a helpful shortcut in hiring, but in the real world of making software, you donāt get to simplify. You actually do need many or most of the traits from that big laundry list in order to build great software and a great company.
Maybe your founding team includes a great product visionary, so coding productivity or work ethic are the most important traits for your first few hires. Once youāve assembled several engineers like that, youāll want to complement them with one or more engineers who are strong systems thinkers and scrupulous testersā¦ or perhaps a great partner for your brilliant but difficult designer.
You wonāt want that next hire to be unproductive. But maybe youāre OK hiring someone who takes five days instead of four to complete a project, if he brings something else to the table that unlocks the potential of your team and increases the collective output.
If you elevate your āhiring barā to religious status, and represent, say, coding speed, not as a means to the end of shipping great software, but instead as the gold standard of What It Means To Be A Rockstar, youāre going to have a lot of trouble hiring for anything else. Your existing team (who have all been selected for coding speed) will view this as ālowering the barā and the consequences could be severeāāāanything from griping and loss of morale, to blocking or undercutting new hires, to quitting.
In fact, even if you never needed to hire another engineer, getting religious about your hiring criteria is a mistake, because it implies that the traits you select for at hiring time are the only contributions that define success as a software engineer at your company. If your team only values speed and not good design or careful testing, watch out, because youāre going to pile up technical debt and bugs. Of course, your team needs to value speed too, otherwise youāll have a hard time punching above your fighting weight.
Narrowing your hiring criteria to a handful of traits is a reasonable shortcut at hiring time, but never lose sight of the fact that a great team is composed of engineers who complement one another. Donāt be afraid of breaking the mold in between each hire. In the end, great managers value, develop, and employ different strengths according to the potential of each member of your team.
Your job is to know what your team needsāāāand make sure the whole recruiting and interviewing team is on the same page about finding it.
Soā¦ what do you look for?
About the guest blogger Jocelyn Goldfein: Jocelyn invests money and time in making high tech startups successful. She gets to work with teams and products she believes in, every day. She’s spent her career building software during high-growth years at VMware and Facebook (and a couple startups). Her and her teams have built middleware, distributed systems, big data powered ranking systems, operating systems, web and mobile apps and developer tools. Learn more about her investing activities on AngelList.