The Non-Programming Programmer

In my opinion it’s less about being able to program and more about being able to solve problems. All you have to do is spend an hour perusing Experts-Exchange to find out just how many people working as programmers can’t research and/or solve the simplest of problems. People who will get an answer written in C# and then ask that the respondent write it in VB.NET for them. I recently was asked four questions in a phone pre-screen:

  1. Name five of the events during a page life-cycle.

  2. What happens between Init and Load.

  3. Difference between HttpModule and HttpHandler.

  4. What do these terms mean: abstract, protected, internal, static, virtual?

The person doing the screening said I was the first candidate to answer all of them without hesitation. One candidate told her that he usually is sitting in front of Google when doing a phone screen.

I think that’s part of the problem. The internet has allowed us to share information in a way that wasn’t possible when I entered the field 25 years ago. We had to figure it out ourselves (and walk uphill to school both ways in the snow). Now a person figures that if they don’t know something they can always ask Google, and cut-and-paste the answer into their application. The problem is they never learn what all that cut-and-pasted code is actually doing.

i think it boils down to 2 things:

  1. college is wayyyy too easy. it is very watered down. it is too easy to cheat in programming classes

  2. programming is at least as much of an art as it is technical. how do you teach someone to get a feel for programming? maybe it’s possible to offer guidance, but the actual ability to program can only come from the student. i think if the person doesn’t have a knack for it, the only other way is practice practice practice, and it’s clear that students aren’t getting practice because of #1

etherpad is a great way to have the candidate write code when doing a phone interview.

Craig,
I avoid the Googling problem on phone interviews by giving a test that is unique and relevant to the company. We’re small enough that I can use it for a large number of interviews.

Using this technique has eliminated many interviewees that tried to Google their way through the interview. I had one candidate with “Excellent C/C++” abilities tell me at the end of the interview “I didn’t expect to have to write any code. I just expected knowledge questions”.

Do things differently from every one else and you have a solid way to screen candidates. By teh time we get someone in for an onsite interview we let them Google all they want to solve the problem we give them.

Asking about FizzBuzz in a job interview is all fine and dandy, but when you get hired and get asked to write an application that allows the Customer Service department to enter contract information into a database with customer data from one of the many databases in the corporation, and you will have to design the database, write stored procedures, and created a Forms or web application front end in .NET, then FizzBuzz and simultated linked lists aren’t going to be of much help. I think the problem is with the interviewers and their questions more than the applicants “book knowledge”.

Granted, some lines of software development, such as embedded systems and driver development. As such, perhaps the type of job interview should be clarified in these articles. I wouldn’t care a damn if a developer couldn’t write code for a linked list if (s)he is going to be doing .NET business software.

I’m pretty happy that back in the day there was nothing like this, because I was one of those programmers who couldn’t program. I had to create a multimedia-show with Macromedia Director and about all I knew about Director was how to have a sprite move around the screen (no actual coding here).

Luckily my employer was a big organization and practically paid me to learn how to program Lingo. They even got me all the books I needed, for free.

If I hadn’t had that job I probably would never have become a real programmer.

(Still can’t edit comments, even with this new log-in scheme???)

The above sentence should have read:

Granted, some lines of software development, such as embedded systems and driver development would need such skills.

Yes it is a huge problem, but I am not at all surprised at the overwhelming amount of incompetence in our industry.

  • For the most part, it’s the money. It is an industry that pays well. An industry that had two major peaks in the last decade alone. Peaks where almost anyone could get hired. In offshore locations, it is a way out of poverty. This results in millions of paycheck programmers, who lack passion.

  • Most programmers work for companies and do enterprise application development. Increasingly, these programmers are considered commodities, a service that can be bought at an outsourcer. We all know that outsourcing is about cost reduction, not quality. For an outsourcer, billed hours count, not passion. It is in their best interest to have as many people as possible as sell them as competent as possible: seniors bring more revenue than juniors, so there is a motivation to cheat.

  • Many employers are overasking. They demand you to be young and flexible, yet have many years of experience in a ton of technologies. The result of overasking is candidates overselling.

  • Although a tech interview is common sense, quite often people are hired by non-programmers, who lack the skill to differentiate quality.

In the end, it is a lack of appreciation and knowledge of programmers that results in situation as it is now. That, and the cost/profit oriented world that we live in today. I suspect this is not unique to IT, you will find that a vast majority of workers in any industry would quit working today if they could. It’s the mortgage that keeps many going, and work is tolerated suffering, not a passion. Guys like Jeff are in a lucky position to enjoy what they do, but not everyone has those possibilities. Don’t look down on the ones who are not passionate. They are just people trying to make a living. They are not frauds or lazy by definition.

Finally, I too am against academic and math questions for application development positions. I have developed at huge multinationals for 10 years very successfully, but don’t ask me how a Bubble sort works. I will understand how it works, but I don’t recall it since I don’t NEED to know how it works. Ask things that apply to the actual job.

I have found the same frustration when dealing with hiring sysadmins/netadmins/DBAs – the seminal difference with those is that while your “senior programmer”'s ineptitude should be shaken out in QA, your “senior sysadmins” incompetence might get found out the first time he/she’s on an overnight call by himself and brings down your production system(s).

I, too, have changed the way I do interviews: I always do a phone screen second. First, I make sure that people pass what I call my “0th order clown filter” – that is, I make sure that those I solicit can actually read and follow simple directions. (Obviously, this doesn’t apply when dealing with recruiters, the number of whom with a clue is a set of measure 0.)

