微软面试经历和相关思考总结

这篇文章介绍我面试微软的完整经历,以及相关的思考总结。文章字数1.3w+,阅读全文大约需要半小时。断断续续写了一个月,可能是市面上最良心的面试经历文章了吧。

一方面是做个记录,另一方面是给有意向进微软的小伙伴们提供一些参考,特别是多关注平时需要注重哪些方面的能力锻炼和知识积累,面试前临时抱佛脚的做法还是不太好。

文中部分观点比较主观,有不同看法欢迎讨论。

背景

先简单介绍我的情况,西安电子科技大学(211,非985),15年本科毕业,进入美团外卖Android团队,18年国庆离职。之后一年多的时间,一方面是尝试创业,另一方面也是给自己充电的过程,包括学习思考、锻炼身体、相亲交友(划掉) 等。

本科刚毕业的时候就听说过谷歌、微软等外企,当年只知道外企一般都要求英语口语和算法,感觉难度较大没去深入了解和尝试(尤其是英语口语没有经过训练真的有点难)。作为对比,国内的很多互联网公司也不差,并且薪资待遇很有优势,也没想过要进外企。

19年底脉脉上好多微软同事发的内推广告吸引了我的注意力,之后就开始了简单的调研,发现了微软这样的外企的一些优点,所以有了尝试进外企的想法。

初期调研

在介绍面试经历之前,先探讨一下关于选择的话题。求职是双向的,公司面试考察个人能力,求职者也可以反过来调研公司和团队情况。对具体面试情况更关心的读者,可以先跳过这部分。

这部分内容,是根据各种渠道获取的信息以及自己思考所得,尽量客观。不少人听说过外企如何如何,但是道听途说不如实地考察,还是得亲自体验了才能了解更多。从开阔视野的角度来看,在国内企业体验过,再到外企体验一下,感受一下各自的优缺点,还是比较有趣和有意义的,对于个人的长期发展也能起到一些作用,这也是我想进微软的一个重要原因。

获取信息的渠道包括:

  • 面试的经历
  • 就职微软的一个大学同学
  • “微软招聘”公众号
  • 微软举办的Tech Talk活动,可以线上提问
  • 和朋友聊天,主要是猎头、HR、同行
  • 网上的文章和观点
  • 微软招聘官方网站

微软的特点

列举微软的一些特点,尽可能客观全面,但主要还是说优势吧。

1、微软近年来更加开放,拥抱开源,认可度越来越高,例如VS Code、TypeScript的流行、收购GitHub和NPM等。微软的市值在上升,微软中国也一直在招人,HC很多(HC = Head Count,即职位的空缺人数)。

2、整体而言,外企更注重以人为本(任何事情都有两面性,对员工更友好,有时候对企业发展则相对不利,各有利弊)。对于研发岗位,微软没有国内公司的加班文化,提倡Work Life Balance,加班相对少(具体要看团队、项目进度等),上下班不打卡、弹性工作时间;远程办公很完善,配套的协作软件也齐全,比较容易申请work from home(毕竟跨国公司,跨国合作的情况也挺多);没有辞退35岁以上员工的文化,可以一直工作到退休;注重新员工培养;福利更加完善,例如每年至少15天年假和15天带薪病假;工资按时薪计算还可以(也要看城市,根据我自己的面试结果,税前年薪折合成时薪,苏州微软和上海头条接近,具体的就不透露了)。

在查看微软招聘官网时,意外发现每个JD(JD = Job Description,职位描述)中都有下面这样一段话。作为对比,一些国内公司会直接在招聘要求中对年龄性别做明确限制。

Microsoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to age, ancestry, color, family or medical care leave, gender identity or expression, genetic information, marital status, medical condition, national origin, physical or mental disability, political affiliation, protected veteran status, race, religion, sex (including pregnancy), sexual orientation, or any other characteristic protected by applicable laws, regulations and ordinances.

示例链接: https://careers.microsoft.com/professionals/us/en/job/794944/Android-Software-Engineer-Microsoft-Edge

3、面试难度适中。难度相对国内一些公司更高,意味着更有机会认识到优秀的人。而在外企当中,可能是因为微软HC较多,所以要求又相对宽松,这让更多人有机会尝试。例如不少外企 JD 中的要求都是5年工作经验起步、英语流利,而微软社招有些岗位1年经验即可,英语口语方面,一些岗位要求能逐渐适应英语环境,还有的岗位不要求口语,面试写代码也比想象的容易一点。

4、由于企业历史更长,管理经验比国内公司更加成熟完善;但由于流程过于严格和繁琐,容易带来一定的效率问题,难以两全。具体来说,微软成立于1975年,而国内互联网公司普遍是90后甚至00后、10后。

5、内部Transfer(转岗)方便,微软中国的团队不少,能尝试的方向较多,还有机会出国工作。

