周思博:软件面试实战指南(第三版)

软件面试实战指南(第三版)

作者:周思博(Joel Spolsky),时间:2006年10月25日

翻译:崇斐,时间:2014年7月3日

@laomanong 补注:原文标题是《The Guerrilla Guide to Interviewing》,直译是“游击队的面试指南”,“游击队”是相对于“正规军”(现在大公司流行的面试方法)来说的。Joel 在第三版加上这个词,意思是说他的方法还不是主流(现在其实很多软件公司已经在用它了),但是他觉得大公司的方法弊端太多(经理面试,问脑筋急转弯问题,先入为主的印象分,忽视基本功考察,稀里糊涂地聘用等),所以不容易招聘到优秀的人才。

以下是正文。


一支由无政府主义者、自由恋爱提倡者和香蕉权利煽动者组成的杂牌军,将爱之船从巴亚尔塔港劫持走了,并且威胁说,除非满足他们的要求,否则这艘载有616名乘客和327名成员的船只将在七天后沉没。要求是什么?一百万没有做过标记的的小额美钞和WATFIV[1]的GPL实现,也就是指,著名的WATFIV编译器。(令人惊讶的是,这些自由恋爱者居然只能找到这么点与香蕉权利煽动者达成一致的东西。)

作为嘉年华航运公司的首席程序员,你必须确认你能否从零开始,在七天内开发出一款Fortran编译器。你有两名程序员下属来协助你。

你能做到吗?

interviewing1

“嗯,我觉得,这取决于……”你答道。写这种文章的好处之一,就是我可以随意编造你的发言,而你却拿我没办法。

取决于什么?

“呃,我的团队能够使用UML生成工具吗?”

这真的很重要吗?三个程序员,七天时间,完成WATFIV。UML工具就一定能搞定吗?

“恐怕不行。”

好吧,那么,靠什么来完成呢?

“我们能有19寸显示器吗?能随便喝Jolt可乐[2]吗?”

老样子,这真的很重要吗?难道你做不做得到是靠咖啡因来决定吗?

“呃,看来也不行。哦,等等,你说我有两名程序员下属?”

没错。

“他们是谁?”

这真的很重要吗?

“当然!如果团队相处不和谐,我们就没办法共事。我知道有几个超级程序员能够用一周时间独立完成Fortran编译器,但绝大多数家伙花上六个月都没法写出一个显示启动标志的程序。”

看来我们终于搞明白一些问题了!所有人都会说,人员是软件项目中最重要的一部分,但没人能真正确定要做些什么。如果你想拥有优秀的程序员,第一要务就是聘用合适的人才,这也意味着你必须能够发现谁才是最适合的,而这通常是在面试中完成的。所以这篇文章讲的全都是与面试有关的内容。

(现场面试仅仅是招聘程序的一个环节,整个程序从筛选简历电话面试开始。这篇文章只涵盖现场面试的内容。)

interviewing2

对于每一个应聘者,你应该准备至少六名面试官,其中包括至少五名会与他共事的人(这指的是其他程序员,而不是经理)。你知道那种对于应聘者只有简陋的经理面试,并仅仅以此做出决定的公司吗?这些公司不会拥有优秀的员工。要在一轮面试中蒙混过关实在太容易了,尤其是由非程序员面试程序员的时候。

即使在六名面试官中只有两名认为应聘者不值得聘用,也不要聘用他们。这意味着你在面对不需要聘用的人时,可以技术性的在两轮面试后就结束“整天”的面试,这并不是坏事,但为了避免过于残忍,最好提前告诉应聘者面试次数。我听说有些公司允许任何面试官刷掉应聘者。我觉得这太过头了;我可能会让任何资深员工刷掉面试者,但并不会只因为一名新来的员工不喜欢就否决掉。

不要尝试同时面试一群人,这并不公平。每轮面试应该由一名面试官和一名应聘者组成,在一间有一块白板并且关着门的房间里进行。基于丰富的经验,我可以告诉你,如果一场面试中花费不到一个小时,那么你是无法做出决定的。

在你的面试过程中,你会见到三种类型的人。天平的一端是无知的大众,他们缺乏这项工作所需的大部分基础能力。这些人很容易被发现并且淘汰掉,通常只需提两三个小问题即可。天平的另一端是睿智聪慧的超级明星,他们可以为了好玩,就用NDS的汇编语言在一个周末内写出Lisp编译器。而在两者中间,有大量的似乎可以做出贡献的“可能人选”。窍门就在于找出超级明星和可能人士间的差别,因为秘诀在于你并不想聘用任何一名可能人选。绝不。

在面试的结尾,你需要准备对应聘者做出一个明确的决定。这个决定只有两种结果:聘用或者不聘用。没有其他可能的答案。绝对不要说:“聘用他,但别把他放在我的团队里。”这很粗鲁,并且暗示着对方并没有聪明到能和你共事,但对于其他团队的笨蛋来说可能已经足够聪明了。如果你发现你打算说:“聘用他,但别把他放在我的团队里”,那么直接翻译为“不聘用”就行了。即使你发现某个应聘者足够胜任你特定的工作,但不适合其他团队,那也是“不聘用”。在软件行业,事情变化得太频繁也太迅速,你需要能够胜任你交给他们的任何编程工作的人。如果因为某些原因,你发现了一名非常非常非常擅长SQL,但完全学不会哪怕任何其他东西的白痴专家,不聘用,否则你就是在用长痛换短痛。

绝对不要说“或许吧,我说不准。”如果你说不准,那意味着“不聘用”。这比你想象得容易。说不准?那就说不!如果你犹豫不决,那意味着“不聘用”。绝对不要说,“呃,我觉得,还是聘用他吧,不过我对此有一点担心……”这也意味着“不聘用”。把所有不确定的情况都机械式地翻译为“不”,就没问题了。

interviewing3

为什么我那么固执呢?因为拒绝一个好人选比聘用一个差人选要好太多了。一个差人选会耗费掉大量的金钱和精力,并且让其他人浪费时间来给他们擦屁股。开除你错误聘用的人得花上好几个月,并且会相当地困难,尤其是他们想和你对簿公堂时。在某些情况下可能完全无法开除任何人。糟糕的员工会破坏优秀员工的士气。并且他们可能是糟糕的程序员但同时却又是个很好的家伙,或者他们的确需要这份工作,所以你不忍心开除他们,否者就会犯了众怒,或者可能是其他任何窘境。总之是糟透了。

从另一方面说,如果你拒绝了一个好的人选,我是说,我觉得有些地方并不公平,但是,嘿,如果他们的确那么聪明,那不用担心,他们会有很多好的工作机会的。不用担心你会因为拒绝太多的人选而找不到人用。在面试过程中,这并不是你的问题。当然,找到优秀的人选是很重要的。但是当你实际面试一个人的时候,要假设还有900人在门外排队等着面试。不管优秀的人选看起来是多么难找到,都不要降低你的标准。

好吧,我还没有告诉你最重要的部分——你如何确定是否该聘用某人?

原则上很简单。你要找的人必须

聪明,并且

能做事(get things done)

就这样。这就是你需要的。记住这些,每天晚上睡觉前都背诵一遍。在简短的面试中你并没有足够的时间来发现更多东西,所以不要浪费时间来尝试了解应聘者滞留在机场时是否保持愉快,或者是真的懂ATL和COM编程还是假装的。

那些聪明但是不做事的人通常都有博士学位,并且在大公司工作,但因为太脱离现实,公司里没人会理他们。与其准时完成工作,他们更喜欢反复思索某个问题中的学术内容。这种人很容易辨别,因为他们喜欢指出两个南辕北辙的观点之间纯理论性的相似点。举个例子,他们会说,“电子表格只是编程语言的一个特例”,然后花一周时间写出一份华丽的白皮书,来阐述电子表格作为一门编程语言时的体现出的计算机语言特性。很聪明,但没什么用。另一种鉴定这些人的方法是,当你正准备发布beta版的那一天,他们常常会端着咖啡杯出现在你的办公室,想和你进行一场关于JAVA内省与COM类库之间优劣性的漫长对话。

那些能做事但是不聪明的人会做出一些蠢事,就好像不经过大脑一样,于是其他人就得来帮他们擦屁股。这让他们成为公司的净负债,因为他们不但没能做出贡献,反而浪费了优秀员工的时间。这种家伙会用他们在前一个晚上刚读到的访问者模式,而且还是完全理解错误的,来重构你的核心算法,用AdderVistior类(没错,还有拼写错误)和VisitationArrangingOfficer单例来代替使用简单的循环完成的数组累加操作,然后你会发现你的代码再也跑不动了。

interviewing4

你该如何在一场面试中发现聪明人?第一个标志就是你不用反复进行解释。你们的交谈会很流畅。聪明的应聘者经常会说出一些有见地、有想法、或者很敏锐的观点。因此面试的重点之一就在于创造一个能让人展示他们有多聪明的情景。最差劲的面试官则是吹牛大王。这种家伙从头到尾都喋喋不休,让应聘者只来得及说,“没错,简直太对了,我发自内心地认同你的想法。”吹牛大王可能聘用任何人——他们认为应聘者一定很聪明,因为“英雄所见略同!”

第二差的面试官是益智问答者。这种家伙认为聪明意味着“知道许多东西”。他们会问一大堆琐碎的编程问题,答对了就能得分。举个搞笑的例子,这有一个世界上最烂的面试题:“在Oracle 8i里,varchar和varchar2有什么区别?”这个问题简直糟透了。知道这种鸡毛蒜皮的人和你想要的人之间根本没任何关联。谁在乎有什么区别?你花十五秒时间就能在网上找到答案!记住,聪明并不意味着“知道琐碎问题的答案”。总而言之,软件团队需要的是有才华的,而不是只有特定技能的人。任何能够带到工作中的技能都会从技术层面上在数年内被淘汰掉,所以,最好聘用那些能学会任何新技术的人,而不是那些刚好在现在知道怎么用JDBC连接MySQL数据库的人。

但大体上说,尽可能了解一个人的办法就是让他们说话。向他们提一些开放性的问答题和解答题。

那么,你会问些什么?

我的个人面试题库源自于我在微软的第一份工作。事实上微软著名的面试问题有成百上千。任何人都有一套他们自己喜欢的题集。你,同样的,也能发展出一套自己的题集和面试风格,来帮你作出聘用/不聘用的决定。下面是一些我成功使用过的技巧。

在面试之前,我会通读一遍应聘者的简历,并且在一张纸片上简略地记录面试计划,这是一系列我打算问的问题。下面是一份程序员面试的典型计划:

  1. 个人简介
  2. 关于应聘者最近从事的项目的问题
  3. 简单的编程问题
  4. 指针/递归问题
  5. 你对此是否满意?
  6. 你还有其他问题吗?

我尽可能地避免对面试者产生先入为主的观念。如果你仅仅因为一个人是麻省理工的博士,在面试开始前就认为他很聪明,那么不管他们接下来一小时内说了些什么,都改变不了你一开始的偏见。如果你因为他们读的是社区大学就觉得他们头脑简单,那么不管他们说什么都没办法改变这个第一印象。面试就像是一架非常非常精密的天平——很难基于一小时的面试来评判某人,这简直是千钧一发。但如果你事先对应聘者有一点点的了解,这就像是在天平一侧加了一大颗砝码,那么面试就白做了。曾经有一次,招聘专员在面试前来到我的办公室,说:“你会喜欢这家伙的。”这简直让我抓狂。我当时应该说:“好吧,如果你那么确定我会喜欢他,为什么不直接聘用他,这样我就不用浪费时间来进行面试了。”但我当时太年轻也太天真了,所以我还是去面试了。当他说了些不太聪明的东西时,我告诉自己,“哎呀,人都是会犯错的嘛。”我带着有色眼镜来看待他所说的一切。尽管他是个蹩脚的家伙,最后我还是说,聘用。你知道吗?其他面试他的人都说,不聘用。所以:不要听招聘专员说的话;不要在面试之前打听应聘者的情况;并且,在你们都独自做出决定之前,绝对不要和其他面试官谈论应聘者。这就是科学的思想。

interviewing5

面试的自我介绍阶段是为了让应聘者放松。我会问他们是否在飞机上感觉好吗。我会花大约30秒来告诉他我是谁,还有这场面试会如何进行。我总会再三向应聘者保证,我们只对他们解决问题的方式感兴趣,而不是实际的答案。

第二阶段是关于应聘者最近从事的项目的问题。比如面试大学生时,就问他们的学位论文(如果有的话),否则就问他们曾经参与过大规模作业,并且乐在其中的课程。比如说,有时我会问:“你上学期学的课程中最喜欢哪门?不一定需要与电脑有关。”而当面试有工作经验的人时,你可以谈一谈他们上一份工作中最后的任务。

同样的,问一些开放性的问题,坐下来慢慢聆听,偶尔当他们要停下来时说一句“多告诉我一些东西”就行了。

在开放性问题中你应该关注什么呢?

首先:寻找热情。聪明人总是对他们的工作充满热情。他们谈论到这些课题时会非常兴奋。他们的语速会加快,整个人生机勃勃。强烈的负面信息也是个好兆头:“我的上一个老板只会用VAX电脑,所以他要求所有东西都在上面做。真是个蠢货!”有太多的人只是在工作,但并不关心怎么去做。这种人很难对任何事情提起兴趣。

糟糕的应聘者对面试并不在意,在面试时也毫无热情。应聘者对某件事充满热情的征兆是,当他们谈到这件事时,会暂时忘记他们正在面试中。有些应聘者一开始会因为在面试而非常紧张——这很正常,当然,所以我总是忽略掉它。但接下来当你和他们谈到单色计算艺术时,他们会变的非常兴奋,并且一点都不紧张了。很好,我喜欢这样热情的家伙,因为他们关注于他们所做的事(想看看什么是单色计算艺术的话,拔掉显示器电源就行了)。你可以在某些事上质疑他们(试试吧——等他们谈到一些可能是对的事,你就说“那不可能是对的”),然后他们会尝试辩解,即使在五分钟前满头大汗,因为他们是如此的投入以至于忘了你即将决定他们的命运。

其次:优秀的应聘者会在所有层面上都仔细地把事情解释清楚。我曾经刷掉了一些应聘者,因为他们在谈到上一个项目时,没法用常人能理解的方式来说明它。计算机专业的人经常会认为所有人都知道什么是贝叶斯法则或者O(log n)。如果他们开始这样干了,尽快打断他们,然后说:“能不能麻烦你,仅仅是练习一下,用我祖母能听懂的话来解释下这东西?”这时候许多人依旧会使用专业术语来描述,让人完全无法听懂。停!你基本上不会想聘用他们了,因为他们不够聪明,不明白如何让他人理解他们的想法。

再者:如果应聘者做的是团队项目,寻找他们担任领导角色的迹象。应聘者可能会说:“我们在做X,但老板要的是Y而客户要的是Z。”我会问:“那么你做了什么?”好的答案可能会是:“我联合其他组员一起写了一份提案……”而坏的答案可能会是:“呃,我什么都做不了。这情况根本无解。”记住,聪明并且能做事。要知道一个人是否能做事的唯一途径,就是看他们过去是否曾经打算把事情做完。实际上,你可以直接要求他们给你一个例子,说明他们过去曾经扮演领导角色并且把事情完成——比如说,克服某些制度惰性。

interviewing6

不过,面试中的绝大部分时间,应该用来让应聘者证明他们能够写代码。

再次向应聘者说明,你知道不用编辑器写代码是很难的,你会不介意他们把白板涂得乱七八糟。同样你得明白不使用编译器时很难写出没有bug的程序,这些问题你都得考虑进去。

在每天的第一场面试里,我曾经在一开始问一个非常非常简单的编程问题。在dotcom的热潮时期,我不得不开始这样做,因为那时有太多人认为HTML就是“编程”,然后就跑来面试,而我就需要个办法来避免在他们身上浪费太多时间。这是一些任何在任的程序猿都能在一分钟内解决的问题。举些例子:

  1. 写一个函数来判断一个字符串是否以大写字母A-Z开头
  2. 写一个函数来计算给出半径的圆的面积
  3. 将一个数列中的值求和

这些入门级的问题似乎太简单了,所以当我头一次提问时,我承认我的确以为所有人都能顺利回答。我发现虽然所有人都解出了问题,但他们花的时间却差别很大。

这让我想起了为何我不能通过证券交易来维生。

Jared是名证券交易员。他总和我谈起他做的有趣的交易。有种东西叫做期权,然后有认购期权、认沽期权和市场陡峭,因此你需要在陡峭化交易时购入,这一切令人费解,但不可思议的是我居然都知道这些词语的意思,我知道看跌期权的意思(将东西按照一定价格卖出的权利,而不是义务),并且如果你拥有看跌期权而股市上涨,我能在三分钟内看出会发生什么,但需要整整三分钟来确认。而当他告诉我一个更复杂的故事,其中看跌期权只是第一步,故事中还有更多别的部分时,我很快就乱掉了,因为我已经想不过来了(“让我们来想想看,股市上涨,这意味着利率下降,而看跌期权是卖出东西的权利……”),直到他拿出图表来向我演练才搞明白。于是我目光呆滞,并且非常难过。虽然我明白任何一个环节,但我不能迅速地了解整体。

在编程中同样有相同的情况。如果基础概念并没有简单到让你不假思索,你就无法进行整体的思考。

Serge Lang,耶鲁大学的数学教授,习惯在微积分的第一堂课里给他的学生出一道相当简单的数学题,简单到几乎所有人都会做,但有的人做得和写字一样快,而其他人的纸上却一片空白。然后Lang教授宣布,那些解题和写字一样快的学生能够在微积分课程中拿到A,其他人则不行。求解一道简单代数题的速度可以准确的预测他们微积分的最终成绩,这相当于整个学期的作业、测试、期中考和期末考的效果。

你看,如果你不能以100英里每小时的速度飙过简单的东西,你就没办法更上层楼。

但就像我所说的,优秀的程序员会站起来,在白板上写下答案,有时还会加上些奇思妙想(噢!Unicode标准!漂亮!),这只花了三十秒,现在我得看看他们是否真的优秀,所以我拿出了大家伙:递归和指针。

interviewing7

15年的面试经验让我坚信,最优秀的程序员能够轻松地同时处理多个抽象层次。在程序设计中,具体意思是他们能毫无压力地解决递归问题(这需要你同时考虑到堆栈调用中的多个层次)或者复杂的指针算法(对象的地址就像是对象本身的抽象表示)。

我终于意识到理解C语言的指针不是一门技能,而是一种才华。在计算机科学的第一年课程中,学期开始时总是有大约200个孩子,曾经在四岁时就用BASIC在他们的电脑上写过复杂的冒险游戏。他们在大学里很轻松地学习着C和Pascal,直到某一天教授讲到了指针,然后突然间他们学不会了。他们再也搞不懂任何东西。90%的人会退出并且改修政治学,然后他们会告诉朋友因为计算机科学课里,好看的异性太少了,所以他们才换了专业。不知为何,大多数人看起来天生就缺乏能够理解指针的脑回路。指针需要一种复杂的双重间接思考模式,而有的人就是做不到,但对于优秀的程序设计来说却是非常关键的。许多“脚本高手”从复制JavaScript片段到他们的网站而开始了解编程,然后开始学习Perl并且从来没了解过指针,而他们永远没办法写出你需要的高质量代码。

这就是所有你听说过的这些著名的面试问题的根源,比如“反转一个链表”或者“在一个树形结构中寻找回路”。

令人悲哀的是,尽管我认为所有优秀的程序员都应该能够处理递归和指针,并且这是辨别某人是否是优秀程序员的很好的办法,但事实是在如今,编程语言已经几乎不再需要这种技艺了。在十年前,很少有计算机科学的学生在没学过递归和函数式编程,以及C或者Pascal的数据结构时就能够毕业,而如今很可能许多名校都只教Java了

如今你可能面试到的许多程序员,都会认为递归、指针,甚至数据结构,都只是低级的实现细节,而这些在如今的许多令人幸福的编程语言中已经被抽象化掉了。“你上次写排序算法都是什么时候的事了?”他们窃笑着说。

但是,我还是不在乎。即使我的急救医生只需要把电子式心脏除颤器放在我的胸膛上,然后按下大大的红色按钮,我依然希望她懂得解剖学。我也希望程序员懂得深入到CPU层次进行编程,即使Ruby on Rails能够理解你的想法,然后点三下鼠标就能架设起完整的Web 2.0社交网站。

interviewing8

即使从表面上看,面试的形式只是让应聘者在白板上写代码,但我真正的目的是对此进行讨论。“你为什么要那样做?”“你的算法的效率怎样?”“你有没有忘了些什么?”“你程序的bug在哪里?”

这意味着我并不担心我给出的编程问题太过困难。只要应聘者有机会开始解答,我很乐意一路上提供一些小小的线索,或者说小小的踏脚石吧。我会让一个人,比如说,将一个三角形映射到一个平面上,这是个典型的图形学问题,我也不介意提示一下三角函数(SOH-CAH-TOA[3],嘿活计!)。而当我让他们快一点时,我会稍微提醒下他们用查表法。注意,这些我很乐意提供的提示,仅仅只是琐碎问题的答案——那些你用Google就能找到的东西。

难免的,你会在他们的函数里找到bug。所以我们就来到了面试计划中的第五个问题:“你对这份代码满意吗?”你也许会想问:“好吧,知道bug在哪儿吗?”这是典型的糟透的开放性问题。所有程序员都会犯错,这没啥问题,他们只需要能找出错误。使用C的字符串函数时,绝大多数大学生都会忘了给新字符串加上结尾。使用大多数函数时,他们经常会出现差一错误。有时他们还会忘了写分号。他们的函数处理0长度字符串时跑不对,或者会当内存分配失败时产生GPF错误……只有在很稀有的情况下,你能遇到一名一次写完就没任何bug的应聘者。这种情况下,问题就更有趣了。当你说,“代码里有一个bug”,他们会仔细地重审一遍代码,然后你就能看到他们是否能圆滑地说明这份代码没任何问题。

面试的最后一个环节,是询问应聘者他们是否有什么其他问题。记住,即使是你在面试他们,一个优秀的应聘者依旧拥有许多工作机会来选择,他们也在用这一天来确认是否愿意与你共事。

有的面试官尝试用面试者问的问题是否“智慧”来进行判断。从个人来说,我并不在意他们会问些什么,因为这时我已经作出了决定。麻烦之处在于,应聘者在一天内得面对五到六个面试官,所以很难让他们给出五到六个不重复的,而且有见地的问题,所以即使他们没任何问题,也没关系。

我总会在面试结尾留出大约五分钟时间来向应聘者推销这家公司和这份岗位。即使你不打算雇用对方,这也还是很重要。如果你有幸找到了一个非常优秀的人选,在这时你会尽你所能地确保对方愿意来与你共事。即使对方是个糟糕的人选,你依旧希望对方喜欢你的公司并且带着好的印象离开。

啊,我才想到我应该多给你一些糟糕问题的例子。

首先,回避违法的问题。在美国,在面试时询问任何有关于种族、信仰、性别、民族血统、年龄、兵役义务、兵役状况、性取向或者身体缺陷的问题都是违法的。如果简历上写到对方曾经是海军陆战队,即使你想闲聊地问对方是否去过伊拉克,也是不允许的——针对兵役状况的差别对待是违法的。如果简历上写到对方在海法就读过以色列理工学院,即使在闲聊时也不能问他们是否是以色列人,即使你只是因为你妻子是以色列人而想聊一聊,或者因为你爱吃炸豆丸子[4]——针对民族血统的差别待遇也是违法的。

然后,回避任何会让人觉得你会在意,或者会差别对待的问题,尽管你对这些东西并不在意也不会有差别对待。我能想到的最好的例子是问某人有没有孩子或者有没有结婚。这可能会给人一种印象,觉得你认为有小孩的人没法在工作上投入足够的时间,或者会跑去请产假。基本上,只问那些与对方应聘的工作完全相关的问题就行了。

最后,回避脑筋急转弯,比如用6根同样长度的棍子搭出4个相同的等边三角形。或者其他的包含海盗、弹珠和密码的题目。这些大多是“原来如此!”的问题——知道就会不知道就不会。对于这些问题,答得出来只代表你听说过这些脑筋急转弯。所以作为一名面试官,通过判断对方是否灵机一动,你并不能得知对方是否“聪明/能做事”。

