面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!

时间:2021-05-01 16:45:02

 

这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书。”                                                                                                                                  ——《程序员》技术主编孟岩

 按:

刚参加了一场春季大型人才招聘会,坐在招聘台上,看到一张张年轻稚嫩的面孔带着焦急带着憧憬,四处投放着自己或简陋或精致的简历,有点遗憾自己年轻的时候没赶上这个需要自己对自己完全负责的时代,没有品尝过投递简历的滋味。但实际上,我和大家一样,都在接受着市场的检验,投简历只是接受市场检验的一件事。

企业需要什么样的人才,人才需要通过怎样的途径了解企业,双向的需求如何能更好地沟通,能彼此对上眼儿,是博文视点出版这本《编程之美——微软技术面试心得》的初衷。但这本书的阅读价值,又岂只在传授“微软面经”,那,还有什么值得看的呢,作为本书的策划编辑,我会在自己的博客上陆续连载一些这本书书里书外的内容,请有心的读者慢慢会领悟作者们写这本书的深意。

另,微软亚洲研究院3月1日为《编程之美——微软技术面试心得》开通了一个专门的网页,会把书中的题目陆续放在上面供读者们比武PK。

***********************************************

自计算机与软件出现以来,在近半个世纪里,软件开发所能衍生出的无限创意,深深吸引着全世界的青年。在二进制的世界里,这帮年轻的程序员充分发挥自己的热情和想像力,仅仅通过对“1”和“0”的互换操作,他们辟地开天,恣意汪洋地创造出一个又一个的奇迹。今天,前几代“青年”积累构建的虚拟世界正在深刻地改变我们的现实生活。软件开发过程的复杂程度已经足以媲美传统的工业生产。前人堆积如山的开发经验和规则,令象牙塔里的学子们望而生畏。今天软件学院的学生们站在巨人的肩膀上,用最流行的语言和工具武装到了牙齿,但似乎缺少了前辈们的热情,也忘记了编程的乐趣所在——发现问题,分析问题,解决问题,寻找更优的解法,总结规律,抽象出算法的过程以及由此产生的成就感。本书收集了大约60道微软技术面试题,作者试图通过书中妙趣横生的问题和详细的解说以及面试者的各种小故事,告诉读者微软需要什么样的技术人才,重视什么样的能力,如何甄别人才。但它更深层的意义在于引导读者思考,帮助读者重拾通过编程探索未知世界的乐趣。

本书适合的读者为:
1. 计算机系、软件学院或相关专业的大学生、研究生。
——您可以把本书当作一本习题集。
2. 面临求职面试的IT从业人员。
——这本书将成为您的“面试真题”。
3. 编程爱好者。
——通过阅读本书,您将充分享受到思考之乐、编程之美。


好工作,今安在?
您想知道微软面人内幕吗?
——《编程之美——微软技术面试心得》通过分析微软面试中经常出现的题目,给您解答微软面试疑惑。

写程序真的没有意思?
为什么许多微软的员工乐此不疲?
——《编程之美——微软技术面试心得》将告诉您:编程和生活一样是富于激情和艺术性的

面试是一个展现分析能力、探索能力的过程,在面试中展现的巧妙思路,简明算法,严谨数学分析,就是——编程之美。
《移山之道——VSTS软件开发指南》的作者、微软亚洲研究院创新工程中心研发经理邹欣和一些喜欢编程的员工以及实习生编写了这本书。

这本书是我目前所见到的优秀面试试题的最全集包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书。”
——《程序员》技术主编孟岩

*******************************************************************

      面试杂谈

背景

每年从金秋九月起,校园里的广告栏中、BBS上的招聘信息就逐渐多了起来。小飞是一名普通高校的应届计算机硕士毕业生,他勤奋好学、成绩中上,爱好广泛。他看到身边的同学都在准备精美的简历,参加各种各样的招聘会,笔试、面试,他也坐不住了。他在BBS上看了各式各样的“面经”,也挤过招聘会上的人潮,他长叹:“行路难,行路难,好工作,今安在?”

小飞从网上了解到了有关招聘的各种术语,他整理了一个列表:

名词

解释

面经

面试的经历。

默拒

投了简历,进行了面试,但是公司从此再也没有消息,询问也不回答。

Offer

公司给学生发的入职邀请。

群殴

