In the
previous post we discussed
the optimal hiring sequence when building a team from scratch. But how do you screen and interview candidates? There are as many opinions as there are people who'd ever went to an interview or conducted one. What follows is my purely personal take on the subject and I expect that some people might disagree with certain things said in this post.
The
http://en.wikipedia.org/wiki/Fail-fast style followed by me is based on my experience with hundreds of screened resumes, phone calls and interviewed candidates.
It boils down to one thing – if something rubs you the wrong way, stop right there and don't waste yours and your team's time on interviewing the candidate further. Or, put it another way – the moment you stop being excited about the candidate – do not hire.
The
fail-fast style of screening and interviewing utilizes several simple approaches; none of these approaches are truly original and they don't have to be used together; however, they are very effective when combined.
Rule 1. Always do a phone screening first.
It helps to filter out weak candidates as early as possible. A phone call takes about 5-30 minutes depending on how the person is answering. It's easy to schedule and generally convenient for both you and the interviewee since they don't have to take a day off to come see you just for the initial conversation.
What to ask during the phone screening? I generally ask what I call X-ray questions - the questions which immediately expose the level of familiarity with the subject matter on many levels. For example, I will always ask if in java an abstract class can have a constructor. If a candidate answers incorrectly, I will ask a couple of clarification questions just to make sure that they understood me correctly and to understand how exactly they think things work with constructors. If they respond correctly, I'll move on to further questions about their understanding and experience of the programming language.
What not to ask during the phone screening? I try not to ask things for which I would prefer to draw on the whiteboard – such questions should be left for the face-to-face. I don't try to ask detailed questions about frameworks because I generally don't care about them (I go into that topic a couple of paragraphs below). I never ask things which are mostly terminological – like 'what is a Factory pattern' or 'are method parameters in java passed by value or by reference'. I've met really great candidates who knew correct answers but simply did not know the right name and it's easier to figure these things out in person with a piece of paper or on a board. Never ask things from the show-off contest like 'what is a byte shift operator'; focus on the candidate's understanding of the concepts rather than API trivia (however if the person doesn't know the difference between Set and List there is a big problem from my point of view and I stop at that point).
At the end of the phone screening you should be excited about the answers you got; if you are, then invite the person for a face-to-face and explain to him that there will be a coding exercise as soon as he comes in (see below). If you are not excited thank the candidate and end the process there.
Rule 2. When the person comes in for the interview, give him some hands-on exercise first (with a fixed time limit).
It does not apply to all fields, but it's perfect for software developers. I have a very simple programming task which requires knowledge of only basic java. It's really simple. It doesn't ask for knowledge of any sorting algorithms. By the way - do not ask the person to write a sorting method – you'll just a get a bunch of loops – this should not be the point of the test. Instead pick a test which asks the candidate to design tiny classes and methods as a natural way of solving a problem. Do not specify how many classes or which classes or which methods you need. Specify only what your problem is and what you need the candidate to design and solve (for example: 'design a simple tree structure and provide a way to calculate the height of the tree; make any assumptions you think reasonable; please provide a simple unit test as well.'). I offer Eclipse and IntelliJ environments pre-configured for the task (blank project with the compiler and JUnit/TestNG classes). Don't forget to tell the candidate ahead of time that there will be coding and confirm with him ahead of time that he is comfortable with Eclipse or IntelliJ.
The candidate is given
25 minutes to write a very simple piece of code and a unit test. Make sure
you can fully implement what you are asking for in about 10-15 minutes. Give your test to a person who you know to be very good and make sure he or she can solve it in 10-15 minutes. And here comes the harsh part –
if the candidate does not produce 90% of the correct solution in 25 minutes it is an automatic 'do not hire' decision.
It does not mean that you just show him the door; you should get into a room with the candidate and
professionally tell him that based on the test results it seems as if his experience is in a different area than the one your team is concentrating on and that is the reason why it is better to leave things as they are at this stage. Make sure you are polite when you say these things. The fact that the candidate could not give you what you were after does not make him or her an idiot, it just means he does not have the skills you are after. Now, some candidates get very defensive at this point and say that it was an unfair test that never happens in real life and that in real life they have developed uber systems for a whole investment bank just look at their resumes etc. Don't argue, but do not give them another chance. If you set the standard for all candidates, make sure you are not bending it. With programmers, it does not matter what they say about themselves, the only thing that really matters is how they solve problems, i.e. write code. You and others could implement your simple test in 10 minutes. If the candidate can't do it in 25, there is a problem.
Why am I so adamant about the programming test? I certainly don't care about the problem I am testing people on, it was chosen based on simplicity. It has absolutely nothing to do with what we are really working on. But it allows me a very quick preview into how the candidates organize code and solve problems. And I am a firm believer that
looking at their code is the best way to understand a software developer' qualifications. There is no single correct way to solve the problem, but there are SO many ugly and incorrect ways of solving it...Sometimes after the failed coding test I am looking at the written code and thinking 'man, is this really what is going on in your head?'.
My experience shows that there is a whole category of people who sound really great on the phone and then when you look at their code after 25 minutes they only manage to write a messed-up class with two fields and a blank static method called 'getHeight'. I call that category 'great game talkers'. They studied all typical interview questions and answer them very well but unfortunately still can't write good code. The coding test helps identify and weed out 'great game talkers' early on before you and your team spend too much time on them.
Rule 3. If the person passes the coding test, begin face-to-face interviews in fail-fast mode.
Same fail-fast principle applies: if the person or a pair of people currently interviewing the candidate think that the candidate is week it is his/their responsibility to stop the process and professionally show the candidate out without wasting the time of the rest of the team on this candidate.
I like interviewing in pairs. First, it makes things a bit faster – if you want 6 people to interview the candidate (6 to 8 people split in pairs is the sweet spot in my opinion) you can ask each pair to limit themselves to 45 minutes and the whole thing can be done in under 3-4 hours. Second, it's easier on the candidate – I was once interviewed by 6 people individually and I can tell you I was really tired by the end. Finally, having a pair of people interview a candidate allows some protection against aggressive dismissals by either of the interviewers. In my team it works like this – the pair interviews a person, then both walk out of the room and discuss between themselves if they think the interview should continue. If either feels very strongly about not continuing they end it, but if one thinks there were no problems and another is only mildly concerned – they allow the person the benefit of the doubt and invite the next pair of interviewers.
Rule 4. Agree ahead of time who will be asking what.
Your team should discuss internally ahead of time who will be asking what questions. This way they cover more of the relevant subject matter and avoid situations where the candidate gets extra points for answering the same question he was asked by the previous person (and of course the second time he will not make mistakes) – this has happened many times.
So these were the rules for the overall interview process between your team and the candidate.
Now I would like to mention a couple of additional thoughts and principles which I believe in and follow when screening resumes and interviewing candidates. I called them opinions rather than rules in order to sound less dogmatic, yet they are still an integral part of fail-fast interview style.
Opinion 1. Separate skill level from ability to learn.
I always look for two things in a candidate – whether or not he or she has a
minimum required level of skill and whether or not a person can learn new things on the job.
Knowing some frameworks is a short-term benefit (the candidate can hit the ground running), whereas the ability to learn is a long-term benefit for the whole team (the person will become master of 2 new libraries in 5 months). What does it mean in practical terms? It means that if the person
understands core java and OOP (the
minimum required level of skill from my point of view for a java developer) I don't care about lack of experience in any framework or technology if I feel that the person can pick it up quickly. Why do I insist on making sure the candidates know core java and OOP? To put it simply,
I need to know that everyone who cooks in my kitchen knows how to wield a knife. But if a person isn't sure which is the cutting edge of the blade... thank you for your time, it was nice talking to you.
Opinion 2. Resume screening - ignore things that do not matter on the resumes.
These things do not matter to me and I simply ignore them:
- Education degree - I need a minimum required level of skill and an ability to learn. I don't care if this is a PhD or a high school drop out.
- College name - I need a minimum required level of skill and an ability to learn. I do not care about which school the person went to (and if).
- Industry - I need a minimum required level of skill and an ability to learn. I don't care whether he is from finance or telecom. I did not care about it when I was in finance. I do not care about it now that I am not in finance.
- Number of years of experience - I need a minimum required level of skill and an ability to learn. That is all I really need.
Opinion 3. Resume screening - ignore everything that looks positive on the resume.
I scan resumes only to find if there is anything
negative that would prompt me to skip the candidate even without talking to him. Did the candidate change jobs every 7-8 months in the last 4 years? Does he put trivial things like 'utilized log4j framework for logging' as a bullet item in the previous job descriptions? For those readers who are not technical in java – imagine a cab driver putting 'utilized gas pedal for driving' on his resume. Does he use expressions like 'participated in' or 'coordinated' a lot?
And here is the interesting thing –
I mostly ignore everything else on the resumes. In other words,
if I did not find any negatives, I assume there are absolutely no positives no matter what is written in the resume. Why? Because people lie. Because 80% of all drivers think they are above average. Because smart people just rephrase and embed job description requirements into bullet items of the previous jobs. I forgot how many times I was
really excited about someone's resume and then would have to end the phone interview after asking just 3 questions.
Opinion 4. Do not hire assholes.
If a candidate is very smart and has lots of experience it still means nothing if you get the wrong vibe from him or her. If there is a tiniest suspicion in your head that the candidate will not fit with the rest of the team - do not hire. A wrong person can break the whole team apart.
Opinion 5. Trust your gut feeling.
You should generally see within 2 or 3 minutes if the candidate is an asshole. If you got that suspicion in the first few minutes – with 90% probability it is so. Don't try to convince yourself that maybe he or she is really OK. Ignore the technical skills. Trust your gut feeling. Do not hire.
Opinion 6. Differentiate lack of technical skills from lack of interviewing skills.
Occasionally you will notice that the candidate passed the coding test but is not doing that well during the interpersonal phase. The most important thing at that point is to determine whether it is lack of technical skills or simply lack of interviewing skills. Some candidates might be extremely nervous, some might be naturally shy, and some might just be very bad at interviewing in general. If you suspect the person is nervous – tell them something unrelated to the interview (be very careful with jokes) and just talk to him as a person, not the candidate. If you suspect the person is naturally shy – think whether or not that would be a problem in your environment; if you are not hiring him as a sales person he might be just fine. If you suspect the person just does not interview well – help him or her a bit in presenting their skills. Always remember that the person sitting across the table is nervous and make allowances for that when it comes to presentation of his answers. However, the answers themselves should be correct!
Opinion 7. Follow the 'Hire or do not hire' rule from
http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html
The link above does a great job explaining why you should force yourself to immediately make positive or negative decision (negative being the default one) about the candidate. There is no middle ground.
In conclusion just a quick remark about java examples and java references in this post. If your environment is not java-based the same principles apply – just determine correctly what constitutes the minimum required skill level – would you let the person wield a knife in your kitchen?
What are your recommendations for interviewing and screening candidates? Comment and share!