6、有练习英语的环境,能认识国外同事,开阔视野。

7、世界知名企业,对于个人履历有加分作用(跳槽、创业、相亲 等)。

8、不排除一些人对微软一类公司有情怀上的考虑,或是对某些产品和团队非常感兴趣。

9、关于城市。微软在北京、苏州、上海都有。上海目前主要是Azure,主要是后台岗位,能选择的比较少;北京和苏州岗位较多。

苏州简单分析一下。好处包括环境好,房价不贵,然后是大家尤其男生普遍很关心的找对象话题,据说苏州微软找对象比较有优势(毕竟隔壁就有好几个大学,微软在苏州目前也是最好的互联网公司了,面试刚通过就有HR来介绍对象了哈哈哈)。苏州的问题是目前互联网行业一般,如果定居了苏州,跳槽的选择不多(一个选项是苏州定居,上海工作);考虑到小孩教育的话,江苏高考据说是地狱模式(反正又不是我考???)。

英语问题

语言问题是包括我在内的很多人没有尝试外企的重要原因(流下了没技术的泪水.jpg)。虽然进了外企的人都说英语要求不高,能让人听懂就行,即使语法错误、中式英语也没关系,只要能讲清楚自己做的东西就可以了(这个时候就想到了几个大佬:悔创阿里杰克马,不知妻美刘强东,普通家庭马化腾,一无所有王健林)。

不少人的英语问题在于,虽然很多单词都认识,但是到自己用的时候想不起来,毕竟不能边说边查词典。也就是说,被动词汇量没问题,但是主动词汇量太少,解决方法就是经常练习。

微软的英语要求有三个等级:

  • low:会读写即可,基本没有口语要求(我面试的时候是全程中文)。
  • middle:简单交流,能表述清楚自己做的东西。
  • strong:英语流利,例如产品岗、全栈开发岗、高职级岗位,通常口语要求高,因为要和外国同事交流。

如果对语言没有把握,可以尝试英语能力要求低的岗位,毕竟如果因为口语导致面试没过有点亏。口语有困难的人,可以先进去了慢慢适应,以后可以再转岗。长期来看,英语口语能力最好要有,否则有一天可能会成为限制你成长的瓶颈。

在外企有更好的环境练习英语,和国外的同事合作,甚至Transfer到国外,接触不同的文化,培养国际化视野,这些优点是国内大部分公司所不具备的。

在面试时就开始感受到了英语能力的锻炼。例如简历要翻译成英文,面试和Offer流程中,正式的邮件和文档也是英文的,还得英文填表和回复邮件。翻译简历的时候,发现一些特殊词汇不太知道怎么表述,查了词典还是不太肯定,只好网上搜英文文章,看外国人是怎么表述的,还请了一个英语学得还行的朋友帮忙检查,面试完了这个朋友还问我英文简历有没有因为翻译问题被嘲笑 →_→

关于加班

外企最广受关注的一个特点大概就是加班少了,这也是很多人想进外企的原因。

加班问题可以从两方面来看。

正面分析

好的一面,适度且有效的加班可以提高生产率。

  • 新冠病毒爆发期,中国用几天的时间就能建起一座医院,即使过年期间,防疫健康码、疫情实时地图等也很快推出。网上很多人提到外国的公交、外卖等服务远不如中国……如果不靠一些人的勤奋和加班,实现这些都有困难。
  • 适度加班会让人更快的成长,毕竟要解决更多的问题,压力催人奋进。
  • 从企业和社会角度来看,适度加班可以节省成本、提高生产率。根据《人月神话》一书的结论,不加班意味着需要更多的人才能完成一项工作,人越多沟通成本越高,1个人10个月能解决的问题,换成10个人用1个月并不能完成。

一些人也并不排斥加班,网上有的狠人说了,只要钱给够,他可以一天24小时都上班,加班加到公司破产 😨

负面分析

坏的一面,加班过多会影响心情,影响健康,降低工作效率,影响生活幸福度等,技术人员猝死的案例也频繁发生,很多人深受其害,不细说了。

关于无效加班。18年下半年开始由于大环境的影响,经济整体下滑,导致了很多企业的恐慌,互联网行业加班也越来越严重。

  1. 真实的案例,有些管理者为了拯救公司下滑的业绩,或者说其实只是缓解内心的焦虑,强制要求员工加班,但是员工并没有更多的事情可做,很多人只是耗着等下班。
  2. 另一个案例就是有些公司会把工作时长作为KPI的参考指标(这和把代码行数作为参考指标有点类似),导致了一个尴尬的局面,到了下班时间,尽管一些人已经干完该干的工作了,但是看到领导和同事都没下班,也不好先下班,也担心影响KPI。既然不能早下班,索性干活慢一点,或者是吃饭时间出去多玩一会再回来继续工作。最后恶性循环,下班时间越来越晚,而实际产出增加很少。
  3. 无效加班问题通常反映了公司和团队管理能力不足,或是对管理能力缺乏自信,缺乏科学有效的方法激励员工努力工作,以及量化员工业绩。特别是国内不少扩张非常迅速的公司,管理能力提升很难跟上公司规模的扩大。

