views:

2126

answers:

14

I'm specifically talking about interviewing for a position for a very experienced and competent C++/C#/Java systems developer, not a html, javascript web developer position. In my experience nervousness is often not a good indicator, because many good developers get very nervous under pressure, so what is a good indicator?


Hmmm... sorry, this didn't pop up when I went to ask this question. I've been told previously I'm not necessarily meant to delete it, but just post a link to the existing one. Please, if people think I should delete it, post a comment here to let me know, quite happy to, it seems very similar to the other one.

... or should I just close it?

+23  A: 

Tell them to write code...

Any who's applying for a Senior Developer position should be able to write some code.

Would you hire a magician without see first a magic trick?

CMS
I kinda disagree. I wouldn't necessarily expect them to write code under the pump. I mean, basic code yes, but really magic tricks are very different, they are meant to be performed "before your very eyes".
Jesse Pepper
@Jesse: I talk about very basic code, FizzBuzz like problems, in a white board, or in a computer, you'll see how people think and react when they face a "real" problem and how they achieve the solution.
CMS
yeah, ok, i agree. seems a bit obvious though
Jesse Pepper
@Jesse: I've seen couple of cases when a programmer got hired on the basis of an impressive CV or because he was a good talker and interviewer enjoyed chatting with him, and actually the "magic" part was missing...
CMS
yes, I agree it's important, but it doesn't necessarily imply a competent developer to me...
Jesse Pepper
@Jesse: you can't test for "competent" easily. Incompetence is easier to find.
Jimmy
I interview with a simple task of creating a web application that will list files in a particular folder, then create a webservice passing in the list of files to receive a file extension / count summary. More than once I've had people who've interviewed well at first, then failed at this.
ck
Magicians perform illusions, not tricks. Tricks are something whores do.
Zombies
+3  A: 

I typically read through their resume to see what they say they did in specific on prior projects then ask them a series of easy questions on one of them. So if they way they are a ASP.NET developer I'd ask them something like what is one of the events in the page lifecycle or some softball like that. If they can't answer an easy question on a technology that they have highlighted then it's pretty obvious...

Outside of some sort of real programming task (i.e. really developing something), I'm not sure how much you can make of someone in a single interview outside of getting a sense of base level competency...

+7  A: 

Ask them a real world programming problem that is not able to be answered by reciting a chapter of a programming textbook. Problems that you have encountered and that developers have to solve in your environment are ideal, as these are what you will need the new employee to handle.

If you are going to ask for code, which is a fine idea, pseudo code is just fine. Good developers are not characterized by the ability to remember programming language exact syntax; the IDE handles that!

Pete
I'd disagree with your statement that a good programmer doesn't need to remember the exact syntax. I would expect the code to be *almost* compilable. A senior developer should be able to know the syntax of his chosen demo language well enough to produce good code without crutches.
Timo Geusch
Definitely writing *pseudocode* - pressurising to remember namespaces and libraries can be unfair (even if you'd forgive them getting something wrong, they don't necessarily realise that) and the point is achieved by seeing the algorithm, process and mode of thought
annakata
@Timo Geusch - that's really hard to apply in webdev, for example, where I expect someone to be working with a dozen languages or more on a day to day basis, and the libraries are deep enough that they may not remember let alone have used any given part of it. Blame intellisense if you want
annakata
I'd expect a good programmer to miss of a semicolon (say) from time to time. But not know the syntax of their programming langauge??
Tom Hawtin - tackline
I think it's the other way around: semicolons and flow of control statements should be easy enough, but remembering exactly how to select nodes from an xpathdocument say?
annakata
+2  A: 

See their response when they hear about something they don't know about, for example, lisp or prolog. If they know vaguely about it, and are interested, it's a good sign. Good developers should be very inquisitive and attentive when someone (hopefully the interviewer) knows about something that it would be helpful for them to know.

Jesse Pepper
+1. It's a good sign for *anyone* (developers surely, but also management/sales/secretary/whatever) to be interested in stuff that they don't master yet.
Pukku
-1. Lisp is useless. -1 Again for giving points to anyone who sits there and will say yes to everything.
Zombies
+18  A: 

Beside letting them write code, I also asked them to debug some. I showed the candidates several problems from "How not to program in c++". I selected short programs and asked them to locate and describe the bug. following the candidate efforts to find an unknown bug were very telling. I tried to make this test game like, to make sure that stress does not play part in the responses. most people liked it and had fun. Even if they did not recognize the bug, what they hypothesized about could show experience, or lack of it.

Raz
I like it... which debugger did you use?
Jesse Pepper
just on paper. I showed them 10 "hello world" each with a different bug. :-)
Raz
What they hypnotized about?
Blorgbeard
+1. Showing them code to debug is a good introduction before asking them to write code. When discussing the bug, you can also discuss style. This will allow you to manage expectations when later in the interview, you'll ask the candidate to write a small bit of code.
MSalters
+1. I agree. Having them review code will enable you to detect if they have good programming habits ("returning a allocated memory is transfert of ownership", "using this uninitialized value lead to undefined results", etc.). It's better because reflexes come easier than though when under stress
paercebal
+2  A: 

