标题:面试实战--M公司


2008年初,物价飞涨,猪肉与牛奶价格涨了100%以上。尽管因为良好的表现,在P研究所的工资已经涨了不少,但是依然无法跟上物价的上涨,买房子似乎更是遥遥无期。待在P研究所的我再也耐不住性子了,因此开始寻找更好的机会。

于是,我怀着试一试的想法,登陆了IT界top2的M公司的招聘网站,注册了一个网上简历,投了相应的几个职位。投了之后,就似乎忘记了这件事。没想到过了2周之后的一个中午,手机突然响起了一个陌生电话,顿时兴奋起来。一接听,果然是M公司打来的电话,说是让我去M公司参加一个非正式面试。我晕,M公司还真是拽,连面试都还分为非正式面试和正式面试。我也没来得及问什么是非正式面试,就高兴的答应了。

M公司的面试,是我非常重视的一次面试。接到电话后,离最后确定安排面试的时间还有3天,因此我赶快温习了一遍C语言,C++语言的一些知识。把那几本经典的C,C++书籍也拿来看一遍。还复习了自己平时工作中总结的笔记。

面试的日子终于到来了。

当天早上我起了个大早,比约定的时间早了几乎一个小时到了M公司的研发总部。在进大厦的时候,M公司研发集团几个字映入眼帘,心里就比较激动,这可是无数IT程序员向往的地方啊。来到3楼,我在大厅的沙发上坐下来静静的等待面试的时间到来。我仔细的打量着周围的一切,看着里面上班的人刷卡进屋,在门口拿免费的早餐面包,非常的羡慕。此外,心情也很紧张,不知道接下来的面试,自己能有什么样的表现。

时间一分钟一分钟的过去,面试的时间终于快要到来了,还有十分钟时间。时间越近,我的心情越紧张。我打电话联系那天通知我的人。不一会儿,他来到了大厅,把我带到了一个小会议室。M公司的会议室的命名也很有意思,以美国的一些著名的场所或者比赛场地命名,但具体的名字我现在却忘记了。

来到会议室,我首先递上了自己的简历,尽管他们肯定有我的简历,但是我还是提前准备了几份,亲自递到了他的手里。所谓的非正式面试正式开始了。首先,他让我做一个自我介绍。自我介绍结束后,就让我开始介绍我所做过的项目。我开始介绍起来。3个项目轮番介绍,我介绍得也很卖力,害怕把项目中任何一个重点部分给遗漏了。介绍过程中,他主要在听,并表现出对我说的和我所做的很感兴趣,因为我做的是安全相关的,而且比较系统底层,这个可能他也是第一次接触。

开始我并不知道我要面试的组是M公司的哪个组。之后我发现他对我简历中的Windows Mobile 项目特别感兴趣。我就料到了肯定是Windows Mobile组。后经确认,确实是M公司的MTC部门。他通过这个Mobile项目问我,既然你是做安全的,那么Windows Moblie里面有哪些安全机制呢?这下我就郁闷了。Windows Mobile的安全机制我了解得很少。可我又不能不回答这个问题。于是我就大谈了一通Windows XP和Windows Vista的安全机制,什么驱动签名机制防止Rootkit,什么栈上no excution机制等等。说完之后,他一针见血的指出,我说的不是Windows Mobile的安全机制。

接下来,他递给我一张纸和一只笔,给我出了一道简单的程序设计题,即让我写出strstr()函数的实现。对于strstr()函数,我并不陌生,以前还经常用到。于是我就开始写了起来。不一会儿,我就写完了。把代码交给他看。结果一下子就被他发现了一个错误,我把==用成了=号。这个幼稚的错误我都能犯,当时心想,这下完了,没下轮了,于是心里有点慌了起来。不过接下来,他继续问我,有没有什么优化的可能呢?我一下子就想到了字符串的模式匹配算法,可是他并不满意,问我还有没有其他的。想了半天我没有想到。后来他提示我说,其实可以判断子串的长度小于母串的长度,可以直接判断查找不成功等。我也才恍然大悟。然后,他告诉我,今天的面试结束了,回去等消息,并问我有没有问题要问他的。我就把一直不解的非正式面试问了他,他解释到,以前M公司在正式叫应聘者前来面试前都有一轮电话面试,紧接着才是onsite面试。由于人在北京,所以非正式面试也被叫到M公司来面,而不是以前的电话面试。