考虑的因素

  1. 实际情况和宣传信息不符。有些公司在招聘信息中声称不加班,进去了发现其实会加班。看看BOSS直聘App里一些996公司的信息,就会惊奇的发现,上面赫然写着工作时间是965。有些不了解情况的HR和你说不加班,可能说的只是HR岗位不加班 (⊙ˍ⊙) 就像中学老师都说大学很闲,大概是师范专业比较闲吧,我们理工专业累死人。
  2. 现在不加班,不代表以后不加班。比如大老板突然给部门安排了额外的任务导致加班,领导安慰大家说,“最近公司业务紧急,有点忙,大家放宽心态,坚持一下”,然后刚忙完又来了一个紧急的新任务,领导也很无奈,又来安慰大家……后来加班慢慢成了常态,领导也不好一直这么说了,尴尬……
  3. 同一个公司不同团队加班不一样,这是个明显的问题,但是容易被遗漏。核心团队加班多,边缘部门加班少。
  4. 几个特殊的加班原因。
    • 招不到人导致的加班。招不到人有时候也是加班的一个原因,由于业务发展过快,团队急需扩张,短时间内还没招到合适的人,导致加班。
    • 发版导致加班。由于人类共有的拖延症,常常会在项目发版的前一段时间里加班,这在外企也很常见。
    • 值班制度。产品需要长期运行(特别是后台服务),需要有人24小时持续关注运行情况,国内公司有轮流值班的制度,而微软等外企则有on call的制度。
  5. 相对而言外企不加班的可靠性更高,大致做了一点分析,不知道是否准确。
    • 一些优秀的外企已经积累了充分的资源和核心竞争力,更注重把产品做得可靠,而不是加班快速开发出产品功能以及迫切实现盈利。尤其是创业期的公司,如果没有资源积累也没有钱,无论国内公司还是国外公司,不加班都比较困难。
    • 根据网上的资料,外企很看重法律,工作时间基本遵循955的原则。
    • 管理经验上,历史更长的外企对工作时长的问题,必然会有更多的探索和思考。
    • 价值观方面,国内一些公司宣传“996是福报”的同时,外企宣传 “Work Life Balance”,“员工的健康是公司最大的财富”……

关于选择

价值观问题。人应该追求相对安逸和健康的生活,还是追求更快成长、挣更多钱?追求成长,是追求本职工作上的能力提升,还是其他工作方向的提升,或是个人综合素质的提升(例如身体素质)?在国内的互联网环境下,加班几乎成了一个默认的事实,知名靠谱一点的公司大多都加班,主流价值观也在过度强调勤奋,攀比收入,自媒体也总是贩卖焦虑,导致求职者没有太多选择的余地。好在现在有越来越多的人认识到了事物的两面性,看待问题更加全面。

对于加班问题,我的想法是希望“加班自由”,追求完全的不加班是不现实的(也没必要),并不排斥主动加班,但不喜欢被动加班尤其是无效加班。所谓加班自由,就是在有想解决的问题、有想学的东西、特殊情况时,可以选择主动加班(也确实会有主动加班到晚上11点之后的经历);而在没啥事情可做,身心状态不佳,或是有其他事情时,可以准时下班。

加班少意味着时间更加自由,空闲时间既可以继续学习和提升本职工作上的技能,也可以用来做其他事情。例如我看到不少有趣的开源项目,优秀的技术公众号,甚至还包括一些创业项目,其作者都来自于外企。毕竟人的精力是有限的,每天忙于加班,肯定不会有太多精力做其他事。

如何调研

如果希望找加班少的工作,除了外企也有一些国内公司可以选择(就不在文章里公开说了)。具体的调研,我的建议是尽量不要道听途说,至少多问几个了解大概情况的人,最好能直接联系到目标公司目标团队当前在职员工(脉脉是个好东西),有条件还可以实地考察。

关于加班的更多看法还可以参考知乎:有没有不用加班的程序员? - 知乎

技术成长

关于核心技术

计算机和互联网领域,很多基础设施和核心技术都是国外(特别是美国)创造出来的,例如操作系统及其生态、编程语言、软件开发工具等。

国内大部分企业核心技术较少,更偏重于技术的实际应用,没有实力研发基础技术,也难以承担基础技术研发的风险,程序员一不小心就会变成“调库工程师”,或者偏管理方向的“Wiki工程师”,技术天花板较低,容易遇到中年职业危机。基础技术薄弱一直是国内的一个问题,特别是在中美贸易战期间,这些问题就更加明显的暴露出来了。

