Thursday, July 7, 2016

I have seen a lot of articles on the interwebs from frustrated job-seekers who say over and over that hiring is broken.

Where I work, I am interviewing candidates who have recently graduated from university, for a Junior Software Developer position with a focus in Web/JavaScript/HTML5. Consequently, I have been thinking a lot about how we in the software industry interview and hire people. Because I have been interviewing people and, I think, I have moved past the need to haze candidates.

I was not subjected to hazing rituals when they hired me for my current gig. When I was hired, I did not write any written technical exam, the interview was verbal, but the company had one, which it would use when it felt there was some question of a candidate's abilities. I did bring in some code running on a laptop that I could show that did some interesting stuff, and which was as close to "proving" I can code, as I could think of. I think ideally, a personal project you have spent two or three weeks on, should be enough to demonstrate. But there have to be alternatives, and I will get into those below. If we're going to get rid of subjectivity, we need to replace it with something objective.

Hiring, like most management decisions, is in the end always going to be fairly subjective, and it's an area of subjective business decision making that I think is very widely done poorly, and I consider myself very poor at it but I believe I'm getting better at it. I hope to improve by being both broader in my search for evidence, and more focused on objective hard-to-fake data.

The short version of this blog post works out to this:

I am in favor of two to four hour take-home coding exercises, and I am against two-week trial projects.

Peppering Candidates with Random Technical Questions Is Not Working

I agree with the critics of our modern whiteboard and non-whiteboard technical hazing rituals.

By treating all candidates the same, and asking the same barrage of questions, we hope to map a candidate's knowledge, and some are even going to claim that this approach is "rational" or "scientific" or "impartial". It's not. Because people are not bots, and technology is not as complex as you think it is, it's far more complex than you think it is.

Here's the problem with technical knowledge: It's not linear but rather factorial in complexity, like the Koch Curve, the closer you look, the more detail is generated, and there is actually no end to the complexity. If you don't even know what I mean by that, watch this awesome talk by K Lars Lohn and then come back. If that talk doesn't give you a reason why you should be going to technical conferences, I don't know what to do to convince you further. There, now, I'm a thought leader.

Now back to interviews. If an interviewer is sufficiently intelligent, I think the interviewer should start by determining from a resume and from any phone screens, the areas where the candidate expresses some interest, experience, and ability, and then talk as openly, and with as much good-will and personal charm, as is possible. In recent weeks, I have watched people as their anxiety goes down, and I notice that what you can learn about someone who believes you are not a jerk, is much higher than someone who has their fence up. This is a poker game where we lose if we keep our poker faces. This interview game is a game where the best move is to fold, and show your cards. This is what I'm looking for. I saw some of what I'm looking for in your resume. I see you mention here that you have tried Scrum and Kanban. What did you find worked and didn't work on your teams when you did those things? Let's talk about how teams work. Let's talk about how compilers compile, how the JVM runs your code, how a statically typed language helps teams ship. How a unit test can help you not break things, and is doubly important on a language like JavaScript where there is no compiler, and where consequently useful forms of static analysis may be impossible. Let's talk about the recent trend towards languages which can be verified to be correct in some aspect, like D or Rust. Let's talk about Functional programming. With Junior programmers I'm interviewing very few have ever played with Rust or D, or F#, or Scala. Very few can tell me about interrupt handling inside the Linux kernel, or about safe concurrency models for web-scale transaction processing, or about the differences between two transaction settings in MS SQL.

So fine. Let's find SOMETHING you love. Animation? Awesome. Games? Awesome. Now we will dig into your own interests, and find out what you've done that we can see evidence of.

Don't I just sound so avant-garde? Trust me, I'm not. I'm probably going to ask Juniors and Intermediates if a Stack is LIFO or FIFO. Then I ask them whether walking into McDonald's and waiting in line to order a big mac, if that line of customers is a Stack, or a Queue. This question might be a bit too easy in England where a line-up is actually called a Queue, but in Canada, I find that people who crammed the LIFO/FIFO part of it can't reason about it, and thus some conceptual wiring is missing in their heads, wiring that I can't quite account for. My mental picture of a Stack is something you might remember from restaurants, if you like me, are of a certain age:

I ask about stacks and queues not because you need to know that every day when you work in my team, but because I have a distressing feeling that candidates can graduate by simply cramming and collaborating on coding projects, and can manage to retain very little of the knowledge-platform that their degree could have given them. Which data structure would help me reverse the order of items in a list easily, a stack, or a queue? The important thing about my question isn't if you could google it or not, it's how adept you are at thinking about systems built of large amounts of software and hardware.

I believe that a working model of a smaller domain contributes to, and correlates well with the reasoning skill you possess in the large domain. The human brain, confronted with systems composed of parts it does not understand tends to ascribe to others the agency for fixing and changing those systems. When a engineer who knows how a system works understands the fundamentals, she will, I hope, be able to begin picking complex problems apart, a process I call bisecting, until she can find individual smaller problems which can be solved. It is these bisectors of complexity that I search for when I interview. I am looking for the developer who doesn't even know how to do this, but who believes she can do it, and who will keep trying until she does it. Possessed of reasoning skills, and a strong set of engineering fundamentals, she is apt to succeed.