于是,我和M公司的第一次面试就这么结束了。在走出M公司的大门的那一刻,自己心情非常不好,为刚才的面试那个不该有的失误而感到难过,心想,和M公司的接触也就是擦肩而过。

开M公司回到家里,心情很郁闷。可就在这个时候,又一个陌生电话响起来了,一看号码,我就知道是M公司打来的,顿时又重新有了希望。电话接通之后,是M公司的HR打来的。让我下周一上午9点去M公司面试,并告诉我随后会给我发面试安排的邮件和相应的面试官。我迫不及待的打开邮箱,很快收到了邮件。邮件上写明,周一上午安排了3场面试,根据这3轮面试的结果来决定是否在下午安排更多的面试。

时间一下就到了周一。我又一次早早的来到了M公司。9点了,3层的前台有零星的几个人。面试我的考官是哪位呢?他来上班了吗?我有点着急,可是又没有他的联系电话,于是我只能等。还好,这个时候我看见了一个人也在看着我,一打听,果然是我的面试官。于是,他又将我带到了一个小会议室。

面试开始了。首先,他让我做英语的自我介绍。我就简单的介绍了一下。当他知道我是中科院软件所毕业的时候,插问了一句“which lab?”,结果我没听明白,他只好用中文问我,我显得比较尴尬。

接下来,正式的技术面试开始了。他没有怎么看我的简历,也没有问我的项目,而是首先考我的C和C++相关的知识,比如static的作用,没问题,我都答了上来。然后问我多线程编程常用的几种机制,critical_section与mutex的区别,可惜当时的我,并没有仔细去研究它们的区别,只能告诉他,critcal_section运行起来效率比mutex快,但至于为什么快,我就无法回答了。接下来又是算法设计与实现,让我写一个strtok()函数的实现,大家看见了吗?又是字符串设计题。碰巧的是,自己以前也接触过strtok()函数,因此入题很快。最后写了出来,递交给他。实现上没什么问题。于是,他继续问我,怎么测试你的这个代码呢?于是,我又不断设想此算法的不同测试情况,包括各种边界条件,各种特殊情况等等,并一一告诉他,他都点点头。最后,他还出了一个设计题,让我不考虑具体实现,为一个生活在一个大都市的盲人设计一个系统,以方便他的生活。这类设计题,是考查的重点就不在技术而在于你的思维是否开阔,是否拥有创新性想法。我从盲人如何上网看新闻,如何乘坐交通出行(第一次知道在美国,打的是需要直接打电话到出租公司叫车,而不是像中国这样满大街的都是出租车),如何看医生等吃穿住行用各个方面来加以设计。设计题结束之后,他问我有没有问题问他,我好像没有问他更多的问题,因此M公司正式的第一面终于结束了。

他让我在会议室等着,他去叫下一个面试者。乘着休息时间,我终于得以喘息一口气,调节调节大脑。刚才的面试,自己整个脑子都在积极思考,脑力劳动也是挺辛苦的。