知名外企掌握了一些核心技术,例如微软的Windows系统等,也是这些企业的核心竞争力之一。可惜的是,外企最核心的技术必然是优先在本国发展,在中国发展的业务还是相对边缘化。如果对技术确实有更高的追求,可以考虑进外企转岗出国锻炼。

关于新人培养与转岗

新人培养是一个很重要的话题。新人培养制度如果不完善,一方面工作经验少的人特别是应届实习生不容易成长,另一方面,想借助公司内部转岗,学习其他项目,转其他技术方向(例如客户端转后台开发),甚至相关行业的转换,也会面临新环境下难以成长的问题。

相对而言,国内公司节奏更快,更加急功近利,会更希望人选入职后很快就能干活,毕竟大家都太忙了。虽然知道新人培训的重要性,但老员工自己也忙,可能根本没有多少时间培养新人,也没有完善的新人培养制度,因此新人可能是“散养”状态,全靠主动。

外企新人培养制度相对健全。另外一方面,抛开制度因素,由于空闲时间更多,实在不行还能自己学,也不用过于担心转方向之后完全跟不上节奏的问题了。

关于学习环境

一些猎头朋友说了,从技术成长和工作跳槽角度来看,国内大厂并不比外企差。因为有不少案例,有些人进外企之后就出不来了,完全没法适应国内公司加班的氛围,或者是能力提升慢,跳槽后工资待遇不高。

由于外企节奏比较慢,压力相对小,加班更少,在这种环境下确实更容易让人放松。而如果进入了非常边缘化的团队,做一些不被公司重视的事,可能就更没有成长了。

如果你追求的是本职工作上更快的成长,拿到更高的工资,进国内大厂确实是很好的选择;如果有比较明确的目标,也不容易受环境影响,在外企一样可以快速成长;如果是想养老,当然是带一把躺椅来外企比较好了……

前期准备

从19年底的时候开始萌生了尝试去微软的想法,就开始针对性的做准备。前期准备我画了一个思维导图,主要分为三部分:

  • 简历准备
  • 博客建设
  • 面试准备

现在回顾起来,准备的过程也是个人成长、提高自我认知的过程。需要了解公司的需要,梳理过去的成果,思考未来的规划,对欠缺的基础知识查漏补缺等,收获挺多。

简历准备

简历部分单独写了一篇文章:技术岗位如何写简历

博客与GitHub

好的博客和GitHub开源项目,对于求职面试有很大的加分作用。甚至有一些人认为,面试不用太关注简历和面试情况,因为简历可以造假、面试全靠发挥,但是要看博客和GitHub,看候选人实际做过什么、写过什么、代码写的如何,这些才是能真正体现能力的东西。

我在面试准备的过程中,回顾之前做过的东西,补了一些基础知识,发了一些博客,还把近几年没整理完的博客顺便整理发布了。简历中也插入了一些博客链接。

基础知识查漏补缺

开发相关的基础知识,网上有很多文章,也有一些书可以看,就不展开写了。如果项目经验没有亮点,基础知识还是多补一补吧,不然面试聊项目又聊不起来,不聊基础知识还能聊啥。

面试常见问题

面试的时候会问一些常见的非技术问题,可以自己提前思考一下,避免被问到一时想不起来,如果面试需要英文,还要考虑一下英文怎么表述。如果之前没有完全想清楚这些问题,进行思考也是个人成长的过程。

例如:

  • 上一份工作为什么离职
  • 为什么想来我们公司
  • 未来职业规划
  • 你有什么优缺点
  • 有什么想问的

算法刷题

刷题部分单独写了一篇文章:技术面试刷题思路总结

面试流程

总共进行了6轮面试:电话面试 + 3轮技术面 + Leader面试 + Manager面试。每一轮的面试内容都是技术为主,每一轮都会考编程。和国内公司不同,没有HR面,谈薪资发Offer等流程都是之后邮件、电话等方式进行。

梳理一下大家最关心的时间:

  • 3月5日:投简历
  • 3月11日:微信电话面试
  • 3月17日:3轮技术面+Leader面试
  • 3月19日:Manager面试

特别提醒,微软面试如果没有通过,会有一定的“CD时间”,也就是这段时间内即使再次投简历,面试官根据你之前的面试评价,也大概率收不到面试邀请。具体要看面试评价,通常是间隔半年时间,当然如果面试在某些地方只差一点,有机会很快就被推荐到其他岗位。

投简历

因为在脉脉有注明微信号,有微软的HR加了我微信,投简历我是直接微信联系了HR,因为得知有个大学同学也在微软,就说明了是让他帮忙内推。

有人问我怎么才能让微软HR主动加自己微信,其实不复杂,考个211或者985学校,进国内大厂,应该就可以吸引到HR的注意力了 →_→

