2019年春微软实习面试经验
介绍
经过几个月的准备、投简历、面试和(最让人难受的)等待,终于在4月16日拿到了微软苏州STCA SE的实习Offer。所以在这里记录一下这几个月来所经历过的实习相关的事情,并想发表一下关于实习、关于未来计划的一些思考。
面试前
面试前最重要的当然是刷题、选择职位投递简历。在这次夏季实习之前的2018年底和2019年初,我还经历了一些和微软相关的面试经历。而且,这次夏季实习生的投递简历的过程也是一波三折,在上海和苏州的职位中纠结,最终还是选择了苏州。下图为投递过但最后撤回的职位。

2018年底:微软冬季实习
2018年10月份的时候看到了冬季实习的消息(当时的微信推送),感觉非常激动,于是很快就把简历投了上去,选择的职位也是微软苏州STCA的SE Intern。
等了一个月,终于在刚下课的时候等到了来自苏州的一个电话,一接果然是HR,心里非常激动,以为和SAP一样要电面了,可没想到就问了一个可以去的时间,我报了1个月(寒假嘛)后,HR就随便说了说如果有的话过几天会有HR来通知的就挂了。然后从同学那里听说这种实习一般都得需要3个月😔,所以就放弃了,最后果然也没有下一步。
2019年1月:MSRA和上海Blockchain
之后,在俱乐部邀请两位去过MSRA的学长学姐来介绍实习经历(俱乐部微信推送)后,学长表示可以内推。心里没忍住,就让学长帮忙内推了MSRA,接下来的事在这篇面经中讲的比较清楚,这里就不再说了。这次是我第一次接受比较正式的面试,成功体验到从自信到自闭的全过程,最终还收获了宝贵的我拒了MSRA的经历。
其实,在这段时间里,我除了投了MSRA,还投过了上海某个区块链相关的职位(上图中最后一个)。在拒了MSRA之后我心灰意冷,向和继续在你院浪费半年时间的残酷命运低头,所以过了几天区块链这个职位的HR打来电话问面试时间,我就直接拒绝了面试。
之后迎来了愉快的、本来准备刷题但是最后在家连LeetCode都没打开的寒假。
2019年2月:夏季实习投递简历
在寒假后第一个工作日就看到了夏季实习生开始投简历的消息(当时的微信推送)。因为刚开学,所以时间比较充足,所以在这次网申开始后,我花了一段时间更新简历,之后立刻开始投简历的。投简历经过了以下阶段。
- 苏州STCA,上海C+AI,上海C+AI Open Source
一开始以为可以投多个职位,所以浏览了一下实习列表,除了一定会投的苏州STCA,还发现了上海的两个职位。本来以为上海微软就只有支持,结果发现其实也是有开发岗的。其中普通的C+AI应该和STCA比较相似,但是另一个C+AI Open Source的职位吸引住了我。仔细了解后发现这个工作主要是给VSCode写Java扩展……我是VSCode(当然还有其他微软产品,除了Surface)的忠实用户,对这个开源和开发扩展的工作非常感兴趣,于是也把它选上了。
苏州STCA,上海C+AI,上海C+AI Open Source
后来听说只能投一个职位。我纠结再三,最后还是感觉在在MS写开源和在MS写Java听上去非常酷,而且这样也能提高自己混开源社区的能力,也可以避免把自己螺丝钉化,而且还可以去体验上海的生活,所以最后留下了上海Open Source的职位。
- 苏州STCA,
上海C+AI,上海C+AI Open Source
结果又没过几天就听说有学长可以帮忙内推。这可难办了:内推可以直接免掉笔试,而我之前对MS的笔试(好吧那是2015年……)的印象是:不会做。而且不仅当时的我不会做,现在的我也不会做啊……虽然刷了一段时间的题但是还是深知自己算法有多么的弱鸡(不管是从自己做题的要死要活的感受以及和同学比较),所以免笔试对我来说是个巨大的诱惑;但是学长只能内推STCA,而上海的是C+AI,这是两个大组,不能互推。又纠结再三,追求稳妥的我最后还是选择了先上车再说,留下了苏州STCA的申请。有关苏州还是上海这一点,文章最后还会继续讲。
刷题
当然了,投简历不重要,在面试前的这段时间里最重要的是刷题和准备面试。而MS的面试=做题(这一点请看下面面试部分),所以面试前的准备就是两个字:
刷题。
刷题的感觉每个人都不一样,对我来说刷题就是两个字痛苦。几乎每遇到一个题我大脑都是空白的状态,即使刷过50、100、150题以后也是如此;给自己安排的配额是每天5道,确实发生过很快就能解决5道的情况,但是那是少数,大多数时候都是2小时2道medium,每道题一段时间后想不出来就忍不住看Solution,之后心态爆炸准备找3道easy水过,结果被easy难住……;其他同学刷个几十道甚至几道就能在面试场上游刃有余,拿到新题至少有个思路不会惊慌失措,而我甚至在刷了下图这么多题后看到新题仍然是一脸懵逼,心里发慌;更别提其他人刷题就是放松、“找到真正的快乐”,而对我就是折磨……

