Recent interviews:
- A somewhat well-known poster here, the kind of coder who parachutes in when startups are having trouble shipping and need help. Didn't actually know the programming language very well, which is sadly common amongst coders of the language in question. Sometimes that's ok, but this person presented themselves as an expert in the language and did not know very basic things about it.
- Again, not very strong with the language, but very strong in other languages and overall quite an impressive candidate. I recommended to hire this person, but for a different engineering role. Got hired for a different role and is doing a great job.
In the interview itself, as I said, no coding. Sometimes I will ask the candidate to spot bugs in a function, or read code and say what it outputs, or have a whole function written with one thing missing, and ask what's missing. But asking the candidate to create something where nothing yet exists is not fair, I think. Whiteboard coding and all that, it's no good.
When I say the candidate didn't know the language well, I meant conceptually. Like, imagine if someone told you C had a built-in array type, for example. It was that sort of thing. And remember, this was a person claiming expertise.
One of the principal things I look for in candidates is ability to speak comfortably about their thought processes & confidence level -- because it's so much more valuable to have a developer say "well, I can think of two ways to solve this, but I'll have a much more solid answer if I can take 10 minutes to refresh my memory on a project I did 5 years ago" than one who says "there are 2 options".
This shows up in interviews (and I look for it); if you give a wrong answer to a question, but you seem to be confident, that's bad. If you give the same wrong answer, but you mention that you don't use the construct (and thus aren't fully confident on your response), that can even be better than giving the right answer.
An interview that only saw correct answers can easily be less informative than one that ran into areas of uncertainty -- because it's crucial to see how they handle that. Do they realize they're guessing? If not: don't hire. Are they comfortable revealing uncertainty or missing knowledge? If not, don't hire.
Ideally they should know how roughly how confident they should be, and also know how to get to a better answer quickly. Real development isn't at all like a closed-book test, and interviews that operate like a closed-book test aren't useful for that reason.
This plays out at a larger scale too - some cultures are more open to borrowing from other cultures, and some are more closed. The more open ones utilize better technology than the closed ones.
I've worked with some developers who are brilliant technically, but are not people you would hang out with outside of work. You don't want to duck out or pretend you have a doctor's appointment just to avoid going to lunch with a coworker. You also don't want an arrogant know-it-all on your team, even if he is a genius with code. I remember interviewing a guy and asking him how he would accomplish something in PHP, and he said "PHP sucks, I would write it in a real language." That's the kind of person you don't want to hire to work on a PHP app.
'That's the kind of person you don't want to hire to work on a PHP app.' Definitely. I would also be surprised if they were even technically capable of giving a good answer, given that attitude.
'You also don't want an arrogant know-it-all on your team, even if he is a genius with code.' Agreed. And since nobody else wants to work with someone like this, this type has a tendency either tone down their attitude or to get weeded out before they can really grow technical expertise. I've interviewed hundreds of people and can only think of a couple of examples that were close to that, and those were either for internships or people fresh out of college. Do you often run into people that are technically a great fit but are too arrogant to hire?
However, you are correct in that there are correlations between them that you can use to guide the interview:
- breadth of technical knowledge -> curiosity
- depth of knowledge on a topic -> focus
- length of experience on a topic -> patience
- sources of knowledge -> self-guidance
- etc.
Wouldn't it be better to ask a problem and see how the person might solve the problem?
let's say you have a callback function cb that is going to be called by some async process, and in this callback we refer to this.method(). At the time we defined the callback, "this" referred to someObject. How can we be sure that when the callback is called, this.method() refers to someObject.method()
In nearly every case where the candidate could not tell me about bind(), call(), or apply(), they can't explain a clean way to do what is described in the followup (e.g. pass your callback as cb.bind(this)).
(Also, coding standards are not subjective. Some ways of writing code are more productive than others. The idea that it's subjective is nice to believe, because then you can pretend that nobody is wrong.)
E.g., you'd need to buy a new POS system, or paid millions to have custom-made medical software recertified (or re-written) to work on a newer browser, etc..
It's much rarer -- most places have bitten the bullet by now -- but I still see it (and IE7 is certainly still around).
IMO, some of what you describe sounds like the wrong way to hire. Stuff like Function.prototype.bind can be easily found By Googling. You want candidates who can adapt to the unknown. I remember a well-known PHP developer in the DC area telling me a story about him guest interviewing candidates for a friend's company - he asked a lot of intense edge questions about PHP to candidates, and only one would give him straightforward answers about not knowing the answer and being willing to Google the answer. That candidate ended up being a phenomenal hire for that company.
That is true, but it is a warning sign that someone with 10 years of working with Javascript has never had to use those functions (even if they had to Google it 5 years ago, they should remember it now). It would be like hiring a driver with 10 years of experience who didn't know what the parking brake was for. Granted it is possible to live your whole life in a flat state and never have to use it, but that's rare, and even if true, I want a driver who has seen at least a hill or two.
Once you've passed the basic questions like this, we definitely get to more difficult and tricky questions, and even a question that has no answer to force the candidate to either BS or admit he doesn't know.
I have more sympathy towards people who may have not been fortunate to have seen the more challenging aspects of development and help them get there - only 2 1/2 years ago, I was unemployed for the past 2 1/2 years out of grad school without any company having given me such a shot at any career, and here I am now as a lead frontend engineer who is trusted to solve any problem thrown at me and build a team. Just as I was pissed off that so many companies were originally dismissive of me despite my education pedigree, I try not to be dismissive of candidates because they didn't happen to use [insert feature]. Stuff like that is easily studied or taught, and I evaluate almost wholly on things that (almost) can't be studied since it pre-empts candidates from giving me answers that hide important characteristics about them.
On the other hand an excellent hire might be a cheat that put the effort to become a good developer once he joined the company or... You might hire a very promising young man who (because this or that) he ended up being a bad hire.
- No formal background
- I don't code on the spot, and not on a whiteboard with zero resources but rote memory
- I'm not "senior" enough (with >15 years in roles with progressively increasing responsibilities and contributions)
- Buzzword trivia was fun in 2003. Not so much.
- Had an off day
The roles I've been hired into where I wasn't subject to a dog and pony show have arguably been the best, as I've been approached as a person and a professional, and not as a little blue box filling an opening in the calendar.
If it goes well (first scenario), I like to spend the rest of the interview pairing on a task like writing a parse method for a Backbone model that needs to transform a response for a charting library or something like that with Underscore/Lodash.
One time, a candidate started checking emails on his phone during an on-site interview. That candidate wasn't hired.
Example:
var a = function(x){ this.x = x+1; return this; }
var b = function(){ this.x *= 2; return this.x; }
a(3).b(); //result = 8
function myFunction() {
var a, b, func;
func = function () {
return {
attrA: function (attr) {
a = attr;
return this;
},
attrB: function (attr) {
b = attr;
return this;
},
toString: function () {
console.log([a, b].join(' '));
return this;
}
}
}
return func();
}
This allows us to call myFunction multiple times, set attributes (imagine it were createPerson instead, with a name, age, etc...) and not run into problems with state being shared.I like this question because it covers closures, this, objects and functions. It also doesn't qualify as a brain teaser, IMO.
That's debatable. It requires a piece of unusual thinking ('return this'), and a bit of magic (knowing about the 'this' magic variable), but once you've seen it, the answer's obvious, and it's pretty easy to replicate everywhere.
- Candidate was lacking in fundamentals in his/her domain
- Candidate could not demonstrate a good critical thinking ability
The first was a total dealbreaker on a phone screen.
I prefer strong critical thinkers, and am willing to eschew complete knowledge of a domain from a candidate and mentor him/her up to speed, but weak critical thinking is nearly a dealbreaker for me as a manager.
I have been extraordinarily happy with all the people I have hired so far.
I've seen signs of poor logic crop up just when going into detail about past experience; but otherwise it can be hard to see -- particularly when the candidate has been working on projects where someone else was providing technical leadership.
I do ask candidates to go through a thought exercise -- basically a software dev related puzzle requiring no special knowledge (except a bit of basic crypto). Something like "here are the 5 constraints; walk through how these 3 scenarios would work" -- no code involved, but requiring the ability to convert constraints and goals into step-by-step instructions.
This has been pretty useful (there's a surprisingly huge range in the types of responses I get) but wouldn't reveal much about how good someone's choices would be deciding how to implement new features from scratch, for example.
I don't necessarily expect perfection in code design - I can help teach that, but a good foundation is paramount.