简历是PDF格式的英文+中文简历,投简历时间是3月5日(周四),岗位是MMX团队Edge浏览器Android客户端开发(毕竟英文要求不高,毕竟目前最熟悉的是Android开发方向,处于程序员鄙视链底层,流下了没技术的泪水.jpg )。

微信电话面试

投完简历比较慌,没事就会去骚扰一下HR,然后HR告诉我简历已经过了,之后会安排面试。3月9日(周一)的时候微软的同事给我打电话,预约了3月11日(周三)的微信电话面试,让我准备好纸笔用于算法。

周三下午两点,面试官非常准时的给我打了微信语音电话。

前半小时照着简历聊项目经验。我的项目比较多,聊的时间比较久,所以最后只问了个别基础技术问题,简单回答了一下。本来准备问ConcurrentHashMap,我说我不了解这块,然后就没有问(之前做项目真的没接触过这个,只知道是线程安全的HashMap,基础知识还得再补补)。

后半个小时问算法题。

一开始问我是不是对图论有了解,我说我不了解(当时还没刷到图论,大学也没怎么学过),所以没问图论。之后一共问了四道题,没有实际写代码,只需要讲思路,或者口头描述伪代码即可。

因为在LeetCode上都有原题,所以就公开聊一下了。

前两题比较简单,一个是数组相关的,一个是树相关的,想了一会就解决了。

第三题是经典的最大公共子串,名字听说过,要用动态规划解决,但是很尴尬,我当时刷题才刚刷到动态规划,完全不知道怎么做(不过自从后来刷了动态规划,现在感觉可简单了),提示了一下还是不会,最后勉强说了个不是特别清晰的思路。。。当时的心理活动是:“卧槽,准备了这么久,第一面竟然就这么挂掉了,亏大了……”

之后面试官又问了我第四题,还是树相关的,最大二叉搜索子树(LeetCode 333,会员可见),直接用暴力法其实很容易,但思路不清晰的话,优化解法有点小麻烦。当时本来想直接给出优化解法,但是一边分析一边发现有问题,所以就说了一下暴力解法,答的也不是特别好。

面试结束后又想了一下,思路清晰的解法可以看我的博客 最大二叉搜索子树

最后面试官问我有没有什么想问的,我就问这轮面试回答的如何。面试官说在最近面试的候选人中,项目经验算中等偏上水平,但是算法回答的不好,算中等偏下水平,因为看我第三题答的不好,所以加了第四题。问我平时刷LeetCode多不多,我说之前因为做项目几乎用不到算法,所以没太研究,最近两个月才开始刷题。面试官说也还好。

邮件预约面试

一面算法回答的不太好还是通过了,看来项目经验和博客还是重要的。第二天(3月12日)上午收到了英文的面试邀请邮件,问我什么时候有空进行4轮大概4小时的线上面试(疫情期间都是线上面试)。

Outlook邮箱网页版有个BUG,北京时间上午十一点多的邮件,显示的是UTC时间半夜三点多。一开始没发现是BUG,一脸懵逼的我还以为是半夜的时候微软美国的HR给我发的,毕竟名字也是英文名。。。于是又去骚扰微信HR,说要英文回复邮件预约面试时间,时间用北京时间即可(此处记一个TODO:给Outlook团队反馈这个BUG)。

因为算法没太准备好,所以回复邮件说要再准备几天,回复如下(英文沟通真没怎么实践过,如有语法错误请大家指出,但不要嘲笑我谢谢 [ 微笑.gif ] )。

I will be available from next Tuesday (March 17) because I need a few days to prepare. And afternoon will be better, thanks.

最后预约了3月17日下午2-6点的面试,收到的面试邀请邮件里给出了四轮面试的时间和面试官的英文名,还有一个Microsoft Teams软件的会议链接。Teams软件之前听微软的Tech Talk时用过,所以使用没什么问题。

距离面试还有几天,赶紧继续刷算法。这就到了发挥学习能力的时候,动态规划、图论,都大致刷了一下,感觉踏实了一点,只是到最后背包问题还是没完全搞明白(过阵子继续研究好了)。

三轮技术面

3月17日下午提前一会进入了Teams软件会议室等面试。

我一直在会议室里,每轮面试都是大概一个小时的时长,每轮面试官基本都是准时进会议室,面试完了再退出。

前面三轮技术面只开了语音没有开视频。每一轮都是先简单的自我介绍,大概聊十几分钟的项目经验和技术知识,剩下的时间写代码。

项目经验因人而异,讨论项目的时候会讨论到一些相关的技术知识,也可能会单独问一些基础知识。可能是因为我的项目经验比较多,所以基本是以项目涉及到的技术知识为主,问到其他基础知识,有些知识我了解不多,就直接说了不了解,面试官也就没有再问。

