2YOE跳槽,高成功率经验帖

来自其他站点
本人湾区大厂工作了不到2年,今年年初跳槽,历经近2个月时间面试了11个onsite,包括各个大厂和几家C/D轮融资前景不错的startup,其中8个拿到offer,都是SDE的第二个级别(例如谷歌L4,微软62等等)。觉得这段时间感触良多,想从跳槽前和跳槽时两部分谈谈个人准备的经历和感受,希望能帮到地里的伙伴们。如有不同看法,欢迎留言讨论。
面试前
我花了大概一到两周时间,这段时间主要用来:
1. 改简历,准备自我介绍
改简历没什么好说的,就是需要熟悉自己每个项目,对每个细节都能回答出来。可以找朋友看简历和提问,然后反复润色。

2. 准备BQ题
可以搜集网上的BQ题,对每个题按照Situation -> Action -> Result的顺序拟写回答。写到最后其实一段经历/项目可以用于好几个BQ题的回答。所以核心还是准备好几个例子,提取其中能表现自己是good problem solver和team player的地方,以不变应万变。即使到时候问到了自己没准备过的题,也可以临场想出回答。action可以分成2~3个小点,显得有条理。

3. 找内推、海投、领英求职
我本人没有海投,只走了内推和领英求职两条线路。充了领英会员,好好修改了领英profile,表明自己open to work,然后就有一些HR/technical sourcer/猎头来reach out了, 个人认为这种是效率最高的,并且很适合有工作经验的人。而且一旦和HR电话聊了之后,基本上就有电面,甚至可以跳过电面直接安排VO。同时我也找了内推,但是内推非常慢(不知道为什么),大部分回复我的时候我已经是跳槽尾声阶段了。甚至有的是HR在领英上主动reach out以及面试流程走完了之后内推才有消息,似乎是内部系统HR之间并没有sync up。可以说我的面试基本上全是靠HR reach out而得到的。海投也是一种不错的方式,听说一些朋友海投也拿到了很多面试。因此建议三条线同时走。当然如果HR都找上门了,就不需要再找内推了,否则可能会有conflict。

4. 准备System Design
这里我工作经验不多,只是靠自学对System Design有非常粗浅的了解,所以不是很有发言权。只能说我自己是这么准备的。
首先是三个经典读物:
(1) Alex Yu - amazon.com(260多页)
(2) educative.io (160多页)
(3) amzn.to (DDIA)
这里自己买书或者网上找pdf资源都可以,很容易找到。这三本书里DDIA是我看到推荐最多的,也尝试翻了一下。它里面讲得很深入,读完一定会有很大收获。但是苦于时间紧迫,我只读了前面几章就放弃了。我主要读的是Alex Yu的System Design Interview_ An Insider’s Guide和grok_system_design_interview,两者都是针对面试的读物,每一个章节都是在讲一个具体的topic,比如design Uber system之类的。第一次因为几乎没什么基础,读起来很吃力,而且看到后面忘了前面。但是每次准备面试前一周都会去翻看面经里提到的几个topic, 一来二去也就慢慢熟了。每次翻看都会注意到不同的地方,感悟也更加深刻。
除此之外,还有两个是视频链接:
(1) youtube.com
(2) youtube.com
第一个是我无意中找到的中文讲系统设计的视频。作为小白,我无法判断讲得好不好或者是否足够深入/正确,但是时间紧迫的话,看这个可以两倍速看哈哈,每个视频都不长,10分钟左右,不会让人有那么大压力。这系列视频讲了一些基础知识(比如花了好几个视频讲Cache, 好几个视频讲Message Queue等等),也涵盖了几乎所有常考的topic,甚至有几十个视频就是带着学习grok_system_design_interview这本书的。我个人觉得很好懂,也补充了很多实际生活中业界的system design做法, 感觉受益颇多。看完前面说的两本书,再结合这个系列视频,至少system design面试我都是有话可说而且知道按照怎样的套路说。
第二个是广为流传的俄罗斯大哥的视频,的确也讲得挺好的,但是我只找到几个topic(例如topK和rate limiter)的讲解。如果只看这里面的几个视频的话,可能很难举一反三。但是作为深入学习某个topic的补充材料,这视频还是讲得很好的。
以上书籍和视频都是需要平时一点一滴的积累的,毕竟一本书就要几百页,视频要看完也要费不少时间,这并不是面试前几天就能做完的事。所以需要在正式面试前很久就开始慢慢看慢慢学。
如果只是针对面试,因为System Design轮一般只有1个小时甚至更少的面试时间,需要合理分配时间。平时可以根据一定的顺序进行演练。我一般是按照以下顺序讲的:
(1)clarification (5 ~ 10分钟):
问清楚use case,requirement 以及数据量
(2)back of envelope estimation (~5分钟)
通常是计算QPS, Network bandwidth, data storage size等等。这一步看面试官喜好,有的面试官不在乎这些计算,也许可以跳过这一步节省时间
(3) System API (5~10分钟)
写下需要什么System API,讲清楚每个API的输入输出
(4) high level architecture design (20分钟)
开始正式地画图和讲work flow
(5)dive deep into component
深入分析每个component的选用以及这么设计的tradeoff等等,例如Data base是用SQL还是NoSQL或者别的, data schema, replication等等
(6) optimization (5~10分钟)
主要从reliability, availability, scalability, performance等等方面考虑,具体看面试官引导方向
(7) wrap up
这是最后还剩几分钟的闲聊了,一般我前面讲到一半就没时间了,根本走不到这一步。。。

