OOP and Interviews

Just got back from vacation and read a blog post by Eric with some concerns about developer knowledge on OOP. It reminded me of a similar conversation I've been having on and off with friends for years, so it seemed like an appropriate topic to write a quick post. After that, I'll also toss in a quick synopsis about interviews.

Eric claims that far too many devs don't really know OOP. To some degree he's absolutely right. I see the same thing when I conduct interviews. There's an interesting dynamic when it comes to OOP, and it depends on how you approach the topic. If you ask a lot of people about OOP, you'll most likely get one of two answers - either they feel it's great (whether they really know much about it or not, they feel the industry [read: you the interviewer] thinks it's important, ergo, it's a Good Thing (tm)) or they feel it's a complete waste of time and far too complicated. Since apparently a good chunk of developers can't articulate the pillars of OOP, some people have even written entire papers asking the question "Was OOP a Failure?"

I'm afraid the RIP engraving on the OOP tombstone is entirely premature, but here's what I've discovered: Just about everyone LOVES consuming OO code, but a good chunk of developers don't like writing OO code (or simply don't know how). OO libraries are easy to consume. It's simple to understand MyMainForm.Text, AcceptButton.Enabled, and MyData.Fields["RowID"].Value. Additionally, the data and behaviors are easily discoverable. That is to say, you start with some object, and in most IDEs with most OO-languages, you click "." and you get all the object's fields, properties, and methods. There's a good reason for all this goodness - one of the primary goals of OOP is code organization. This is much easier than having tons of variables strewn in dozens of files, with names like gdwmaxdaysinqueue, CUST1_TEMP_DBID, or even X$. While some devs might even rebel against writing OO code themselves, you'd be hard pressed to find (for example) a .NET dev who would give up the .NET framework classes for winforms in favor of something flat like the Win32 User API.

The problem is that getting all the organization isn't free. Just like living in a house is infinitely easier than building a house, consuming OO code is much simpler than actually writing it. At the same time, most newer languages are making this much easier. Having said that, I also strongly believe that a lot of the "complexity" is in some respects purely perceptual. I often say that when faced with a problem, most programmers simply bang away and try samples until they get something to work. After that point, whatever happened to work becomes "the way to do it". Problem solved, why go back and reinvent the wheel? However, writing good OO code requires a fair bit of upfront thinking rather than the "discover a working solution as I go" approach. A lot of developers, particularly self-taught devs, get passed this experience and don't like to go back and discover a different way to write code to solve the problems they're already solving now, albeit somewhat disorganized. And before I get beat up for saying that, it isn't to say that only OOP code is well organized and everything else is not. In reality, I find that the most resistance to OOP comes from people who have programmed for years without it. Some of the newer bunch simply don't know much about it, but aren't really against it.

To prove the case to myself, I taught several semesters of OOP at USF. The students (most of whom were taking the class as part of a business or accounting curriculum rather than CS, some with no prior programming experience) had absolutely no difficulty at all getting the concepts with a minimal amount of proper guidance. At the end of the 7 week course, they simply couldn't fathom writing code any other way. But unlike the trial-and-error method of most self-learning, not everyone has the patience to get the guidance necessary to get into OOP, even if it comes from a book and not a teacher.

And without further ado or even a good segue, I'll dive into the interview stuff.

Interviews really serve one purpose - to see if the person in front of you can do the job. This has as much to do with technical knowledge as it does with a "fit" in the team. What an interview shouldn't be is a game of trivial pursuit. If your candidate will be writing a lot of OO code, then of course it makes sense for them to have a very good understand of OOP and be able to intelligently articulate the pillars of OOP. In today's environments, OOP is often an extremely relevant topic, which candidates really should be (at the very least) brushing up on.

However, should a candidate be able to explain how to correctly write a custom WCF transport off the top of his or her head? In 99.5% of the cases, I'd wager the day-to-day tasks the dev will be performing has nothing to do with that. Some interviewers use the interview as a vehicle for conveying Alpha developer dominance (i.e. showing off who is more intelligent or technically savvy and making sure the candidate knows he is at the bottom of the totem pole should he get the job). The questions are about things the candidate won't be experiencing on the job and any answer wouldn't necessarily qualify or disqualify the candidate from the real duties they would have to perform. That's just bad form, and if I caught anyone on my team doing that, they would really be in for it.

The same goes for that incredibly stupid bucket of trivia puzzle questions concerning light bulbs, coins, minimum distances, and trains. A lot of people claim they use these to gauge "problem solving skills". I claim BS. In fact, most of the people asking these ridiculous questions didn't know the answers themselves until they were told or found them in a trivia puzzle interview questions book. If you are asking these questions, chances are that you (a) don't know relevant questions to ask and are using these as fillers, or (b) are just trying to show off. Knock it off; you're not impressing anyone (and if you're impressing yourself, seek professional help as soon as possible). A lot of candidates are nervous enough as it is. Ask questions relevant to what they will actually be doing (and no, it's not trying to figure out how to find defective pills in the minimum number of weighings). If the open position was about Mensa Puzzle Solving Punditry, it would be called "Mensa Puzzle Solving Pundit" instead of "Sr. .NET Developer".

Then what should you be asking? Well, I'm not going to be presumptuous enough to tell you what is the best way for you to interview. In the end, that's really for you to decide. My approach is simply this: talk to the candidate. Anyone who can do the job can hold a very engaging conversation about the relevant topics. I avoid the trivial pursuit approach at all costs. Typically what I do is start vague and steer the conversation into more and more specifics as it goes. For example, find a previous project on the resume that claims to have incorporated some of the relevant techniques or technologies. I start by simply asking the candidate to talk about that project.

I look for a few tell-tale warning signs. For example, I don't want to hear "we did X" and "we implemented Y". I'm not hiring your entire team. I'm trying to hire you. I want to hear what you did specifically, not what your team did. I want to know what you know, not what your team knows. Sometimes people who (involuntarily) get off a project hide behind the accomplishments of others and don't understand the relevant topics at all. If I hear too many "we"s, I immediately start asking specifically about what the candidate himself did and understands about the project.

Also, if (as a candidate or interviewer) you don't understand a topic, don't talk about it. Nothing bothers me more than BS during an interview. I'm not looking for perfect knowledge. I'm looking to see if someone is qualified enough to do the job. Don't make things up. Don't throw around acronyms or buzz words you don't understand. If you get caught (and particularly pray I'm not the one who catches you ;-)) you will look 10 times dumber than you probably are. It's OK to say you don't know, or don't know off the top of your head. I will then try to assess how you would solve such a problem involving that topic, and that's more important to me than knowing every answer from memory. If you can figure out something after reading a help doc for 15 minutes, that says a lot about your ability to perform and produce given something you didn't already know from the start. If you are an interviewer and you do this, and the candidate catches you, you will also look 10 times dumber than you probably are. That's not going to help you fill the position.

