MSRA面经

来源:互联网 发布:淘宝怎么买vr资源 编辑:程序博客网 时间:2024/04/30 22:28

找工作过程基本结束了,我写了一份承诺的面经。当然其实我觉得微软笔试和腾讯面试部分也非常精彩,偷点懒不写了。O(∩_∩)O哈哈~,首先祝师弟师妹们明年都能拿个好offer!

  11月25日收到电话,11月29日飞北京,30日参加微软亚洲研究院的面试,12月1日飞回来。

   由于投的职位是RSDE(Research Software Development Engineer),因此内容主要是dev,但是离专业的development还是有一点差距的,并且掺杂了一些research的部分。一共四轮面试,上下午各两轮,每轮一小时,上下午两轮面试之间没有休息时间。

   先说说面试的整体情况,由于时间特别紧,这个面试官出去那个面试官进来,因此估计他们自己也没有啥时间交流。所以每个人都例行的问了一遍:介绍一下你做过的项目。这是一个非常考验人的活,即使是说相同的内容,也需要不厌其烦的说四次。当然,我担心他们后续会沟通,所以我每个人介绍的都略有不同,第一个面试官大致介绍了情况,第二个面试官侧重介绍系统架构和可改进的地方,第三个面试官讨论P2P的发展和现状,第四个面试官结合论文讨论自己系统的功能。下面开始介绍面试细节了哈(虽然面试官没有叮嘱,且没有签啥协议,还是不确定漏题好不好,因为我面试前也没有搜索到msra的rsde相关面试内容,具体题目都隐去吧),由于要记录四轮的内容,本篇日志非常长,当然你可以直接跳到最后的总结部分。

 

  第一轮面试由于是面试的开场,所以面试官表现的比较随和,不至于给人一个下马威。整个过程中交流的非常友好,存在疑问的可以直接问,对方会给你一些提示。并且他多次提到,理解不清楚的地方,要问,后面的所有面试都可以问

   进入倒数第二大题的时候卡壳了。面试官让我想一个稳定的排序算法,算法复杂度为O(NlogN)。我们知道,快排、堆排、归并排序都是不稳定的。使用索引排序或基数排序呢,又达不到复杂度的要求。卡壳了一阵子,面试官提示了一下,不要局限于排序算法,比如二叉搜索树,想想能不能用上呢。当时一想,恍然大悟,呵呵。

   新的要求来了,给你一张纸一支笔,把代码写出来。刷刷的一顿写,自己看着有点满意,却不知这里有个小BUG。面试官让在琢磨一下平均复杂度是多少,我把代码看了一遍,里面有个顺序遍历的小分支,那么最坏情况下复杂度是O(N*N)。改进一下树节点结构即可避免顺序遍历。

   这种在对方提示下,一步步的达到终点的面试感觉还是挺友好的,也没啥压力。第一轮感觉不错。

 

  第二轮面试介绍完项目后,人问了一下,你觉得如果现在重写,你认为有哪些可以改进的地方。当然我不太明白他所期望的改进是来自那部分,运行性能还是开发维护方面的,只得自己瞎扯。比如数据调度部分应该抽象成接口,这样我们可以切换不同的数据调度算法而无需修改其他部分,再比如socket和系统api,同样封装成接口,使用多态实现跨平台的系统,等等。不至于一句话没说但是也没有特别出彩的地方。其实项目做了这么多年了,自己是应该仔细想想这个问题,从server架构上的高并发到软件代码的后续维护上,都有很多可以改进的地方。面试忌讳临场发挥,有备而来才能从容应对

   话题一转,面试官提了一个问题:推导一下计算机图形学中的画直线算法。这学期才选的图形学,上个月才写过代码的,可惜啊,天煞的死活想不出完整的迭代实现了,只记得原理。推啊推愣是没有推出无除法和浮点运算的单步迭代条件。╮(╯▽╰)╭,不过人家说米有关系,主要是看你思考问题的过程。

 

  二面感觉不怎么好,毕竟推导直线算法的一个大题相当于挂了。出来就被送去吃饭去了,一点半继续面试。

 

  三面是最惨的一面,一点半走进小房间就感觉状态非常不好,人累,思维不活跃。但是没有时间了啊,只能硬撑着了。开场白同样是介绍项目,这次介绍比上午两次都要详细,个人感觉有点偏research的味道了。项目介绍的后半部分,面试官提了一个问题:所有的P2P都要有数据源的情况下才能进行,现在有没有什么系统能在持有资源的节点退出的情况下,还能继续运作的?我个人提了两个方面,但是不知道对不对,起码我认为提出自己的独立见解以及你对学术和产业界现状,应该是考察的一个重点。我说商业上和学术上有两条路:商业上就是现在广泛使用的云计算,也就是迅雷和QQ旋风推出的离线下载。在云里面只要有人下载过,哪怕他退出了云端一样的有缓存,其他用户搜索资源的时候可以秒下,相当于一个无限大缓存或种子节点。学术上可以使用网络编码增加数据的多样性,减小搜索特定资源的难度,举了BT下载中99%下载问题的例子以及介绍了一下随机线性网络编码的概念。

   然后进入技术面。有一个非常强烈的感觉大家可以参考一下“所有面试内容,都是基于你的简历上所写的内容来的,没有写的基本不问”。建议大家不熟的,千万不要写上去,写上去了的,要真正做到熟练掌握。

   大小端问题和指针对齐问题都有问,可惜当时脑子糊涂,做错了。还有一个典型问题,写一条语句判断float x是否等于3。老实说,要是换一个说法,float和int在实现上的区别,估计很多人知道。但是写一条严谨的语句,相信很多人写return x==3.0; 我也是这样。结论是什么呢?普通的编程这么做可以,但是涉及到一些高精度的地方,必须判断x-3.0小于一个足够小的数,才能认为他们相等。如果这是一个非常多次数的迭代计算,x==3.0的误差会越来越大。不过我个人感觉,这些技巧就跟用比特位一样,需要长期的训练,培养计算机类型的思维,绝非你知道不支持原生浮点数这个概念就可以了的。

   最后一个大题:给你一支笔一张纸,写一个XXXX代码。题目不难,但是对是否真正动手写过的人一下就能考察出来,只知道算法概念,没有自己实现过的人,裸写起来非常困难(面试时间受限啊)。没想到这只是故意设计好的一个陷阱,XXXX在单线程下工作的非常好,现在问你,如何改进从而适应高并发情况(多线程同时插入删除和搜索)。当时真懵了!这里需要修改传统的删除代码,使得加锁粒度足够的小。我当时愣是没想出来,等面试官离开小会议室的那一刻我顿悟了,想到一个解决方案,可惜木有机会了,内牛满面。

 

  最后一面遇到了一个行家,进来人家就说:“我也是做P2P流媒体的,CCTV转播08年奥运会的P2P网络电视一共两套,微软承接一套,当时我参加了开发”。要说紧张,真没有了,第三面那么惨,第四面也就不做啥希望了。但是没有想到第四面跟第一面一样,非常的友好和轻松,呵呵。

   同样是先介绍项目,但是人家直接问我说,你先介绍一下论文吧。那么我就把论文跟项目结合起来讲的,传统方案有什么问题,我们怎么处理的。没想到人家提出了一个很犀利的问题,他说XX情况下,这种方案不利于P2P节点之间的协作。当时我一愣,这个问题我都没想到,看来是论文中的一个BUG。人说这个问题不经过几百万节点的实际网络分析,光方针,估计确实看不出啥影响。然后开始侃当年的往事了,⊙﹏⊙b,当年有个XX路由器,总是干扰P2P啥的,我顺着杆子往上爬啊,我说我们也在实际应用中遇到了深度精简版XP的问题等等。聊天吹水到一定程度,那还是要回过头来面试的。

   第一个问题,写一个求最大公约数的代码。这个不难,我用的辗转相除。心惊胆颤,还好后面没有让你继续优化(编程之美上面有好几个优化算法,我真记不住)。

   第二个问题,类似于网上流传的一个内存受限情况下求N个数的中位数的问题差不多(但是要复杂,具体题目就不详细透露了)。于是按照那个思路提出了一个自己的想法。但是面试官提出疑问,这样的话中位数所在的桶是存着误差的,因为这里不知道已经产生了多少个数(及参考题中的那个N,是不存在的,哈哈),或者说我们把所有值重新遍历一遍是不合适的,怎么减小误差呢?其实不要把面试官提出的问题当成难为你,他们其实是在给你指点方向。后来我改进了一下方法,不断的学习历史数据改进现有参数。看来对方比较满意,当时问我有没有做过这个题,我说真没做过,但是我做过已知总数求中位数的题目。

 

  微软的面试虽然累,但是收获还是非常丰富的。结合整个找工作的感受,总结几点

   1、有疑问要问面试官,除了一面的情况,三面那个float x的问题,我实在不知道怎么做,问面试官希望考察的重点是什么,人家跟我解释的过程其实答案也告诉你了。总比自己一个人沉默的想要好,一个题目不知道,咱们可以进入下一个嘛。

   2、学过的跟计算机相关的课程,最好都复习一下,尤其是面微软这样的公司。其他公司因为时间受限,可能主要是面试算法题。但是微软有的是时间,一天时间四面,可以非常多的方面了,如果人家想的话。当然,正如二面的面试官说的,主要还是考察你思考问题的过程,背书式的出结果也没啥意思。最好学算法啥的都学通了,为什么要这么用,什么情况下适合用,不要吃快餐。

   3、学习算法和编程知识的时候要触类旁通,多思考一些引申性的话题。比如一面那个排序用二叉搜索树来做,如果问你搜索树能不能排序,肯定说能,反过来问排序算法有哪些,估计很多人直接忽略了搜索树。再比如多线程加锁,各种情况下如何加锁更合适呢?现有的一些数据结构是否合适在多线程下操作呢?多思考一下,不管有没有结果,总比到了面试的时候再想要好得多。

   4、实事求是,不隐瞒,多沟通。别的不说吧,就说现在的面试官以后可能是你的同事,你说要是面试过程中不实事求是,即使侥幸进入了,同事以后相处也是问题。一面最后有一个函数发生器的题目,跟四面最后一题一样,我看过类似的。我觉得没有必要隐瞒自己解题的思路,或者说故意假装想了很久,直接说我们先来思考一个别的题目吧,有点类似。进而讨论那个题目的时候,在面试官帮助下想想,能否借用已有知识解这个题。相信面试官也希望你是一个能触类旁通,容易沟通的人,而不是一个闷着头自己干的人。

   5、每次面试不管成功与否,都应该总结经验;对于简历上的每项内容,都要准备好扩展内容,而不是简单罗列。总结经验改进不足,相信很多人知道。而扩展简历内容说的是什么呢?很多人列了项目经历,现在给你一个问题,介绍一下XX项目。你准备怎么回答?简历上只有摘要的条目,离面试要求查远了。所以一定要提前准备,项目做了什么,有何意义,应用场景,自己的工作,问题和收获,自己对项目的思考,这些都可以提前准备一下,然后面试的时候按照一个流程娓娓道来。

  6、最后一个是本次找工作过程中的一个最大感受。相信很多人都会看很多书补充知识,但是书后面的题目,尤其是思考题,不知道有多少人做。编程之美上面每一章几乎都有拓展的思考题。我遇到过三次笔试或面试题目是这个思考题类似的。盛大和百度的笔试里面有,而因为我提前思考过,所以就直接做了。比当场想要好吧?腾讯的终面问了这么一个题目,搜索引擎如何区分伪原创。这个题目的精简版是根据关键字生成网页摘要,编程之美上面有。而页面相关,是这一章的思考题。当天中午我思考了一下,当天下午面试就遇到了比思考题更进一步的扩展。比面试当场想要好吧?并不一定是要压题,而是根据思考题发散思维,自己多想想有哪些解决方案,遇到类似问题不会那么仓促。

 

  找工作过程基本结束了,我也写了一份承诺的面经。当然其实我觉得微软笔试和腾讯面试部分也非常精彩,偷点懒不写了。O(∩_∩)O哈哈~,祝师弟师妹们明年都能拿个好offer!

原创粉丝点击