If there is one subject that causes me to go on a spectacular tirade, it would be interviewing software engineers. Having run a software development company, interviewed myself at all levels as a software engineer, and currently in the process of interviewing peers for the company I currently work for, I would say I have a bit of experience in this area. And in my observation, there seems to be a common theme that continually rears its ugly head.
Most programmers do not know how to program.
Blasphemy, you say. The issue is that I am not even talking about slight incompetence. I am talking about basic tasks that first year computer science students should be able to accomplish within the first few weeks. You may think I am being harsh, but that is further from the truth. I am not the first one to delve into this topic and Jeff Atwood has a good recollection of his own experiences with the subject.
I am not talking about candidates that are socially awkward, have a lack of experience with a specific language, cannot speak of their direct contributions to projects, or even those that lie on their resume. I am talking about senior software engineers with years of experience in software engineering who claim to know multiple languages and hold certifications. Yet, they cannot write a single line of code.
How do I know this? Let me walk you through the process.
When we interview at my current company, we bring the candidate in front of a few of our engineers. I am a fan of interviewing with the whole team because I think personality fit is still a crucial part of the puzzle. We ask them a few questions about themselves, questions about their resume, and general chit-chat before we ask them a standard set of questions. Depending on the candidate, these questions might change, but the same concept is the same.
The first part is a simple whiteboard question. Yes, we ask them to write code. I know some people disagree with this approach, but I think its value depends on how you approach it. I like to start out by asking a simple problem a-la fizzbuzz. Except we go even easier.
“Write a function in your language of choice, that will sum the numbers from 1 to n inclusive, given a number n.”
That is it. It almost sounds absurd in its simplicity. Let me be clear, there are no gotchas here. We aren’t looking for the formula for the Triangle numbers. We aren’t concerned about integer overflows for large values of n. We don’t even care if you get the syntax right. Why don’t we care about these things? Most of the candidates we interview cannot do it, period.
We usually interview candidates who are familiar with C, but I have interviewed Sun (now Oracle) certified Java developers. No matter what language they used. No matter how many hints we gave them (“How would make something happen over and over again?”) they could not do it. I understand that you are not developing in your usual environment. I understand that you use Google and Stack Overflow liberally. I understand that you are used to an IDE with code completion. However, there is no excuse for any software engineer to not know how to write a single for-loop. These individuals were gainfully employed as software engineers. Some of them worked for large defense contractors. Some of them had Doctorates.
There may be other methods of weeding out candidates that work just as well. Maybe those methods are easier on the candidate. We can certainly give them a laptop with an IDE and a couple of hours in a room by themselves, but it doesn’t seem to me that we are currently letting people slip through the cracks when they can’t do the simplest of tasks. Don’t get me wrong, there are other questions that we ask to give them a chance, one of which works well for figuring out how much the candidate knows.
“If you open your browser and type in our web site address and hit the enter key, what happens?”
There are tons of right answers to this question. If you know anything about anything, you have a chance to impress us. You could go down any of thousands of tangents and at least sound competent. You could talk about keyboard scancodes, operating systems, context switching, cache coherency, TCP/IP, HTTP, protocol stacks, routing tables, etc. Just know something.
This isn’t an issue of finding qualified candidates. This is an issue that candidates such as these are working on government projects, e-commerce, and all kinds of software. I don’t mean to insult them; many people can get stuck in mindless job doing simple tasks and forget the fundamentals. But if you write software on any level, you had better know how to write at least some code. Practice sample interview questions. Read a few text books. Experiment a little.
But above all, know how to write a for-loop. For your own well-being. And for my sanity.