5. 刷题
这应该是大家都知道要做的一步,但是每个人方法不同。我见过刷了很多题也挂了面试的,也有人只刷了一两百题就能拿下好offer的,不得不说刷题也是讲运气和天分的。我属于笨鸟先飞类型,在跳槽很久很久前有个超长"潜伏期",每天都在积累。对于准备时间紧的小伙伴来说,我很难说出一个速成的方法。只能说说个人做法,仅供参考。
(1)有自己的分类集。
我自己是有个分类集的,每次做完一题就把它归类到某一个算法类型里,比如DFS,BFS,DP,Binary Search等等。
这里形成自己的分类集的好处是,自己做的题都是根据自己的分类来的,是最符合自己的思考方式的。我看到刷题网上有些分类奇奇怪怪,完全按照它的tag刷会很别扭。如果有个自己的分类,以后复习时也会顺畅很多。而且还方便比较同一类型的题之间的相同和不同。因为基础差,我一开始是什么都不会,只能尝试理解高赞答案,去搜索网上一些博主的帖子。严格说就是"抄答案"和死记硬背,但是同时我也在总结,例如什么样的题适合用BFS,什么情况下的优化应该往BinarySearch方向想,DP可以分成哪几类等等。积累得多了,慢慢有感觉了,也能看出哪些题和哪些题本质上是一样的,就不需要每题都依赖于别人的解答了。
(2)做标记标注好题和记录思路
刷的题多了,逐渐会举一反三,并且能分辨出哪些题是好题,哪些题纯粹是brain teaser意义不大。碰到好题了还会做标记,表明下次要着重复习这一题。每次刷题的时候,也会记下自己的思路,并且每次都争取找最优解而不是做出来就够了。这里记思路的好处:一是下次复习的时候不用全部重新来,在准备时间紧迫的时候可以直接看自己的"历史思路";二是因为是动手写的,印象会更为深刻,而且俗话说好记性不如烂笔头,忘了后也可以快速捡起。
(3)关注一两个好的讲解视频
这里可以根据个人风格选出最符合自己思维的视频。例如花花酱等等。我在初期"抄答案"时,就是跟着这些视频学习的。有的题实在没有思路的时候就在这些视频里直接搜索。这些视频通常都是有一系列的,涵盖了很多蠡口题,有的还会有总结性的视频。无论是刚开始刷题还是再次捡起题,这些都是不错的学习资料。

面试中

我面试的这些公司的流程都是大同小异 ,都是HR phone call -> tech phone interview -> VO
这段时间主要是输出了,我的面试结果可能70%取决于面试前的积累,30%取决于这段时间的强化复习,当然运气成分也不可忽视。
1. HR phone call:
这轮主要是HR/technical sourcer搜集信息,心态上可以暂时放轻松,常见问题有:
; 简单介绍一下自己,包括项目和技术栈
; 对这家公司有什么了解
; 对哪个领域/职位感兴趣
; location问题,现在在哪里,是否愿意relocation之类
; 身份问题,例如是否需要visa sponsorship
; 对薪资有什么要求。个人建议这个问题模糊回答,把面试要到手再说,这个时候谈薪资也没有太大意义。
我也看过一些帖子说HR都是人精,在最开始搜集信息的时候就会把你的倾向记录下来,作为日后薪资谈判的参考,因此和HR 聊的时候放平心态就好,不要显得太卑微或者太傲慢。

2. tech phone interview
主要是考coding,开始会问5~10分钟的BQ。准备过程同VO