通常指一群人一起参加面试,一般以多对多的形式同时进行,最后总是会有人被不幸淘汰,这一过程就叫做“群殴”。

听霸

凡校内招聘演讲会都出席旁听的。

投霸

凡公司招人都投简历的。

笔霸

凡投出简历都能得到笔试机会的。

面霸

凡参加笔试都有面试通知的。

巨无霸

在招聘过程屡屡被拒、机会全无的,江湖人称“巨无霸”!

霸王面

“霸王面”指没有获得面试资格,却主动找用人单位,要求面试的人,源自吃饭不给钱的“霸王餐”,即“没机会面,创造机会也要面”。

小飞获得了一个在微软亚洲研究院实习的机会,在工作中认识了一位有丰富招聘经验的研发经理。他对经理进行了非正式的采访,希望能得到第一手的“内幕”消息。下面就是小飞整理出来的问答。小飞的问题用Q来标注;经理的回答用A标注。

典型面试

备注:在本文中,应聘者(英文为:candidate, interviewee)指应聘公司职位的学生,或其他社会人士;面试者(英文为:interviewer)指公司里进行招聘和面试的人员。

Q经理,您好。我就开门见山,您能否分享一下当年您第一次去面试的故事?

A:好,大学毕业后,我进入了学校“产业办”开的公司。有一天,一家美国公司(我们姑且叫它H公司)要来招人,这是我的第一次面试。那个公司的代表和我寒暄之后,递给我一道题目,题目大意是“写一个函数,返回一个数组中所有元素被第一个元素除的结果”。我当时还问了一些问题,以确保理解无误,所谓clarification是也。那位面试者简单地解释了一下,然后就在电脑上敲敲打打,也不理我了。我想这也不难,如何能显示我的功力呢?于是我就把循环倒着写 for (i=n; i>=0; i--),因为我当时看到一本Unix书上是这么写的。

代码大概是这样的:

void DivArray(int * pArray, int size)

{

    for (int i = size-1; i >= 0; i--)

     {

        pArray[i] /= pArray[0];

    }

}

写完之后,他看了看就问我,你为什么要这么写循环?如果不这么写可以么?我说,也可以呀。他问了两遍,如果正着写循环会出现什么问题。我想,能有啥问题?就把循环正着写。噢,原来陷阱在这里!你知道这个陷阱是什么吗?

Q:让我想一想,知道了,如果循环从数组的第一个元素开始,并且不用其他变量的话,在循环的第一步,第一个元素就变成了1,然后再用它去除以其他元素,就不符合题目要求了。

A:对,同时还有另一个陷阱——看看你是否会检查除数为零的情况,以及对参数的检查,等等。

Q:这不是很简单么?一会儿就写完了。

A: 试题大多数不难,但是通过观察应聘者写程序的实际过程,面试者可以看出应聘者的思维、分析、编程能力。面试者一般还会有后面几招留着。比如,如果你要测试刚才写的这个函数,你的测试用例有多少?或者改变一些条件,能否做得出来?

Q:很多人说,面试是一个不公平的游戏,因为信息不对称。比如:面试者知道问题的答案,而应聘者不知道,面试者知道今年公司要招几个人,而应聘者不知道。

A:但是,应聘者手头有几个Offer,面试者也不知道。应聘者是否喜欢公司提供的职位和薪酬,面试者也不知道。一方面,应聘者在“求”职,另一方面,面试者也在“求”才。面试也是一个增进双方互相了解的有效途径。

既然扯到了“信息不对称”,我再讲一个我的故事,当年H公司来我校面试的时候,我对H公司的了解仅限于H公司捐赠给我们计算机系的一个有些过时的小型机系统。我想,这个H公司是不是还有一些新东西?那时候还没有互联网,于是我就托人借了几本原版的Byte杂志来看,这是很厚的一本杂志,非常多的广告,看了半天,夹在杂志中的小广告掉了一地。我只看到杂志对H公司新出的一个桌面管理软件“NewWave”的评价,我琢磨了半天,大概搞懂了这是一个什么东西,市场上还有什么竞争对手,等等。

过了两天,面试开始了,对方端坐在沙发里问“你对我们H公司有何了解?”我先说了H公司的小型机系统,然后说,“By the way,我还了解了NewWave”。于是我把看到的东西复述了一下。没想到对方坐直了身子,说这个NewWave就是他曾经领导的项目。于是我就根据杂志上的描述问,“您怎么看某某竞争产品?”他很兴奋地跟我谈了NewWave 是如何的领先,云云。后来我们又聊了不少相关的东西。

最后所有人面试结束之后,我们的领导说,美方觉得我很突出,知道不少东西,包括NewWave,口语也很好。领导就要求我给所有人都介绍一下NewWave,我只好把看到的东西又复述了一次。不久,H公司过来面试的另一个经理不解地对我们领导说,为什么你们这么多人知道NewWave

前不久,我在面试的时候问一位同学,“你对微软亚洲研究院有什么了解?”他说,“没啥了解,昨天打电话叫我来面试,我就来了……”对于这样的同学,信息的确是非常不对称,那他吃亏也是难免的了。还有一位在面试中发挥得很不好的同学跟我说,他特地没有做任何准备,因为他想显示他的“raw talent……

Q:关于Test(测试)的职位,有没有一些典型的题目呢?

A:有哇,典型的题目如给你一支笔,让你说说你如何测试——据说要测试12个方面;再比如判断一个三角形的特性(直角、钝角、锐角、等腰)——据说有20多个测试用例,这是要考察大家思考问题的全面程度和逻辑分析能力(测试用例见4.8节“三角形测试用例”)

Q:网上有些非常流行的问题,都号称是从大公司流传出去的,是真的么?

A:对,是有一些题目比较常见,例如“下水道的井盖为什么是圆的”,还有一个问题一度非常流行,据说早期面试PMProgram Manager程序经理)职位的应聘者大多曾碰到这个题目:

房间里有三盏灯,屋外有三个开关,分别控制这三盏灯,只有进入房间,才能看到哪一个电灯是亮的。请问如何只进入房间一次,就能指明哪一个开关控制哪一个灯?

传说在晚上,微软一些会议室的灯忽明忽灭,那就是一些还没有搞懂的同事们在实地钻研。

Q:我大概了解了Dev/PM/Test 这三种工作的典型面试题,那么这些题目的答案别人都知道了,还怎么面试呢?

A:对,会有不少题目流传出去,这本来无妨。但是一些人知道答案之后,就开始背诵,或者原封不动地拿它去面试应聘者,忘了“知道答案”和“能做一个好员工”的关系。大家都知道了答案,就能做一个好的开发人员、项目经理,或者销售经理么?一个极端情况会是:公司里每一个人都知道哪盏灯是由哪一个开关控制的,如何测试三角形的类别等,但是这个公司真能从此开发出更好的软件么?

一句话:关键不在于答案,而在于思考问题的方法,这也是我们没有“题库”的原因。

研发职位的选择

Q:微软以及很多其他软件公司都有不少研发职位,名称不尽相同,而且还是缩写,能不能讲解一下?

A:不少同学对微软公司的各种研发职位(Discipline)并不太了解,我们在面试进行到一半的时候,经常发现一个应聘者其实更适合做其他类型的工作。当然这时我们可以调换面试的方向,但是对应聘者来说总不是一件好事。我刚好在BBS上看到了一篇文章,这篇文章从个人的角度出发,非正式地讲了R&D各个方向的特点,虽然并非完全正确,介绍也不一定全面,但是我们不妨看看:

aRAssistant Researcher,,助理研究员,也可以叫研究员助理,主要在“R&D”的“R”这一端,工作是读论文,提想法,被否决后再提想法(如此反复N次),赶在截止时间之前提交论文aR的想法得到初步验证之后,还要跟其他部门推销自己的想法,争取把想法变成产品。aR的乐趣是能在一个领域中深入研究,发表论文,申请专利,每个专利申请(无论是否批准)能给自己得一块黑色立方体石头。好多人的桌面上堆了不少石头,好像他们没什么苦恼。 aR有时做的事情和RSDE差不多。aR以后会成长为Associate Researcher (副研究员)Researcher(研究员)、高级研究员,等等。总之,最后就成了大家小时候特别梦想做的“科学家”。

Dev:正式的名称叫SDESoftware Development Engineer),这个职位和aR相对,是在“R&D”的“D”这一端。他们在一个产品团队中,按照严格的流程开发产品。MS的一个产品发布之后,所有成员会得到一小块铁皮(学名叫“Ship-it Award”),上面写着产品的名字和发布日期,资深的Dev会收集到不少,他们会认真地把这些小铁皮整齐地贴起来,摆在办公桌最高的位置上。Dev的乐不少,这里就不列举了。但是苦有不少,比如产品的周期有时非常冗长,过程定义得非常完备(有时不免觉得太完备了);比如要维护老版本;比如要用比较成熟的技术,而不是最时髦的东西来开发产品。另外Dev要负责一个或几个模块,这些模块不一定和最终用户打交道,未必是整个产品的核心模块。做一个好的Dev要生活在代码中,对代码和平台的各种细节要非常熟悉,掌握非常底层的技术,有些人以此为乐,有些人则未必。Dev的职业发展道路很多,如果只想钻研技术,不乐意做很多管理工作,Dev 可以成为非常高级的工程师, 直到 杰出工程师(Distinguished Engineer)。当然,Dev 也可以成长为开发主管(Dev Lead),开发总经理(Dev Manager),等等。

2  Dev得到的小铁片SHIP-IT

Test:正式名称是Software Development Engineer in TestSDET),简称为TestSDET(读作S-DET)。这个职位看似没有DevaR酷,但是很有前途,首先中国的同学由于种种原因(不了解,看不起,做不来)不太愿意做这种工作,因此公司找人非常急迫,相对容易进入。这一职位所谓的苦(也反映了一些人的偏见和误解)从传统意义上说,SDET得等着上家(PM/Dev)给你东西,你才能“测试”。然而现代软件工程要求TEST 从项目一开始就积极参与项目的规划,了解客户需求,制定测试计划,设计测试架构,实现测试自动化,等等。事实上这些都是开发的工作,所以他们叫 SDE in Test。而且SDET 能更深入地了解产品的各个模块是如何合作,如何在实际情况下被用户使用的。从代码之外理解程序,这是测试之乐。那种“产品发布前一个星期让测试人员来测一下”的情况在微软是不会发生的。那些只会用鼠标点击测试,然后报告bug的人员叫Software Test EngineerSTE),这样的事一般会外包给别的公司。用足球比赛作比喻,Test就是最后一道防线,如果你没有防守好bugbug就会跑到顾客那里去,因此Test工作非常重要。Test的职业发展和Dev类似,一直到有专门管Test工作的副总裁(VP)。

PM:这恐怕是外界误解最多的行当,简而言之,Program Manager(程序经理)做的是开发和测试之外的所有事情。有些同学会问 “我写程序都不用测试,那么除了开发和测试之外还有什么事儿?”在公司里开发商业软件可没有那么简单,比如有10Dev5Test 要在一起开发下一个版本的MSN Messenger,那我们到底要做多长时间才能完成?什么事情先做,什么后做?项目进行了一半的时候,领导说我们改名叫Live Messenger吧,那这一改名意味着什么?如何调整进度?最后还剩下两个月的时候,看起来我们的确完不成全部任务,那要怎么办?你又不是DevTest的老板,他们凭什么听你的呢?这也是PM的苦。PM的乐看起来在于,他们可以全盘掌控一个产品,广泛了解一个行业,和用户打交道,代表团队出席各种会议,在公司内部的曝光度也比较高。

RSDE:好了,我们最后看看RSDEResearch SDE),这是微软亚洲研究院一个比较特殊的队伍。RSDE的乐趣在于可以接触到各种最新的研究成果,并用它来解决挑战性的问题。RSDE的苦在于项目都是V0.1版,而且做得成功的项目大多数会转化(Transfer)到产品组中,由别人推向市场。RSDE在和研究部门合作的时候,就要负起aRPM(甚至Test)的责任,刚开始,RSDE既没有R的黑石头,又没有DSHIP-IT小铁片。RSDE参与的项目有比较大的风险,经常会不如预期,或者会失败(这也是科学研究的特点)。项目失败后,RSDE掩埋了项目的尸体,擦干自己的血迹,又得找新的领域和新的项目。RSDE 还有“创新”的任务,这个词人人都会说,但是要做出来就不是那么容易了,全世界有这么多人在琢磨计算机,你能在什么地方作的比其他任何人都更进一步呢?这也是RSDE 的乐趣吧。有些同学能力很强,兴趣广泛,但是一时也拿不准自己要深入研究哪一个领域,这时不妨来做RSDE。做得好的RSDE,他们的工作成果推进了研究,又走向了市场,这样就既可以拿到黑石头,又可以拿到SHIP-IT小铁片儿。我个人认为能有机会做 RSDE 是很令人自豪的事情,相当于参军当上了特种兵,很好,很强大。

Q:看起来真是眼花缭乱……

A:总之,每类职位都很重要,都有存在的理由,都有不错的发展前景,都有自己的苦和乐。微软很大,微软中国研发集团(CRD)内部有很多不同的机构和部门,这也意味着有许多机会,让有能力的同学尝试aRDevTestRSDEPM的职位。

求职攻略之笔试答疑

微软中国每年都会举行几次技术笔试,2006年的笔试结束后,主持笔试的经理回答了学生提出的很多问题,小飞把这些问答整理如下(下文的“我们”指的是策划并批改试卷的技术人员):

Q:笔试的难度是不是有些太难了?

A:从分数看,参加笔试的同学普遍得分较低,这说明不少同学大大低估了试题的难度,或者说低估了我们对答案的期望。一言以蔽之,我们希望看到接近“职业”水平的答案。

Q:为什么有些人笔试得了负分呢?

A:这是因为我们对选择题采用了“不做得零分,做错倒扣分”的判卷策略。公司的大部分同事们认为倒扣分是比较有效的甄别方法。而且我们尽量避免非常偏僻的知识点和有争议的答案。

Q:你们是不是只选取了其中一些卷子判分?

A:我们对大多数的卷子都全部判分,每个部门都会抽调不少工程师加班判卷,同学们写的每一行都会被看到,对于一些很难读通的程序,我们还会一起分析,不会因为一眼看不懂就给个0分。对于单项题答得非常好的同学,我们会特别标记。像这样的无绝对标准答案的试卷,判卷是相当累人的活儿。至于是否全部判分,会不会把所有分数都全部告知考生,这由各个部门决定。

Q:笔试题目全是英语,这究竟是考英语还是考技术?为什么不用中文出题呢?

A:微软公司的工作语言是英语,公司在中国的各个部门(研究院,工程院等)都是如此。我们注意在考卷中不用很生僻的词汇,以免影响同学们的发挥。在有些题目中,我们还增加了一些注释,并且有一些小题目注明可以用中文回答。有些考生英语写得不错,起承转合,很像GRE/TOFFEL的作文,可惜只有结构,实质内容不多,得分也不多。

Q:笔试的题量为什么这么大?很多人根本没有足够的时间做完!

A:每次开发新的软件,我们的时间也不够,这就是做软件项目的特点。 我们看到很多同学有些大题一个字也没有写,感到很可惜。其实,如果时间安排得当,至少应该每一道题试着回答一些基本问题。我们的很多监考人员也会提示大家注意时间分配。况且,如何在有压力的情况下最有效地分配时间,这也是一个人非常重要的能力。

Q:我会C#VB.NET,为什么微软的笔试时偏偏要求用C语言答题?

A:对于微软的工程师来说,C语言是基本功。

Q:为什么我投一个技术支持的职位也要用这么难的题来折磨我?

A:因为投同一个位置的人太多了。大家的简历都很优秀,所以只好用笔试来进行一次筛选。

Q:考题包罗万象,甚至包括我不熟悉的知识领域,难道微软需要的是“全才”吗?

A:我们的考试是想考察在实战中的基本知识和基本技能。考试不是万能的,笔试总分很高的同学,也有在面试中表现得很不如人意的。如果有人在某些题目中有优异的表现,即使总分不高,我们也会考虑的。

Q:我申请的职位比较特别,自己的专长没有能够显露,通过这样的一个考试不能真实反映出个人特点,有什么办法呢?

A:这一点我们同意,我们考试的主要目的是把所有考生中的优秀学生选出,并安排他们进入下一轮。至于在某一方面有专长的同学,他们应该直接和有关部门联系,或者我们的有关部门应该直接联系这些同学,例如在某些研究领域发表过高水平文章的同学。

Q:笔试通不通过是不是还有些运气成分在里面?

A:当然有,大家也都知道,一次笔试不能够反映一个人完全的、真实的水平。同学们寒窗十多年,经历了无数闭卷考试,作为一个过来人,我觉得职业生涯和人生不是一次两小时的闭卷考能决定的,希望这样的笔试是大家人生中倒数第几次的闭卷考试之一。人生是更加开阔,充满更多变数的开卷考试。不管是开卷、闭卷,都是一分耕耘,一分收获。