Even candidates who absorbed everything their school offered them will still need a lot of additional skills and need to learn a lot of tools. But if you are not a learner, a sponge for knowledge in university, an organizer of systems and ideas, a bisector of problems, what rational evidence do I have that things will be different in your work life? If you can't tell me how to troubleshoot your mom's internet connection, I'm not going to believe you can understand a Healthcare Information Systems environment.

I recently interviewed a candidate with a Masters Degree in Computer Engineering, that I hope was simply having trouble because English was a second language. Several days after the interview, I am wondering if I simply made the candidate so anxious and flustered, that I actually caused the interview's dismal result. Whether or not that happened in that case, it's critical that interviewers turn our dreadful critical gaze upon ourselves, find sub-par elements of our practices, and fix them.

A good interviewer needs to set candidates at ease. When I see candidates smiling and laughing, and joking in an interview, I am happy. I know that I'm talking with the real person, and that we can figure out what will and will not work with this candidate within this team.

I am not going to stop asking semi-random factual questions, but I am going to give candidates fair notice. I happen to like the little thing on Reddit where people ask you to "ELI5". Explain it like I'm five. When you know something cold, you can explain it to a five year old. This is a new knowledge-sharing phenomenon that originates with millenials. If you're 21 right now, I'm old enough to be your dad, and then some. Unlike some people, I think the world is going to be fine, when the Millenials take over and we're all retired. I'm cool.

So why do I ask what DNS and DHCP are, when you could google that, and when those seem more like questions for an IT/Network-admin than for a Developer role? The argument that you can google what you don't know falls down at the point where you don't google because you're facing unknown unknowns. Design decision mistakes are a common after-effect of unknown unknowns. I make design decision mistakes all the time. We all do. We do not understand the domain in which we are engineering well enough, and we do not even know what it is that we do not know. This is the unknown unknown I speak of. I am looking for engineers who are wary, meta-cognitive, who build themselves and others up. So let's get to my hire/no-hire criteria, and see if you agree or disagree with them.

Cardinal "Hire" Qualities (with profuse thanks to Joel Spolsky)

I want to hire someone who is SMART and CURIOUS, who GUARDS the team that GETS THINGS DONE, and WHO IS NOT A JERK. I have grouped and expanded things in a way that makes sense to me but I freely admit that I stole almost all of this from Joel Spolsky. Thanks, man.

SMART + CURIOUS: I am looking for evidence that you are a passionate, intelligent geek who likes to write code. You have a deep and dividing interest in some (but usually not all) areas of computers, software development, and technology. If I ask you how a CPU's level one and level two cache works, and you don't know that, that's OK, as long as you can answer the question "tell me about something that you built recently on your own time that you didn't have to build", or "tell me about some language or operating system or tool that you're experimenting with".

GUARDS + GETS THINGS DONE: You're not just a member of a team that shipped, but a member of teams that would not have shipped without you. Your team didn't know about version control? You taught them. Your team didn't know about continuous integration? You added it to their practices. Your team didn't understand the zen of decoupling or the zen of test? You taught it. You modeled the practices that made your team get stuff done. When you saw things that were bullshit, that would sap the motivation of the team to GET THINGS DONE, you faced the boss and spoke up. You, my friend, are the guardian of the customer's happiness, the guardian of the product's marketplace success, and the keeper of the flame. Sometimes being that guardian means NOT GETTING (the wrong) THINGS DONE especially if it means doing them "wrong" just so they can be done "fast". Long term trends that slip under the radar and that are under-valued in agile/scrum teams, are things you like to bring up at retrospectives.

NOT A JERK: You defuse tense situations. You don't add gasoline to open flame. You call people out privately, and you praise people publicly. You absorb blame. You deflect praise. You admit when you failed to do any of the above, and resolve to do better when you don't live up to your own internal high moral standards. You believe you can be a great engineer while valuing different people who have different communication styles, cultures, languages, and you think that the team's differences can become sources of strength, and when difficulty and division is spreading, you find ways to unify the team and give it a focus, a technical engineering focus, with a strong shared ethical principle. You are a curator of good company culture.

But let's be honest about the above. The above is the person I'm trying very hard to be. I'm trying to hire people who are trying to do some of the things I try to do.

My questions for you guys:

How Do you Find Out Real Stuff about Candidates when you are conducting an interview?

What do you want to know when you hire or when you are seeking a job?

As a candidate, do you ask who you would report to? What do you hope to learn?

How do you feel about the number of people in the room? Do you think its a better sign when you are interviewed by one person, or do you think it's better when you're interviewed by three or four people?

Are there any "shibboleth" questions you have as a candidate? What do you want to find out with them, even if you don't want to state your question directly, what are you trying to figure out? I don't have a specific question but if I see signs of aggression, arrogance, or naked exercise of rank or privilege, I quietly note it to myself, and decline further interactions with a company. One thing you certainly can't fix in a company is the culture of its leaders.

When you are being interviewed, how should people approach you to find out the most accurate picture of your strengths and weaknesses?

I'd like to open the floor to a discussion now, let's keep it civil. Thanks.