真正的程序员,请你站出来

我们积极的对外招聘已经有四个多月了,如果要问从这次经历中有哪些收获,我只能说,我终于明白,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个小时的工作。这占用了 一个懂技术的工程师大量的时间去发现一个可用的候选人。

真正的程序员,请你站出来。

[英文原文:LINK ]
分享这篇文章:

55 Responses to 真正的程序员,请你站出来

  1. Peter says:

    鉴于目前中国高等教育的情况, 您的要求显然太高. 我断言, 就算是高校教授来回答这些问题, 没有参考答案他们也做不出来.

    但在职的程序员, 特别是从事程序设计三到四年的, 你的这些要求完全能够满足.

  2. Happyday says:

    刚看到这篇文章,起初感觉像其他隐形招聘文章一样,想一掠而过~后又想了想,还是发表一下自己的看法吧。
    现在这种形式的招聘广告层出不穷,都一方面声称自己对人才的饥渴,另一方面又表示职场中的应聘者如何如何的不符合要求。我想问一下,这个市场是否是双方的呢?招聘者是否在发布如此信息之前已经考虑过自己是否有足够的能力以及吸引力来招募到很多慕名前来的应聘者呢?或者这个帖子只是一个招聘广告+牢骚贴?个人没有看过Jeff Atwood的文章,但我以为“程序员不会编程”这句话本身就是一个笑话而已…
    最后,还是要祝愿LZ的公司能够找到称心如意的“程序员”

  3. flyhighw says:

    请不要以你自身的能力去评估别人,如果你觉得很牛B,为啥没能力一个人把项目做下呢.如果我以这样的眼光去看你们那些面试官,请问,是否你们的面试官也不算真正的程序员?

  4. terry says:

    当然从公司的角度来说,希望一进来就能做事情的,但有些时候真的是双向的, 给予程序员一些培训, 最后会得到回报的。 现在的都是很急功近利, 希望一进来就能做的非常好

  5. 十分 says:

    我甚至连评论的资格都没有,因为他提出的问题是确实不会做。
    当我会做的时候我想问,你们有什么资格聘用我?

    • flyingrass says:

      不上网,不查手册,能编写出一个完整的程序,实现一点小复杂的算法,就算一个合格的程序员咯

      • Adam says:

        看来我还需要努力,把手册背下来,现在如果我不查手册,很多函数的使用一定想不起来

      • Sweet says:

        我认为这样才是最笨的程序员,合格的程序员是会利用一切的资源去解决问题、实现需求。而不是说为了凸显能力不查API不上网,甚至于拒绝使用IDE。所以我平时看到那种推荐别人用记事本和EditPlus写程序的,很反感,放着高效好用的IDE不用,却非要去背什么API,背下来又如何?实际开发的时候,你去纯手敲?关闭智能提示?IDE会防止你犯低级错误、格式化你的代码,让你有良好的编码习惯。我确实也很佩服之前AQEE上一篇文章讲的徒手程序员,可惜他们是被那个年代限制了,然后到了现在,习惯了几十年的开发方式了。所以,把重心放到设计、算法、数据结构上,这才是合格的程序员。
        另外,这篇文章说的还是有一点道理的,哪些做了很多年开发(有大型系统开发经验)或者学历很高的程序员,往往在一些反而是很基础的事情(不是理论)上犯错误,或者是没有深入了解过自己所精通的技术的一些实现细节。不过他们这些平时没有注意的细节,多半也是在实际工作中,很少遇到的,比如我以前面试的一个.NET的程序,就对ubyte的一些东西不了解,就是从来没有在开发中用到过这个数据类型。

        • 笑笑十年 says:

          我是做前端的,我的招聘要求通常是必须有能力手写代码,前端api非常少,不想C或者JAVA非常多的类库,如果前端这么点API还记不住,我实在不敢招进来。
          再一个,IDE这东西仁者见仁,智者见智,不然为什么notepad++和sublime这类文本编辑器这么火?
          我不愿意用eclipse的原因第一个太卡,第二个用它写程序最后我发现我不会部署。

  6. breaker says:

    @Peter
    @花非花

    是的,那要看程序员工作的环境和态度,中国的一部分职业程序员都是 Copy-Paste 型程序员,应付任务后后就在偷偷摸摸的 QQ 中度过。这样的人,你给他十年也不顶 P 用。

  7. star.liang says:

    还好。。。知道一两个。。。上学时候导师深刻的提醒过

  8. liaoxy says:

    @十分
    非常赞同十分的观点,招聘者老喜欢把要求抬高,生怕找来个低于基准要求的人来做事一样,这个就像去买家电时,销售者老喜欢说高价格来给你砍价一样

  9. 忧郁 says:

    我进公司的时候,有三个上机题,我只会做前两个,第三个所用的知识见都没见过。第一个题是“给你一个字符串,然后将它反转。”第二个题是“给你一个数字,算出从1+到它的和。”这两个题应该很简单吧,我几分钟就做好了,可是对于和我一起来面试的人来说,他们之中大部分都不会做。

    • 忧郁 says:

      这件事让我很感慨,我不知道我们上班时,编程时都做了些什么?

    • ZX says:

      不会吧,这两道题还有人不会做?另外,我想知道第三题是什么

    • Wizmann says:

      1. print raw_input()[::-1]
      2. print sum(range(int(raw_input())+1))

      哈哈,这个算作弊不?~~

      • gnay says:

        那是PYTHON 这些语言直接支持了,JAVA也有biginteger……一般人只学了C/C++,写不出来很正常,我记得我调试这题就调试了很久……

    • gnay says:

      第二题……第二题……题目意思不完整吧……如果这么说的话,int x = n * (n-1) / 2;应该还有限制,比如说,n可能很大,大到1亿什么的……你确认你用C语言来写的话,几分钟能写好 1亿 * 99999999 / 2?何况……可能还是1234567* 1234566 / 2; 99999999 * 50000000确实太简单了……

  10. shuiboy says:

    我没有接触过一些公司,不过同样感到不可思议。我怀疑他们把你们的简章内容看错了!

  11. ZX says:

    国内的公司通常问你会不会XXX框架,会不会用XXX服务器,最搞笑的是某些大型央企问你对他们的系统规格熟悉不熟悉,我没进你们公司前最多只是你们的客户(而且可能是根本不用你们IT系统的用户,你知道,很多国企的IT系统烂得要死),我熟悉你们的系统规格干吗?
    PS:我不明白,哲学博士也就算了,做内核开发和编译器设计的人都不会反转链表?

  12. says:

    单链表逆置,竟然说通过率才5%,我不信,我才一年工作经验,我肯定能做出来的

  13. yu says:

    全不会啊。啊啊啊

  14. lang says:

    记得是大三才学的算法导论和操作系统里的介绍,现在也记不得了

  15. 梁俊 says:

    一个程序员路过

  16. 景笑 says:

    作者象个幼儿园阿姨走到大街上,
    忘记了场景,大声嚷嚷:
    “谁会数数?站出来”
    引来众人侧目……

  17. 杨xx says:

    这个面试题弱爆了,本人大一时刚学完c++和数据结构后,就独立的正确实现了一颗完整的平衡二叉树

  18. justdoit says:

    这篇文章貌似以前看过。。

  19. lambert says:

    我只觉得从你所期望的答案和问题本身来看应该是面试官应该提高问问题的技巧。(难道是原文是英文的然后翻译太烂?)

  20. 寻觅 says:

    其实本文的目的不在于招聘本身,而是对于程序员的本质的一种质疑。那些被淘汰的人换个称谓或许会更好,比如:软件工程师。Sorry,也许你会不高兴,但其实就是这样。真正的程序员就应该懂那些,真正的程序员就是一个编码的极度狂热者。达不到这个要求的,哪怕在公司做编程做了再久也就是一个软件工程师。其实程序员是一个很神圣的称号,真的。PS:我其实是个软件工程师。

  21. Alan haha says:

    这些问题都不会= =那这帮人是怎么毕业的= =
    这些都是考试必考啊= =
    上面说平衡树的那位= =这些都是考试里的基础啊= =
    红黑树、B+树、各种堆(左堆、贝努里树什么的)= =你不会这些也敢去考数据结构?
    读者写者、哲学家进餐、银行家算法,不会这些也敢去考操作系统?

  22. laosun says:

    很感慨,现在中国IT行业的情况确实不好,双方的目的完全不在一个点上,招聘方想要一个能来干活的,不想耗费人力财力去培养,求职的死命想挤进IT,哪怕工资不高都愿意,就是想入个门走下去,但是我们的教育确实没有做好这些,导致谁都不能满足谁,双方都有原因。。即使那些工作过几年的,很多人的编程的水平没有真正的提高,目前来说多数人就是知道个框架SSH什么的,涉及到最重要的底层很少人能理解,这也就制约了向更高层次的发展,无论是科班出身的还是外来的程序员,内功的修炼真他妈是最重要的。。。。PS:我也是刚刚进入这个门,需要学习的东西太多了。。明天上班估计老大又要修理我们了。。。。

  23. nov30th says:

    参加过acm的人,看这篇文章,真的很幼稚。如同上面一个回复,就是广告,没有能力找到优秀人才而在这里抱怨。

  24. Leo says:

    这篇文章看的我心潮澎湃啊!!!

  25. sioux says:

    这是人家翻译的文章, 大家看看就行了,回复了原作者也看不见, 我个人觉得国内软件行业的落后,是程序员,缺少的节操。 5K的工资就让一大堆人节操掉满地了。。 在中国,你没钱活不下去呀, 在公司多数不允许有想法, 对产品没有个人的见解和坚持自己的勇气和能力。 做出来的东西缺乏灵魂, 为什么呢?因为我们在打工, 并不是因为我们喜欢这个行业而选择这个行业,选择编程,而是因为我们在这个行业,所以编程。

  26. fanslate says:

    我忽然有些想知道,国内是否有这样类似的公司呢

  27. hwei says:

    招聘时请直接写清楚需要用到什么知识,告诉应聘者如何复习。
    管他是以前就会还是临时突击,面试时达标就够了。
    这就不就能提高招到合格程序员的概率了么?

  28. 涛声依旧 says:

    虽然这些题目都能答上来,但是我算不上一个真正的程序猿…..

  29. Luis.Zhang says:

    我发现,这个网站有点意思,哈哈

  30. happytik says:

    对文章内容深有同感。现在要招到一个能够独立解决问题的程序员还是比较困难的。重点不在你掌握多少知识,关键是要有能力使用你掌握的知识解决一些比较困难的问题。对一些知识一知半解比较容易,但如果要深入进去,往往是比较困难的。读写锁的理论假定10个人会,能够正确实现的估计也就一两个人吧,能够将读写锁理论应用到具体应用,解决实际问题的人估计就更少了。我记得一个软件的实现,使用c++自己实现class到数据库表的自动映射,并利用tree管理class对应对象的内容,使用读写锁及其变形来实现tree上耨的的并发访问控制。真的很佩服实现这个功能的程序员。还有一个A*算法,要真正用来解决实际问题,单单理论是远远不够的。至于一些涉及到数学算法的知识,估计一些人一辈子都无法深入到那种水平。例如:密码算法,尽管有很多开源算法,但真正理解加密算法及其理论,并能够进行一些延伸和扩展的人,太少了。

  31. PreZident says:

    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. 这句翻错了。
    That’s a lot of time to find one candidate with a basic understanding of software engineering. 这句也翻错了。
    烦请看一下。

  32. PreZident says:

    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.
    这段应该也翻错了。请看一下

  33. lx says:

    我确实不明白“请写出一个C函数,实现反转一个单向链接表的功能。”这种简单的问题为什么写不出来!!!确定建立筛选的没有问题?确定会写的人没有因为运气不好简历直接被扔掉了?确定选人的不是xx大学毕业的不要?

  34. 简单CRM says:

    大多时候,还是老板按自己喜好决定。

  35. kobe says:

    在学校里的时候,这些问题都是太简单了,但是大学毕业后就不会了。。。

  36. KentZhang says:

    上一次有个公司让我写个对应接口的C链表删除,我是没写出来。他们给的接口是这样的:
    void reverse(link_node * head, link_node * will_delete);
    然而让我自己写个简单的vector包括迭代器,不要求太高的时间和空间复杂度的话,我还是能搞定的。
    后来我意识到我一个人非专业的(电子)去和专业的(计算机)拼数据结构作甚。我4年的专业训练教会我怎样读懂原理图,怎样简单的分析信号。于是我去做了音频视频,现在稍微接触点OpenGL。觉得挺好的,毕竟领域不同。
    如果让我招人,我出题必然是主要考虑测试面试者解决问题的思路与能力,理解新知识的速度与能力,以及对对应领域是否有一定的了解,我不可能希望一个熟悉各种框架和语言,但是不知道连续信号和离散信号区别的家伙来帮我做音视频吧。
    如果招大牛的话,看github之类的就应该够了。

  37. 高亚斌 says:

    我站出来了。。。

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据