Difference between revisions of "Interviewing a Technical Candidate"

From strattonbrazil.com
Jump to: navigation, search
(Anatomy of a Perfect Technical Hire)
(Forty Minutes of Coding)
 
(8 intermediate revisions by the same user not shown)
Line 7: Line 7:
 
Neil Roseman, previously a VP at Amazon, wrote [http://firstround.com/article/the-anatomy-of-the-perfect-technical-interview-from-a-former-amazon-vp 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.   
 
Neil Roseman, previously a VP at Amazon, wrote [http://firstround.com/article/the-anatomy-of-the-perfect-technical-interview-from-a-former-amazon-vp 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.   
  
* You should come out of every interview with a clear sense of whether the person could improve the probability of your company’s success.
+
* Don’t forget to introduce yourself to help work out everyone’s nerves.
* Great interviewing is work. It takes time to prepare, conduct the interview and then de-brief in an effective way. If you don’t want to do the work, don’t interview.
+
* “Tell me about your background” is not a useful question for a tech interview.
* Once you form an initial impression of someone - which usually happens within the first 60 seconds - you should spend the rest the interview trying to invalidate that impression.
+
* Pick specifics out of a resume to determine what the candidate actually did. Remember, you want people who get stuff done. Period.
* You should always take copious notes during interviews so you can make a cogent argument for or against a candidate.
+
* Probe when you see a resume with a long list of skills. Separate the truth from filler.
* In most cases, the “best and the brightest” already have jobs, so you’re really just on the lookout for the best available. Plus there’s no way to prove that your hiring process resulted in the right people because you can’t A/B test hiring decisions.
+
* Don’t “try out” new questions on candidates. Know what a good answer sounds like.
* Always strive to hire superstars but realize that not all hires need to “walk on water. This person should be better along some dimensions than a majority of the current staff and have the potential to have a long-term impact.
+
* Make sure you have them write code! This is too often skipped.
You want to hire people who are smart, that get stuff done and have the functional set of skills you need for the role.
+
* 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.
 +
 
 +
== Time Management ==
 +
 
 +
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.
 +
 
 +
<blockquote>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</blockquote>
 +
 
 +
If they say they've designed an architecture, have them diagram it on the boardAsk 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.

Latest revision as of 14:45, 26 August 2014

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.

Time Management

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.