So as the candidate begins to discuss the project (and particularly with me homing in on certain technologies or techniques), I begin to ask more and more specific, and deeper questions. A proficient person will be able to keep up and go along with the conversation. When the candidate can no longer keep up, I've discovered the limit of their knowledge on the given topic. If they can keep up until I no longer have questions, then welcome aboard! I know I can do the job, so if you know as much or more than I do, I can't ask for more. This more "natural" style of communication (as opposed to simple question and answer sessions) also relaxes the candidates a bit more. That helps me filter out any noise caused by nervousness.

Do you have any good interview techniques or pet peeves? Let's hear about it! :-)

posted @ Wednesday, January 02, 2008 4:30 PM

Print

Comments on this entry:

# re: OOP and Interviews

Left by Josh Bush at 1/2/2008 8:17 PM
Gravatar

Everyone has their own style of interviewing.  I've had to interview candidates on a few different hiring occasions and we've recently decided to go with the written test route as part of our process.

Our test isn't too specific and just covers the basics(looping, arrays, functions, and a basic sql select).  It's not "fizz buzz" easy, but it's easy enough that a good candidate will be close on most of it.  

We explain to the candidate the reasoning for the test and let them know that it's fine if they don't know everything.  Also, we allow the candidate to use any language or pseudo-code to answer.  In reality we're just looking for a basic understanding of the concepts.

They take the test first thing and I'll take a quick look at it before we go talk to them.  We never mention the test or ask them questions about the test during the interview.  The actual interview is more like you described with just having a nice conversation about various things.

The test is beneficial to us because I can quickly see what I need to ask in the interview to gauge their knowledge.  I think the test allows more time for the personality discovery in the interview process.  In the end, it really doesn't matter how good of a developer you are if you don't mesh well with the team. All of it has to be considered.

# re: OOP and Interviews

Left by Eden Ridgway at 1/2/2008 11:50 PM
Gravatar

Your approach to interviewing is almost identical to mine. Here are some additional interviewing tips:

* Do not read your questions off a piece of paper! You must engage the interviewee is this is a sure fire way to make the interview impersonal and dull. Using the more natural drill down technique you describe will provide far more useful information that scripted dialogue.

* Don't be too formal during your interview. It is not difficult to do this while remaining professional. Simple things like smiling or cracking an appropriate joke will put the interviewee at ease and reduce the effects of interview stress and nervousness.

* Encourage the interviewee to interview you about the company. Don't just give the interviewee the standard sales speech. Be honest and open (as far as possible) in your responses because maybe during the line of questioning he (or you) realise that he is not a good fit for your company despite his technical ability.

* Bad hires are terrible for team morale and cause stress for all involved. If a candidate is a 50/50 hire rather say no than take a chance.

* Don't forget that team fit is an important hiring criteria. For example, if you bring a much older candidate into a team of young hot shots, the candidate better be a real authority figure or easy to get along with.

# re: OOP and Interviews

Left by The_witt at 1/3/2008 7:13 AM
Gravatar

Great read!

