Skip to content

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实习纪哦!

4 Comments

  1. cnx wrote:

    现在NOI可以用STL了

    Thursday, March 31, 2011 at 16:56 | Permalink
  2. wrote:

    你怎么能面试Facebook,是在中国吗,还是去美国?求解。

    Saturday, April 2, 2011 at 21:36 | Permalink
  3. duguyue100 wrote:

    神奇的更新。。
    饿~话说我同学也是深受C++qsort毒害而现在打快排很费劲的人。。

    Monday, April 4, 2011 at 12:30 | Permalink
  4. BYVoid wrote:

    你要在MSRA多久?我暑假也可能過去。

    Wednesday, April 20, 2011 at 21:37 | Permalink

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*