面试的重点是写代码。远程面试写代码的具体形式是,浏览器打开一个 Codeshare 窗口(相当于有代码高亮功能的记事本),或者是其他代码编辑器,用Teams软件的Share功能共享窗口给面试官。

介绍完题目,面试官都会说有任何疑问随时可以提。

第一面出完一道题的时候,我问了一下面试官有几道题,需不需要考虑时间问题尽量做快一点,面试官说时间不用担心。

所以每一轮写代码,都会一边思考一边说我的分析过程,题目不明确的地方也会提出来。面试官也会对我的思路给出反馈,或者给一些提示。整体思路确定了就开始写代码,写的时候也是一边写一边和面试官讨论。面试官也会提出一些疑问,这里为什么这么写,或者是有些地方没考虑到也会问,然后我会去想一些办法来完善。题目不算太难,但是基本上40分钟也就刚好只做了一道题。

我刷的题不算多,面试的时候也没有遇到原题,但是现场基本都想出来了思路,大概说下题目类型(具体题目就不公开了)。

  1. 第一面的题是字符串处理相关的,用到了DFS算法。代码基本写出来之后,讨论了一下能想到哪些测试用例。

  2. 第二面是数组子序列相关的问题。刚看到题我提出应该可以用动态规划思路解决,面试官说没这么复杂。所以想了一下,可以用双指针解决,有些场景没考虑全,面试官给了我一些具体Case的提示,花了一点时间想到了怎么解决。

  3. 第三面,面试官说写点代码看看,可以用熟悉的工具不管是记事本还是什么都可以,我问IDE也可以吗,面试官说可以,于是我就拿出来IDEA了。题目是一个修改字符串的问题,要求原地算法。听完题目之后分析讨论了挺久,只想到了一个性能比较差的办法,面试官让我分析了一下复杂度是 O(N^2) 。又想了一会还是没想到怎么优化,然后面试官说,还是优先解决问题,就按照现有的思路写一下代码。用IDEA写完代码之后,面试官让我写个测试用例调试一下代码(谁让我用了IDE呢……)。于是写了一个 main 方法和一个测试用例,说明了一下因为时间关系配置环境比较费劲,不然可以写单元测试,也先只写一个用例测试下看看。第一遍运行的结果果然不对,打断点找到了大概的问题所在,但是当时脑子有点转不动了,毕竟连续面试了三个小时,一时不知道具体怎么改,看时间也快到了,就和面试官说了一下情况,也总结了一下,状态不太好,但是思路肯定是没问题的,要多花点时间调试一下,还有就是没想到复杂度更好的解法。

    后来有天晚上回想起这道题,突然发现这题好简单,O(N) 复杂度轻轻松松就能解决,代码也会短很多,但是当时就怎么都没想到,果然灵感还是很重要的

面试聊项目和写代码都有一定的偶然性,但是如果每一轮都回答不好,每道代码题都做的不好,那就有点说不过去了。这也是微软会有三轮并列技术面的一个原因,不是为了增大面试难度,而是降低偶然因素对面试效果的影响,最后会综合多轮面试的结果来考虑,而不会因为某一轮没发挥好直接淘汰候选人。

总的来说,遇到的编程题比较注重逻辑,难度没有想象的大,刷了不少动态规划和图论都没用到。

Leader面试

三轮技术面结束,紧接着就是Leader面试,开了视频。主要是聊技术相关话题,都是面试比较常见的问题,例如个人的技术栈,为什么换工作,为什么想来微软,之后的计划,简单聊一点项目,在之前的工作经历中比较有成就感的事,有没有据理力争最后解决了的问题等。

讨论了一点相对复杂的算法问题,地图应用相关的,讨论了挺久,我提出了一些我的看法,最后给出了大致的伪代码。在讨论相关话题的时候,图论算法总算派上了一点用处,没白学……

时间快到了,面试官说本来准备再写个代码,但是时间关系就不写了。问我有没有关注过有意思的Android新技术,最好是能具体到技术细节的。提到了Flutter,说了一下大致的原理,又聊到Flutter的缺点和解决思路。问到RN和Flutter的相同点和区别,比较尴尬的是我没了解过RN,但是做过前端开发,了解React和Vue,猜测RN是React运行在WebView中(后来看了一下,RN的原理是用React语法写JSX代码,实际上还是解析成了Android原生的View组件)。

最后面试官问我有什么想问的,我还是问这一轮面试回答的如何。面试官说本来对我挺感兴趣,但是感觉有点浮于表面,RN不是网页。这下我有点慌,赶紧解释了一下,RN确实没用过,也没了解过原理,所以都是猜测的,要是问我Gradle相关的技术,了解的会深入一点(当时的心理活动,好不容易面试了这么多轮,要是这么挂了还是太亏了)。

面试结束托HR帮忙把我写过的一篇关于Gradle的博客链接转发给了面试官,面试官说“小伙挺好”。还是感觉有点慌,好在当天晚上HR就告诉我面试过了,已经准备安排下一轮面试了。

