Interviewing a Technical Candidate
I've become involved in the interview process at my company. It's been fun to learn the general guidelines we've setup for each other, but on thing I've learned is that interviewing is hard. It frustrates me how little I seem to know about a candidate after an entire hour of time with him and although we have four employees interview each candidate, I'm not confident the sum of parts is a complete picture.
I've tried to be proactive learning more about technical interviews. Time management is especially important. Having only an hour with the candidate I've found some questions can eat up a lot of time without telling me much about the programmer's coding ability or their fit on the team.
Anatomy of a Perfect Technical Hire
Neil Roseman, previously a VP at Amazon, wrote The Anatomy of a Perfect Technical Hire, what he believes to be some good rules. While I don't agree with everything the article as a whole provides some great pointers.
- Don’t forget to introduce yourself to help work out everyone’s nerves.
- “Tell me about your background” is not a useful question for a tech interview.
- Pick specifics out of a resume to determine what the candidate actually did. Remember, you want people who get stuff done. Period.
- Probe when you see a resume with a long list of skills. Separate the truth from filler.
- Don’t “try out” new questions on candidates. Know what a good answer sounds like.
- Make sure you have them write code! This is too often skipped.
- Dig into algorithms, data structures, code organization, simplicity.
- Use some questions that are vague and open-ended. See if they ask you questions to find out more.
- Ask a design question. See how people think about a bigger picture problem.
- Create core competences for your company. Make sure candidates measure up well.
- Make it tough but fun. Good developers want to know they’re talking to smart folks.
As I said, I feel like time goes by so fast in an interview. It's important to keep a good schedule so you get what you want out of the candidate and also the candidate gets what he needs out of the interview (they need to get sold on your company during the interview). For an hour long meeting I like to use the first ten minutes introducing myself and going over their resume. This is followed by about forty minutes of coding starting with an easy problem and getting harder and deeper as they progress. The last ten minutes of the interview is strictly for the candidate to ask me questions.
The First Ten
After a quick introduction I briefly mention the schedule of the next hour so the candidate knows what to expect. I start by going over parts of the candidate's resume with them. I've already highlighted specific sections I want to discuss beforehand. Roseman suggests focusing on percentages in particular.
They might think it sounds good to say 'I improved system availability by 50%', but if we’re hiring someone for a system engineering role, I need to know they actually did that. -Roseman
If they say they've designed an architecture, have them diagram it on the board. Ask them what part of the design they did and dig deep to determine whether they were actively shaping in the process or just a participant.
Forty Minutes of Coding
I always start with a relatively easy question like reversing a string. This allows the candidate to relax a bit and get into programming mode. Again, questions are prepared beforehand. I've been tempted to use questions without trying them on others, but I try to stick with questions I'm very familiar with. For every question I ask I should already know common bugs people run across, edge cases, and variety of questions to dig deeper into their code. Once they complete the problem, I try to dig deeper by adding additional features or changing the scope to see how they can adapter and generalize their code.
When programming I generally try to let the candidate program in whatever language they want including pseudocode. For both my jobs out of college I had to learn the company's principle language on the fly so in general I don't care whether they know language X or library Y. If they do decide to use some esoteric language like Haskell that I don't know as well, I expect them to be able to explain to me very carefully what the program is doing. Similarly, if they claim proficiency in a language on their resume, I expect them to use it well. I've seen people who have worked with C++ over ten years and struggle with pointers. This is a bit of a red flag that they haven't been able to understand the fundamentals of the technologies they've worked with.
Most important with any technical interview is to never let the candidate get stuck for extended periods of time. It is only time wasted when I could be learning more about them. If the candidate goes silent for more than twenty seconds I ask them what they are thinking. If a candidate gets stuck it can quickly eat through the valuable interview time. Give hints and point out bugs. It's just as important to know how they think. Sometimes when listening to the candidate I've realized they don't understand the problem and by rephrasing my question I can get them back on track. Sometimes even a particularly smart candidate might not get a particular part of the problem. Make a small note and move on.