大概5分钟之后,一个穿着时尚,身材高挑的美女走进了会议室。她就是今天负责第二面的人。她不是负责我的技术面试,而是HR面试,所以她告诉我,我面你,应该算是所有面试中最轻松的。后面的面试经历,果然是这样的,我可以边回答她提的问题,边偷偷的欣赏这个M公司的美女HR。首先她又让我用英语介绍下自己的工作经历。开始我没听得很明白,又想弄个自我介绍。结果被她打住,说是工作经历,而不是自我介绍。因此我又切换为工作经历介绍。本人大二的时候就提前其他同学一学期过了英语六级,因此做个简单的英语介绍,还是没有问题的。后来,她又开始问我问题,比如你为什么要选择来M公司工作,你期望的薪水是多少,你都做过什么项目呢?尽管不是技术面,她还是对技术很好奇的,问了我Windows Mobile与Andriod, Symbian等的不同,我也一一作答。她边问边做记录,我边回答边偷看身边这位美女HR。

第二面HR的面试也结束了。HR mm随后带我去另外一个房间等待新的面试官。当时我问她有没有水喝,因为2面下来,偶已经说了很多话,感觉有点口渴了。因此她带我到了M公司的免费冰箱里拿了一瓶冰红茶。

随后我被安排在了4层的另外一个会议室。不到一会儿,一个年轻小伙进入了会议室,他就是今天第三面的面试官。实际上本来应该面我的是另外一个manager,但是他却出差去了,所以就派了这个年轻小伙来面我。小伙一坐下,就直接问我问题了。首先第一个问题就是问我,C语言和C++语言的区别和以及分别有哪些优缺点,接着问我函数的重载相关问题,如为什么返回值不能用来函数重载。问题问完后,算法设计题又开始了。小伙先让我定义一个链表结点结构,太简单了,我很快写了出来。然后,小伙问我,如何判断一个链表是否含有循环。我一听,这个算法是很出名的,不就是步长法来判断吗?于是我脱口而出。小伙愣了一下,然后问我是否有其他的方法。我限入了思考,但是一时半会没有思路。后来他又给了我提示,我突然有了思路,并把思路告诉他。他同意了我的想法,最后还是要让我把代码写出来,并说写完代码就带我去楼下吃饭去。链表的操作我还是玩得很熟的,于是一会儿就写了出来并交给了他。

这样,上午三轮面试就结束了。我很庆幸的是,3轮面试之后我还没有阵亡。

接下来就是M公司著名的午餐面试。小伙带我到楼下餐厅,让我自己点自己喜欢吃的东西。我就随便点了一个。午餐还没上来,小伙就开始不停的问我问题,搞得我很疲惫。他问我,如果你和你的领导对于某个问题观点不一致,你怎么办;你和你的团队观点不一致,你该怎么办;在上午的面试中,有没有你以前做过的题目;在来M公司面试的只前,你做了哪些准备。我都一一做了回答,并告诉他,在面之前我确实做了不少的准备,熟悉了编程语言与数据结构,并知道M公司爱考字符串。后来我发现,我这个回答对我造成了不好的影响,也许让他们误认为了我之前知道了他们的面试题目,也许也是因为这一点,影响了我最后的面试成绩。这个教训让我明白,人太坦诚了,也不一定是好事,尤其是因为坦诚而让对方对了有了更大的误会,让你吃了不少亏。整个午餐,小伙并没有让我好好吃饭,一直在问我问题,搞得我很疲惫。

吃完饭,小伙将我带入3层的又一个会议室,让我在那里等着,会有另外一个面试官来面我。果然不到一会儿,另外一个面官走了进来。第四面开始了。第四面完全面的是代码的管理和测试相关的知识和技能。由于之前在P研究所,根本没有考虑这些代码管理和测试流程,也没有进行过相关的培训,所以,觉得傻了。他问的很多东西我都不知道。他到是也没有对我失望,干脆给我讲解了很多关于代码管理和程序测试相关的知识。包括code review,包括如何编写测试案例,包括自动化测试。还好,我的学习能力很快,马上上手并写了一些测试案例。

四面结束后,大概已经下午3点了。他直接将我从会议室带到了另外一个拥有独立办公室的面官前。很显然,这个面官至少是个senior manager了。

第五面开始了。能熬到第五面,我其实已经感到很有成就感,过五关斩六将的感觉让我感觉不错。他开始问我做过什么项目,我又开始对自己的项目做了一番介绍。然后他又问我,你都有哪些优点。我想了片刻,自卖自夸的把自己的优点说了一遍。他让我举个例子证明我的优点,我又结合自己的项目说了一遍。他问我,你的项目都是内核底层编程,和运用态编程不一样,你有什么看法。我谈了自己的体会。最后,他就递给了我一张纸和一只笔。我知道M公司最典型的纸上编程又要开始了。他让我写一个链表的排序算法。我很快的写了出来,他不满意,因为我对链表只交换了值,而没有移动指针。于是我又给出了第二个版本的链表排序算法。他提出了我的算法的一个小问题,我很快纠正了算法。

就这样,第五面最后也结束了。他将我带到了另外一个独立办公室,让我去见另外一个面官。很显然,接下来的面官的级别肯定会越来越大。我心中既兴奋,又显得很紧张。

进去之后,我规矩的坐了下来。他首先向我做了一个自我介绍,并告诉了我他的英语名字。紧接着问我:据说你来面试之前做了很多准备?我心一想,肯定是中午午餐面试的那个小伙把从我这里打听的消息告诉给了后面的面试官。实际上,M公司的面试流程正是这样的,前一个面试官把自己的面试结果通过电子邮件或者他们内部的网上简历系统通知给下一个面试官。当然,如果你表现很差,前面的面试官就可以直接把你淘汰。我告诉他,其实也没什么很多的准备,也就是复习了一下C/C++语言和数据结构。然后他也没和我做过多的寒暄,直接递给我纸和笔,让我写一个关于树的算法。与树的孩子和兄弟相关,但具体题目我忘记了。开始我想利用队列来解决,但是他提醒我,想好了思路,就不要变不要增加任何条件了。我感觉不大对劲,难道用队列解决难度很大?他又提示我,你其实可以换个思路来解决。我马上就想到了递归。因为树的问题,大多可以通过递归来解决,既简洁,又清晰。

于是我开始动手用递归来写。果然,越写思路越明确写得也越顺手。最后终于把写好的算法递给了他。他大概看了2分多钟我的算法,没有找出任何问题,我能感觉到他对算法很满意的样子。然后,他问我有什么问题可以问他的。面了一整天,我其实已经身心俱疲,也想不起什么问题可以问了。于是我告诉他,我没有问题可以问了。他似乎不大满意,让我想想有什么问题可以问他的。我就说,以后我能问问你我是否被录取了吗?他说,那你可以去问HR。于是,他打算把我送出门去。我起身穿外套,他还很友好的提示了我说我外套的领歪了。我于是整理整理衣衫,走出了门外。他还送我走出了大门,我问他,今天的面试结束了吗?他说是的,结束了,回去等消息。

走出M公司的大门,我发现太阳已经在西边快要落下,时间已经快6点了。我真的不敢相信自己从早上一直面到了下午6点,总共六面,而且还坚持到了最后。

回去后,就开始等待M公司的消息。可是2天过去了,还是没有消息。于是我有点着急了。难道被拒了?自己感觉自己面得还很不错的呀。为了让自己不再整天想这个事儿,是死是活早知道也可以安分下来,于是我拨打了那个2面美丽的HR mm的电话,问她面试结果。她告诉我,面得还不错,她会组织那些面试过我的人开会讨论,并让我等待进一步通知。

果然,电话打了不久,又收到HR的通知,让我又在下一个星期一去M公司接着面。虽然很遗憾,经过6面之后,没有直接拿到offer,但还让我去面试,我也感觉有了希望。

又一个周一到了。我第三次走进了M公司的大门。在我等待正式开始的时候,已经有一个哥们被即将面试我的考官面完,并神情严肃,从那表情就能感觉到他面得并不理想。果然,他不久就被HR通知回家没有接下来的面试了。

上午10点第7面准时开始。面官是一个senior manager,他带我去会议室面试的时候,周围的M公司员工都向他打招呼,他也显得很忙碌的样子。之后面我的时候也一直在忙着有电话打来。

进入会议室后,我还看见了他面试前面那个家伙留下的草稿。只不过很可惜的是那个家伙没能继续下去。想到这里,我有点紧张了。我会不会和那个人一样的结局呢。

我坐在他的对面,看着他试图打开网络调出我的简历,去等了半天也没有成功,看来M公司的系统也并不是很有高效啊。于是我直接给他递了我准备的纸简历。他非常快的浏览了一下我的简历,并在我简历中的一些关键字处画上了圈。然后开始发问了。他根据我的简历开始发问,问了我MFC的消息映射的机制,再问我calling convention是什么,C++语言中的虚函数机制是什么样的。对于这些问题,我很高兴自己都能回答出来,但由于自己比较紧张,回答问题有语速有点快,被他发现我很紧张后,他开始安慰我说,别紧张,到目前为止,你的表现都很好,我这样随便的坐着(他敲着腿坐在我的对面),就是给你一种宽松轻松的环境,放松心态。于是我稍微放松了一下心情,继续答题。紧接着又是设计题,让我设计一个手机电话簿备份功能,以防止手机丢失。由于自己曾经做过网站,我很容易的想到了建立一个网站,在服务器端为手机提供网上备份功能(是不是现在炒作的云计算雏形?^_^)。设计题完了之后,紧接着又是一道编程题。笔和纸递给了我,让我如何找出一个数组中所有的重复数字。他出了题就让我开始写,在我思考的时候,他让我先写着,并想好有什么问题可以问他,说完之后,他就暂时离开了会议室忙自己的事去了。

拿着纸和笔思考了一会儿,就有了思路。我发现在高度集中注意力的高度思考下,灵感也来得很快。于是动手开始写,一会儿就写了出来。写出来之后不久,他又忙着进了会议室,我把算法给他看,他很满意。问我有问题问他吗?我就随便问了一般的问题。他回答完之后,就把我带回来3层大厅把我交给了HR,让HR为我安排接下来的面试。我很庆幸,我没有像刚才的哥们那样被淘汰。那种过五关闯六将的感觉棒极了。 遗憾的是,当时本来安排给我面试的MTC部门的老大上午在开会没有时间了。于是我被延迟到了下午3点。当时得知这个消息的时候,我并没有多想,连过7关的我有点得意忘形了,甚至觉得M公司已经注定向我伸出了召唤之手,因此一身的轻松,对自己截止7面以来的表现也感到非常满意,认为下午的面试应该是和这个M公司的老大谈谈理想和规划,聊聊天就完事的了。

下午我又提前半个小时第4次踏进了M公司的大门。3点了,还是没有人出来联系我,我有点着急,于是又给那个2面面我的HR美女打电话问情况,她告诉我,别着急,才刚过3点,他会出来联系我的。果然,一会儿就有一个看着很精神很年轻的人出来联系我了,并很友好的和我握手并告诉我他叫什么名字。他就是整个MTC的主管。如果他的样子和他的年龄吻合,那么他也真够年轻的了,而这么年轻就当上了这么一个大的部门的主管,也算年轻有为了。

他开始带我到他的办公室,路经M公司的办公场地,他还向我介绍M公司的一些内部情况,比如部分人员已经搬到了清华科技园等。进入办公室后,我把自己的简历递给他,他说其实他们有我的电子简历。于是他开始问我问题:如果C++十分是满分,你给自己打多少分?我说8.5 分。于是他问我,那1.5分是哪些地方没掌握呢。没问多少C++的问题,他就开始给我出设计题。由于面的是手机开发部门,他问了一道与手机相关的设计题,即如何实现目前手机中的智能输入法,比如要输入一个单词,可以通过手机键盘(与计算机键盘不同),拨下几个有限的键,就可以实现一个带有提示的正确输入。我听了之后,没有完全明白他的意思和要求,只好胡乱的说了一通,比如用二叉排序树,但也没有给出一个很好的解决方案。于是,他看我无法再当场给出很好的解决方案了,就告诉我这个设计题你下去之后可以好好想想,你会发现很有意思的。紧接着说,我们编程吧。