Manager面试

还是邮件预约,Manager面试安排在3月19日,Teams远程面试。

面试的内容还是技术为主。一开始是了解技术上比较擅长的方向,问到了未来职业规划,我说先继续做Android,之后可能想试试其他方向,面试官介绍了一下微软内部转岗的情况。还问到了住在哪(因为面试的是微软苏州,而我当前在上海,要搬家)。问我有什么想问的,就问了一下上升空间方面的问题,具体一点例如升职级应该注意哪些方面的能力,面试官也做了比较详细的回答。

然后又到了写代码的时间……微软面试真的是很注重写代码的能力。具体题目就不公开了,有一点难,属于分支场景比较复杂的,不至于完全想不出来怎么写,但是不容易考虑全面。情况很多,所以我先把能想到的所有情况都一一列举出来,对照着这些用例就想到了大致的思路,还是一边讨论一边写代码。最后代码基本写出来了,正常参数输出正确结果没问题,还差异常参数的校验部分不太完善。这个代码又写了45分钟的样子,面试结束。

面试总结与技巧

整个面试过程,因为状态不是很稳定,加上刷题不多,有一些代码个人觉得写的不太好,不过在面试官帮着分析的情况下倒是也基本解决了问题。

好在我过去的项目经历比较多,博客和开源项目也确实是自己做的,所以问到相关的技术细节也都没啥问题,简历里也贴了一些相关链接,HR反馈面试的评价都还不错。

总的来说,我的感觉是学历(211或985)、工作经历(大厂经验)、项目经验(面试聊的、博客写的、GitHub开源项目)、面试表现(基础知识+算法),至少要有一部分亮点,如果都没有,那就要多积累经验之后继续尝试了。

面试评价

根据我的经历,点评一下微软的面试。微软面试整体给人的感觉还是很好的,大公司的面试流程确实很完善。总结了几个点:

  1. 准时。除了网络环境问题带来的影响,多数面试官都是准时开始了面试,误差不超过两分钟。整体面试节奏控制的也比较好,连续四轮面试的时候,前面几轮基本上是55分钟左右结束,避免影响到后面的面试,当然最后一轮就无所谓一点了,多聊了一会。
  2. 礼貌。面试官说话都很礼貌,不会问比较隐私的问题,每轮面试结束都会说感谢参加面试。
  3. 可以提问。每一轮面试,面试官都会主动问我有没有想问的(当然大部分公司面试,面试官不一定会主动提这个,但候选人可以主动提问题)。我一般关心的问题就是面试流程,以及这一轮面试回答的如何,面试官也都正面回答了我的问题。
  4. 预约面试时间很顺畅,面试官整体精神状态好。不像国内大厂,面试官常常要在百忙之中抽空面试,预约时间要协调多次(特别是最后一两轮面试),还可能要安排到上午比较早的时间或者晚上,面试官的精神状态也看得出来会比较累。这其实可以反映出来,微软内部研发人员确实加班不多(但是微软的HR不一样,晚上也要回消息处理问题,心疼一下)。
  5. 注重能力,尤其是通用能力和潜力,我理解具体包括沟通能力、逻辑思维能力、考虑问题全面性、钻研能力(在某个技术上有一定的深度)、技术热情等。六轮面试都是技术为主,从时间占比也能看出来,大部分时间都用在了考察通用的代码能力上。基础知识方面,数据结构、设计模式一类通用能力也会做一些考察。到Manager面试的时候会问到职业规划,想尝试什么技术方向可以提出来,通用能力足够了,换其他方向问题也不大(这里又要提一下新人培养的重要性了)。
  6. 能力以外的东西不会特别关注。我的经历比较特殊,中间有裸辞一年半尝试创业的时间,网上有观点说这种情况面试容易受影响(一般是担心候选人不稳定很快又去创业)。但是实际面试过程中,没感觉到什么影响,我简单介绍了一下情况,面试官也没怎么问。但是放到国内公司,HR面一般还是会问很多相关情况。

Teams软件评价

远程面试使用的Teams软件界面很简洁,习惯了国内软件多大全甚至花哨的功能,Teams软件初看起来让人觉得有点简陋。实际用的时候,发现其实该有的功能也都有,语音、视频、文字聊天,屏幕窗口共享,通过链接或拨号进入会议,手机电脑各种平台都有客户端,基本够用了。把核心的音视频通话质量优化好,比开发不常用的附加功能还是更重要吧。

写代码关注点

