2007年9月3日星期一

谈谈Google的面试

谈谈Google的面试
王咏刚

去年做了不少面试(据说自己的面试次数在Google全球都是排在前列的,有点儿不敢相信),也参加了好几次校园招聘之类的活动,体会总或多或少有一些。也许可以给大家分享一些不涉及公司秘密的东西,一来让大家了解Google为什么聚集了这么多出色的技术人才,二来也可以让那些投简历的朋友在心理上准备得更充分一些——说实话,的确有些应聘者是因为对Google招聘流,还有面试要求不太适应,而没有展现出自己应有的水平的。

毫无疑问,Google在最近几年里一直是世界顶尖技术人才的聚集地。远的不说,在Google中国,我们身边就有ACM世界冠军,奥赛金牌得主,以及若干知名技术公司的前CTO。但这并不是说Google招的全都是那些拥有偌大的名头或来历的牛人,我觉得,只要有真本事,进Google并不像想象中那么难。

关于招聘流程,其实开复在《与未来同行》那本书的第185页已经讲得非常清楚了,不外乎是下面几个主要的步骤:

1. 筛选简历
2. 电话面试或笔试
3. 若干轮面试
4. “招聘小组”讨论
5. “副总裁小组”最后复核
6. 发录用通知,签合同

筛选简历似乎和其他公司没有什么本质的不同。我经常会在内部系统中收到招聘团队转来的,要我帮忙看一看并给出建议的简历。在国内,大多数人的简历都会有中英文两份。只要有中文简历,我一般就只看中文内容了。但许多从美国来的同事就会优先看英文简历。所以,投简历时中英文简历要尽量一致。

看应届毕业生的简历和看有工作经验的应聘者的简历是大不相同的。

对于前者,说心里话,有区分度的信息通常不会很多,不外乎学习成绩、论文或著述(如果有的话)、实践项目(如果有的话)、竞赛成绩(如果有的话)等少数几项,至于自己说自己精通某某,熟悉某某,这个东西水分多少很难讲,反正我一般是权当参考的。所以,对应届毕业生更常见的做法是在学校或公司举行笔试,看笔试情况来决定谁可以进入下面的流程。

但对于有工作经验的人,简历就非常非常重要了,因为你可以很容易地利用各种信息,从两份简历中比较出应聘者的实力差异(当然不是绝对准确的,因为还要考虑某些人更善于包装自己的因素)。在写简历的时候,大家其实可以设身处地地想一想,如果你在审阅一份这样的简历:应聘者声称自己精通某某平台,某某技术或某某语言,但又举不出足够有说服力的证据;声称自己在前公司做过项目经理、研发部经理等关键职位,但又无法清楚地描述自己在关键职位上有什么样的表现;声称自己做过N多项目,但又举不出一个有技术含量,或是可以体现自己价值的……你会给他或她进入后续流程的机会吗?

电话面试是一件很有趣也很容易惹来争议的事情。至少我自己觉得,虽然电话面试可以省些时间,但的确比较难于全面了解一个人,不像面对面的面试那样有现场感,也没有直接交流时的各种便利——比如,可以从对方眼神、表情中发现他的许多特点。具体到技术面试上来说,电话面试让对方写代码是比较难的,据我所知,有的面试官的确会让对方写一段简短的代码,然后在电话中念出来。这个方法是不是真的有效,的确很难讲。但同时,我个人认为,电话面试有一个最大的优点,就是可以更容易地考察对方的语言交流能力:因为电话上的沟通不如面对面那么方便,在电话面试中你可以很容易地看到对方是如何利用这个“有限信道”来向你传递信息的。能够在电话面试中清楚、明白地展示自身优势的人,至少在语言交流方面都不会有什么问题。——顺便强调一下,交流和沟通能力对于现代软件开发来说,实在是太重要了。

笔试主要是在招聘应届毕业生或实习生的时候使用,去年Google在好几所高校都做过比较大规模的笔试。那些笔试题目中,有一小部分是我出的,所以了解一些情况。和有些公司强调思维灵活性的智力题不一样,Google的笔试题最最重视的学生在CS 专业上的基本功和灵活运用基础知识解决问题的能力。去年用在校园招聘的笔试题有许多套,大多都分为选择题和编码或算法题两个部分。做过这些题目的同学应该比较清楚:选择题考察的不外是对CS基础课、专业课的掌握情况,可能会涉及数学、逻辑、计算机原理、数据结构、算法、编译原理、操作系统等方面;而编码或算法题考察的则是编程的基本功力(比如对语法要素的正确使用,代码的可读性等等)和灵活运用算法知识解决具体问题的能力(比如算法的选择,算法的优化程度等等)。

