真正的程序员,请你站出来
本文是从 LINK 这篇文章翻译而来。
我们积极的对外招聘已经有四个多月了,如果要问从这次经历中有哪些收获,我只能说,我终于明白,Jeff Atwood在FizzBuzz这篇文章里说的并不是玩笑话。(译者:这篇文章里说程序员不会编程)。
在新成立的公司中,我们RethinkDB公司因面试过程最为苛刻而出名。这是事实——我们对面试过程不会有半点妥协。我们期望通过最大范围的筛选来建立一个高质量的开发团队。对于这个初衷,我在之前的一些文章里提到过多次。在过去的几个月里,我们遇到不少人认为我们的要求高的有些离谱,以为我们是在招聘同时具有量子力学和计算科学双学位的火箭专家。这是误解。我们只希望招的能编程的程序员。
为了满足大众的好奇,我们公布了一些冒烟测试过程(smoke test),这写过程只是半个小时内的一次电话交流,大概20个候选人中有19人通不过这个测试。(这些候选人都是经过简历审查筛选出来的)。我们并没有 要求他们对一个复杂的算法提出解决方案。我们并没有让他们去做脑筋急转弯问题。我们并没有让他们做复杂的指针算法和操作。就像下面的这个问题,绝大多数的 应聘者都不能正确的解答,甚至做满半个小时,甚至给了大量的提示的情况下:
请写出一个C函数,实现反转一个单向链接表的功能。
就这样的一道题。我们选了一些简历写的让人不可抗拒的应聘者(包括做内核开发的,编译器设计的,还有一个哲学博士学位的),没有人能正确的编写出来,不管给他们多少时间。
我们当然也问了些其它问题。把N个元素插入到一个Vector里(或者ArrayList,或其它的你所选择的语言里被称作动态数组的东西),最坏的最复杂的一种运算情况是怎样的?我们并不是考察应聘者对这个数据结构的了解程度,我们只是希望他们用自己的见解阐述一下。我们会告诉他们vector的内部工作原理。你们知道吗,我们甚至接受O(N log N)次这样的答案。
如何实现一个读-写锁?我们并不要你通过电话编写出这样一个程序。只是说说方案,如果你的方案里能提到饥饿矛盾问题(starvation issues),那我们就算你中了头彩了。我们真的希望老天能不拘一格降人才,可是我们真的没有找到这样的人。
我们试探着询问多任务运行的合作模式和抢先模式的区别。我们试探着询问条件变量的工作原理。20个人中有19个人从头至尾一句话都没说出来。
为什么我们会询问这些很特别的问题?因为这些知识对一个大学毕业生来说是他们所学的全部课程中最核心的部分,因为这些知识在我们的日常工作中会以这 样或那样的形式被使用。而且,在这四个月的招聘中,我们发现,如果你能理解线程和协调进程的区别,你就能知道如何反转一个链接表,如果你对条件变量有了基 本的了解,你就能获得更多的机会在众多的应聘者中证明你是个更好的程序员。很多的人都做不到这些。
我们希望所雇佣的程序员拥有比我们上面所说的技能更多的能力,而且我们不认为这些要求很过分。只是希望你们对基础知识有扎实的掌 握,有潜力去完成艰巨的任务,对你们所开发的程序有虔诚的热爱。引用我的同事第一次听到FizzBuzz里的言论时的反应:“如果他们不能编程,他们能干 什么?”挑选简历需要好几个小时,每个应聘者需要20多分钟进行冒烟测试。然后面试过程每个人需要45分钟。整个过程差不多要15个小时的工作。这占用了 一个懂技术的工程师大量的时间去发现一个可用的候选人。
真正的程序员,请你站出来。
转自:http://www.aqee.net/will-the-real-programmers-please-stand-up/
Will the real programmers please stand up?
Posted on June 29, 2010 by RethinkDB
We've been actively recruiting for four months now, and if there is one thing we've learned, it's that Jeff Atwood wasn't kidding about FizzBuzz.
Among our friends in the startup community, RethinkDB has the rep for having the toughest interview process on the block. And it's true - the interview process is something we won't compromise on. We're prepared to turn away as many people as it takes to build a superb development team. We wrote that much in an earlier post. In the past few months we ran into people that thought we have ridiculously high standards and are hiring rocket scientists who also double majored in quantum mechanics and computer science. We don't. We just won't hire programmers that can't code.
In the interest of openness, we'll post the smoke test that makes us turn away 19 out of 20 candidates within half an hour of a phone conversation (and that's after screening the resumes). We don't ask people to code a solution to a complex algorithms problem. We don't ask to solve tricky puzzle questions. We don't ask to do complex pointer arithmetic or manipulation. Here is the question that the vast majority of candidates are unable to successfully solve, even in half an hour, even with a lot of nudging in the right direction:
Write a C function that reverses a singly-linked list.
That's it. We've turned away people with incredibly impressive resumes (including kernel developers, compiler designers, and many a Ph.D. candidate) because they were unable to code a solution to this problem in any reasonable amount of time.
We ask other questions, of course. What's the worst case complexity of inserting N elements into a vector (or an ArrayList, or whatever your language of choice calls dynamic arrays)? We don't care if you know, we just want you to try and figure it out. We'll explain how a vector works internally. Hell, we'll even accept O(N log N) as an answer.
How would you implement a read-write lock? You don't actually have to code it over the phone. Mentioning starvation issues is bonus points. For heaven's sakes, just give us something. We try to ask about the difference between cooperative and preemptive multitasking.
We try to ask about condition variables. 19 out of 20 times there is silence on the other end.
Why do we ask these specific questions? Because they're part of a core body of knowledge taught in any undergraduate curriculum worth its salt, and because in some form or another, they came up in our daily work. And in four months we found out that if you understand the difference between threads and coroutines, can reverse a linked list, and have a basic understanding of condition variables, chances are you're probably a much better programmer than most who are looking for a job, and a huge chunk of those who aren't looking as well.
We're hiring people who can do more than what I listed above, but I don't think we're asking for too much more. Just a solid understanding of the fundamentals, the drive to accomplish great things, and a little genuine love for your craft. To quote one of my colleagues who heard about FizzBuzz for the first time, "If they can't do FizzBuzz, what can they do?". After spending hours reviewing resumes, it takes twenty interviews to get to the candidate that can pass the smoke tests. At an average of 45 minutes per interview, this works out to fifteen hours of work. That's a lot of time to find one candidate with a basic understanding of software engineering.
Will the real programmers please stand up?
Interested in working at RethinkDB? We're hiring - please see our jobs page for more details.
转自:http://blog.rethinkdb.com/will-the-real-programmers-please-stand-up