微软面试经历和相关思考总结,9次前端面试经验总结

正面分析

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

  • 新冠病毒爆发期,中国用几天的时间就能建起一座医院,即使过年期间,防疫健康码、疫情实时地图等也很快推出。网上很多人提到外国的公交、外卖等服务远不如中国……如果不靠一些人的勤奋和加班,实现这些都有困难。

  • 适度加班会让人更快的成长,毕竟要解决更多的问题,压力催人奋进。

  • 从企业和社会角度来看,适度加班可以节省成本、提高生产率。根据《人月神话》一书的结论,不加班意味着需要更多的人才能完成一项工作,人越多沟通成本越高,1个人10个月能解决的问题,换成10个人用1个月并不能完成。

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

负面分析

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

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

  1. 真实的案例,有些管理者为了拯救公司下滑的业绩,或者说其实只是缓解内心的焦虑,强制要求员工加班,但是员工并没有更多的事情可做,很多人只是耗着等下班。

  2. 另一个案例就是有些公司会把工作时长作为KPI的参考指标(这和把代码行数作为参考指标有点类似),导致了一个尴尬的局面,到了下班时间,尽管一些人已经干完该干的工作了,但是看到领导和同事都没下班,也不好先下班,也担心影响KPI。既然不能早下班,索性干活慢一点,或者是吃饭时间出去多玩一会再回来继续工作。最后恶性循环,下班时间越来越晚,而实际产出增加很少。

  3. 无效加班问题通常反映了公司和团队管理能力不足,或是对管理能力缺乏自信,缺乏科学有效的方法激励员工努力工作,以及量化员工业绩。特别是国内不少扩张非常迅速的公司,管理能力提升很难跟上公司规模的扩大。

考虑的因素
  1. 实际情况和宣传信息不符。有些公司在招聘信息中声称不加班,进去了发现其实会加班。看看BOSS直聘App里一些996公司的信息,就会惊奇的发现,上面赫然写着工作时间是965。有些不了解情况的HR和你说不加班,可能说的只是HR岗位不加班 (⊙ˍ⊙) 就像中学老师都说大学很闲,大概是师范专业比较闲吧,我们理工专业累死人。

  2. 现在不加班,不代表以后不加班。比如大老板突然给部门安排了额外的任务导致加班,领导安慰大家说,“最近公司业务紧急,有点忙,大家放宽心态,坚持一下”,然后刚忙完又来了一个紧急的新任务,领导也很无奈,又来安慰大家……后来加班慢慢成了常态,领导也不好一直这么说了,尴尬……

  3. 同一个公司不同团队加班不一样,这是个明显的问题,但是容易被遗漏。核心团队加班多,边缘部门加班少。

  4. 几个特殊的加班原因。

  • 招不到人导致的加班。招不到人有时候也是加班的一个原因,由于业务发展过快,团队急需扩张,短时间内还没招到合适的人,导致加班。

  • 发版导致加班。由于人类共有的拖延症,常常会在项目发版的前一段时间里加班,这在外企也很常见。

  • 值班制度。产品需要长期运行(特别是后台服务),需要有人24小时持续关注运行情况,国内公司有轮流值班的制度,而微软等外企则有on call的制度。

  • 相对而言外企不加班的可靠性更高,大致做了一点分析,不知道是否准确。

    • 一些优秀的外企已经积累了充分的资源和核心竞争力,更注重把产品做得可靠,而不是加班快速开发出产品功能以及迫切实现盈利。尤其是创业期的公司,如果没有资源积累也没有钱,无论国内公司还是国外公司,不加班都比较困难。
  • 根据网上的资料,外企很看重法律,工作时间基本遵循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分钟的样子,面试结束。

面试总结与技巧

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

总结

根据路线图上的重点去进行有针对性的学习,在学习过程中,学会写笔记,做总结。

这里分享一些前端学习笔记:

  • html5 / css3 学习笔记

  • JavaScript 学习笔记

  • Vue 学习笔记

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

总结

根据路线图上的重点去进行有针对性的学习,在学习过程中,学会写笔记,做总结。

这里分享一些前端学习笔记:

  • html5 / css3 学习笔记

  • JavaScript 学习笔记

  • Vue 学习笔记

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-csYjNRv8-1712952526673)]

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值