Aaron Swartz: How I Hire Programmers
aaronsw.com
aaronsw.com
From http://openlibrary.org/about/people: "Aaron Swartz, Former Project Leader. The Open Library wouldn't exist without Aaron. He wrote the backbone of the system you see today. He has also worked on specs like RSS, startups like Reddit.com, and software projects like web.py. He worked from San Francisco to architect the site, put together the team, and attempt to keep things organized, and we couldn't have come this far without his crucial expertise."
Even if they hadn't hired me I would have been happy to do it. It was enjoyable and I learned a lot of interesting stuff. I know some people would say it's unfair to ask this, but I really wish it would become the industry standard method.
It seems like it'd be hard, using this tactic, to protect trade secrets in companies where that's important.
Also, I doubt any secret that can e leaned in a day is worth a lot.
If I was signing something that could get me sued in the future, I'd make darn sure that I read it thoroughly before signing!
That's just common sense:)
With EULAs and click-through "contracts" devaluing the term, the average person probably signs hundreds of contracts a year, and reads none of them.
Maybe that's true, maybe it isn't, but at least personally speaking, I always do my interviews with PTO and only quit after I get a job offer I like. I'd never burn PTO for something like that unless it was a truly extraordinary opportunity, and don't better programmers have enough options that they wouldn't have to do so?
Now I consider any interview process incomplete and utterly unreliable if it doesn't include writing actual code, however simple and straightforward.
It must be pretty rare to find a person who can describe a complex project in detail but is unable to write any code during an interview.
Yes, these candidates would typically be able to explain their involvement with previous projects, to give a technical overview of what they'd done. They would totally pass my bullshit filter. I thought I had a well-tuned bullshit filter. I was wrong.
The programming problems are typically very simple, an order of magnitude simpler than an algorithm or design question that might be a part of the same interview. I don't want to give specific examples, but maybe implement one of a standard algorithms on an array or a tree (I'm not talking balanced trees, way simpler). Maybe do something that requires a nested loop and some bit-twiddling, or careful thinking about entries in a two-dimensional array, or a bit of smarts to hold some sparse data - but again, nearly trivial from the algorithmic point of view. There are many possibilities.
What you want to check is whether the candidate can think through their own code, whether they know to check for edge cases, whether they think of test cases, how they deal with off-by-1 possibilities, how they debug their own code, do they have a reasonably clear style.
What you tend to see when a candidate fails such an assignment is people who don't remember the mask to fill a byte with 1's, who can't get a nested loop right because they can't seem to keep two counters in their head at the same time, who don't have the instinct to check for an off-by-1, who can't trace through their own code visually with sample arguments, etc. etc. Sometimes they had just impressed you a lot a few minutes before with a nice technical summary of what they did in their previous project.
The place I'm currently at interviews in a very similar matter and we're currently batting 3 for 3 on new hires over the last year or so. I've never been a fan of the "run puzzles at them until they fall over" method. Google's hiring methods gave me a big fat headache and made me run as fast as I could from there.
I recently interviewed at another company that does a variation on this by sending you a coding challenge and you send the results back within 2 hours (you text them at a certain time and then they send the challenge). I liked this approach as well.
Both have their pros and cons but each of them will show you how someone codes. The hardest part for us has been figuring out if their style/approach to problem solving meshes with the team. That's still hard to determine in an interview because it's something of a personality thing We've worked our way through those issues, though.
I don't think that paragraph and the proceeding one was there when I originally read the post. Seems it's been edited since it was submitted.
See this thread in the comments on the blog (from the author): "The comments here and on Hacker News reminded me I left out a step. I’ve added it." (http://www.aaronsw.com/weblog/hiring#c9)
I just didn't want you two thinking you were crazy or somehow accidentally skipped two paragraphs.
But has that ever happened at your job? If so, instead of hiring high pressure programmers, could you take steps to eliminate the high pressure scenarios, e.g., unit testing, back up systems, roll back plans?
I know everyone will have counterexamples of this high pressure thing that happens.. but is it really typical for your job, really?
There are a lot of developers that "get stuff done" without accomplishing anything of use to the company.
Interviewers should understand your contribution to the company isn't in your control, but your contribution to the team was.
Their objectives are basically the same. The difference is in the ways of proving the "getting things done" part.
I never assumed the programming questions in an interview were really about getting the right answer in ten minutes or however long you spend on it, but more about giving the interviewee an opportunity to explain their thought process and problem solving approach to the interviewer. I don't agree that asking interviewees to solve programming problems in an interview is useless, but obviously looking at code samples from other work is great, too.
That's what they say. But do you know anyone who failed the questions and still got hired? My experience has been that even when I nail the algorithmic questions, I miss a few trivia questions and don't get called back. Nuance cannot be replicated at corporate scale.
I don't have the experience to know how well it works in the general case, though. Anyway, I don't think Aaron is arguing against interviewers using the technique wrong, but rather that it doesn't correlate at all with "good hires", even when used more intelligently. I don't think that's true.
It should be pointed out that I structure the interviews to try to avoid that case anyhow. If your interviewee nails everything, it either means that you've got a class-A programmer, or your interview difficulty tops out too soon. I've become a big believer in gradated interviews. I've got a pretty good SQL series that starts out where the answer is literally "SELECT * FROM some_table" (though I find it occasionally trips people up to simply omit the where clause) and goes up from there on this little two-table schema. I've got some good HTML generation series that starts out with a simple "can you dump out a table from a 2D array or equivalent structure?" (since I try to do language-agnostic interviews) and go up through "do you know about escaping" and "can you handle optional parameters" and so on. Over time I've been selecting for the series that produce more gradation.
I know pairing is sometimes controversial around these parts, but for interview purposes its benefits are pretty evident.
On the other hand, this is a subject near and dear to my own heart, and while I appreciate a lot of his methods, I don't think his model scales well. In order for it to work the way he wants, he has to conduct the interviews himself.
A few thoughts...
Programming isn’t typically a job done under pressure, so seeing how people perform when nervous is pretty useless.
Not my experience. Actually, quite the contrary.
The single biggest difference I have ever seen (over and over again) between a good programmer and a great programmer is how they respond under pressure. Given enough time, lots of programmers can code something that works. The problem is that there are many occasions where there simply isn't enough time. Can you hit a deadline? Can you stay awake all night if you have to? Can you resolve this problem that's holding everything and everyone else up? Can you settle down that user or customer who's up in arms? Can you figure out what wrong decision was made 4 steps ago that is causing big problems now? And can you do it now?
Understanding how well someone performs under pressure (and whether or not that makes them nervous) is hardly useless. I can't think of too many more things that are useful to know.
So I just request a code sample and a demo and see whether it looks good.
There are too many cases where this doesn't work at all. What if they've never contributed to an open source project? (Whether or not you like this has nothing to do with their skill as a programmer and is another subject). What if they're prohibited from sharing someone else's proprietary property? What if they're bound by someone else's (illogical) shop standards? What if they salvaged someone else's shitty architecture with great workaround code? If they wrote something as part of a team, which part was theirs? How much of the analysis, design, architecture, testing, and deployment did they do? For that matter, how much of the actual programming did they do? Lots of posers share something they "worked on" but could never build in a hundred years.
To find out whether someone’s smart, I just have a casual conversation with them.
That's it? You make judgements on the fly? Using what metrics?
The idea of a learning from a casual conversation makes a lot of sense. But what is your plan? Ten people having ten conversations will come up with ten different assessments of the same candidate. Unless there is some kind of standard and a plan going into the meeting. How will you know they are smart? How will you know they can get things done? How will you know they can work with others? Without a plan to answer these questions, you're just waving your hands.
I suspect OP already has a plan of attack for his casual conversations but it's hard to say because he never says anything about it.
Ask them what they’ve been thinking about and probe them about it.
Again, this may or may not be a good litmus test. I know programmers with IQs of 160 who have written tons of brilliant code. If I asked tham what they've been thinking about, the answer could be "who will win the Notre Dame game" or "will I get laid tonight" just as easily as it can be about something truly cerebral.
Finally, I figure out whether I can work with someone just by hanging out with them for a bit.
Again, you can learn a lot about someone else this way, but sooner or later, you'll need some kind of standard and metric for this method to be replicable. Before you start, you must be able to say, "This is when I will know what I need to know." Until then this is just one guy's hand waving.
I’m amazed that so many companies use such silly hiring methods instead.
I'm amazed that so many companies use such silly methods for so many other things as well. But there are just as many who hire very well. I know many great programmers employed and still delivering great product 15 or 20 years with the same company. The same companies that seldom make bad hires. They use a lot of OP's strategies. But they also combine these strategies into a comprehensive system that works no matter who does the hiring.
I like OP's thinking. I just don't see how it will work well once his company becomes too big for him to do every interview himself. Systemitizing his methods will make it scale.
We let everyone who asks take a very relaxed programming test. Simple (if you know basic algorithms, at least) problem, 4 hours deadline, work from home or in one of our free offices, programming language up to the interviewee. The delivered program is then rated by a few of our programmers who give some comments and a thumbs up or down. If thumbs are generally up, the candidate goes to the interview. The ones who get to the interview almost always end up hired.
So, basically, we have 3 tasks:
* Answer emails, send out tests, receive deliveries, and schedule interviews or say "sorry" to each candidate: This is the most stressful, so we rotate that every once in a while.
* Going over code and commenting: Enough people consider this a somewhat fun break from normal work that we don't have any problems scaling this.
* Interviewing: This has to require the R&D leader and at least one senior programmer. Since the people who get this far are almost always hired, it takes up no more of their time than it has to.
That is, hearing,"You're so smart," so many times, from teachers, other students, coworkers, bosses, etc., cultivates a sense of elitism and a shock when something is actually difficult.
You're also bound by the same emotions as most other people. If you're a particularly aggressive or irritable person, imagine being surrounded by people who keep making mistakes because they're stupid. If you turn it outward, you're impatient at best and a bully at worst. If you turn it inward, you're stressed out, anxious, and depressed.
All of that said, being a professional programmer was the most satisfying thing I've done. Unfortunately, I moved on precisely because of the above paragraph -- I had managers I felt were particularly dim.
My thoughts all stemmed from the idea that compliments make people worse at what they do. At BEST they make the person continue at the same speed with a boost of moral. Imho.
Try as we might, IQs don't actually follow a bell curve. There are many more on the high and low ends than would be expected by looking at the curvature in the middle. Whether this is a measurement error or something else, we don't know.
Also, because of the unique position of the USA in the world (and especially places like Silicon Valley, Cambridge, Pasadena, New York) an awful lot of the right hand side of the bell curve for nations like China, India, Russia, etc. are currently living here, and often working for tech companies.
Additionally, when you do happen to get extremely brilliant people excited and working on the same thing as you in the same organization, the effects are magical. I've experienced nothing else like it.
Finally, when you're in Silicon Valley, you get the sense that there are maybe a couple thousand serious players who, if you look close, are directly involved in or are supporting most of the major efforts. It is a small world -- it seems like it's about two degrees of separation, give or take. You really get the sense that the right kind of people are the crucial ingredient that fires the whole engine of innovation here.
IQ is probably one of the less important characteristics in most positions in most companies. But it's still an ok measure for something important.
But much better to have people who are not merely good intellectual generalists (high 'g') but who are actually alarmingly good at the actual things you need to do in your company. There are as many times more of these as there are distinct things to do.
The value is defined by a bell curve.
Most IQ tests can't even measure above 155 or so, anyway, and they obviously can't measure below 0. So it's a little silly to talk about them being normally distributed.
The IQ test was invented by Alfred Binet as a way of identifying people who were having trouble in school because they were mentally slow. For this he came up with a large number of different questions that exercised the brain in various ways, and figured out how well an average kid would do. When he gave the test to a real kid he would take their performance and figure out a "mental age" that they performed at. Their intelligence quotient was then defined as 100 * (mental age) / (physical age).
The development of IQ tests aimed at adults which are defined based on a bell curve was a later innovation. The name was kept simply because it was then well-known.
This is also a good test of common sense: if they answer "will I get laid" rather than "monads", you know they don't have any.
Because you have provided no mechanism to insure consistent results no matter who is conducting the assessment.
If you and I each assessed the same candidate using your methods, we could very easily come up with 2 very different assessments. And that's the trap you'll fall into as soon as you're not conducting every interview.
All 3 of your questions are important. How do you know when you have the answer?
What is the definition of "smart"? "good stuff in the past"? "works well with others"? We all have different definitions.
You may think someone is smart because they can code Algorithm X 5 different ways in 7 minutes. But I may think they're not so smart because they piss off the user trying to determine what the algorithm should do.
You may love something they have done in the past while I hate it. For a thousand different reasons.
Can they code a bubble sort in 2 different languages in 15 minutes? Can they do an iteration with an early exit, based upon an easily determined condition? How much can they speed up a piece of code with multiple obvious opportunities? Whether or not you'd ever use these particular questions, they are much more likely to give questions like yours the consistent yes/no answer you want.
I applaud your desire to avoid the sins of the past. You lay out a sensible approach. What's also needed is the application of some standards and metrics to give a higher probability of consistent results. That's all.
> If you and I each assessed the same candidate using your methods, we could very easily come up with 2 very different assessments. And that's the trap you'll fall into as soon as you're not conducting every interview.
...
> What's also needed is the application of some standards and metrics to give a higher probability of consistent results.
I don't think that's necessarily true. If you're Google or IBM, it might be, but if you're hiring for a smaller firm, it may very well be best to get someone that is a good fit for that particular culture.
Which actually sort of ties into my other post: I think your point about scaling is important to consider, but it only kicks in at a certain size, and I have a sneaking suspicion that Aaron has not handled hiring for, say, Accenture (nor would he want to).
I don't think hiring is ever going to be a one-size-fits-all, cookie-cutter, "standards and metrics" sort of business as long as you're talking about hiring people.
> Not my experience. Actually, quite the contrary.
> The single biggest difference I have ever seen (over and over again) between a good programmer and a great programmer is how they respond under pressure. Given enough time, lots of programmers can code something that works. The problem is that there are many occasions where there simply isn't enough time. Can you hit a deadline? Can you stay awake all night if you have to? Can you resolve this problem that's holding everything and everyone else up? Can you settle down that user or customer who's up in arms? Can you figure out what wrong decision was made 4 steps ago that is causing big problems now? And can you do it now?
> Understanding how well someone performs under pressure (and whether or not that makes them nervous) is hardly useless. I can't think of too many more things that are useful to know.
I'm pretty sure your examples conflate different sorts of pressure, and I don't think how you perform for one reflects how you'll perform for all. I've been in all those situations and the physiological responses are different.
There's never been a time on the job that I've felt the sort of pressure I have in an interview. In fact, if that were routine, I'm pretty sure my friends would have burned out of software development long ago. Moreover, if my job routinely required last second cowboy-style programming, which is sure to lead to bad design and bugs, I'd get a new job.
I'd say that, for most software positions, if it makes sense to hire programmers whose success depends on performing well under the same physiological conditions as are normal during an interview, something's broken in your processes.
Disclosure: As an ex-basketball player, crunch time pressure is extremely similar to interview pressure, and I handle both exceedingly well. I've always felt a little fraudulent since I come off better in interviews than some programmers who are more talented than I am.
I found the reason in the end. I wasn't extra stress sensitive. I just couldn't relax during stressed periods -- I was "on" 24/7.
Mediation solved that.
Edit: This was a bit personal, but I'll let it be. It might help someone. (AA, etc.)
Sigh.
There is a huge difference between being under pressure and the unique pressure of performing in an interview. The former is being able to handle a longer term fear of failure. The latter is dealing with a short-term fear that activates the primitive brain's "fight or flight" instinct.
There is a HUGE difference, and I would never trust anything I got from the latter style interview.
All-night overtime or short deadline pressures are completely different beasts.
As many have pointed out already, there's a big difference between the pressure of an interview where you've got a couple of minutes to either win the job or completely blow it and a deadline where you usually have several days to plan and prepare.
I would also point out that if management is constantly springing short, do-or-die deadlines on workers then there's something very wrong with their planning.
I wouldn't want anyone on my team who fell apart under stress. Performance under pressure isn't the only factor, but it is a factor.
That said, if anyone has a zero-stress engineering job, please tell me.
This does put on some pressure - there is a deadline, after all - but people who are shy but confident in their coding abilities may be less anxious. This would also solve the common "but I wouldn't code without an IDE/Google/Wikipedia" complaint.
I've had phone interviews where I've been asked to solve a logic puzzle with pen/paper while explaining my approach. Solving a problem you've never thought about while being put on the spot turns out to be incredibly difficult. These sorts of problems require deep concentration and quiet yet it tends to be awkward to have silence between strangers. The situation really inhibits serious problem solving.
That is so true. Most people can't keep up their "interview face" for very long. It's tiring. At some point, if you put them at ease, they will revert to their normal self. That is when you'll get to see what they're really like. I've seen some pretty amazing transformations when waiting for this second phase of the interview.
i like staunch's "spend a day with the team" method a lot, though talking about strengths/weaknesses and role playing certain scenarios is also a good way to get a sense for potential clashes ("tests are for monkeys" or what not)
what i didn't understand was the "smart" part. i don't think it's possible to get a sense for whether someone is smart--especially technical smarts as opposed to, say, leadership or empathy smarts--simply by talking with someone. in fact, the whole concept of smart is exactly what pressure-ful, fanciful interview questions are trying to get at. i'm not even sure "smart" is a single or useful concept.
specific interview questions do try to determine technical skills or thinking process...but it a chat over coffee, a single, brief encounter, any different? in a good way?
i'm nitpicking here, but i felt that the solution to smarts--assuming we define smart to something useful--is kind of weak.
From my personal experience, I've dealt with smart people and smart people - one kind knows / understands a lot of things in a broad field, the other kind knows a lot about things but is almost completely devoid of common sense. I'd prefer the first kind in any situation where I or my friends would have to deal with them over the medium to long term. I'm pretty sure this would be reflected in all areas worth measuring for a company too.
So trying to define smart as a concrete measure may be missing the point, as you will actually have to work with the person, and what you feel is what tends to form your opinion / bias and affects your future interaction in such a way that it generally tends to become a self-fulfilling prophecy.
Smart, affable, productive people with demonstrated ability make great employees.
I'm not interested so much in who to hire -- I think that's a no brainer, frankly. I'm more interested in where to find these great people to hire. Really. We are having hell finding great developers.
That said, I'm not sure if all of his advice can be followed by a reasonably medium sized company/organization where hiring decisions are made by a committee, rather than one person.
As a side note, I think that reading a resume can actually be a good starting point to understand the candidate's background.
I understand the low hanging fruit, I just witnessed and interview the other day for a Java web developer, and one of the questions was describe a singleton pattern to which the interviewee could not respond. Given that there has been a history of singleton / Java / Bad things web applications problem, not understanding the pattern is a significant issue and I did thing it was an appropriate question to use as a filter, but asking a web developer deep questions about class-loader nuances seems like overkill to me and I have seen that done as well.
I wouldn’t mind if people stop posting drivel from his site.
If you don't commit to that communication, you'll be an unsettling and depressing interviewer. You can't just play part of the process by the book, it really has to be all or nothing.
Being that I've only interviewed at big-ish companies and in Japan (where companies ape the large companies uncritically), I haven't had a chance to see some of these techniques :/
Yep.