Some “Developers” Just Can’t Develop
richardsbraindump.blogspot.com
richardsbraindump.blogspot.com
It's more like asking a truck driver to read a sign at 20 feet, and to flex his hands and legs to make sure he's able to control the wheel and pedals.
The idea with writing code on paper in an interview is to disqualify the blind-since-birth truck drivers who would point to a rubber duckie in a line-up and say "That one! That is a truck."
Of the three, the computer fares worst. Many developers work in highly customized dev environments with special keyboards or monitor layouts. Using an unfamiliar setup, cold, in a stressful situation can make them sieze up or perform poorly.
Paper is no good because you can't watch their problem-solving process without hovering over their shoulder, and they get no feedback from you if they're going into the weeds.
The whiteboard seems to work best, because you get a good give-and-take effect between the candidate and interviewer.
I know, you didn't mean that it was all completed, but still... how much free work can you get from people before it's called abuse? If you had said "the guy who won the job just brought the best ideas with him", I'd be all happy.
1. We only used code from the guy who won, and he never saw the other submissions.
2. The interview project was time boxed to 24 hours. The guy who won did it in about 9 hours.
The actual feature is big, and has lots of edge cases: our devices need to be able to update themselves when new versions become available, roll back if there's an error, archive past versions, and never, ever end up in a state where they're bricked. The applicants did a small toy implementation of this functionality. The guy who won wrote good enough initial code to be used as a foundation for the rest.
That allows face-to-face communication, and avoids the uncomfortable violation of personal space induced by over-the-shoulder glancing.
Incidentally, this technique scales very effectively for phone interviews.
If I find a promising-looking candidate, I send them a few really simple tasks to code up (nothing at all complicated, or particularly "academic", maybe an hour's work at the very most). I set no time limit, and even don't demand all the tasks are completed.
This serves as a very effective filter for quickly discarding the completely-useless (which easily comprises 70% of the applications we get), and for the rest gives me a pretty good insight into their abilities.
I've tried sending these tasks both before and after interviews, and I'm definitely in favour of sending them first and interviewing second.
Apart from the obvious stupid-filtering benefits, I've found it helps immensely in keeping interviews relaxed. Having seen some code, I have a vague baseline for their abilities, so I can start with something I know they're familiar with and slowly work towards more complicated and interesting topics (without having to drop any questions that are met with a blank stare).
Although getting example code after an interview is an interesting experience. My predictions about a candidate's performance based on an interview have proven, with alarming regularity, to be way off the mark.
But now that I started my own company, I get paid a little more than a guy of my age/qualifications should. Hopefully soon a lot more if I can keep building it up. I get paid based on the economic value of my products, not what any one individual thinks of me personally.
It didn't seem to be a big deal. Nor should it be -- the goal of your interviewer is to watch you do things like: test your code, remember to check the edge cases, manipulate pointers correctly, be able to figure out how your brain-dead bubblesort algorithm is likely to scale as N grows larger, knowing what exceptions are and understanding their proper role...
It's possible that the interview is better if you're missing your higher brain functions while you're writing the demo code. You're trying to demonstrate your everyday habits, the things you do instinctively, when your memory, your cram session, and Stack Overflow all fail you. It's like asking a trumpeter to pick up their instrument and blow a few notes: according to Malcolm Gladwell, some orchestra conductors claim to be able to detect expert players with nothing more than this one test.
ADDENDUM: Oh, look, Reg Braithwaite already said this, more or less:
http://weblog.raganwald.com/2007/01/dont-overthink-fizzbuzz....
I'm personally a huge fan of interview questions that require candidates to do tasks that are as close as possible to what they'll actually need to do on the job.
For devs this means coding, designing etc. For testers this means creating test cases and for a UI designer it means doing UI design. If someone made me interview an accountant I'd have them do some actual case questions for accounting. I wouldn't be able to tell if they did them particularly well but that's a whole other issue and is probably why no one has asked me to interview any accountants.
Like many other folks that interview using this strategy I've come to it after seeing how many people have a great resume but are completely unable to do the actual work. This is often true even for people that pass reference checks with flying colors. After getting burned a few times you realize the benefits of getting people to demonstrate their abilities before hiring them.
The counter point to getting developers to code during an interview (and presumably to accountants doing accounting problems in an interview) usually takes a form like "I can't write code in an interview setting b/c X, Y and Z but I'm a great coder under normal conditions".
I'm sure this is true for some people and it is unfortunate that those high quality people miss out on jobs they are qualified for. It's also a loss for you as a hiring manager. But as a hiring manager you're better off with an interview process that mistakenly screens out some good people if it ensures fewer poor hires that you ultimately have to fire. A poor hire is very expensive in terms of time, team morale, money etc.
I had always thought it was insulting to ask interviewees to write a simple two-line strcopy() function. Of course they can -- they've got a CS degree! So I would take that as given and move straight to more abstract non-coding questions.
It took me a long time to accept the fact that many people can talk about programming very glibly but can't actually do it. At first I felt like a jerk by making people write so much simple code in interviews, but it's led to much better hiring results.
i've found the best way to screen candidates is to just ask them to sign up on project euler and work through at least three problems, in any language, and mail me the results. the quality of code i get so far is quite representative of the quality of the employee on the job.
yes, they could google the answers, but i disqualify the easiest-to-google questions (sum of multiples of 3 and 5 up to 1000, i'm lookin' at you). but honestly it doesn't matter - you can tell if they do because they can't explain it. and i can generally weed out anyone in the first place who would try to google the answer just from a skype conversation...
project euler hasn't failed me yet.
That there are people who have cheated their way to high score, completely ruined the enjoyment of the site. It does seem a bit silly, that your own enjoyment of a problem is tarred by someone else's exploits. It shouldn't affect you, but it ultimately does, in some ways that someone else cheating in MMORPG affects one's own rat killing efforts.
Ok, it's the author that sucks at his job. I'm sorry if that is not very constructive, but if I had to choose between having the horror show developer he describes on staff for 10 years taking up a cubicle and a paycheck, or the author on staff for 10 years hiring retards, I would take the horror show developer, as he would do far less damage in the long run.
Probably the author just has a positive view of people, and tends to see the best in people, or believes people when they tell him things. This would be fine for many jobs, but interviewing candidates requires a willingness to ruin someone's week. It is never the goal, but if a totally unqualified candidate shows up you must be willing to push them to answer questions so that you know that they are unqualified.
In any developer interview, you really only need to cover the following things:
- The person knows what they should know, based on their resume. - If they say they were a linux administrator for 2 years, they should know all about linux basics and shell basics, they should be able to run a machine remotely without breaking it, they should not be dependent on any gui tools, they should know the common server software people run, and so on. - If they were a web developer for 2 years, they should know about the stuff they supposedly doing, if it was backend code they should know about cache control headers and how ajax requests are or are not cached by the big browsers, they should know POST and GET and when to use them, and so on.
Anyone who doesn't know the things they 'should' know cannot be considered further, either they are lying on their resume or they are just turds who don't learn anything.
- They should be able to demonstrate an ability to code on the spot right in front of you. Some people claim they cannot code in front of someone else. Other than someone with an anxiety disorder, if a person can't code in front of another person it is just because they can't code at all. If their code is incorrect or suboptimal the main thing is that when you go over it they smack themselves on the forhead and seem annoyed that they would make such a mistake, and that they see right away how what they coded is wrong. If they can't get some challenging thing exactly right isn't such a problem as not 'being with it'.
- They should be sane and law abiding, not a drug user (and here I mean drug use which you can notice or that they *brag about), and that they have an ability to conform to some baseline social norms, such as bathing every third day or better, washing their hair and clothes occasionally, use and empty their trashcan, being able to talk to people without freaking out, and not going off on people or constantly insisting on doing things however they want to do it without strong rational each time.
This is basically 'smart, gets things done, can do things (vs coercing others to pick up their slack), makes a point to learn about what they are supposed to be doing, and isn't filthy or crazy.'
In fact, the last sentence in the first paragraph is very telling.
In my early years I was very much hit and miss in terms of finding the right people and it wasn’t until a horror hire that I realised what I was doing wrong.
Never thought of it that way before, but it makes perfect sense. If you can ride a bike, change a flat tire, or balance a checkbook, you can do it alone or in front of others. Why not the same for programming?
They are complete wastes of whatever resources they consume, but they are totally oblivious to this either for psychological reasons (ego defense or something) or the usual 'incompetent people have no way to detect incompetence', but probably a generous helping of each, ego defenses prevent them from integrating the memory of each failure they are responsible for (when they are fired from one job they aren't qualified for they just apply for another job they aren't qualified for) and the incompetence thing means they are unable to detect any real reason for their suckiness, leaving them with only the potential explanations they can come up with (usually stuff about how they were distracted or were having personal problems or had too many things going at once, as they are convinced that if they could just sit long enough and work at it they would eventually get it done. They are of course wrong, no amount of time would allow them to succeed at the task in question.)
This is not true, as long as you're willing to wiggle on "can't". I do pretty poorly at coding while someone else is watching, because it takes most of my attention to code, and if there's a social situation going on, too, there's usually not enough left. The less well I know the watcher, and the better the watcher is at what I'm doing, the worse I do. This is true for finding bugs, too; having someone trying to find the bug on the same screen as I am means I'm almost guaranteed to fail to see it before they do. Fortunately, after 30 seconds or a minute of fruitless looking, most people will go back to their desk and let me actually get on with it, and then things get done. :)
Your ability to read the opposite of what is said intrigues me. Are you a birther by any chance? :P
FizzBuzz turned out to be an extremely simple problem (description in the post).
Atwood's article starts with a quote of yet another article with the following lines:
Like me, the author is having trouble with
the fact that 199 out of 200 applicants for
every programming job can't write code at all.
I repeat: they can't write any code whatsoever.
Surely, this is an exaggeration I'd thought... How can someone who calls themselves a programmer can fail to solve FizzBuzz even at under the pressure of being at a job interview?To my horror, I discovered that a lot of comments to Atwood's post provide an incorrect solution and only prove the point of the article.
I realize that anecdotal evidence like this does not technically prove anything, however it does make me shudder inside...
http://steve.yegge.googlepages.com/five-essential-phone-scre...
I require HR/recruiter/whoever to have the candidate receive my phone call from a place where he has email access. I call, introduce myself, and then immediately tell them that I'm sending out a couple samples of Java code. To avoid formatting hell, I PDF them (w/ Eclipse pretty formatting, even!). Then, we open up the code samples, and I ask questions about them. I can write more about this if anyone's interested.
Is this company a very famous or desirable place to work? Up-front screening could work very well in that situation. But for less well-known companies like mine, candidates are less willing to go through a lengthy process to interview with us (except the desperate ones, and we don't want those).
Besides, given a population of superstars that want the easiest interview process possible, vs. a population of superstars that want to work with other superstars, which one would you rather work with?
I'd be more concerned with the test not measuring what you want it to measure. It's possible to test well and still not be able to code yourself out of a paper bag, and it's possible (though somewhat less likely) to code well and not test well.
I won't do it. That is to say, I won't do it for just any company. I try to determine if a company has their act together by interviewing them back. I don't mind (and expect) some degree of white board coding or something, but there's a level of nuttiness that isn't worth my time for a company that maybe would be good, maybe not. If it's 'just a job' I have other options.
You can get away with more onerous hiring barriers if you pay a better salary or are otherwise a more attractive candidate (top reputation, etc) for employment. If you really are getting much better hires, you should be able to pay better I suppose. I think paying for code samples, or contracting for a few hours of work, etc, are also more respectful ways to get work from a non-employee and signals to the candidate that you're serious and they're at the final step.