I have been thinking this for years! I agree that while tech knowledge is great, you still need to interact with the person in a cohesive manner to get the job done correctly. We can all learn as we go on the "hard stuff". A good base skillset can do wonders. But, getting the interviewee to loosen up and really show what he/she can do is what really metters.

Thanks for the insite.

T

# re: OOP and Interviews

Left by dbalzer at 1/3/2008 8:02 AM
Gravatar

Good insights Rob!  We have a couple of teams in our company and the interview process differs based on the manager doing the hiring.  Each of the managers participates in this process though.  I use the conversational method you mention and have found that the candidates we've hired this way outperform the ones that pass the standard question list that one of the other managers has.  Problem I see with the question list is that in most cases the questions are taken from the bold headers of the most popular dev books and don't really probe the depth of the candidates knowledge.  It shows whether or not they took enough time to brush up for the interview but not necessarily that they understand the subject (Right Answer?  Great let's move on!).

Also, you mention the need for "Team Fit,"  I have found this to be more important than the depth of knowledge the candidate has.  Yes the candidate must be qualified to do the job, but I'll sooner take someone with a little less knowledge and an eagerness to learn that fits in with my team than someone with an unbelievable skillset that will run roughshod all over everyone.  This will just lead to the need to fill more positions.  I speak from experience on this one.

# re: OOP and Interviews

Left by John Stockton at 1/4/2008 1:05 PM
Gravatar

Great Post.

I agree wholeheartdly with your approach to interviewing, probably since it's the approach I use myself.  While I do have a list of questions going into the interview it is not a "answer them all correctly or you're out" kind of a list but exactly what you describe, a way to find both the breadth and depth of a person's knowledge in relevant areas.  The questions are also tiered.  By that I mean that if the person cannot correctly (or closely) answer one question, then I will probably skip a few others, why make the person more nervous my missing a lot of questions when you already know they don't know the answer.

Now even though I do use a question list, I also ask more open-ended questions and drive deeper for information.  One of my favorite sets of questions goes something like "What code have you written that you are most proud of" contrasted with "What is your biggest failure / mistake in programming".  Seeing the response given to these two questions really lets you see if the candidate gets passionate about their work and if they can admit their failuers (sp).

At least, this approach has worked for me :)

# re: OOP and Interviews

Left by Edward Buatois at 6/19/2008 9:48 AM
Gravatar
Great posts...! I'm interviewing now and am writing down all the great advice...! Just kidding.

To me there's really two questions here: What constitutes "good knowledge of OO," and "what's a good way to tease out of someone that they can really do the job?

Regarding "good knowledge of OO," well, it depends on what you need. Inventing a "levels of OO skill list" off the top of my head right this minute, I'd say there's four kinds of OO developers in order of skill maturity. 1) Developers who "get" using OO objects. 2) Developers who can write object-oriented classes given a design. 3) Developers ones who can create a reasonably good object graph to solve a particular business need. 4) Developers who can truly think beyond the immediate business need into the daunting gray area of "how can I design these to be usable now, and flexible/extensible enough later for a completely unanticipated future need?"

Of those four tiers, I put myself in the third tier. I can write a solid object graph to meet a specific business need, and if I can think of a way that this or that class might be reusable/extensible, I'll do what I can to make it reusable/extensible. Sometimes though true reusability/extensibility are concepts that in practice permeate the design of the entire object graph, not just one or two classes. The Bridge pattern is probably a good example of that. Anyway, I think studying formal design patterns really helps for taking it to that next level.

As for interviewing -- since I'm interviewing, I'll share a good experience I had and a bad one.

The bad experience -- the interviewers broke the interview into meeting with three sets of people for half an hour each. And half the questions were of the nature, "What did your last review say you needed to work on?", "Name someone you had a personality conflict with in the last year and how did you solve it?", "Name a problem you never found a solution for." I have to be frank, the barrage of negative questions really put me off. Felt a little bit like "Tell me, when did you stop beating your wife?" There's a place for negative questions in an interview, but I think they were over-emphasized at that company. One other thing -- the three half-hour interviews. Let's put it this way: Two out of the three interview teams said, "Man, it always feels like we're only getting started when it's time to rotate." That's the way I felt too. Half an hour is not enough time for a single conversation to provide any team with the kind of breadth and depth necessary to really get a sense of who the interviewee is and what he can really do. Frankly, they should make those interviews at least 45 minutes -- or be a little more strategic in the kinds of questions they ask, anyway, to maximize the time.

The good experience -- It was just a conversation, as one person above put it. It was a lot of fun, actually. There were three people interviewing me, and we got into the plusses and minuses of this or that technology or technique. I think it's there that you really start to get a sense of what the person knows, how they approach their work and the problems they face, how they deal with the things that they DON'T know so well, and, as important as anything else, how they might actually be to work with. Are they humble? Arrogant? Creative? Irritable? Etc.

I've interviewed people, but I think in the future, if I interview people again, I'll try that approach -- just a conversation, see where it leads.

Your comment:



 (will not be displayed)


 
 
 
Please add 7 and 2 and type the answer here:
 

Live Comment Preview: