My Problem With Your Interviews

在经历了3轮电话面试且被Facebook拒绝之后,我发表了本文,但这不是出于报复心理。事实上,我几个月前就已经打算写这篇文章了。现在言归正传:技术公司(至少包括Google,Facebook,VMWare,毫无疑问还有很多)正在试图寻找最棒的技术人才。(所以他们联系我,询问是否有兴趣与他们一起“探寻工作机遇”)。但是他们如何做到这点呢?

典型的面试(比如电话面试,或者现场面试)充斥着解题过程。有些人将其称为“智力测验”。它们通常不是真实世界的问题,目的是为了核实你的算法技巧和你的计算机科学知识。简单的包括递归,二分查找,基础数据结构(链表,散列表,树)。更复杂的要求红-黑树,迪杰斯特拉(Dijkstra)算法,NP完全性(NP-completeness)知识等。如果在电话里,你在一个共享文件中写下代码。如果在现场--你在白板上写下来。因此,这些难题应该检验你的计算机科学和算法技能。不过让我们退一步从另一个角度来看这幅场景。

  • 你在这些面试里做的事情都是你从未在实际生活中做过的:你在不用编译器或调试器的条件下写代码。你在有限的时间内做这些,并且是在别人的监视下或者在线等待中进行。但是暂时把这些放一边,我们假设写无法运行的代码有助于面试。

  • 这些智力测验测试的技能都是大多数开发者从来不需要的。大多数人撰写商业软件,它并不需要红-黑树。你最近一次在商业软件中使用递归是什么时候?你最后一次完成这类事情是在大学。并且如果你是一名大一新生,其中的很多问题实际上都很简单,因为你前几天刚作为一项家庭作业把它们做完。但另一方面是,撰写即使像二分查找这样简单的事情也变得有点乏味,因为你只是昨天没有做这件事而已。当然你将会完成它,但是要花一点时间,以便你能够回忆起来,并且为了确保无误而使用编译器。(顺便说一下,facebook的面试题真的很简单。然而我没有完成得很理想的确是我的失误,也许应该归根于面试紧张,或者只是因为我过去3年来都没有做过此类事情而已。)

  • 不管怎么说,测试的技能都是在你日常工作中很少用到的。即使是在像Google和Facebook这样酷的公司里,也仍然存在相当平常的项目,譬如需要编写API代码,维护现有代码等。我不认为在你进公司的第一周会被允许微调搜索引擎,不论你在面试中表现有多棒。

  • 在这些面试之前的面试准备是建议的,甚至实际上是必需的。准确的说,面试就像一场大学考试。但这样就令人无语了--你并不希望人们针对你设定的面试标准去做准备。你希望他们都是。。。好的程序员。

  • 聚焦于这些计算机科学技能意味着这些公司可能会错失优秀的工程师,即那些仅仅不对底层细节如此感兴趣的人。

顺便说一句,这是我在第一次Facebook电话面试后的一条回复摘录:

在另一方面,我认为在面试高级开发者时涉及计算机科学一年级家庭作业题并不是一个好主意。事实上--大多数人(包括我)在大学之后就没有做过这些了,而且这看起来更像无意义的问题而不是实际编程。

以上列出的问题就是为什么我不喜欢这类面试的原因。很显然是因为我不喜欢解决这类难题。我只是不喜欢它们,它们对我毫无吸引力。你可能会争辩说,除了日常工作以外,为了持续训练算法技能你可以参加(像TopCoder之类的)编程比赛。我会介绍一段自己高中时期的经历。那时有两种学生比赛--一种就极像这种类型的编程难题--在规定时间内布置了大量这种难题,你必须提交一个覆盖了尽可能多预定义(但是你尚不知道)的测试案例的解决方案。另一个比赛是在家创建一个软件,然后当着评委会的面展示它。我在后者中是第一名,但是在前者中惨极了。为什么?因为我讨厌仅仅为了解题而去解决无用且不切实际的问题。相反我喜欢开发软件。如果我爱好它们的话,我也许会擅长解题。我只是不喜欢而已。这并没有技能的等级之分--一种是能解决复杂算法难题的人(高级),另一种无法解决的人,因此只能去开发软件(低级)。而是存在两种不同种类的技能,并且在创建优良软件的过程中它们都是有用的。一个撰写底层部分,另一个设计API,架构,部署方案,处理代码抽象。那么,回到“除了日常工作之外我现在做什么”的问题上来--我负责构建过程。我已经在几个我很喜欢的私人项目中工作过。这远远超出了我或许本应该很享受的TopCoder比赛的期望。

不幸的是这些很酷的公司主要雇用TopCoder类型的人。大概说得通的原因是,因为他们有大量的求职申请者,并且他们能够负担得起许多“错误-否定”。但是许多更小的公司采纳了这些面试惯例,也因此他们未能得到最棒的技术人才。我读过的最棒的关于软件工程师面试的文章在几周前刚刚出现。Jeff Atwood建议如何雇用一名程序员,我完全支持他的方法。

而我在面试时的问题就是他们实际上并不验证你是否能做现实的编程工作。并且很明显我的问题是我并不喜欢底层与算法之类的东西,因此我无法为像Google和Facebook这样酷的公司工作。

重要提示:我并没有说你不应该知道计算复杂度是什么,一个散列表如何工作,或者如何撰写递归。你应该知道这些,因为那是为了能够撰写优良代码所必需的基础。但是我认为对这些事情过于关注是与日常编程毫不相干的。(话说回来,如果我是一个只能用PHP写网站并且认为散列表是一种家具的彻底的蠢蛋,是不可能通过前两轮电话面试的。)

原文:My Problem With Your Interviews

iTran乐译参加活动,读好文章!