其实,出笔试题是一件苦差事。要想得到逻辑上没有漏洞,适于CS或相关专业的学生解答,易于上手,又有一定区分度的题目,实在是太难太难了。每套笔试题都要花费工程师许多精力,出完了题目,还要更多工程师来把关,看有没有漏洞。即便如此,去年用在高校的笔试题里还是存在少数表达含混或者逻辑上有漏洞的情况——在提高笔试题质量方面,我们还得继续努力。

若干轮的现场面试是应聘者必须经历的,最有挑战性的,也最能影响面试结果的环节。Google对人才的要求向来都很高,这种要求也主要体现在现场面试的环节中。一个应聘者在若干轮的现场面试中,可能要面对的是有不同技术背景或技术特长的面试官,每个面试官所考察的重点也可能各有侧重,每个面试官也都有自己喜欢的提问方法和面试题目。达不到标准的人要想在Google的若干轮面试中“蒙混过关”,概率应该是接近于零的吧。

许多人都想知道Google在面试中最看重的是应聘者哪方面的能力。我记得在去年在校园宣讲中曾反复强调过:仅从专业角度上说,Google会要求一个应聘者既具有扎实的CS基本功,也拥有灵活的思维方式和解决新问题的能力。当然,专业以外的东西,比如真诚、坦率,比如交流能力,对职业的正确态度等等,有时比专业能力更重要。

因为每个面试官有每个面试官的特点,不大好介绍和评价其他同事的面试方法。我自己在面试时,一般喜欢先考察一个偏重基本功的题目,然后再考察一个偏重思维灵活性的问题。我还有一个倾向,可能也是某些应聘者比较担心的,就是边聊边问,根据应聘者的自我介绍,提最有针对性的问题。比方说,对方讲,自己有五年的C语言编程经验,精通(老实说,面试多了,对 “精通”这个词就非常敏感,总觉得这个词背后是有无数玄机的)C语言,那我多半就会立即考察一下对方对C语言指针或函数调用的掌握程度;如果对方说自己精通的其实是JavaScript语言,那我自然会渴望知道,对方是不是真的清楚,JavaScript作为一种动态语言或脚本语言有哪些与众不同的语法特点;如果对方说自己对J2EE平台和流行的框架非常熟悉,那我一般会先从最基本的面向对象设计以及最基本Java对象模型开始问起;如果对方说自己有丰富的软件设计经验,那我这里有好几个并不一定真正存在的软件需求,需要对方画出系统架构的设计图来。

面试时现场写代码或现场设计算法几乎是一定会发生的事情。拿我来说,对方写代码时直接敲在电脑上或是写在纸上,选用什么样的语言,或者使用什么样的代码风格,其实都是无所谓的。我最最关心的是应聘者对编程序这件再普通不过的事情的理解程度。一般说来,只要时间允许,我都会和应聘者一起,逐行讨论他刚写出的代码,比如函数接口设计是否合理,有没有其他的设计方式,变量类型的选择是否合适,代码运行时的时间或空间开销是否太大,代码中两个看上去相似的片段是否可以合并,等等等等。如果是现场设计算法,那我一般会要求对方在纸上用最直观的图示把他的算法思路表现出来——这多半是因为我的脑子比较慢,如果对方不能描述得非常清楚的话,我很难判断他的答案究竟是不是正确。一般说来,Google经常使用的面试题目都可以从不同的角度入手来解答,出色的应聘者还经常能想出面试官从未见过,又完全正确的新答案来。所以,做面试官也要开动脑筋,判断对方的答案哪一步正确,哪一步有问题。几场面试下来,面试官也要消耗许多脑力和体力的。

面试结束后,面试官要写面试报告,而且要用英文来写。写报告会占用不少时间,我自己的英文并不熟练,一个45分钟左右的面试结束后,就多半要花20到30分钟来写报告。不过一年下来,写面试报告倒成了自己提高英文写作能力的一个重要练习项目,也算是对付出的这许多时间的一种回报吧。

正如开复在书中所介绍的那样,所有面试报告都要送到“招聘小组”和“副总裁”小组评审。一个应聘者是否能加入Google,就要看这两次评审的结果了。

先大概介绍到这里吧,其他相关的感想以后再续。对了,忘了提一点,Google中国招聘的技术职位并非只有软件工程师一种(参见http://www.google.cn/jobs/),上面讲的不少要求是针对软件工程师的。其他技术职位在对应聘者能力的要求方面各有差异,面试时的侧重点也不尽相同。比如下面两个特定领域的研发职位(顺便在这里贴一下广告,呵呵):

移动和无线应用工程师:http://www.google.cn/support/jobs/bin/answer.py?answer=57922
Linux/开源软件研发工程师:http://www.google.cn/support/jobs/bin/answer.py?answer=55003

没有评论: