暴
暴峰雨
编者按: 进入美国微软公司是很多软件开发人员,特别是年轻开发者的梦想,微软对招聘人员的面试十分严格,面试问题内容广泛而且古怪, 本文作者收集了各种关于微软如何进行面试的资料,相信对于软件公司招聘和想加入软件公司的开发者都会有不少启发。 作者Chris Sells是Windows 面向对象技术专家,现任DevelopMetor (www.develop.com )软件工程部门负责人,是《ATL Internals》, 《Effective COM》等技术名著的作者之一。
撰写此文的目的
许多年前开始,我就一直在搜集微软公司的面试资料。这项爱好的动机是因为我总猜想,或许有一天我也会成为微软的一员。但数年后的今天,我有了妻子和两个孩子,毫无疑问,她们非常可爱,而我距离原先的那个计划也有些遥远了。
无论如何,我想应当将所收集的全部资料发表出来,来帮助那些仍然想成为微软雇员的年轻人。实际上,我已经知道,对于微软的每一场面试,人们都要花费数周的时间来仔细琢磨。但应当注意的是,不要将精力放在重复的研究上面,毕竟,处于这个年龄和行业的人应当更具有创新精神。
如果事实上你已经通过了微软面试,那也希望你能够将所遇到的那些希奇古怪的面试故事讲给我们听。无论如何,我不只是简单地收集面试问题。下面所列举的,只是微软面试问题中比较有代表性的部分范例,而不是全部。这样做的主要原因之一也是因为我希望微软能够招聘到一些优秀的员工,因此我个人并不想泄露太多,以使微软实现这个目的的难度愈来愈大。我的初衷是帮助面试人员,而不是帮面试官员说话的。我想,微软内部应当能够正确平衡自己的利益关系。
按照微软公司的传统,申请加入微软公司的人将会遭受残酷的折磨。具有合格教育背景的申请者们将被带到微软公司,渡过漫长的一天。他们将被依次带到几位程序员面前,每一位程序员将同他们一起呆一小时。通常,面试从上午9:15开始,在同5位程序员谈过话以后,于下午2:30结束。稍事休息后,他们将被带领着参观微软公司总部,并招待一顿晚餐。有时候,申请者在面试结束时就能拿到录取通知书;有时,等到他们回到家后才收到通知书。在1995年,微软公司共收到120,000份履历表。公司邀请了其中的9000名申请者来公司面试,最终录取了2000名,程序员的录取比例是60:1。
在面试时,程序员按照固定的程序办事。他们事先都要求看一遍应征者的履历表,然后就其教育背景和工作经验提几个问题。他们还会出几道编程方面的题目要求应征者予以解答。面试结束时,主考官会给其他的程序员发一封电子邮件,对是否录取应征者投赞成票或反对票。另外,还要告诉其他人面试时提了哪些问题,应征者是如何回答的。全部面试结束时,将统计一下票数。
程序员不但要考查应征者的编程能力,还要判断其是否适合在微软公司工作。因此,他们将向应征者施加心理上和脑力上的压力。随着时间的推移,他们的不友好开始在应征者的面部表情中显露出来。每参加一次会议,应征者就少一分信心,多一分沮丧。
本文收列了微软面试中一些比较有意义的话题,简单分为以下十个专题。这些素材基本都来自现实事例,因此它的意义也许就更加值得注目。
(1) 面试问题
(2) 问题答案
(3) 提出如此古怪问题的动机
(4) 面试技巧
(5) 典型的电话面试
(6) 典型的面试过程
(7) 参考资料
微软对收集面试资料 所做出的反应
有一个未署名的人告诉我说,"一个正好在微软工作和做面试的朋友告诉我,微软已经通知所有正在面试的员工密切注视你的网站,看有什么想法和观点。"
在我写下上面的篇首后,我听到了更多关于微软的消息或资料,一个名叫Mike Byron的微软雇员对此提出了明显的反驳,证明微软并不是一个令人头痛的工作环境:
“我已经在微软工作了将近五年。我有一个妻子和一对7岁的双胞胎孩子。我们过着非常自在、而又常规的生活。我每周工作的时间大约在40-45个小时,长期都是如此。在微软,我时间安排的很好。在硅谷我也是一个具有老资格的人。自从1977年创造主要系统软件以来,微软就和其他大多数的硅谷公司没有什么太大区别。在接近软件上市的时间,我每周的确工作将近50-55小时。”
“现在,在这里工作的员工每人都有完全不同的故事。而我也决不是独特的一个,我有许多朋友,大家基本上情况都一样——每周工作40个小时。”
我很感谢Mike所提出的证明材料,从而改观了我对微软繁重工作量的片面看法。
面试问题
下面这些问题来自微软的真正面试记录,是通过微软员工流传到各主要大学校园的。因为微软顾问有时可以成为终身制,所以向他们所咨询得到的面试问题我们并没有归纳进去。微软面试所提出的问题一般包括下面这些基本方面:
(1) 谜语
(2) 算法
(3) 应用程序
(4) 智力
以前的读者可能会注意到,和过去相比,问题数量减少了。缩减的原因非常简单,就是为了更让其具有代表性,而且收集也只是基于我的唯一爱好:怪题。似乎有一部分人在我们列举问题的帮助下顺利踏入微软的门槛。根据我的常识,没有人能够在微软得到自己干不了的工作,但一部分应聘的人却能够在这里得到许多其他的意外收获。问题分列如下:
(1) 谜语
为什么下水道的盖子是圆的?
在美国有多少辆汽车?
你让工人为你工作7天,回报是一根金条。这个金条被平分成相连的7段。你必须在每一天结束的时候给他们一段金条。如果只允许你有两次把金条截断,那你如何给你的工人付费?
有一辆火车以15公里/小时的速度离开洛杉矶直奔纽约,另一辆火车在同一轨道上以20公里/小时的速度离开纽约驶向洛杉矶。如果有一只鸟,以30公里/小时的速度和两辆火车同时启动,从洛杉矶飞出,遇见另一辆火车后返回;依次在两辆火车间飞翔直到两辆火车相遇,请问,整个过程这只小鸟将飞行多少距离?
你有两个罐子、50个红色弹球、50个蓝色弹球。随机选出一个罐子,随机挑出一个弹球放进罐子。将所有的弹球放进两个罐子,怎样给红色弹球取最大选中的机会?在你的计划中,得到红色弹球的准确几率是多少?
想象你正站在一个镜子面前,正对着。举起你的左手,再举起你的右手,看看你的影像。当你举起你的左手时,你的影像举起的是他的右手。但是当你翘起你的脑袋时,你的影像表现一致,而不是将他的脑袋降低。为什么镜子中的影像能够颠倒左右,却不能颠倒上下?
你有四个装了药丸的罐子。每一个药丸都有一定的重量,被污染的药丸被放在一个罐子里,而且它的重量是正常药丸重量+1。只称量一次,如何判断那一个罐子是放了被污染的药丸?
如果你有无穷多的水、一个3夸脱和一个5夸脱的两个提桶,你如何准确测量4夸脱的水?
你有一桶果冻,其中有红色、蓝色、绿色三种。闭上眼睛,选出同样颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?
将汽车钥匙插入车门,向那个方向旋转可以打开车锁?
如果你能够去掉50个州中的任何一个,那你去掉的是那一个,为什么?
(2) 算法
链表和数组的区别在那里?
实现链表排序的一种算法。为什么你会选择这种方法?
实现数组排序的一种算法。为什么你会选择这种方法?
编程实现strstr函数一样的功能(或者一些其他的字符串库函数)。
编程反转字符串,优化速度、优化空间
编程计算一个整数的位数,优化速度,优化大小
在链表里如何发现循环链接?
给出洗牌的一个算法,并将洗好的牌存储在一个整型数组里
写一个函数,检查字符串是否是整数,如果是,返回其整数值
给出一个函数来输出一个字符串的所有排列
实现malloc() 内存分配函数
给出一个函数来输出Fibonacci 数列
给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
怎样从顶部开始逐层打印二叉树节点数据
(3) 应用程序
怎样将电脑技术集成进一个百层办公大楼的电梯系统?怎样优化实用性?怎样通过影响因素,比如工作日、上班高潮期、楼层等来安排交通量?
你怎样重新设计一个ATM?
假如我们想通过电脑来运行一个微波炉,你将编写一个什么类型的软件来实现这个功能?
你怎样为汽车设计一个咖啡机?
(4) 智力
M&M's 是怎样制作的?
如果你不得不学习一种新的计算机语言,你打算怎样着手来开始?
如果微软告诉你,我们打算投资五百万美元来启动你的计划,你将开始什么商业计划?为什么?
如果你能够将全世界的计算机厂商集合在一个办公室里,然后告诉他们将被强迫做一件事,那件事将是什么?
如果你打算在五年内受到奖励,那获取该项奖励的动机是什么?观众是谁?
你怎样将微软Excel 的用法解释给你的祖母?
为什么在任何一个旅馆里你打开热水,热水都会瞬间倾泄而出?
问题答案
已经有很多人询问过上述问题的正确答案,但我自己不可能对外发布。一方面是因为答案本身意义不是太大;另一方面,这里也绝对没有一份所谓的完全正确的标准答案。如果真有,那可就太像一个欺骗行为了。无论如何,本文的初衷是给大家提供参考和指引。
不过如果你想知道M&M's是如何制作的,你可以访问(www.m-ms. com)。
提出如此古怪问题的动机
有相当一部分人对微软面试中提出如此古怪问题的动机进行了自己的解释:
"我只是一个普通的微软用户。即便这样,我对他们的面试问题也总是很感兴趣。因为它可以让我看到世界上的其他人是如何看待自己所熟悉或相关的事情的,对吗?在这些问题的启发下,我自己还制作了一些非常有趣的问题。我想,设置这些问题的目的是为了能够让其他人都能找到解决这些问题的方式--属于自己的独特方式。我想,那也是更令人心满意足的事情。"
无论如何,我自己的观点如下:
我感觉,在微软的面试中相对于一些真正重要事情来说,上面所有的问题都是第二位的。事实上,他们并不是真正关心面试者所回答的答案是否真正正确,而更关心的是你是如何解决这些问题的(例如,你是否具有创造性、聪明、高效、第一流等等)等。这里有最关键因素的是:他们想知道你具备什么样的能力(备注:仅仅限于该阶段)。
微软的面试官员并不想浪费时间来搞清楚哪些是你知道的,哪些是你由直觉知道的。他想知道你是什么样的人,而不是想知道你认为应当成为什么样的人。这里似乎有一个很明显的事实是:真实性至关重要。许多人一直有一个误区,认为他们肯定可以模仿某种类型的形象。而实际情况是,如果面试官员有一丝感觉,觉得你不是真实的,那意味着,这场面试也就到此结束了。即便应聘人具有相当的水平知识和智力,那也不能改变这个事实。
面试技巧
Fred(化名)在打算去微软面试之前发现了我的网站。他联系了我,探讨了关于上述问题的潜在答案,以及他应该准备的其他东西。他同样也替我做了很多我想做的事情。这里是Fred从人事部接到面试电话后告诉我他的面试技巧:
他们希望我在上午10:15前到达微软招聘处(19号楼)。那时,我将见到我的面试官员,并展示我为此次招聘所准备的自己编写的软件程序。我们将谈论我所关心的所有的话题或问题,然后我们进入第一次面试。我应聘的是软件设计工程师职位,可能属于交互式媒体部。面试官可能包括大部分的软件设计工程师。
其中一些面试官可能要比其他人更重要些。在整整一天中,我可能会在任何时候碰见一个特别重要的面试官。面试官员寻找的是那些对微软的工作显示出很大热情的人,同时他们也想要那些在回答问题或编写代码前经过深思熟虑的人。不论是缺乏持久的工作热情,还是缺乏预先思考,都是两个最大的不利因素。
面试官员可能会仔细查问我的技术能力。通常会问到许多有关编码的问题。我可能会用自己最喜欢的计算机编程语言来写这些。我也可以对一个给定问题提出最适合的编程语言来解决。他们还会问我一些关于项目计划和个人化管理方面的基础问题。面试官员想知道我如何和团队里的其他人打交道,以此来判断担当组长或程序经理的可能性。
我应该大大方方地提前到达,并享受自助餐。和我早上谈话的那个人说,我应该在到达时打电话,以便提前准备一些咖啡或其他东西。他们没有对衣服提出什么要求,但我想牛仔肯定还是不去考虑的。到时我将穿一套灰色的套装,配一条清爽的领带。此外,他们准备午餐(太好了,我想会需要的)。
下面是另一个Fred(同样也是化名)提供的面试技巧
面试官员对许多计算机语言都很熟练,所以你可以选择C或C++(到目前为止,这还是最流行的)、BASIC或其他语言。当然,如果你对C++应用很熟悉,那就应当用C++来执行算法,充分表现这一点。
同样,在面试中不要声称自己所有语言都很熟练,毕竟这里是微软,说到熟练他们可能比你更有资格。而且,如果你并不了解C++或其他语言,那就照直说,不要试图去欺骗,以免带来你后面的尴尬。
对于测试的职位,重点强调是开发算法,然后告诉面试官你是如何来测试的(例如,给出不合规定的输入参数(如何给出,给出哪一个),减少内存,使用双字节来测试函数等等)。
一位名叫Matthew Wetmore的人提供了如下面试技巧:
面试时间可能各不相同。先是经过人事部门的招聘人员,然后直接同你未来可能的同事或上级见面,所以行程安排可能有一点古怪,要跟各部门的会议、任务安排等协调开。因此,你将有可能花费整天的工夫来接受那些可能和你属于同一个职位的人们的面试。如果你希望成为一个软件开发工程师,而面试你的是程序经理,那肯定有问题。同样,从接触人事部开始,你就要绝对明确你的目的是什么。这是整个面试过程中无论如何也不能错过的重点所在,如果你适得其反,那面试官将会感觉他们正在浪费时间。
至于面试的衣着打扮,这不是一个定则,常常取决于面试你的人。如果你打算着套装,要确定它是否能让你感觉舒适自然。我面试软件开发工程师的职位,但我的确没有在意应聘者的衣着,不过也不能过分放松(比如一件粉红色的短裙就会让人觉得不太舒服)。程序经理的职位需要比测试人员和开发人员更多的公众社交,所以就应当格外注意。但我想,无论决定穿什么,务必要使自己感觉舒适自然。
典型的电话考试
下面是一个非常真实而又很有趣的电话面试范例,是由Bob(化名)提供的。
一个晚上,我打算去微软的在线工作空缺数据库里看看。太奇怪了,我发现了一个比较有意思的工作(开发SDK材料来支持CryptoAPI和其他安全技术)。寄走我的简历后大约两周左右后,我接到微软人事部的电话,他们想预约下一周做一个电话面试。在约定好的时间里,电话铃响了。这是微软人事部的一位小姐来做面试。谈话涉及到我的一些背景,包括我毕业的学校、学历程度,以及简历中相关的其他问题等等。然后她谈到了我现在公司的老板,我告诉她在为DoD工作,然后可笑的事就开始了:
问:DoD是谁?
答:国防部(Department of Defense),美国政府的一个部门。
问:哦,我想我从没有听说过他们。他们是做什么的?
答:(这里回答的很长,总之内容涉及到联邦政府、国防部、陆军、海军、空军、民间雇员(我是平民)、计算机安全研究等等,等等。在我回答的过程中她始终在做记录)。
问:你们发行了多少个商业产品?
答:一个也没有。
问:一个也没有?我本来以为你会曾经开发过软件和产品。
答:我的确是开发过,但这些产品没有一个是"商业"的。你问的是有多少个"商业产品"。我是为政府部门工作的,所以没有商业产品。
问:你刚才说你是为谁工作?
答:国--防--部
问:他们是做什么的?
答:(重复上面的内容)
问:好了,如果给你一个需要三周才能做完的项目,要求你两周完成,你会怎么办?
答:告诉管理部门这是个三周才能完成的工作,评价两周里我能完成多少,然后尽可能地去做。
问:但假如他们要你全部完成呢?
答:告诉他们可以给我多安排几个人,这样也可以提前时间。
问:你不可能要到更多的人,仅仅是你们小组的人而已。你还会怎么做?
答:那我会告诉主管部门根本不可能全部按期完成,这样可以让他们知道具体细节,知道尽可能努力后会作到什么程度。
问:好了(非常不赞成的口气),你们究竟发行过多少商业产品?
答:没有一个(继续重复)
问:好了,根据你的简历,我看到你做过团队管理和软件开发,你现在在干什么?
答:(我告诉她有关使用Windows NT进行的安全性研究计划等等)
问:那说明你实际上生产了这个研究产品? 答:调查报告而已。
问:为谁?谁会来看这些报告?
答:微软是为每个人服务的,至少我希望微软能看看这些报告,Netscape、Sun和其他任何人都可以从发表过的学报里看到我的报告。此外,我们还打算在互联网上公布。
问:那就是说,你的确是没有一个客户?
答:是的,哦,不,无论如何,我有一个客户——政府,而且我还是自己的客户。
问:那你们发行了多少商业产品?
答:(到现在为止,我多少明白了点,这位小姐不屈不挠地肯定想将她面前面试表格中的那一项填写清楚!但是我却真是恼火了,只好再次重复前面的答案)。
问:你是怎么理解截止时间的?
答:截止时间让我觉得可笑。
问:啊,为什么?
答:我做的是研究,我没有最终期限或者什么截止时间。。
问:那,我明白了,你还有什么问题吗?
答:现在没有。
问:你还想了解什么吗?
答:这和截止时间有点关系。因为从一个最大的非商业组织转换到商业软件公司,这毕竟是一个很大的转折,我不敢肯定是否能很快地熟练起来。
问:非商业组织?你说你为谁工作?
我列举的已经足够多了。你可以想象得出来,我希望给你们提供微软面试技巧的愿望有多么迫切。我和一些经常在一起工作的微软工程师们谈了谈。他们指出我的第一个、也是最大的失误是将我的简历给了微软的人事部门。他们讲如果当时我将简历给了他们,那现在我肯定早已经是他们公司中的一员了。我的"落选"经历让他们大笑。但无论如何,我现在不得不等待至少一年的时间来使我的名字和简历从数据库中调出来。他们认为直到目前为止,"落选"的黑点短期内是不会消失的。
数月后,我以客人的身份拜访了微软主要设计师(或者类似的头衔,他直属于副总裁)。我告诉他曾经在微软面试过,但不合格(他笑得合不上嘴)。我说,"面试过程中,有一个问题我始终不知道正确答案是什么。我想知道你的答案,你是怎么理解截止时间的?它的正确答案是什么?"他回答道"我不知道"。我说"至少我可以告诉你,正确答案绝对不是'截止日期让人可笑'"。
典型的面试过程
Fred不但在去微软面试前支持我的工作,面试过后,他还给了我一份详细的面试资料:
"好了,现在我可以说我在微软面试过了。奇怪,太奇怪了,面试完一周后我才发现,我应当面试的是程序经理职位,而不是软件开发工程师。
星期天下午,我乘座的飞机降落在Seattle-Tacoma机场。天气很好,万里无云。我打了辆出租到Courtyard Mariott旅馆。到达时,我收到一个纸条,上面写着微软将替我负担我房间的饮食费用。
星期一早晨,我到达19号楼,见到了招聘人员。他告诉我总共有四项面试:两个是微软项目组的,两个是微软Word组的。按照这个次序,他征求了我的意见,然后让我签了一个保密协议。
之后我被带去参加第一场面试。所问问题如下:怎样将电脑技术集成进一个百层办公大楼的电梯系统?我们讨论了多少价位的传感器可以应用这个项目里;特定时间里怎样确定有多少人在等待电梯;什么类型的交通可以预想为典型的工作量;一天中交通量的变化;楼层到楼层的交通变化等等。此外,我们还讨论了实用性的概念和具体实现。
第二场面试是午饭过程中进行的。我被带出校园进了附近一个意大利餐馆,边吃饭边面试。其中问到大量的有关我的工作历史、相关经验的话题。被问及的问题如下:怎样设计可嵌入文档的控件对文章进行复制保护,并且可以快速通过因特网复制?瞧,吃饭中问到的问题也一样让人头痛。
午饭后,没有什么休息时间,我又被带进了第三场面试。所问问题如下:在Word文档中定义一个界面来缩进被选文本。我不得不考虑到被选区域的范围,从单个句子一直到横跨数页的大段句子。同样我还不得不考虑到被选部分当前不可视还是部分可视。他们还问及我所定义的控件状态,用户怎样知道什么时候是使用这些控件的合适时间。并且还问我用户怎样知道这些控件的用途是什么。
最后,也就是第四场,也是最艰难的一场面试。这当然是事后我才知道的。因为我的主考官是以哈佛大学数学高级班全班第一的成绩毕业的。他的确是一个最难缠的面试官。他问我的第一个问题就是:到目前为止,什么是你遇见的最困难的问题?我的回答是前面所问到的控件保护问题。然后他又问:想象一个设置到12点的时钟,注意时针和分针重叠。然后问题是:每天有多少次同时时针和分针重叠?解释你是如何确定这样的情况发生时的准确次数的。
我感觉到和面试官的差距,但这种感觉还没有击倒我。他不停地问我是否还有其他问题,我通常还有。但是一旦这个问题被回答后,他会再次问我是否还有其他问题。
问题难度有深有浅。有非常简单的有关我个人背景的,也有一些属于微软本身也在一直努力寻找答案的开放式问题。我想,我能够比较满意地回答大部分的问题,但无论如何,还是有一些问题让我很是尴尬。例如,第四位面试官的第一个问题"到目前为止,什么是你遇见的最困难的问题"一时难倒了我,但最终我还是回答了。从微软的面试中,我学到了许多东西,也明白个性是最可宝贵的。每一个面试人员都有其自己个性化方式和办公场所。
在微软,没有人距离Bill Gates的职位会超过六个等级,但同时绝大多数的人都在底层工作,相对而言,微软的组织结构比较平滑。
"我想为微软工作吗?"也是一个问题,我的答案是"视情况而定"。
什么是程序经理
在微软,有一个奇怪的职位--程序经理Program Manager,这好象适合于大多数雇员。我就此问过Fred,看他是否知道它的确切含义,他回答说:
"程序经理(简称PM)是微软公司特有的、分析一个应用程序的特定功能。他们需要和软件设计工程师、测试人员、用户教育、文档、市场等等沟通。通常由程序经理定义程序需要实现的功能、确定需要修正的错误以及升级的内容。他们制订计划表、确定产品发行到消费者手里的时间。他们创建原型(通常用Visual Basic)、运行最新的Build来明确进展,并产生新的想法。同样,程序经理也接听支持电话、检查用户的反馈数据库等等。联络技巧、管理能力以及判断能力是一个程序经理的必备条件。
撰写此文的目的
许多年前开始,我就一直在搜集微软公司的面试资料。这项爱好的动机是因为我总猜想,或许有一天我也会成为微软的一员。但数年后的今天,我有了妻子和两个孩子,毫无疑问,她们非常可爱,而我距离原先的那个计划也有些遥远了。
无论如何,我想应当将所收集的全部资料发表出来,来帮助那些仍然想成为微软雇员的年轻人。实际上,我已经知道,对于微软的每一场面试,人们都要花费数周的时间来仔细琢磨。但应当注意的是,不要将精力放在重复的研究上面,毕竟,处于这个年龄和行业的人应当更具有创新精神。
如果事实上你已经通过了微软面试,那也希望你能够将所遇到的那些希奇古怪的面试故事讲给我们听。无论如何,我不只是简单地收集面试问题。下面所列举的,只是微软面试问题中比较有代表性的部分范例,而不是全部。这样做的主要原因之一也是因为我希望微软能够招聘到一些优秀的员工,因此我个人并不想泄露太多,以使微软实现这个目的的难度愈来愈大。我的初衷是帮助面试人员,而不是帮面试官员说话的。我想,微软内部应当能够正确平衡自己的利益关系。
按照微软公司的传统,申请加入微软公司的人将会遭受残酷的折磨。具有合格教育背景的申请者们将被带到微软公司,渡过漫长的一天。他们将被依次带到几位程序员面前,每一位程序员将同他们一起呆一小时。通常,面试从上午9:15开始,在同5位程序员谈过话以后,于下午2:30结束。稍事休息后,他们将被带领着参观微软公司总部,并招待一顿晚餐。有时候,申请者在面试结束时就能拿到录取通知书;有时,等到他们回到家后才收到通知书。在1995年,微软公司共收到120,000份履历表。公司邀请了其中的9000名申请者来公司面试,最终录取了2000名,程序员的录取比例是60:1。
在面试时,程序员按照固定的程序办事。他们事先都要求看一遍应征者的履历表,然后就其教育背景和工作经验提几个问题。他们还会出几道编程方面的题目要求应征者予以解答。面试结束时,主考官会给其他的程序员发一封电子邮件,对是否录取应征者投赞成票或反对票。另外,还要告诉其他人面试时提了哪些问题,应征者是如何回答的。全部面试结束时,将统计一下票数。
程序员不但要考查应征者的编程能力,还要判断其是否适合在微软公司工作。因此,他们将向应征者施加心理上和脑力上的压力。随着时间的推移,他们的不友好开始在应征者的面部表情中显露出来。每参加一次会议,应征者就少一分信心,多一分沮丧。
本文收列了微软面试中一些比较有意义的话题,简单分为以下十个专题。这些素材基本都来自现实事例,因此它的意义也许就更加值得注目。
(1) 面试问题
(2) 问题答案
(3) 提出如此古怪问题的动机
(4) 面试技巧
(5) 典型的电话面试
(6) 典型的面试过程
(7) 参考资料
微软对收集面试资料 所做出的反应
有一个未署名的人告诉我说,"一个正好在微软工作和做面试的朋友告诉我,微软已经通知所有正在面试的员工密切注视你的网站,看有什么想法和观点。"
在我写下上面的篇首后,我听到了更多关于微软的消息或资料,一个名叫Mike Byron的微软雇员对此提出了明显的反驳,证明微软并不是一个令人头痛的工作环境:
“我已经在微软工作了将近五年。我有一个妻子和一对7岁的双胞胎孩子。我们过着非常自在、而又常规的生活。我每周工作的时间大约在40-45个小时,长期都是如此。在微软,我时间安排的很好。在硅谷我也是一个具有老资格的人。自从1977年创造主要系统软件以来,微软就和其他大多数的硅谷公司没有什么太大区别。在接近软件上市的时间,我每周的确工作将近50-55小时。”
“现在,在这里工作的员工每人都有完全不同的故事。而我也决不是独特的一个,我有许多朋友,大家基本上情况都一样——每周工作40个小时。”
我很感谢Mike所提出的证明材料,从而改观了我对微软繁重工作量的片面看法。
面试问题
下面这些问题来自微软的真正面试记录,是通过微软员工流传到各主要大学校园的。因为微软顾问有时可以成为终身制,所以向他们所咨询得到的面试问题我们并没有归纳进去。微软面试所提出的问题一般包括下面这些基本方面:
(1) 谜语
(2) 算法
(3) 应用程序
(4) 智力
以前的读者可能会注意到,和过去相比,问题数量减少了。缩减的原因非常简单,就是为了更让其具有代表性,而且收集也只是基于我的唯一爱好:怪题。似乎有一部分人在我们列举问题的帮助下顺利踏入微软的门槛。根据我的常识,没有人能够在微软得到自己干不了的工作,但一部分应聘的人却能够在这里得到许多其他的意外收获。问题分列如下:
(1) 谜语
为什么下水道的盖子是圆的?
在美国有多少辆汽车?
你让工人为你工作7天,回报是一根金条。这个金条被平分成相连的7段。你必须在每一天结束的时候给他们一段金条。如果只允许你有两次把金条截断,那你如何给你的工人付费?
有一辆火车以15公里/小时的速度离开洛杉矶直奔纽约,另一辆火车在同一轨道上以20公里/小时的速度离开纽约驶向洛杉矶。如果有一只鸟,以30公里/小时的速度和两辆火车同时启动,从洛杉矶飞出,遇见另一辆火车后返回;依次在两辆火车间飞翔直到两辆火车相遇,请问,整个过程这只小鸟将飞行多少距离?
你有两个罐子、50个红色弹球、50个蓝色弹球。随机选出一个罐子,随机挑出一个弹球放进罐子。将所有的弹球放进两个罐子,怎样给红色弹球取最大选中的机会?在你的计划中,得到红色弹球的准确几率是多少?
想象你正站在一个镜子面前,正对着。举起你的左手,再举起你的右手,看看你的影像。当你举起你的左手时,你的影像举起的是他的右手。但是当你翘起你的脑袋时,你的影像表现一致,而不是将他的脑袋降低。为什么镜子中的影像能够颠倒左右,却不能颠倒上下?
你有四个装了药丸的罐子。每一个药丸都有一定的重量,被污染的药丸被放在一个罐子里,而且它的重量是正常药丸重量+1。只称量一次,如何判断那一个罐子是放了被污染的药丸?
如果你有无穷多的水、一个3夸脱和一个5夸脱的两个提桶,你如何准确测量4夸脱的水?
你有一桶果冻,其中有红色、蓝色、绿色三种。闭上眼睛,选出同样颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?
将汽车钥匙插入车门,向那个方向旋转可以打开车锁?
如果你能够去掉50个州中的任何一个,那你去掉的是那一个,为什么?
(2) 算法
链表和数组的区别在那里?
实现链表排序的一种算法。为什么你会选择这种方法?
实现数组排序的一种算法。为什么你会选择这种方法?
编程实现strstr函数一样的功能(或者一些其他的字符串库函数)。
编程反转字符串,优化速度、优化空间
编程计算一个整数的位数,优化速度,优化大小
在链表里如何发现循环链接?
给出洗牌的一个算法,并将洗好的牌存储在一个整型数组里
写一个函数,检查字符串是否是整数,如果是,返回其整数值
给出一个函数来输出一个字符串的所有排列
实现malloc() 内存分配函数
给出一个函数来输出Fibonacci 数列
给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
怎样从顶部开始逐层打印二叉树节点数据
(3) 应用程序
怎样将电脑技术集成进一个百层办公大楼的电梯系统?怎样优化实用性?怎样通过影响因素,比如工作日、上班高潮期、楼层等来安排交通量?
你怎样重新设计一个ATM?
假如我们想通过电脑来运行一个微波炉,你将编写一个什么类型的软件来实现这个功能?
你怎样为汽车设计一个咖啡机?
(4) 智力
M&M's 是怎样制作的?
如果你不得不学习一种新的计算机语言,你打算怎样着手来开始?
如果微软告诉你,我们打算投资五百万美元来启动你的计划,你将开始什么商业计划?为什么?
如果你能够将全世界的计算机厂商集合在一个办公室里,然后告诉他们将被强迫做一件事,那件事将是什么?
如果你打算在五年内受到奖励,那获取该项奖励的动机是什么?观众是谁?
你怎样将微软Excel 的用法解释给你的祖母?
为什么在任何一个旅馆里你打开热水,热水都会瞬间倾泄而出?
问题答案
已经有很多人询问过上述问题的正确答案,但我自己不可能对外发布。一方面是因为答案本身意义不是太大;另一方面,这里也绝对没有一份所谓的完全正确的标准答案。如果真有,那可就太像一个欺骗行为了。无论如何,本文的初衷是给大家提供参考和指引。
不过如果你想知道M&M's是如何制作的,你可以访问(www.m-ms. com)。
提出如此古怪问题的动机
有相当一部分人对微软面试中提出如此古怪问题的动机进行了自己的解释:
"我只是一个普通的微软用户。即便这样,我对他们的面试问题也总是很感兴趣。因为它可以让我看到世界上的其他人是如何看待自己所熟悉或相关的事情的,对吗?在这些问题的启发下,我自己还制作了一些非常有趣的问题。我想,设置这些问题的目的是为了能够让其他人都能找到解决这些问题的方式--属于自己的独特方式。我想,那也是更令人心满意足的事情。"
无论如何,我自己的观点如下:
我感觉,在微软的面试中相对于一些真正重要事情来说,上面所有的问题都是第二位的。事实上,他们并不是真正关心面试者所回答的答案是否真正正确,而更关心的是你是如何解决这些问题的(例如,你是否具有创造性、聪明、高效、第一流等等)等。这里有最关键因素的是:他们想知道你具备什么样的能力(备注:仅仅限于该阶段)。
微软的面试官员并不想浪费时间来搞清楚哪些是你知道的,哪些是你由直觉知道的。他想知道你是什么样的人,而不是想知道你认为应当成为什么样的人。这里似乎有一个很明显的事实是:真实性至关重要。许多人一直有一个误区,认为他们肯定可以模仿某种类型的形象。而实际情况是,如果面试官员有一丝感觉,觉得你不是真实的,那意味着,这场面试也就到此结束了。即便应聘人具有相当的水平知识和智力,那也不能改变这个事实。
面试技巧
Fred(化名)在打算去微软面试之前发现了我的网站。他联系了我,探讨了关于上述问题的潜在答案,以及他应该准备的其他东西。他同样也替我做了很多我想做的事情。这里是Fred从人事部接到面试电话后告诉我他的面试技巧:
他们希望我在上午10:15前到达微软招聘处(19号楼)。那时,我将见到我的面试官员,并展示我为此次招聘所准备的自己编写的软件程序。我们将谈论我所关心的所有的话题或问题,然后我们进入第一次面试。我应聘的是软件设计工程师职位,可能属于交互式媒体部。面试官可能包括大部分的软件设计工程师。
其中一些面试官可能要比其他人更重要些。在整整一天中,我可能会在任何时候碰见一个特别重要的面试官。面试官员寻找的是那些对微软的工作显示出很大热情的人,同时他们也想要那些在回答问题或编写代码前经过深思熟虑的人。不论是缺乏持久的工作热情,还是缺乏预先思考,都是两个最大的不利因素。
面试官员可能会仔细查问我的技术能力。通常会问到许多有关编码的问题。我可能会用自己最喜欢的计算机编程语言来写这些。我也可以对一个给定问题提出最适合的编程语言来解决。他们还会问我一些关于项目计划和个人化管理方面的基础问题。面试官员想知道我如何和团队里的其他人打交道,以此来判断担当组长或程序经理的可能性。
我应该大大方方地提前到达,并享受自助餐。和我早上谈话的那个人说,我应该在到达时打电话,以便提前准备一些咖啡或其他东西。他们没有对衣服提出什么要求,但我想牛仔肯定还是不去考虑的。到时我将穿一套灰色的套装,配一条清爽的领带。此外,他们准备午餐(太好了,我想会需要的)。
下面是另一个Fred(同样也是化名)提供的面试技巧
面试官员对许多计算机语言都很熟练,所以你可以选择C或C++(到目前为止,这还是最流行的)、BASIC或其他语言。当然,如果你对C++应用很熟悉,那就应当用C++来执行算法,充分表现这一点。
同样,在面试中不要声称自己所有语言都很熟练,毕竟这里是微软,说到熟练他们可能比你更有资格。而且,如果你并不了解C++或其他语言,那就照直说,不要试图去欺骗,以免带来你后面的尴尬。
对于测试的职位,重点强调是开发算法,然后告诉面试官你是如何来测试的(例如,给出不合规定的输入参数(如何给出,给出哪一个),减少内存,使用双字节来测试函数等等)。
一位名叫Matthew Wetmore的人提供了如下面试技巧:
面试时间可能各不相同。先是经过人事部门的招聘人员,然后直接同你未来可能的同事或上级见面,所以行程安排可能有一点古怪,要跟各部门的会议、任务安排等协调开。因此,你将有可能花费整天的工夫来接受那些可能和你属于同一个职位的人们的面试。如果你希望成为一个软件开发工程师,而面试你的是程序经理,那肯定有问题。同样,从接触人事部开始,你就要绝对明确你的目的是什么。这是整个面试过程中无论如何也不能错过的重点所在,如果你适得其反,那面试官将会感觉他们正在浪费时间。
至于面试的衣着打扮,这不是一个定则,常常取决于面试你的人。如果你打算着套装,要确定它是否能让你感觉舒适自然。我面试软件开发工程师的职位,但我的确没有在意应聘者的衣着,不过也不能过分放松(比如一件粉红色的短裙就会让人觉得不太舒服)。程序经理的职位需要比测试人员和开发人员更多的公众社交,所以就应当格外注意。但我想,无论决定穿什么,务必要使自己感觉舒适自然。
典型的电话考试
下面是一个非常真实而又很有趣的电话面试范例,是由Bob(化名)提供的。
一个晚上,我打算去微软的在线工作空缺数据库里看看。太奇怪了,我发现了一个比较有意思的工作(开发SDK材料来支持CryptoAPI和其他安全技术)。寄走我的简历后大约两周左右后,我接到微软人事部的电话,他们想预约下一周做一个电话面试。在约定好的时间里,电话铃响了。这是微软人事部的一位小姐来做面试。谈话涉及到我的一些背景,包括我毕业的学校、学历程度,以及简历中相关的其他问题等等。然后她谈到了我现在公司的老板,我告诉她在为DoD工作,然后可笑的事就开始了:
问:DoD是谁?
答:国防部(Department of Defense),美国政府的一个部门。
问:哦,我想我从没有听说过他们。他们是做什么的?
答:(这里回答的很长,总之内容涉及到联邦政府、国防部、陆军、海军、空军、民间雇员(我是平民)、计算机安全研究等等,等等。在我回答的过程中她始终在做记录)。
问:你们发行了多少个商业产品?
答:一个也没有。
问:一个也没有?我本来以为你会曾经开发过软件和产品。
答:我的确是开发过,但这些产品没有一个是"商业"的。你问的是有多少个"商业产品"。我是为政府部门工作的,所以没有商业产品。
问:你刚才说你是为谁工作?
答:国--防--部
问:他们是做什么的?
答:(重复上面的内容)
问:好了,如果给你一个需要三周才能做完的项目,要求你两周完成,你会怎么办?
答:告诉管理部门这是个三周才能完成的工作,评价两周里我能完成多少,然后尽可能地去做。
问:但假如他们要你全部完成呢?
答:告诉他们可以给我多安排几个人,这样也可以提前时间。
问:你不可能要到更多的人,仅仅是你们小组的人而已。你还会怎么做?
答:那我会告诉主管部门根本不可能全部按期完成,这样可以让他们知道具体细节,知道尽可能努力后会作到什么程度。
问:好了(非常不赞成的口气),你们究竟发行过多少商业产品?
答:没有一个(继续重复)
问:好了,根据你的简历,我看到你做过团队管理和软件开发,你现在在干什么?
答:(我告诉她有关使用Windows NT进行的安全性研究计划等等)
问:那说明你实际上生产了这个研究产品? 答:调查报告而已。
问:为谁?谁会来看这些报告?
答:微软是为每个人服务的,至少我希望微软能看看这些报告,Netscape、Sun和其他任何人都可以从发表过的学报里看到我的报告。此外,我们还打算在互联网上公布。
问:那就是说,你的确是没有一个客户?
答:是的,哦,不,无论如何,我有一个客户——政府,而且我还是自己的客户。
问:那你们发行了多少商业产品?
答:(到现在为止,我多少明白了点,这位小姐不屈不挠地肯定想将她面前面试表格中的那一项填写清楚!但是我却真是恼火了,只好再次重复前面的答案)。
问:你是怎么理解截止时间的?
答:截止时间让我觉得可笑。
问:啊,为什么?
答:我做的是研究,我没有最终期限或者什么截止时间。。
问:那,我明白了,你还有什么问题吗?
答:现在没有。
问:你还想了解什么吗?
答:这和截止时间有点关系。因为从一个最大的非商业组织转换到商业软件公司,这毕竟是一个很大的转折,我不敢肯定是否能很快地熟练起来。
问:非商业组织?你说你为谁工作?
我列举的已经足够多了。你可以想象得出来,我希望给你们提供微软面试技巧的愿望有多么迫切。我和一些经常在一起工作的微软工程师们谈了谈。他们指出我的第一个、也是最大的失误是将我的简历给了微软的人事部门。他们讲如果当时我将简历给了他们,那现在我肯定早已经是他们公司中的一员了。我的"落选"经历让他们大笑。但无论如何,我现在不得不等待至少一年的时间来使我的名字和简历从数据库中调出来。他们认为直到目前为止,"落选"的黑点短期内是不会消失的。
数月后,我以客人的身份拜访了微软主要设计师(或者类似的头衔,他直属于副总裁)。我告诉他曾经在微软面试过,但不合格(他笑得合不上嘴)。我说,"面试过程中,有一个问题我始终不知道正确答案是什么。我想知道你的答案,你是怎么理解截止时间的?它的正确答案是什么?"他回答道"我不知道"。我说"至少我可以告诉你,正确答案绝对不是'截止日期让人可笑'"。
典型的面试过程
Fred不但在去微软面试前支持我的工作,面试过后,他还给了我一份详细的面试资料:
"好了,现在我可以说我在微软面试过了。奇怪,太奇怪了,面试完一周后我才发现,我应当面试的是程序经理职位,而不是软件开发工程师。
星期天下午,我乘座的飞机降落在Seattle-Tacoma机场。天气很好,万里无云。我打了辆出租到Courtyard Mariott旅馆。到达时,我收到一个纸条,上面写着微软将替我负担我房间的饮食费用。
星期一早晨,我到达19号楼,见到了招聘人员。他告诉我总共有四项面试:两个是微软项目组的,两个是微软Word组的。按照这个次序,他征求了我的意见,然后让我签了一个保密协议。
之后我被带去参加第一场面试。所问问题如下:怎样将电脑技术集成进一个百层办公大楼的电梯系统?我们讨论了多少价位的传感器可以应用这个项目里;特定时间里怎样确定有多少人在等待电梯;什么类型的交通可以预想为典型的工作量;一天中交通量的变化;楼层到楼层的交通变化等等。此外,我们还讨论了实用性的概念和具体实现。
第二场面试是午饭过程中进行的。我被带出校园进了附近一个意大利餐馆,边吃饭边面试。其中问到大量的有关我的工作历史、相关经验的话题。被问及的问题如下:怎样设计可嵌入文档的控件对文章进行复制保护,并且可以快速通过因特网复制?瞧,吃饭中问到的问题也一样让人头痛。
午饭后,没有什么休息时间,我又被带进了第三场面试。所问问题如下:在Word文档中定义一个界面来缩进被选文本。我不得不考虑到被选区域的范围,从单个句子一直到横跨数页的大段句子。同样我还不得不考虑到被选部分当前不可视还是部分可视。他们还问及我所定义的控件状态,用户怎样知道什么时候是使用这些控件的合适时间。并且还问我用户怎样知道这些控件的用途是什么。
最后,也就是第四场,也是最艰难的一场面试。这当然是事后我才知道的。因为我的主考官是以哈佛大学数学高级班全班第一的成绩毕业的。他的确是一个最难缠的面试官。他问我的第一个问题就是:到目前为止,什么是你遇见的最困难的问题?我的回答是前面所问到的控件保护问题。然后他又问:想象一个设置到12点的时钟,注意时针和分针重叠。然后问题是:每天有多少次同时时针和分针重叠?解释你是如何确定这样的情况发生时的准确次数的。
我感觉到和面试官的差距,但这种感觉还没有击倒我。他不停地问我是否还有其他问题,我通常还有。但是一旦这个问题被回答后,他会再次问我是否还有其他问题。
问题难度有深有浅。有非常简单的有关我个人背景的,也有一些属于微软本身也在一直努力寻找答案的开放式问题。我想,我能够比较满意地回答大部分的问题,但无论如何,还是有一些问题让我很是尴尬。例如,第四位面试官的第一个问题"到目前为止,什么是你遇见的最困难的问题"一时难倒了我,但最终我还是回答了。从微软的面试中,我学到了许多东西,也明白个性是最可宝贵的。每一个面试人员都有其自己个性化方式和办公场所。
在微软,没有人距离Bill Gates的职位会超过六个等级,但同时绝大多数的人都在底层工作,相对而言,微软的组织结构比较平滑。
"我想为微软工作吗?"也是一个问题,我的答案是"视情况而定"。
什么是程序经理
在微软,有一个奇怪的职位--程序经理Program Manager,这好象适合于大多数雇员。我就此问过Fred,看他是否知道它的确切含义,他回答说:
"程序经理(简称PM)是微软公司特有的、分析一个应用程序的特定功能。他们需要和软件设计工程师、测试人员、用户教育、文档、市场等等沟通。通常由程序经理定义程序需要实现的功能、确定需要修正的错误以及升级的内容。他们制订计划表、确定产品发行到消费者手里的时间。他们创建原型(通常用Visual Basic)、运行最新的Build来明确进展,并产生新的想法。同样,程序经理也接听支持电话、检查用户的反馈数据库等等。联络技巧、管理能力以及判断能力是一个程序经理的必备条件。
| 我们只不过是生命之网上的一股线绳,生活在离太阳最近的第3颗行星上,我们只有一个地球!One earth!
oicq:19906552 |
| 喜欢电影的朋友这来... |