Skip to content

Tag Archives: MSRA

MSRA实习纪(一):面试篇

(我目前正在面试 Facebook 的 winter intern,所以还是先赶快把这段欠了很久的面经写出来以攒人品吧。) 我面试的是 MSRA 的 Innovation Engineering Group (创新工程组),面试官是一位 RSDE II。他在面试之前跟我用电话和邮件确定了电面的时间,而后我的电话就非常准时的如约而至了。(题外话:Facebook 的电话就似乎没有那么准时。) 面试时不仅需要接电话,还需要进入一个网页版的聊天系统,这个系统可以即时对话,还有虚拟的白板可以用文本或图像写写画画,之后的写代码环节就是在这个白板上进行的。 接了电话,寒暄过后就进入聊项目阶段。首先是对我简历上列出的项目经历做了些蜻蜓点水式的随机提问,应该是为了确认基本的真实性。而后,面试官问我这些项目经历中最大、最复杂的是哪个,我回答说是大一至大二暑假时跟着翁凯老师做的那个嵌入式Linux的项目。于是就开始深入地聊这个项目,比如说,为什么会选择AT91RM9200做CPU。这个问题我之前从来没想过,因为芯片选型这些重要决策当时都是翁凯老师确定的啊。于是便磕磕绊绊地说了些计算能力和外设接口满足需求、性价比高、省电、CPU频率可调之类的。 聊过简历上的项目后,又问了和编程语言相关的问题,既有客观题又有主观题。我记得的有C#里面的Property是干什么用的,动态语言和静态语言的区别,C#属于动态语言还是静态语言——最后这个问题比较tricky,传统上来说C#是根正苗红的静态的面向对象语言,但C# 3.5和4.0增加了一些比较“动态”的特性,但我在面试当时其实只知道这些动态特性的存在,并不了解具体有哪些。(应该还有别的很简单的客观题我记不起来了。) 下一个阶段是时间最长的,基于一个假想的项目来提问各种问题。大概是说有一个唱片公司在全国各地开了很多家买唱片的连锁店,连锁店内用电脑展示歌手、唱片、歌曲等信息,顾客可以用店内的电脑完成浏览、查询、试听等操作。首先问的是这样一个系统的架构,我答就是有一个中央服务器,店内的电脑连接服务器获取信息什么的。(不详细写了我当时的答案了,时间久了也不可能记那么清楚。)然后问到说现在这样一个系统性能很差,应该怎么办。我答性能问题首先一定要profiling,看到底哪里是性能瓶颈才能对症处理,比如说服务器性能差、网络性能差、客户端性能差需要优化的东西就完全不一样。面试官补充说道是网络带宽的问题,店里面都只有拨号网络,问我应该怎样优化。我回答了几方面:一是可以削减传输的内容,例如音视频功能在带宽不够的前提下可以考虑不予提供;二是可以对传输的内容进行压缩,压缩有有损和无损两种,分别可以应用于图像、音频、视频内容及文本内容;三是可以在客户端做缓存,下载过的东西就不要重复下载;四是网络实在很差的情况下可以考虑不用网络,假设信息更新频率不是那么快,可以考虑每周一次把数据更新刻成光盘快递给所有分店(这个有点是为了展示自己具有“think outside the box”的能力故意说的)。然后面试官就问,缓存的话可以怎么实现。我就答了算法可以用LRU、MRU什么的;数据结构根据储存在内存还是硬盘上可选用 hash table、B+ tree  等。然后面试官又非常详细地追问了一下只用内存的LRU具体怎么实现,我就详细地答道可以用一个 linked list 和一个 hash table 来做什么什么的,互相之间怎么着用指针指来指去怎么添加怎么删除什么的。 最后一个阶段是实际写代码,在那个可以实时看到对方打字过程的聊天工具里写,不要用IDE、编译器。先是让选语言,说我简历上列的那些个语言里除了Haskell 面试官不会其它可以任选。我考虑自己多年OI到ACM/ICPC的经验就选了C++。结果呢,要求实现一个排序。说起来比较囧,其实我最不会写排序了。高中的时候搞OI,其他用Pascal语言的同学都把快排背得滚瓜烂熟,而我则很轻松地用标准库里的qsort函数搞定(至今怨念OI比赛不准用STL);大学里搞ACM/ICPC更是有STL里好用的sort函数用啦。所以说虽然说要让我敲一个二分图匹配、平衡二叉树或者最小费用最大流什么的我都能基本做到随手就来,对于自己好多年都没有写过一次的排序我还是比较没信心。最终我选择了时间复杂度达到理论最优而又写起来相对不容易错的 merge sort 来写。由于第一次在这样的环境和场景下写程序,写的时候极其紧张(一紧张连new和delete都忘了怎么用了直接图省事写了句“int temp[n]; // C99”),代码写得磕磕绊绊,不过似乎最终还是一遍就写对了。还是感谢OI和ACM/ICPC为我打下的扎实的coding基础啊。 最后面试官问我还有没有什么问题要问他,我什么问题都想不到就说没有。不过我后来想到,也许应该最后问他一下他对我面试的表现总的评价怎么样,对我个人能否给出什么建议这样的问题。即便面试官回避问题或者干脆不答,也许也能有一点谨慎好学的印象分。如果面试官答了那就有可能是真知灼见的建议。 和预先通知的一样,这场面试总共耗时整整一个小时。 我后来意识到,我在面试中踏入的最大的误区是,在面试时被问到问题完全没必要等面试官话音刚落就回答。这是出于日常生活中两人交替说话时的行为习惯。但我现在觉得完全没必要在面试中也这样,对于比较复杂无法在一两句话内答完的问题,尤其是主观问题,完全没必要把自己第一感觉得到的答案直接说出来。可以直接跟面试官说我想一下,然后花个三十秒考虑一下各种可能性,分几点来回答,然后再有条理地说出来,这样可能会给人感觉更好。 悟到的另一条面试经验是,由于面试官问的很多问题都会直接基于你的简历中的内容。确认简历中内容的真实性也肯定是面试官的一项重要任务。所以有必要在面试前把自己的简历好好过一下,考虑一下每一项能力、经历等描述有哪些可以提问的角度,预先自我演练一下。比如说,把自己简历中从前做过的项目仔细过一下,不仅要想清楚自己在其中的作用和贡献应该怎样表述和展示,还有必要想一下整个项目在选型、架构等重大决策有哪些、为什么这么做,尽管那些决策自己可能并没有参与做出。 好了,这篇就是这样,敬请期待今后的“MSRA实习纪”系列。将来还可能会有Facebook面经以及我真心希望能有的Facebook实习纪哦!