Obviously, there are tons of things to ask to verify general developer skills, but I have a few "baseline" language-specific suggestions:

When interviewing candidates for a C++ dev position, the first thing I check is that they understand construction/destruction order and how different types of storage classes works. I consider that very basic knowledge (and crucial for writing exception-safe code) when it comes to C++ and if they fail at that, it's a very bad sign. I'm surprised how many people that claim professional C++ knowledge that just don't know how these things work.

When it comes to Java candidates, my first baseline test is that they know how references work in Java (e.g. show them a few different attempts at implementing a swap function and ask how they work / don't work). This is also an area where surprisingly many claim-to-be-pro candidates fail...

I've never interviewed anyone for a C# position, so I have nothing to say there really.

Niklas
+4  A: 

My favorite excercise is to show them the source code for Apache Tomcat’s DefaultServlet and ask them what’s wrong with it. It’s so full of resource leaks and bad practice that a developer that wants to be hired by me needs to find at least two different things to be considered by me as a possible candidate.

Bombe
I pity those candidates. That's a hell of a lot of code to go through, especially in an interview.
Chris Serra
I second that. Remember, they're interviewing you too. You'll make a better impression with concise problems.
Mike Robinson
I got only to the init method before seeing at least two things wrong with the code at just a cursory glance, so I tend to agree with Bombe here. Debugging level, lol.
MetroidFan2002
+2  A: 

Of course, "very nervous under pressure" might well be excusable in an interview, but might also be something for the interviewer to be aware of.

If you have a huge deadline or need your developer to interact with senior management/important client/PR/esteemed visitor/etc. then someone who gets nervous under pressure might very well be someone you want to avoid.

My warning signs in interviewees are a lack of clarity and when the little things haven't been given the care they deserve. Developing is about getting things right on a micro level, possibly more so than on a macro one.

It starts with the CV/resume/application form: almost any typos are a bad thing. If you can't use a spell checker or ask someone to proof your writing, then you aren't showing enough care.

But more generally, waffle and bluster are a sure sign that someone's trying to pull the wool over your eyes - if you ask a question about specific projects or times when they've worked in a particular way, you want detail, you want precision, you want confidence that this person actually did those things and isn't just reporting on the experiences of others.

I mean those little sparks of empathy when you're talking about foo v2.6 and when you mention that little glitch with the grommet driver and they say "oh we got around that by reconfiguring the bar API, it's all in the wotsit implementation - still it was all better in 2.7" - you know they've been there, not just heard someone at the water cooler (or remembered it from some response on the internet about interview questions).

Unsliced
Different types of pressure, though. I've known many programmers (myself among them) who are hopelessly nervous under pressure in areas where they feel incompetent (e.g., interviews), but excel under pressure in their area(s) of expertise (e.g., coding to hit a tight deadline).
Dave Sherohman
+7  A: 

I always like to ask this question:

Given a set of N numbers, how would you find the duplicates?

What I'm fishing for is: Do they grasp the difference between O(N^2) vs O(NlogN).

As they answer, if they need it, I'll provide a few hints to guide them along.

If they suggest a double-for loop O(N^2), I'll inquire if there is a more efficient approach. Or how long they think it would take to run with 10,000,000 numbers.

If they suggest sorting O(NlogN) followed by comparing adjacent values O(N), well that's good enough.

The ones who ask:

  • Are these floating-point or integer numbers?
  • How wide (8/16/32/64-bit) are these integers?
  • How large is the set?
  • Or who suggest an array of counters (for small-width integers).
  • Or who suggest O(N^2) for very small set sizes.

Those I really want to keep!

But it can be hard to think of all the details under stress & time-pressure.


Look, nobody knows everything. Most people can be taught. But when an individual lacks the fundamentals, really basic algorithmic complexity theory, it's going to be an uphill battle.

(And yes, I've had many coworkers straight out of Dilbert who didn't understand what O(N^2) meant and didn't want to learn! Somehow they always got fast-tracked into management...)



Amended to add:

You seem to be quite a fan of the big-Oh :) - eljenso

I needed something simple/elementary/basic that's common to all structured programming courses of study. We're talking Freshman/Sophomore level here. When you get to the more advanced stuff, people go off in different directions and subfields. It's harder to reliably test.

At the same time, I needed something that would clearly be neglected in those "Learn C++ in 30 days" community-college type classes.


Out here in the Real World, I've seen things you would not believe!

  • One fellow coder took down the production server with an inappropriate cartesian join. Even after I explained O(N^2) vs O(NlogN), and how to use GROUP-BY & HAVING clauses to achieve O(NlogN), he still couldn't wrap his mind around it. He insisted it was impossible to solve right up until I sent him the code. (All 5 lines of it!)
  • Another fellow thought int * foo() { int a; return & a } was an appropriate mechanism for memory allocation. Sadly, he was not the worst member of that particular team. Another programmer, who couldn't manage to grasp a for loop, took top (bottom) honors there.
  • At yet another job I was criticized for breaking my code into small methods/functions. Apparently, when my boss wrote code, she just used one big function. Self taught, of course. Same lady eventually arranged for my termination so she could take over and do the coding "correctly". God help them!
  • Yet another coder, sadly one of the better members on this particular team, wrote a threading library I needed to use. I asked him where the mutexes where. He said "I tried it without mutexes and it works, so we're not using them". I got hauled out on the carpet for rewriting his code. But that seemed the best course of action to take.

Seriously, I can't make this stuff up.


While I'm amending... Two other suggestions:

(1) Give them some simple code and ask them to explain what happens to the stack as the routines execute. Code should involve malloc or new, data on stack (including pointers), manipulation of said data, a function or method call, etc. Keep it short.

(2) Give them a simple problem, such as write code for some basic complex number math (add, subtract, multiple, square root, etc). Point out to them up front how to do the math. (Especially for square root.) Complex number math knowledge is not what you're testing.

See if they come up with an Object-Oriented (OO) solution or a functional decomposition approach.

Some folks do write functional code in C++. That will get ugly & painful real fast!

Mr.Ree
You seem to be quite a fan of the big-Oh :)
eljenso
@eljenso: Thats what Mr.Ree's mom said last night.
abelenky
lol, now that's an answer :) The bit about "I tried it without the mutexes" spontaneously made me hit the upvote button. On a more serious note, it does show that you're interested in more than just (rambling on about) big-Oh which is, although important, a bit boring.
eljenso
Mr.Ree
On a more horrifying note: Every one of these people talked a good game during the interview!
Mr.Ree
+2  A: 

Obligatory

Jason Baker
+1  A: 

You've had some very good answers so far, but I'd like to make a few additions.

Besides pure coding skills and puzzle solving I usually ask in which style they write their code. I am not interested here in a lot of buzzwords, but what I want to know is if they know how to write clean and readable code. Obviously if you have some code they have written I want to make sure that they have good methods names that provides context to what takes place inside the method. That anything inside that method is of the apropriate abstraction level and not to low detail. If we dont have any code I usually provide a class which is not so clean and nice and ask them how they would refactor it into readable code. If they manage to produce a class that starts off with a high level abstraction and then moves into lower and lower level I am happy. If they think they can add comments to a code that should be split into several to provide apropriate context I wont be impressed.

(I promise I wont rant any more about comments in bad code any more this week)

willcodejavaforfood
A: 

Well, I'm not a hiring manager anymore (now I'm just a simple coder and thanks for that), but when I did do interviews, I usually asked the candidates to tell me about their all-time best project and tried to get them to explain to me what was so exiting about this.

When people get to pick their favorite topic they are usually eager to talk, and you can expect them to be able to tell a great deal, which is a good way to get the interview started imo. It is also a good opportunity to ask about the candidate's specific role in the project. In my experience this tells a lot about if the candidate was a driving force on the project or just tagging along as well as their ability to understand some technology (and be able to explain it).

I would also ask candidates to talk about a specific technical problem from their past. The problem should be non-trivial and hopefully have caused some headaches. For this I would ask how they approached the problem. Again, looking for specific actions (not how you could potentially do it, but what they actually did). It is not really important if they solved the problem or not. I looking for their ability to describe technical problems and trying to get an idea of the problem solving skills.

Another technique I've used is a variation of Joel's impossible question. Instead of asking a "random" question (like how many mail boxes in Seattle), I would usually pick something from their favorite project / past experience and remove an element from the setup and ask them to talk about how they could work around this obstacle.

Brian Rasmussen
A: 

When interviewing candidates, I give them some FizzBuzz style questions they should be able to answer. I also give them some very difficult questions that almost no one gets right.

The point to these questions isn't whether or not they can solve the problem, its whether or not they can approach the problem. Can they break the problem down into smaller pieces? Can they formulate and ask insightful questions about the problem? Can they come up with techniques that might shed light on the problem. Solving it is the end goal, but how you get there says a lot.

The worst candidates just freeze up, and can't work on the problem, can't ask questions, and just stare blankly, hoping that something comes to them. The best candidates will discuss with me what they are thinking, what approaches they are rejecting and attempting, and discuss ideas and ask me questions as they work on the problem.

abelenky
+10  A: 

The tell-tale sign that a developer is not competent is when you ask him a question that he doesn't know the answer to and he doesn't say "I don't know."

Robert Rossney