(编注:推荐阅读:《Google承认那些臭名昭著的智力题对其招聘毫无用处》 ,还有 37 Signals David 的这篇《为什么我们不用智力题来面试程序员?》)

过去,我曾经用过“不可能的问题”,也就是所谓的“模糊问题[5]”。典型的例子就是“西雅图有多少个钢琴调音师?”应聘者并不知道答案,但聪明的人不会放弃,他们会很乐意去尝试,并且估算出合理的数字给你。让我们想想看,西雅图大概会有……一百万人吧?那么也许1%的人有钢琴?然后每架钢琴每隔几年就得调一次音吧?然后大概需要35分钟来调音?当然咯,全都错了,但至少他们在攻克这个问题。“好吧,35分钟,但是在不同钢琴间移动需要花掉多少时间呢?”

“很好地切入点。如果钢琴调音师能提前预约好时间,那么他们也许能安排好计划来尽可能减少交通时间。你懂的,是一起把Redmond的所有钢琴搞定,而不是一天中在520公路来来回回跑三趟。”

一个好的模糊问题能让你和应聘者进行讨论,来帮你评判对方是否聪明。一个糟糕的“原来如此!”海盗问题通常只会让应聘者盯着你一阵子然后说他们被难倒了。

如果,在面试的结尾,你确认这个家伙足够聪明并且能做事,并且其他四个或者五个面试官也同意,那么你录取对方应该没什么问题。但如果你有任何的疑问,那最好等等看是否有更好的人选。

决定是否聘用应聘者的最佳时机是在面试结束后的三分钟左右。太多的公司允许面试官等到几天甚至几周后才提交反馈信息。不幸的是,时间过得越久,你记住的东西就越少。

我会让面试官在面试之后马上写下反馈意见,不管是“雇用”还是“不雇用”,并且附上一两段说明。截止时间是面试结束后15分钟。

如果你无法作出决定,有一个很简单的方法。不雇用。不雇用你不确定的人就行。这在头几次会有点让人头疼——如果我们再也找不到优秀人选了怎么办?没问题的。只要你的简历筛选和电话面试进行得不错,在现场面试中大概会有20%的录取率。然后当你遇到了聪明的,能做事的人选,你会知道的。如果某人不能令你感到兴奋,那就找下一个吧。


[1]WATFIV Waterloo FORTRAN IV WIKI

[2]Jolt可乐 一种程序员很爱喝的咖啡饮料 WIKI

[3]SOH-CAH-TOA 西方背诵三角函数的口诀:

Sine(正弦)=Opposite(对边)/Hypotenuse(斜边)

Cosine(余弦)=Adjacent(邻边)/Hypotenuse(斜边)

Tangent(正切)=Opposite(对边)/Adjacent(邻边)

[4]炸豆丸子 中东一带的料理,也译作中东蔬菜球、油炸鹰嘴豆饼、沙拉三明治 WIKI

[5]back of the envelope 信封背面打草稿,引申为不正式、不精确,此处译为模糊的


想知道更多东西吗?你正在阅读Joel on Software,这里年复一年地发布一些关于软件开发、软件团队管理、用户界面设计、经营成功的软件公司和有关橡胶鸭子的疯言疯语。

关于作者。我是Joel SpolskyFog Creek Software的共同创始人之一,这是一家坐落在纽约的能够给予程序员优良待遇的同时仍能保持利润丰厚的公司。程序员拥有独立办公室,免费午餐,每周工作40小时。客户只需要为喜欢的软件付款。我们创造了Trello,超级轻量级的项目管理平台;FogBugz,启发式的缺陷管理软件,为了帮助优秀的团队开发卓越的软件而设计;以及Kiln,让资源控制更简易。我也是Stack Exchange的共同创始人之一以及CEO。更多关于我的信息

2 收藏 评论

关于作者:诸葛不亮

若夫乘天地之正,而御六气之辩,以游于无穷,是为逍遥 (新浪微博:<a href="http://weibo.com/pkuxkxzgbl">@诸葛不亮_闭关苦修</a>) 个人主页 · 我的文章 · 14 ·  

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部