MSRA实习纪(零):简历篇

我从2011年1月25日起在 MSRA (Microsoft Research Asia) 的 Innovation Engineering Group 实习,为期约六个月。在此期间,我会在遵守保密协议、保守商业秘密的基础上,对这次实习经历做一些心得体会的总结。以下是本系列的首篇文章,主要是写了我在正式发出实习申请之前写简历时收获的自我认识。 2010年11月27日,我看到刘未鹏(pongba)发的一条tweet,说他们组要招实习生,为期至少六个月。后来我又收到了未鹏的邮件,问我能否推荐实习生人选。 我知道未鹏在MSRA工作,但当时并不清楚他具体在哪个组。但是我当时的想法是,不管未鹏在哪个组,我相信他的选择,他所在的那个组就是我想去的那个组。我对未鹏的了解始于高中的时候,那时刚刚学了C++,于是就像很多C++程序员一样不可救药地沉迷于这门其创造者都需要别人来教他怎么用的语言的奇迹淫巧中,于是就如同艺术领域的初学者第一次踏入罗浮宫一般,带着崇敬和仰慕半懂不懂地阅读未鹏当时名为“C++的罗浮宫”的博客中 template metaprogramming 之类的C++高级技巧。 然而,高中时的我从未鹏的博客上收获的绝不仅仅是C++的语言技巧。正是从未鹏的博客上,高中的我初次领略了理论计算机科学的美:到现在,我还清楚地记得自己初次阅读《康托尔、哥德尔、图灵——永恒的金色对角线》一文时,被高密度的既极度新鲜又激动人心的概念轮番轰炸(哥德尔不完备性定理、Lambda演算、停机问题、Y Combinator、不动点定理、对角线方法、罗素悖论⋯⋯),那种醍醐灌顶般被震撼到几乎忘记了呼吸的美妙感受。——这就是我在计算机科学领域的真正启蒙吧。 也正是从未鹏的博客上,我理解到了一个程序员最重要的工具是他的大脑,任何fancy的语言、框架、IDE以及各种 buzzwords 的重要性都远不及他的学习方法、思维能力、行为习惯、心智力量的重要性,而正是这些“内功”层面的东西决定了卓越程序员与普通程序员的分野。 (扯一句题外话,刚才提到了我在计算机科学领域的启蒙始于未鹏的博客,而我在有关但并非完全等同的软件工程领域的启蒙则始于某个记不清楚的日期逛北京王府井书店时,出于不可知的原因央求同行的姑父给我买下了一本2004年3月第1次印刷的《程序员修炼之道——从小工到专家》,即 The Pragmatic Programmer: From Journeyman to Master 的中译本。同时,那次经历也是我第一次见识到用一张薄薄的卡片刷一下就能付款。) 接到未鹏发来的邮件时,我自己还并没有找实习的打算,于是我通过论坛等方式把这条实习信息传达给了浙大ACM集训队的现役及往届队员,还给一些我觉得可能会想实习的学长打电话询问,但大家都纷纷表示很难抽出整整六个月的空来。 后来,由于一些莫名其妙的动机,我产生了想离开杭州一段时间的念头。于是我就跟未鹏说我找到可以推荐的人选了,其实就是我自己,呵呵~接下来的当务之急就是写一份简历。坦率讲,这还是我第一次需要写份正襟危坐的简历呢。写之前觉得很容易,不就是把自己干过啥会干啥一条一条列出来么。没想到写了又写改了又改花了大约三天左右才写好第一个让自己满意的版本。(我当前版本的简历可以在这里访问到。) 写了一份正式简历才知道,尽管从前并没有人找我要过这个,但写简历的过程还是给人挺多启迪的。比如说,简历的第一个Section一般都是叫“Objective”,也就是简述你个人在事业和求职方面的目标。我以前并没有仔细思考过这个问题的答案,所以在这三天里一边写其它的部分一边思考,最终写上了一句“Build tools that make programmers’ life more fulfilling, including mine”。——这肯定并不是最终的答案,也许以后的经历会告诉我这个目标定得过于宽泛或者过于狭窄或者并不那么适合自己,但我非常高兴自己能在大三上半学期而不是更晚的时候对这个问题的答案进行了仔细的思考,并给出了一个让当时的自己满意的表述。 对于我来说,在事业方面的困扰从来都不是选择太少而是选择太多:从大方向上来说,不管是 Computer Science 还是 Software Engineering 都可以说是感兴趣且有一定基础;从更细分的 topics 来考虑的话,programming language theory, compiler construction, functional programming, […]