On interviewing – beyond technical competence
In the last few posts on interviewing, I discussed mostly about the technical aspects of the interviewing process and some readers had raised the concern that whether technical competence alone is sufficient for doing programming job well. Well, it’s definitely not. In this post, I will discuss on the three most important factors, besides technical skills, that people must care about when evaluating candidates for a programming job.
You want people programmers who are really passionate about their craft and take pride on what they do. Passionate people are self-motivated; you don’t have to spend your time on preaching them on why they should add value to the team in one way or another. They are also autonomous; as long as you have given clear and challenging objectives, they will know how to get things done. Passionate programmers will spend their weekend surfing over technological blogs and feeds to keep them up to date and their evenings reading books or coding something, unrelated to the project, to sharpen their knowledge and skills. Passionate programmers are also curious, they just don’t accept the fact that there is something about this software business that they can’t understand and will go any necessary length to understand stuffs under the hood. They will “javap” Java class files to see what the bytecode instructions look like; they will decompile DLLs to see how the MS developers actually write code; they will use Fiddler to see what are actually sent back and forth between their web client and the WCF web service…
Look for passion in CVs. Do the candidates code in their free time even as simple building some “toy” projects? Are they contributors of any open-source projects? Look for passion during the interview. Asking them how they learn new things – whether they are up to date about latest technologies and trends, whether they learn things on their own initiative instead of “learning on the job”. Notice if they sound really enthusiastic when talking about technologies or display a curiosity in stuffs that they don’t know. At times, you will interview very good liars, but then, passion is among the most difficult things to be faked and I can’t think of any single mistake I’ve made on this so far.
There is nothing worse than a highly competent programmer who is dishonest. Dishonest people have excuses for almost everything. They cover their mistakes with lies and blames. They will trick anyone on everything just to get to where they want to be. They will take all praises if things go well and dismiss all the responsibilities when things go wrong. They spend office time fulfilling their personal timetable and always act as though they were the most hardworking staff. And the more competent they are, which usually mean the more authority they would assume in the project, the more damaging it will be when their mistakes are uncovered. The bottom line, dishonest people, no matter how competent, ruin the people, the project, and the organization.
On the contrary, trustworthy people will tell you and everyone else in the team about their mistakes and have a plan to avoid it from happening again. They even take note of every criticism from others in order to reflect and improve themselves. They are transparent in everything they do even if that means there are more chances of them being caught of making mistakes (“So what? Everybody makes mistake, the point is to learn from it and be a better person”, these people think.) And last but not least, trustworthy people also get thing done. They are given a task and if they say they will finish it they will finish it.
It’s quite difficult to tell if people are trustworthy or not unless you have worked with them for a while. But there are a few things that can help. Check if they really know the things they list in the CV. Check for their integrity by asking questions about their past behaviors in certain circumstances – try to ask a lot of questions and identify inconsistency in things they say. And as this is no exact science, use your instinct as well. If they display any single sign of being untrustworthiness, then unless they are so competent that you really want to give them a try, you should quickly proceed with a no-hire decision.
Programmers have to work well in team. You don’t need a hero who does not listen or accept almost anything said and done by others. You don’t need a hero who refuses to participate in code review just because they think their code is perfect or because they don’t want to accept any comments from “those inferior programmers”. You don’t need a hero who disregards almost every team rules and processes. These people, often cynical, never see the good things in others but can spend the whole day criticizing the bad things. In most team meetings, these people either speak a lot, leaving no space for other (“I’m the only one in this whole team that can make sense. The others had better listen to what I say”) or they don’t speak a thing (“Are these people know what they’re talking about? I’m bored to dead here.”)
On the other hand, people who have high teamwork spirit will care about everyone else in the team. And even if their colleagues are really incompetent, these people, instead of saying “I hate working with these jerks”, they will say “I think I can assist my colleagues in this particular area”. They think independently and at the same time value diverse opinions; they can work effectively on their own and at the same time care about the things others do and are always willing to give a helping hand. They not only comply with team’s discipline but also do their best to bolster it as they know discipline creates great team, or simply because they can’t just accept the idea that others have to suffer because of their sloppiness or the idea that they are too lazy to adhere to something the whole team has agreed on. They share their knowledge to their colleagues whenever they have a chance. And if you have a team wiki’s, their names will be in the top of the contributor list.
Just like trustworthiness, it’s very hard to tell if people have teamwork spirit or not unless you have a sufficient amount of time working with them. Again, instinct counts. Does this person seem to talk only about his/her achievements without any regards to the people s/he worked with? Does this person mostly use “I” instead of “We” when describing all the significant technical decisions made in his past 50-people project? What does s/he think about other job roles like tester, business analysts? Does s/he think that discipline is very necessary?
That’s it. Passion, trustworthiness, and teamwork spirit (plus sufficient technical ability) are all that you need. You may think these things are too obvious to be discussed at length in any blog post, but then, as simple as they are many interviewers I know often forget about them and pay too much of their time questioning the technical competence alone. The more time you spend up-front to evaluate these factors during the hiring, the better off your organization/project will be. And if some time in the middle project that you discover that the person you hired is dishonest, lacks of passion, or tends to go for one-man heroic effort, the best thing you can do for your team, and probably for that person as well, is to let him/her go very quickly.