求职攻略之决胜面试

经历了笔试、电话面试之后,许多同学接到了微软公司的邀请——来公司进行面对面的考察。

Q:既然微软这么重视实际的能力,每一个人都会经过几轮面试的考察,在学校时的学习成绩是否就不重要了?

A:也不一定。同样,关键不是在于静态的成绩,而是通过成绩了解成绩取得的过程,了解一个人的特质。曾经有一个面试者详细询问了一个应聘者在学校里的各种表现,最后在面试报告中写道:“我详细询问了她从中学到大学、研究生的情况,她在学校里没有一科的成绩是非常拔尖的,也没有太坏的成绩。她从来没有做过出格的事情,如逃课、自己写一些程序、打工等。我在她身上看不到对卓越的追求,也没有看到她有实现自身价值的想法……所以我认为本公司不应该雇用她。”

Q:虽然我没什么想法,但我觉得微软太有名了,我也不用多想了,我就是要进这样的公司,你叫我干什么都可以!

A:我们恰恰不太需要没什么想法的人,这也许和企业文化有一些关系。在中国一些企业的文化中,往往是领导安排你做什么,你就做什么。在微软,我们认为每个人都是独立的个体,我们希望雇员能够“在其位,谋其事”,同时能考虑到自己三五年后的发展,并且能自己制定计划去实现事业目标,这是公司的文化。

Q:面试的时候要穿什么衣服?

A:在没有特别规定的情况下,穿你觉得舒服的衣服就行。我们看到不少应聘者穿着明显不舒服的西装来面试,这样不会给自己加分,当然也不会减分。但是自己太不舒服,会影响发挥。

Q:不舒服没关系,只要你们公司觉得舒服,我就舒服。

A:我们刚刚说过,微软更看重的是“你”是否觉得舒服、“你”要做什么,以及“你”有什么创意。

Q:有没有在面试中作弊的呢?

A:说起来,还真有。有一天,我在微软外面的一个中餐馆吃晚饭,这个餐馆很小,大家坐得比较挤,我不得不听到邻座的高谈阔论。,原来是一个刚刚在微软面试过的学生在和几个同学聚餐,他很兴奋地谈着当天面试的经历——

“他问了那个在链表中找回路的问题了么?”

“问了,我假装思考了一下,稍稍试了试别的解法,然后就把你说的那个解法讲了出来……”

对于这种人,我们内部叫“Poser”——摆姿势的人。如果你在面试时恰好被问到了一道知道答案的题目,你可以向面试者提出来。摆姿势的话,万一被戳破,会比较难堪。既然你已经花了时间了解法,不妨和面试者深入地探讨一下。

Q:大家发表在BBS 上的面经,公司看不看?

A:公司的一些员工也在看,有一次,HR 在某BBS 上看到一篇很详细的面经,文笔生动,此文章从他看到HR JJ的那一刻写起,直到做了什么题目、怎么做的、说了什么话、最后如何走出了公司大门他都做了详细记录。从描述上看,我们很容易就能推断出这是哪一位应聘者。他似乎发挥得很不错,可惜他忘了在开始面试的时候,HR JJ给他讲的,他也签了自己大名的保密协定。对于这样的同学,我们只能遗憾地放弃了。

Q:整个面试过程中我觉得自己答得很不错了,面试官指出的问题我大部分都能回答出来,为什么我还是没有通过?

A:一个原因是有比你更厉害的应聘者,另一个大家容易忽略的原因是,应聘者和面试者对于“不错”的定义是不一样的。

对于在校学生,觉得自己写的程序,涂涂改改,大概逻辑能通过就行了,面试者指出的问题能答出来一些就行了。但是对于将来的公司员工,我们要考察:程序设计的思路如何?编程风格如何?细节是否考虑到?程序是否有内存泄露?是否采用了最优算法?是否能对程序进行修改以满足不断变化的需求? 是否能举一反三?

另外,除了专业技巧,我们在面试中还会考察应聘者的职业技巧(professional skills, 也有人称为 soft skills)。 这个人交流能力,合作能力如何,对自己的评价和期望是什么?在有压力的情况下,能否发挥水平?是否追求卓越?

