从一开始找实习,到最后转正敲定,我前前后后在微软被十来个人面试过了(平时也会看到同事和上司去面试别人,也了解身边实习生都被问到什么样的问题),有了一点点经验,基本上对微软的面试流程和大体思路有了比较充分的了解。转正之前发过愿说,如果能成功就写点资料。今年互联网工程院在中国大规模扩充,苏州新店明年即将开张,因此招聘也比以往容易了不少。如今能转正并非说明我自己的能力,只能说是赶上了好机会吧。
下面介绍微软北京西区基本情况。
微软亚太研发集团,位于海淀镇内丹棱街五号,毗邻著名上市公司新东方集团的总部及海淀区人民法院,靠近羲和雅苑、港丽、金钱豹、中八楼、玛雅、中钢江南赋、蕉叶等著名非著名餐厅,地理位置非常优越,呵呵。
主要分成这么几个部分:
1.亚洲研究院(MSRA),在二号楼最顶上的三层,视野非常开阔,工位狭小了些,《编程之美》这书就是研究院的一干人等吃饱喝足,琢磨着写出来的。他们喜欢招博士。研究院很有钱,据说每年kick off都能去国外玩。
2.MSRA的楼下是亚洲互联网工程院(STCA),搞互联网的,bing搜索引擎,计算广告,语音等等,欣闻MSN要关张大吉了呵。。。书里有一节是关于饮料的,他们研究院的人就涮了一下STC(说成Smart Tea Corp,实际上是Search Technology Center)。STC是跟MSRA亲缘关系最近的了,很多支持部门都是共享的,还有一些STC的人员就是从MSRA空降来的,毕竟数据挖掘、机器学习啥的在互联网领域应用最为直接。今年大肆扩张的就是互联网工程院。主要在做美国市场。说实话,英文搜索,bing真的技术非常强悍了,不建议大家迷恋谷歌。今年招这么多人,会不会分一些人来做做中国的?我是个小卒子,不清楚。
3.STC再往下是商务软件部(MOD),就是搞Office的了。顺便打个广告,我很喜欢OneNote,推荐大家玩玩看。当然了,我也挺喜欢有道笔记,有道笔记像快艇,OneNote像航空母舰。
4.目光切换到一号楼,这栋楼里是亚洲工程院(ATC)。俗话说得好,隔楼如隔山,实习了几个月,他们在搞啥玩意我暂时也还不清楚。操作系统?数据库?Xbox?Azure?不清楚。
下面说说微软面试的一些特点
1. 和所有IT行业招聘一样,问什么问题都是取决于interviewer个人的,没有什么所谓的题库,他想问什么就问什么。工作有一定经验的人能够当interviewer,需要经过一些培训。面试要符合一定的原则。(什么井盖是圆的之类的问题纯属扯淡,没人问这种问题,微软不问,谷歌也不问。)
2. 就校园招聘来讲,最重要的原则大概就是——1.以做题为主,而不是狂聊你的既往项目经验。对于我这种半路出家的人来说,这简直就是福音啊。2.必须要手写代码(当然电话面试不在此列)。《编程之美》所体现的大致就是这样的特点。
3. 上述原则是“技术面试”的原则。面试分为技术面试和终面(即经理面试,内部称作AA面试,似乎是as appropriate)。技术面试就是小兵和主管来面,终面就是经理来面。据我所知,技术人员招聘是完全没有HR面试这种环节的。经理是最终做决定的人,前面的技术面试所起的作用只是把人最终放到经理的面前而已(不过根据技术面试的表现来决定要不要进行AA面试的人是HR)。
4. 有资格进行AA面试的人数不多,一个大组一个。就STC来讲,统共只有十来号人,如果你有幸进入到微软,可以很方便地在Lync上看到他们的名单。。。。。
5. 继续说技术面试,每次一个人,时间一个小时。社招基本上是两个人。校招会随年份不同而有区别。今年招人多,于是只有两个人。往年似乎是三到五个人。题目其实大多没有《编程之美》上难题那么难。不会让你敲电脑的。好像第一节控制CPU那里说到还让面试者实际操作,不知什么面试官这么有风格,反正我闻所未闻。
6. 面试官其实是会根据你的背景调整问题的,有面试者学数据库的,如果碰巧他也懂,就会问点数据库啥的。我是数学出身,操作系统、编译、网络、数据库一概不会(真是不好意思),于是从来没碰到过这些问题。最后一场AA面试,一上来问我一堆C++面向对象、函数重用的问题(就是那种基类指针指向衍生类的)。他一看我都晕了,于是行了行好,转移到算法数据结构上去了。
7. AA面试,一个人,一个小时,一次机会。他说行就行,他说不行就不行。其实能通过前面技术面试,经理也就知道你技术能力可以了。到这一关,写代码不是必要的了。是否还要做题则因人而异。社招的话应该不会再做题了。到了这一关,经理会更多地看你的性格、态度、潜力、思维、表达等软实力了。他们都是四十多岁的老油条,即使是让你做题,其实也是更希望从你的解题过程中看到你的思维跟表达能力。所以,您要是自己闷头想,根本不理会他的提示,那就好自为之吧。
8. 经理们每人每年有一定指标特招(也就是技术面试未通过,仍然决定想要招聘),不过不多,我个人觉得意义也不大吧。
就先说这些吧,以后还可以再补充。
下面说说我在微软的几次面试内容吧。很多同学似乎觉得问了什么具体问题最有价值。不过我倒觉得恰恰相反,我上面写的内容才最有价值。
1.最开始接触微软是在未名看到MSRA招实习生,于是投了一个。有个挺年轻的研究员联系我,说是想做做类似于Boltzmann机解决围棋问题的课题,于是把我叫去聊了聊。他有这么个概念化的想法。这条路之前也有人走过,但也没有能走下去。聊过之后双方大概都觉得不是非常可靠,于是也就作罢了。
2.今年暑期实习,先后去面过ATC跟STC,每场各两人,明显感到了软开跟互联网的风格不同。ATC对数据结构和算法的要求非常非常高,乃至于会问我KMP算法,问得我简直想死啊。当时第一个人一上来让我写“递归法”求斐波那契。虽然心里觉得很奇怪,但也就写了个递归。他冷冷地说:“你觉得你这有什么问题么”。我内心的草泥马狂奔啊。我后来猜测,可能他的意思是,想搞个能存储中间结果,减少计算次数的“半递归”。总之ATC面完之后,HR当场说:同学,你可能更适合搞研究,请多关注MSRA。。。STC的要求就低一些,对你的数学能力更抱有一些好感。第一个人问了个未知大小随机取样的问题,再一个判断矩形重叠的弱题目;第二个人问了个概率论的三扇门问题(哥,俺就是学概率论出身的……),写段代码模拟一下,又问了一个类本书2.12题。于是我就这样找到了一份暑期实习。
3. 转正面试第一次,技术关两人再次轻松搞定。这一次碰到的两人都更侧重于编程能力跟代码风格。第一人,不定长二维数组拷贝(即各行长度不等)。第二人,字符串转整数,链表反转,要考虑种种边界条件,要给测试用例
4.对了,关于代码风格补充说一句。我个人总结,您别管去哪面试吧,变量名都最好能写得让人一眼就看明白,字写得好看点,缩进写得整齐点。写个啥abc、 temp的你就等死吧。个人经验,我代码能力真的不行,我学数学的能写个什么高档代码啊,我连STL都没用过,继承、多态从来使都没使过。不过我每次都把变量名写得比较长,让人家知道是干什么的,结果一写完interviewer都很开心。您要是写着写着发现落了几行,就标个号,再在后面做注,插上什么具体内容。绝对真实,欢迎参考。
5.转正面试第一次,AA关悲惨挂掉,S*** Yang面的。确实怪我自己,对自己认识不清所以聊天没聊下去,做算法题时又忽略了他的提示。算法题是加油站问题:某环线上若干加油站,已知各站油量及各站间耗油量,求汽车从某一站出发能够绕一圈。
6.转正技术面试第二次,这一次是和普通校招一起进行的。第一人,正中下怀的概率问题,用rand_int(5)构造任意的rand_int(n);类本书2.19题,若干区间求合并,还会进一步提示如何用查找树来解决。第二人,正中下怀的PageRank原理问题,后面的编程题我忘记了。。。。
7.转正面试AA,H** Yang面的,先聊天聊到我之前为啥AA没过……如前所述的OOP问题,我没答好。又一次是类似2.19题。之后是一个基本数据结构实现,可删早期元素的栈。当晚收到通知。