Maybe I'm just incredibly naive, but are fizzbuzz tests really that necessary? I have a hard time believing anybody could get an interview, let alone graduate with a BS in compsci, without being able to do something THAT simple ....
Yes, they are necessary. I've seen "senior" people bomb on it. There's a segment of "developers" that are good at selling themselves as programmers, manipulating the interviewer so you talk yourself into thinking they are awesome. You've probably met some of these types at conferences, and think they'd be a worthwhile hire. But stick a simple programming problem in front of them, and they can't back it up. if you're not that great at spotting these people, they can slip by the average interviewer without something concrete like a FizzBuzz to show they can back up their talk. And once they make it into your organization, if you don't catch them early, they can be extremely destructive.
Yes, yes they are. I don't even see all of the resumes submitted to my company since they are filtered through the recruiters and our HR guy but the ones I do see still need a fizzbuzz test more often than not.
Granted, it is not a thing you should give everyone. I can usually tell when I look at a resume that such a thing is likely to be pretty pointless (It points me to a github account I can look at instead? Why bother? The resume is clearly written by someone who knows what they're talking about and isn't stuffing everything they've ever done onto a page in a game of buzzword bingo? Probably safe.) so I don't give fizzbuzz tests to everyone but sometimes you have to be sure.
While this is a little disappointing in that it speaks to the quality (or lack thereof) of developers coming out of college, or elsewhere, it is also really encouraging too! the fizzbuzz problem is actually incredibly simple and I was able to write code out by hand that worked in my python interpreter.
Hopefully I'll have some good github stuff to point potential employers to soon (i'm working on some things now). But at least I know that I should be able to pass some of the incompetency gauges fairly easily!
also, i've never heard of buzzword bingo before, but it sounds interesting! maybe i'll make a program for buzzword bingo. You can use it in your interviews! :P
But actually, fizzbuzz is just the bottom level. You also want to do basic coding exercises for whatever specific area you are hiring for, such as:
- Set up an extremely basic web app that lets the user enter a name and echoes it back to them.
- Make a sprite move across the screen.
- Display a 3d cube with different colors on each side and make it rotate.
- Make it play some music.
- Aggregate the data in this simple database.
- Here's some naive producer-consumer code. Make it thread-safe.
- Debug this code that has memory issues.
- Critique this (flawed) design.
- Update the CSS to make this page look nicer.
Basically, you never want to get into a situation where you've hired someone who has managed to talk his way through life. It's far less headache to just use a few sanity checks on every potential hire.
I wonder if there's a harder equivalent to FizzBuzz — one that doesn't take any longer to explain or do, but requires a much higher level of skill to pass. One we used at http://airwave.com/ was "Write a Perl subroutine to determine whether a string is a valid dotted-quad IP address," which is something you can do in various reasonable ways in one to five lines of code.
I think we did get someone solving it that way once, and modulo Unicode, it's arguably a reasonable solution. But there are other one-line solutions that are more transparent.
The Stanford CS Ph.D. candidate whose solution included a Perl function for converting decimal numbers of up to three digits to binary was rejected.
I failed to note in my earlier comment that yes, it is so much harder. Fizzbuzz requires that you write a loop, print some strings, and either maintain a couple of counters or use the modulo operator. Your solution requires:
- writing a subroutine
- understanding Perl parameter passing
- understanding Perl regexps, including =~, anchoring, alternatives, metacharacter escaping, character classes, and repeat counts;
- the ternary operator.
And then you could probe things like:
- Do they know how to fix the bug in your version where it incorrectly accepts an IP address with a newline appended to it?
- Do they know it would still work without the return and the ?1:0?
- Can they figure out that they could simplify and clarify the code substantially with qr?
- Do they understand why someone might prefer a non-regexp-based approach? :)
There are plenty, and yours is a good example of one. In fact I think actual FizzBuzz is not used much in the wild any more as it's too well known and thus drillable.
You have clearly never had to interview people. Fizzbuzz is super basic and that's the point. It quickly separates the person who was around when programming happened and someone that actually did the programming.
I interviewed a 'senior' developer who had been a consultant for several years. When we asked how he implemented past projects, his answers were really vague. We got suspicious and dropped down to a simple problem like, "write a loop to print the numbers from one to ten."
The guy was writing some really weird stuff. When asked to explain, he confidently told us that in C++, every time you reference the iterator variable inside the loop, it gets increased. His solution was something like:
for (int i = 1; i <= 10; i++)
{
printf("%d\n", i); // <== i gets incremented!
i--; // need to compensate for the extra increment!
}
(except I'm pretty sure he didn't get printf right)
So, yeah, I see FizzBuzz as a wonderful way to weed out the incompetent right away, allowing you to focus on deciding whether you need capable or exceptional.
Incidentally, one of the guys on my senior project team in college didn't understand how variable assignment worked. He would write:
int flagsVar = COMMON_BASE_FLAGS;
flagsVar = ADDITIONAL_FLAG_I_WANT;
CallAPI(flagsVar); // Why doesn't it work?!