Q:很多有名的企业面试只要求谈谈就可以了,为什么微软一定要写代码?

A:我们的绝大部分工作,都是通过代码而来,很大一部分的问题,也是由代码所导致的。所以我们不能不重视写代码这件事。当然有很多其他工作不需要写代码,但这不在我们的讨论范围内。

有一次我在过道上碰到一个同事陪着一个应聘者走出大楼,这位应聘者边走边侃侃而谈。后来我问这位同事详情。他说,这一位先生表达能力不错,但是当我叫他写一个小程序的时候,他死活不动手。他说在以前的工作中,如果要写代码,从MSDN上拷贝一些下来就行了。我和他僵持了一会儿之后,我只好说,那你要是不写的话,我们就没什么可谈的了。所以后面的所有面试都没有必要了,我直接送他出了门。

有一次我也收到我们开发总经理的邮件,上面强调了面试的时候一定要让应聘者动手写代码等,这时对面的一位同事不好意思地说,他今天碰到的应聘者是以前朋友的朋友。两人聊了很长时间的闲话,后来他不好意思叫他写代码,时间也不够了,于是就写了一些反馈,说这人看起来还行。没想到开发总经理眼尖,把这个问题揪出来了。

Q:市场上有很多号称宝典的面试书籍,这些的确是外企用的面试题目么?我看到一本,就像是网络上流传的各种面经的汇编,好像没有太大的价值。

A: 我觉得最好的技术面试“宝典”,就是讲算法和数据结构的经典著作。微软亚洲研究院的工程师们在长期的面试过程中,也收集了一些有意思的面试题目,听说马上就要出版了。

Q: 太好了!这书里面一定有无数的源代码供学生们钻研吧?

A: 其实,大部分题目都不需要连篇累牍的程序来解决,聪明的解法通常是非常简明的。 药灵丸不大,棋妙子无多,程序也是这样,许多题目的核心算法就是寥寥几行,这可以说是编程之美的一种表现形式。我们面试就是要寻找能体会到编程之美的人。

Q:技术面试还有什么特别的诀窍么?

A:微软全球资深副总裁,亚洲研究院的前任院长沈向洋博士经常讲的一句话是“Nothing replaces hard work”,既然同学们知道技术面试不外乎就是这些类型的题目,那大家就自己动手做一遍好了。 如果实在做不出来,可以学习《编程之美》或者其他书上详细的讲解。

Q:我自己解答问题太慢了,能不能把《编程之美》书上的解法背下来,这也是一种捷径吧?

A:有时要小心这样的“捷径”。不怕你笑话,我想起以前考大学的一件事儿。当时有一本很厚的英语标准化考试模拟题,不少同学都买来做。另一位同学从学长那里得了一本做过的书,我们在做题的时候,他说:“我不用做了,我已经有答案了,我平时看看答案就行了,一样的。”结果高考的时候,他的英语考得很不好。

所以,对于认为只要买了一本《编程之美》,或者其他宝典,就好像得到了入职捷径的同学,我要提醒一下:小心这样的捷径!纸上得来终觉浅,绝知此事要躬行。

小飞的总结

结束了和研发经理的几次对话之后,小飞陷入了深思。他发现面试并不一定是用难题、偏题来考倒人,笔试和面试考察的都是自己在编程、解决问题、与人合作等方面的全面能力。运气和背好的答案并不能帮助他解决所有的问题。微软公司花费很多人力物力来寻找合适的人才,那自己如何能展现能力,让伯乐相中? 他做了如下的总结:

1.    知己知彼。知己,就是要了解自己的能力、兴趣、职业发展方向;知彼,就是要了解公司的文化、战略方向和择才标准。

2.    笔试就是基础,用扎实的理解和考虑完备的解答来征服阅卷者。

3.    面试就是探讨,用缜密的代码和严密的分析赢得未来同事的尊重。思考问题的方法比结果重要,面试者会更加在乎你解决问题的思考过程。

4.    你的工作就是最好的面试,不要把时间花在寻找捷径和背诵答案上,要通过实际的工作和产品来体现自己的水平。

千里之行,始于足下,要想在入职竞争中脱颖而出,自己得先下苦功夫,在平时就要用职业的标准来要求自己。他相信 ,只要自己付出了足够的努力,就会有收获——“长风破浪会有时,直挂云帆济沧海”。