总之,这段刷题经历让我终身难忘,也是我最后选择先上车再说的原因:我确实是不想再经历刷题的痛苦了……
PS: 在4月的时候看了下微软笔试题,发现当时选择内推是正确的,也证明了我对自己的认知没有错。
面试
3月1日结束了投简历的环节,然后就边刷题边焦虑地等面试。终于在3月12日收到了一封现场面试邀请,确认自己有空的时间后在3月18日收到了3月20日面试的通知。生日面试可真刺激。第一次面试包含两轮面试,两轮都基本就是在白板上做算法题,每轮1个小时,听学长说,只要过一轮就会又三面。
第一轮
第一轮的面试官把我从楼下带到面试房间后,随便寒暄了几句就开始做题。第一轮的题目是这样的:
n个人,以i,j元组代表i关注j. 输入关注关系的数组(例如
[(1,2), (2,3)]表示用户1关注用户2,用户2关注用户3),且认为每个人自己关注自己。计算所有人的被直接关注和间接关注的人数(比如i关注j,j关注k,那么i间接关注k,k的被关注量为3)
这个题目的做法是DFS,即对每个用户(比如说i),寻找(k, i)出现的个数,然后对每个(k, i),寻找k的关注量。用一个Boolean数组表示一个用户是否被访问,从而解决环的问题。最终写出来的算法和图的DFS遍历比较相似。
看起来很简单,都知道是DFS,但是当时不知道脑子怎么抽了想的是带回溯的DFS……然后卡了40分钟没想出来怎么处理环,最后面试官(应该是看不下去了才)来提醒了一下不带回溯,并指出来哪些行要改,但是我还是直到最后一分钟才做出来……由于是在MS办公楼一个小房间里里做的,当时卡住的时候紧张地满身大汗,话都不想说了……这种情绪还是得控制一下才好。这轮根据面试官的反应和个人感觉应该是挂了的。
第二轮
面完第一轮已经一个小时了,于是休息了几分钟就迎来了第二位面试官。和第一位不太一样的是,第二位面试官一开始还问了20分钟左右的项目经历。我趁势推广了我的博客,面试官在我博客上看到了An Infinite Loop Caused by Updating a Map during Iteration这篇文章,就饶有兴趣地让我讲讲这个bug以及怎么发现它的。这个部分我个人感觉讲的不错(毕竟算法题这么屎的我还敢面试MS的原因是我项目经验应该还不错吧……),面试官的反应也不错,这让我稍微放松了一些。
之后,还是得做题。这轮面试第一题是这样:
在二叉搜索树中,按照节点值的大小顺序,找一个节点的上一个节点。
这个题比较简单,因为对二叉搜索数进行中序遍历,其结果的顺序就是从小到大的。所以这个题最简单的做法就是先做一个中序遍历,将结果存储到数组中,然后在数组中查找要查找的节点。。
很明显这不是最优的,果不其然面试官要求进行优化。一个简单的优化是只记录前一项(而不是保存之前所有的节点),在中序遍历中,首先检查当前节点是不是要查找的节点。如果是,则返回前一项;否则,将当前节点记录下来,然后继续遍历。
以上两个思路可以参考LeetCode 173。之前的两个写法都是用递归的,所以面试官到这里又继续问,能否将递归改成循环。这个也是个比较套路化的做法,背下来就可以了,也可以自己写几个递归算法然后尝试用栈把递归改成循环,可以参考LeetCode 94的Solution。值得一提的是我不知道在这里又出什么问题了,又以为碰上了第一轮一样的错误(环),然后又开始纠结,紧张地满身大汗,话都不想说了。当时心里全想的是完了,然后又立刻安慰自己没过还有其他出路……不过还好,稍微冷静下来后仔细看了下代码发现自己纯粹是没事找事,所以就直接给面试官看了。
这个题到这里就结束了。之后面试官又出了一道题:
二叉树中,输入两个节点,检验两个节点是不是同深度但异父母。
这个题最简单的思路就是寻找从根节点到两个节点的路径,然后比较路径的长度和路径的倒数第二项(即节点的父节点),也可以采用BFS的思想。
这个题做了之后就让询问面试官一些问题后就结束了。
结束一二面后
这一二面还是比较刺激的,随便两道题就将我算法弱鸡的本质毫无保留地暴露出来。这时的心情还是比较复杂的:一方面第一面表现实在是太差了,但另一方面个人感觉第二面地表现应该还是可以接受地,面试官的反应应该也比较正面,再加上两面过一面就可以三面,所以还是有希望的。
令人喜悦的是3月21日就收到了三面的安排邮件,确认时间后在3月29日收到了4月4日三面的邮件。还是从学长那里了解到三面的形式不一,可能又会做题,但也可能只聊天。但是我当时已经松懈了,再加上考试的压力,我就没有继续准备了,准备自由发挥,认命了。
三面
4月4日前去三面,是和另外一批内推的同学一起面试。他们一天面完三轮,而我们先面了两轮的,这次去只用面试最后一轮就可以了。
见到面试官后,面试就直接开始了。一开始它看我简历,就直接问我React的一些问题,例如
- 三个框架的区别
- 为什么用React(API简单,概念简洁)
- React和Vue检测数据变化的方式更喜欢哪一个(当然是有利有弊了)
后面还看我简历上提了ASP.NET...
剩余内容已隐藏