3. VO
流程:很多公司都有5~6轮,其中2轮coding,1轮System Design, 1轮BQ, 1轮HM 面,可能有的公司还多一轮culture fit之类的。在我看来HM面和culture fit轮本质上都是BQ.
时间安排:因为我觉得安排在同一天连续面试比较累,就把面试总时长比较长的和特别想去的公司分成两天,既能补充精力,也多了一晚上的复习时间。这里排时间的时候就需要注意各个公司的流程快慢。例如狗家流程是著名的慢,可以安排在中间,这样后面拿到了其它家的offer就可以正好用来compete,避免狗家已经催做决定了而别家结果还没出来的窘境。拿我自己来说,前面5家主要是用来练手的,第6家是狗家, 第7~11个VO是其它比较想去的公司。
(1) coding面试准备:
A. 当VO date定好后,可以在VO前一周搜集地里的面经题,我通常搜集最近1个月的面经题,通常已经有几十个链接,足够准备面试了,再多也没有时间仔细看。有的公司面经贴比较稀疏,可以搜集好几个月的甚至更多。
B. 搜集完后我首先就是看这些帖子。看面经帖的好处首先是能熟悉这家公司考的题的风格和难度,例如有的公司更注重思路,有的公司更重做题速度。其次看面经也是最容易碰到原题的方法,算是走捷径,所以最先看。保证自己对每个题有思路,如果刷题网上有原题的就适当亲手写一下。每次都尽量知道最优解,刷题网有Solution的看Solution最优解,没有的就看Discussion。通常帖子里本身也有很多讨论,有些大佬会贴出自己的思路。当然也遇到有些面经贴题目描述实在读不懂的情况,这时就只能跳过,祈祷自己到时候有个好运气不要碰到这一题了。看面经我通常会花3~4整天。
C. 看完面经贴如果还有时间,可以再刷刷公司tag题。我给自己定的标准是tag题前100个,尽量复习,能过多少题算多少题,剩下的不管。有历史记录的就看历史记录,不会每题都重新写,因为没有那么多时间。但是每过一个题都保证自己知道最优解思路,掌握时间和空间复杂度。
D. 如果还有多余时间,可以着重准备一下自己薄弱的算法,找几个题练练保持做题感觉。但我一般准备了ABC步就没时间了,不会走到这一步。

(2) System Design面试准备:
主要看面试前长期的积累,一些基本功等等。临时抱佛脚可能会被面试官一眼识破。面试前就重点准备面经里提到的几个topic。如果没有面经/题库,就翻看上面提到的书籍或视频里自己薄弱的topic,知道该有什么component以及不同做法的trade off。面试时如果能做到有话可讲、有合理的逻辑,我觉得即便没有完成也至少无愧于心了。

(3) BQ面试准备:
这里没有太多特别准备的。主要是看面试前准备的问题和回答,以及强化练习对自己例子的表述。最常见问题有:
; 你最喜欢的/最近的project是什么?
; 这个project的挑战在哪里?可以是技术挑战,也可以是时间紧等"抽象"的挑战
; 说一个你和同事有矛盾的经历。
; 当project时间紧的时候怎么确保能deliver?
; 做了哪些并不属于自己责任范围内的事?
; Why想进这个公司?
个人认为所有的BQ都是想了解这个candidate是怎么在一段经历中解决问题、学习知识以及与人相处的,所以重点并不是说出经历本身。而且准备过第一家BQ后,后面花费在BQ准备上的时间会越来越少,因为各个公司问的问题也是大同小异,第一个VO的BQ回答可以用到第二个第三个。可以说后面每次都是在强化自己的口语表达,因此回答得会越来越熟练顺畅。

以上是一些个人感悟。可能排版上有些乱,但是希望这些总结能真真切切帮助到大家,也祝地里的小伙伴都早日拿offer拿大包!如果觉得有帮助的话,求米,谢谢😀

补充内容 (2022-02-23 14:53 +8:00):
对于面试前刷题准备不知道从哪里开始的,可以从蠡口Facebook和微软top 100 questions刷起,原因是这两者加起来有100题左右,一方面不至于刷不完而压力太大,另一方面它cover了很多别的公司的考题,因此刷面经的时候会发现已经有些题刷过了。有了这100题的加持,找刷题感觉和准备面面经都会更高效。

补充内容 (2022-02-27 12:42 +8:00):
为避免误导大家,更正两个错误:
(1) System Design 第一本书作者是Alex Xu (而不是Alex Yu), 之前写错了
(2) System Design 第二个链接视频主是白俄罗斯人,不是俄罗斯人😂,不好意思,把别人国籍都给搞错了。。。
35条回复