I have also developed a pretty standard list of graded questions that allow me to quickly determine if letting someone loose on a production system/database/network is safe or highly ill-advised. (These are also questions that aren’t easily discoverable via Google/Bing/Wolfram Alpha.) The downside to a standard set of questions is that if you deal with recruiters, the questions very quickly get passed back up and subsequent candidates from the same recruiter get prepared.

Other commenters’ notes about “problem solving vs. programming” are well-taken, but if, coming in, your candidate can’t show that he’s got a reasonable-sized toolbox of problem solving already, you’re going to spend a lot of time teaching him or her, rather than getting him or her to do the work – which can be costly in the case of a “senior whatever”.

I hear this frequently, but it hasn’t been my experience that it’s as bad as you’re portraying. Perhaps the recruiters I work with are better than most, but the people I interview tend to be able to do simple coding tasks. It’s where more critical thought and problem solving is involved where they tend to fall flat, and where the failure of candidates starts to approach the degree you speak about.

My impression, however, is that – as with many things with programmers – ego is inflating the degree to which this is a problem. Not that it’s NOT a problem, but to call it an “epidemic” is bordering on absurd. “Everyone I talk to is SO stupid that you wouldn’t believe it!”

So boss… am I hired?

for(int i = 1; i < 100; i++)
{
	bool printNumber = true;
	if (! i % 3 )
	{
		printNumber = false;
		std::cout << "Fizz";
	}
	if (! i % 5 )
	{
		printNumber = false;
		std::cout << "Buzz";
	}
	if (printNumber)
		std::cout << i;
	std::cout << std::endl;
}

Or a method in a C# Console App:

private static void FizzBuzzTest()
{
for (int i = 1; i < 100; i++)
{
if ((i % 3 == 0) && (i % 5 == 0)) Console.WriteLine(“FizzBuzz”);
else if (i % 3 == 0) Console.WriteLine(“Fizz”);
else if (i % 5 == 0) Console.WriteLine(“Buzz”);
else Console.WriteLine(i.ToString());
}
}

I went with 4 conditions instead of 3 for easier for debugging.

Just occurred to me that Billy and I made the same mistake the for statement should be:
for (int i = 1; i <= 100; i++)

we were missing the 100th display.

I think Techiferous hit the nail on the head. The more I learn the more I realize I still have a lot to learn. Wisdom breeds humility. I’m twice the programmer I was when I started my career and haven’t even begun to approach the programmer I ‘thought’ I was back then.

Sadly, there are too many that have no desire for self-improvement and will sail through life thinking they achieved greatness when they’re not even mediocre.

Fog Creek started out doing phone screens and then in person interviews. The phone screens cut down on a lot of false positives, but we’d still have people come in, get picked up by the limo, stay two nights at the Ritz in Manhattan, and then come in for an interview and get 3 straight NO HIRES in a row. We added a screen sharing code interview in the mix, and saved so much time and money. Highly recommended. (We use Copilot and Etherpad to do the remote code interview).

Josh, I always do that. I always mess up some mundane detail.

I would still try and exercise a little judgment in the code example requirement. After all, python is one of the languages I like and

mystring[-1::-1]

to reverse a string fulfills the ‘don’t call string reverse requirement’ but doesn’t tell you anything other than I know and like array slicing in python.

Also, I initially tried signing in with facebook connect and it didn’t like it very much. I allowed it to do what it wanted to do and I just got redirected to an openid page that was blank, then back here and it asked me to sign in again.

Not sure who I would talk to about that, but figured I would mention it.

Maybe you should make fixing the facebook connect signin your programming test for stack overflow candidates?

Well, one thing to remember is the difference between Computer Science and Software Development. Some of you will say they are the same, but I will argue till I die that there is a HUGE difference.

I started out as a CS major, but after many classes with little programming and a LOT of theory I changed majors. I did not want to be a Computer Scientist… I wanted to be a computer programmer. My advisor did not recognize this, so I quit altogether and changed majors out of the college of Science and Technology.

I eventually went back and finished CS as a minor, but still wrote very few applications. Looking back, I know that the theory was needed and I use some of it, but I was learning about Big O and algorithm design, while my friends were at a JuCo learning Visual C and C++.

The point, if there is one, is that it’s possible to go through college and get a Computer Science degree and know a lot of terms and theory, but not have super strong programming skills. It’s the difference in paper skills and real skills. But the paper gets you an interview.

FizzBuzz won’t tell you if a person can actually program, but it can tell you how a person thinks as well as how much experience they really have - after all, if kids can play the game correctly then it’s not a hard problem. But if for example if someone started to writing this (pseudo code):

function Fizz (number integer) returns boolean
if (number mod 3 == 0) return true else false
end function

function Buzz(number integer) returns boolean
if (number mod 5 == 0) return true else false
end function

function FizzBuzz(number integer) returns boolean
return Fizz(number) AND Buzz(number)
end function

I would instantly know that they are a programmer, regardless of whether they even get time to finish the main program. Because of the approach they took.

Similarly, if I asked someone to do this in SQL and they asked me “well can I use a tally table” then right away I’d know that they would go on to write a set based solution as opposed to a loop or a cursor, meaning they were experienced, even if they never actually got the right solution in the interview.

I’m stunned to see that candidates are not able to write a program to find if a given number is prime or not. Yesterday, I interviewed 10 people of which 8 were not able to write the program. It reminded me of your earlier post and today you have re-iterated the same.