验题是业界众所周知的。在外界不仅流传着很多微软使用的趣题、难题和怪题,还有很多与解题和答案有关的有趣的小故事。我就亲身经历过一个。
故事发生在我加入微软之前,在得克萨斯州奥斯丁戴尔计算机公司总部工作期间。有一天,我同组的一位女同事不知从哪儿得到一个智力测验题,她很神秘地告诉我说,这题是最近微软面试中刚刚出现的。具说微软内部员工平均解题时间是5分钟以内,外界高手的平均水平是15分钟,而外界一般人员很多根本解不出答案,不管给多少时间。这位女同事说她已想了很久了也没有结果,于是让我试试。我通常对智力测验题不感兴趣,但听她说得那么玄乎,又被她一激,于是拿来题目认认真真解了一把,结果5分钟内解出了答案,让她连说佩服。到这里故事讲了一半。在讲故事的后半部分前,我先得把题目和答案给大家讲解一下:
题目是这样的:有四个人(a,b,c和d)要在一个月黑风高的夜里过一个很长的独木桥。桥只能一次乘载两个人,就是说每次最多两人同时过桥。过桥要用手电筒,而这四个人只有一只手电筒,也就是说两人共用这只手电筒过桥后,其中一人必须带着手电筒返回(没有其他方法),否则其他人就不能再过了。这四个人由于年龄和身体状况的差异,每个人过桥所需要的时间不同:a需要1分钟,b需要2分钟,c需要5分钟,d需要10分钟。由于共用一只手电筒的原因,当两人一同过桥时,过桥的时间是以其中慢的一人为准,比如a和c一起过桥要用5分钟。
现在问:要所有人过桥,最短要多少分钟,如何安排他们的过桥顺序?
这个问题看起来并不复杂,很容易入手,解题的策略也不难确定。既然手电筒要来回传递,根据能者多劳的原则,当然是尽量用最快的人来担此重任。因为a过桥最快,所以很快就会得出以下的答案:
第一步:a和b一起过桥,时间是2分钟
第二步:a带着手电筒返回,时间是1分钟
第三步:a和c一起过桥,时间是5分钟
第四步:a带着手电筒返回,时间是1分钟
第五步:a和d一起过桥,时间是10分钟
总共需要19分钟
这看起来安排很合理,但答案是错的。正确的答案是17分钟。看到这里不妨请读者思考一下如何得到这个答案。
其实解题的关键是你能否想到另一个更重要的策略,就是:要让走得最慢的人(c和d)一起过桥。请你根据这一原则再试试看。
以下是正确答案:
第一步:a和b一起过桥,时间是2分钟
第二步:a带着手电筒返回,时间是1分钟
第三步:c和d一起过桥,时间是10分钟
第四步:b带着手电筒返回,时间是2分钟
第五步:a和b一起过桥,时间是2分钟
总共需要17分钟
可见这题的关键是在于你能否突破那个显而易见的思维定势,发现不易发现的更有效的方法,甚至有时还要敢于违背那个明显的规则。
那好,我们再回到故事的后半段。那个女同事在惊叹佩服之余,又突然想
要再找位高手试一试。于是想到了她的男朋友。她男朋友是德州大学物理系博士毕业,当时在奥斯丁的摩托罗拉分部作芯片设计工作。女同事当即拿起电话把题目告诉了她的男朋友。结果还不到两分钟她男朋友就打回电话,说已解除答案,时间是19分钟。当场我们都笑了,告诉他答案不对,应该时间更短,让他再想一想。挂上电话后又过了10多分钟,她男朋友的电话又响了。这一次我们以为他做出了正确答案,没想到他不仅没有做出正确答案,反而振振有词地说,19分钟是绝对的最短时间,他已用数学方法理论上证明了这一结论!我们听了一愣,然后是狂笑不止。
不同分工不同侧重的面试
可想而知,在微软,即使是同样级别的技术工程师,不同职位的面试会有不同的要求和侧重点。以下我们以项目经理、测试人员和开发人员为例加以说明。
项目经理的面试
在微软的产品小组里,往往有三个角色。除了大家熟悉的开发工程师和测试工程师外,还有一个有“微软特色”的角色,叫做项目经理(pm,programmanager)。不少读者可能对pm不是很熟悉,或者有一定误解。也许是因为pm本身是一个很不公平的称谓,因为他们既不写程序(program),又不管理(manage)人员,却被称为programmanager。一个有趣的说法是:pm的职责是做软件开发中除了写程序和测试之外的所有事情。虽然有些言过其实,不过,确有一些道理。一个pm在不同的产品阶段,责任是不同的。比如,在一个产品开发循环还未开始时,pm的任务是做客户需求分析,然后设计出该版本的蓝图;当产品开发循环开始了以后,pm的工作是把想法以及要求清清楚楚地写下来,交给开发工程师去完成;在产品开发循环中间,pm要不停地与开发和测试人员交流,随时对计划进行修改,以确保按时完成。在产品开发循环接近尾声时,pm又开始参与下一个版本的设计。
由于pm相对工程师而言,人数比较少,pm面试的经历也往往被较少提起。而且,pm面试的题目,也往往与工程师面试的题目大相径庭。希望我的一些pm面试的经历,能够对大家有所启发。
pm的问题一般分为两类,一类是设计问题,一类是情景问题。下面我就根据自己的经验,对上述两个问题简单地分析一下。
设计问题一般范围比较广,很多时候格式是“请你为xxx设计一个xxx”。比如说,请为盲人设计一个微波炉,请为老人设计一台电冰箱,请为小朋友设计一部手机,等等。这些问题主要考察应聘者的需要分析,创造设计能力以及优先级安排的能力。这类题目看似简单,每个人都能上来说两句,不过面试官却有自己的一套标准判断答案的好坏。不过什么样的想法是好的呢?这个问题就比较难回答了。还是用我经历过的一个例子来讲讲吧。有一次面试,我记得被问到“如果你要针对老年人,设计下一代的电冰箱,有哪些新的功能需要设计”。看到这个题目,我想不少读者都会觉得挺简单的吧,不少人肯定已经有一堆的想法了,我当时也一样,开始陈述一堆新鲜的功能:超静低音,绿色环保,节约用电,冷柜能够自动制作冰激凌,冰箱门把手能够自动测体温和心跳,冰箱正面还有lcd可以看电视。虽然自己说的神采飞扬,可是面试官表情却不是很赞同的样子。事后等到的反馈却是“想象力丰富,可是缺乏对用户的同情心”。原来,pm的一项重要标准就是看你是否能够想用户之所想,急用户之所急,充分地为用户量体裁衣,从而设计出为用户喜爱的产品。而我的回答却完全忽视了用户是老年人这个前提,反而是为自己设计了一台电冰箱。那么好一些的回答是怎样的呢?我们可以分析一下老年人的特点,比如行动弯腰不便,容易健忘,那么设计出来的冰箱就应该考虑这些,比如把储藏室抬高一些,老人就不用弯腰去拿东西;把门设计成电力辅助的,老人开门就不会觉得吃力;还可以定时提醒老人买牛奶,或者提醒牛奶已经过期,等等。这些功能都很简单,容易实现,却实实在在解决了老人生活中的不便。当然,这类设计问题的答案是不定的,任何贴切于用户的设计都能博得面试官的好评。
另外一类问题是情景问题,往往给出一个比较棘手的场景,考验pm如何提出解决方案。比如说,微软的产品x马上就要发布了,可是却发现两个问题a和b,每个都很重要。如果你只有人手解决其中的一个,应该解决哪一个?这种问题考察的是pm考虑问题的全面性和说服力。容易出现的错误是先入为主,马上根据自己的直觉给出一个答案,因为这样面试官往往会加入一些新的信息,从而使你的答案看起来是不正确的。比较好的做法是:做一下全面的分析,比如a和b分别会造成多大的损失,解决a和b又分别需要多少资源,产品x的市场策略是什么,微软最重要的形象是什么,等等。往往当你把所有条件都列在黑板上时,结论已经不言自明了。顺便说一句的是,这种情况的的确确会在工作中发生,到那个时候,pm们,开发经理们和测试经理们会跑到一个房间里(这个房间往往被叫做warroom),像刚才说过的一样,pm会把所有的信息都汇集在黑板上,然后大家一起讨论出解决方案。
测试人员的面试
微软总部常有很多测试工程师的招聘名额,有面向刚出校门的大学生、研究生的,也有面向有工作经验的。美国的大学中,除了佛罗里达州的floridainstituteoftechnology(fit)外,几乎没有其他学校设置软件测试专业,而只是设置涵盖软件测试内容的一、两门课,甚至只是讲述软件工程书里的若干章节。所以微软没有要求测试工程师的应聘者有软件测试学位,但当然希望学习的是计算机专业或其他有关专业,如电子工程、数学、信息技术、通信工程等。当然,也并不完全局限于这几个专业,只要申请者具备所需的编程能力和其他软技能就可以。
一般来说,第一个技术面试的考官会测试你的基本测试概念:比如边界条件(boundarycondition)、有效用例(validcase)、无效用例(invalidcase)、等价类(equivalentclass)等等。你开始不懂也没关系,面试官会给你耐心解释定义。等你明白了以后,就要看你是不是能应用这些概念来回答测试问题,看你能不能很快地学会新知识并应用于实践。
测试人员的面试主要看三类能力:一是重要的软技能,二是测试能力或潜能,三是编程能力。软技能包括:分析解决问题、替用户着想、联络沟通、交际、自信度、学新知识、系统思维、追根溯源、处理困难、团队精神和协作、管理、组织、分清优先度等能力。还要执著。遇到困难不放弃才能克服困难按时保质完成任务。
怎样评价测试能力主要是看给你一个测试问题后,你是否能够有由浅入深地分析出所有基本的、重要的、特殊考虑的测试用例。而且能否系统性地进行分析是很关键的。因为在微软测试工程师要能独立承担多个功能产品测试,我们要求测试工程师系统性地计划、执行和检查测试,不然很可能会漏掉重要的测试用例。有的应聘者能答出很多很好的测试用例,但却不能系统性地列出测试用例,而是无条理地、东一下西一下地找。比如,怎样测试一个自动卖饮料的机器(见下图)?
理想的测试工程师候选人应该能考虑到以下方面:包括外表感觉、颜色搭配、各部件相互位置等用户界面设计、内部结构、电源系统、投钱孔、灯、说明书、商标、饮料保持温度、机器室外最低最高承受温度、饮料补充和拿取、拿取口位置、拿取难易程度、重量、材料、饮料之间空隙、振动承受度、各种极端条件、特殊用户需求(小孩、老人、残疾人)等。针对投钱孔的功能测试应该有很多测试用例。比如测试输入钱的功能,应考虑用不同种的市面流通的所有钱币或钞票。比如硬币像一分、五分、一角、五角、壹元,纸币壹元、两元、五元、十元、一百元、五百元、假币、假钞、有缺损的真币、真钞票等。还有找钱的功能。边界条件应包括该输出的硬币或钞票用光了,没钱找时,应给消费者提示。还有很多可考虑的测试用例。就留下给大家做练习吧。
编程能力方面的问题可能和开发人员的面试问题有类似的地方,但应该简单一些,因为主要是基本的编程问题。微软从2005年前后开始对测试工程师必须要求有编程能力,因为现在初进微软的测试工程师的级别和开发人员是一样的,这主要是因为测试人员也要能编程,以便把大部分测试实现自动化。
对测试工程师的编程有关的面试题,不单单是看你能不能写出正确的代码,还要看你的代码能不能正确处理不同的数据或本程序需要处理的信息。你应该考虑到边界条件、包括有效和无效数据在内的不同数据类型、出错信息处理、给用户提供提示等做测试时需要考虑的测试用例。
开发工程师的面试(1)
开发人员的工作,主要就是围绕着软件开发的各个阶段,设计,编程,测试,调试等。理所当然,开发人员的面试,就是针对考核这几方面的能力。
(1)编程。有句话说微软的面试不写程序就不是微软面试了。没错,对于开发人员的面试这是真的。编程就是考你的基本功。
如果你的手已经生硬,多年没有写过一行代码,开发人员的面试一定搞砸。“能写程序”(ca