总结一下面试时写代码要注意的点:

  1. 沟通能力很重要。注重沟通,搞清楚需求,说清楚自己的思路,及时得到面试官的反馈和提示也能帮助写代码。如果听完题目二话不说就写好了代码一遍通过,谁知道你是不是单纯记性好又遇到了原题呢?如果没有很快想到完整和最优的解法,把想到的部分思路说出来,也比一直埋头想不说话好多了。
  2. 重点是把题做好,时间上稍慢一点也没问题,慢工出细活,外企尤其注重代码质量,开发效率相对好一点(当然也不能太过分,好歹基本做完一道题吧……)
  3. 写代码需要灵感,一时想不出来很正常,要注意心态,不用太慌,可以举一些实际例子来思考,从暴力法逐渐优化的角度思考,或者和面试官讨论讨论,可能就有进展了。
  4. 重点关注考虑问题全面性、逻辑能力等,形式和某些细节并不重要。例如忘了某个API的名字或者参数细节。再例如某些地方知道要做判空处理,但是写起来比较费时间,直接写个TODO示意一下也没问题。用什么工具写问题也不大。远程面试直接在自己电脑上写还是方便很多(毕竟实际写代码都是要反复修改完善的,纸上写受限太多了)。现场面试没参加过,不过如果候选人想在自己电脑上写,应该也是没问题的。
  5. 面试的时候尽量保证比较好的精力状况,放宽心态,尽量不要给自己太大压力。

面试小技巧

1、充分沟通。面试的过程就是沟通的过程,沟通很容易出现误解,消除误解促进沟通,帮助面试官了解自己很有必要,特别是对于能力强但是沟通能力相对薄弱的候选人而言。

我的建议是,除了回答问题时的充分沟通,在每一轮面试结束前如果有机会,可以和面试官交流一下这轮面试的整体情况。如果确实是没表达清楚,面试官对你产生了误解,或是其他问题(例如碰巧不了解问到的内容,但很擅长其他的东西),可以适当说明一下,提高成功率。当然有意弄虚作假,或是找借口为自己辩解的说辞还是不提倡了。

2、尽人事,听天命的心态。准备的时候要尽全力,而到了面试的时候要放松心态,紧张只会影响面试发挥。说到这又想说了,面试心仪的公司真和找对象一样,没成功的时候容易把对方想象的过于完美,患得患失,更加紧张了哈哈哈……

3、注意精力管理。微软的面试轮数比较多,而且常常会有连续很多轮的情况,如果是现场面试还要坐车,管理好个人精力还是很重要的。

4、面试策略。只专心面试某一个公司,不给自己选择的余地,还是广撒网,面试很多公司,积累经验,最后还方便谈薪资选一个最好的呢?

多面试几次确实会积累经验,比如在经过了微软的考验后,面试头条时算法题感觉有点太简单了。但是面试太多会很累,不管是跟进流程还是面试准备都很容易让人分心,面试的过程也很累。所以我个人更倾向于前期多花时间调研和准备,尽量只面试少数不错的公司,微软面试全部结束,再面试了头条,两个典型公司基本上可以了解市场行情了。

后续流程

面试完后,当天下午就收到了面试通过的邮件,微软的另一个HR加了我微信。

之后的流程:填表提交基本信息,口头Offer,正式Offer,提交各种证明材料,背景调查,入职手续办理,最后入职。

口头Offer环节,如果觉得工资和之前的工资有落差,可以尝试聊一下,主要是强调个人对公司的价值,注意方式。不过据说外企的薪资一般比较固定,所以提升空间不大。

提交材料环节,需要一些电子文档。小技巧是扫描件可以直接用手机App(例如Android中的Simple Scanner)扫描成PDF。需要打印、手写签名、再扫描的,直接在原始PDF里插入手写的电子签名即可,同样具有法律效应。疫情期间也不用跑去打印店了,还省了钱。

背景调查环节,职级越高调查越严格。因为微软用了第三方公司的背景调查服务,流程更长(需要3~4周),也更严格。调查内容主要是学历、最近7年的工作经历、有无违法犯罪记录。只要简历等材料如实填写、遵纪守法,基本不会有问题。

需要注意的是,即使面试通过了,在正式入职前,中间的流程还是有可能出问题影响入职的,特别是签正式Offer之前,如果拖太久或是沟通问题,是有可能取消Offer的。

总的来说,从投简历一直到入职,整个流程的时间还是挺长的。投简历是3月5日,收到正式Offer邮件的时间是3月27日,之后还要经过接近一个月的背景调查流程,记录下来供读者参考。

致谢

从最开始有了想找工作和尝试微软的念头,一直到写完这篇文章,经历了三个多个月的时间,中间得到了不少帮助和支持,一并表示感谢。包括不少关心和鼓励我的人,帮忙分析某几个公司优缺点的高中同桌,某个和我一起刷题还帮忙看英文简历的小伙伴,在微软就职的大学同学,全程在老家面试期间家人的支持,猎头朋友们提供的信息和建议,面试官和HR(特别是被我在微信上反复骚扰的HR),网上其他人提供的各种文章资料等。