于是,他给我纸和笔,把题目告诉了我。题目很容易理解,就是把一个IP地址字符串转换为一个32位的整数。他问我,懂了题目的意思了吗?我说懂了。他还问,以前做过吗?我已经边开始思考这个问题的解决方案,边应付着回答说,没有做过。

就这样,我开始写这个算法的代码。他就离开了我走到旁边的电脑上开始做自己的事。不多久,我想出了这个问题的解决方法。从字符串的左边至右边扫描字符串中的”.”,然后将字符串分为4个部分,对每个部分的字符串转化为整数,然后将整数分别左移24位,16位和8位,再将结果相加。思路有了,于是开始写代码。代码写得其实很吃力,主要是没有处理好扫描部分的代码。4个部分的数字的代码重复写了4次。然后用自己实现的字符串到整数转换的函数实现转换。而后来自己还发现自己在“<<”运算符与“+”运算符的优先级上犯了初级错误,本来我想写成(a << 5) + b,但是由于没有弄清它们的优先级,我写成了a << 5 + b即为a << (5 + b),其结果大不一样。也许这个错误是致命的。还有一个不足就是我在算法中为了知道各个”.”中的子串的结束,而修改了原字符串,将”.”分别变成了”\0”,这个也是不对的。

算法总算写好了,并把写好的代码交给了他看,并告诉他,代码可能写得不大好(这句话有点多余,一下就让人家觉得我不自信了)。他接过我写的代码,边看代码边问我为什么写得不大好。在他看的时候,给他介绍了自己算法的思路。他听了我的思路,说了句“that’s what I want”,证明我的思路是争取的。但是,对于代码,我自己都感觉写得有点乱。他也问了我,为什么你这个循环里的代码连续重复4次呢?我说因为要4次把字符串转换为整数。而此时自己的脑子也热一阵冷一阵的。感觉情况不妙。

果然他看了我的代码没有再说什么,走到他的电脑面前开始记录我这次面试结果。而我这个时候,包括我在写代码的时候,S公司的HR也开始频繁给我打电话,但写代码的时候我没有接,因为正在郁闷的忙着写代码,但S公司的HR也真够尽业的,频繁的给我打,还好我将手机设为震动了,但也给我写代码制造了不小的干扰。因为S公司也是今天我的最后一面,我在中午12点之后3点之前去了S公司完成了最后一面。很显然S公司的HR现在给我打电话,肯定是给我发offer并讨论给我的待遇问题了。

在他记录面试结果的时候,我终于可以离开会议室接听S公司HR的这个电话。接完之后,我回到了会议室。面官告诉我,到目前为止,我在M公司的面试总算告了一个段落。我会将所有的面试官组织起来,讨论是否录用你,并将在一周之内告诉你结果。说完,他亲自将我带出了M公司3层的大门,并再次与我握手,并让我保重。

面试结束后,剩下就是苦苦等待。一天过去了,没有消息,2天过去了,没有消息,而这个时候我已经有了S公司的offer。我曾经一度担心如果S公司和M公司同时给我offer,我该如何选择。S公司是让我去做系统内核驱动,而M公司让我做的是手机应用开发。平心而论,我更喜欢系统内核底层的东西。但对M公司又是非常的向往。3天过去了,一周过去了,我依然没有等到M公司的消息,没有offer,也没有拒信,直到本人写下本书也没有任何消息。而此时,M公司已经宣布裁员5000人,我所面M公司的那个部门全部裁员。不知道是该可惜还是觉得庆幸。而唯一确定的是,我的前7面不错的表现,败在了最后一面的掉以轻心和一些不该有的失误,功亏一篑。



看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注