2021 求职记
· 职业
2021 年底抱着试试看的心态出去找工作。最后面了 Google、DoorDash、Meta,三个都拿到了 offer,运气还不错。写篇文章记录一下。
动机
我一直把自己的职业生涯想成三部曲:
- 中厂:几百人的工程团队。用现有的技术解决业务问题,学到的东西可迁移性强,比如微服务这套基本都是 AWS、Kubernetes、gRPC、React。
- 大厂:FAANG。钱多,不太容易裁员,有很成熟的内部基础设施,比如 Google 的 Spanner、Colossus、Blaze。去大厂主要是开眼界,看几万人的工程团队怎么运作。
- 创业公司:搏一把财务自由。
毕业之后被一家广告公司收留,名字就不提了,免得关键词被搜索引擎索引到。很幸运遇到了一个赏识自己的老板,干了五年,升了两次职。可惜待得越久,看到的问题越多。虽然有很多想法,但发现自己也改不了什么,唯一的选择就是跳槽。具体的就看另一篇文章了,这里不展开。
刷题
刷题就是算法和数据结构,码农跳槽最重要的环节。之前我对自己的算法一直不太自信,每次刷题都很痛苦。Google 或者 Meta 的 recruiter 找上门,我都因为这点不敢投。
2021 年 1 月 2 号,修完三个周的长假,我痛定思痛,开始咬牙刷 LeetCode。
一月
第一阶段就是补基础。Heap(之前我从来没用过 Python 里的 heapq)、UnionFind、DFS、BFS、回溯、二分查找、DP、双指针,每天一个主题,然后找对应的 Easy 或 Medium 做。之前在公司也当过面试官,经典题型都知道一些,所以这一段比较容易,不到一月底就搞定了。
二月到三月
第二阶段稍微难一点:拓扑排序、Dijkstra、Quick-sort、单调栈/单调队列、最小生成树。有些算法比如 Quick-sort,概念简单,但真让我 5 分钟 bug-free 写出来,以前是做不到的。于是我整理了一套比较优雅的实现,每天早晨完整写一遍。
与此同时开始刷 LeetCode 整理的 Google 高频题,一共 50 道,不少都是 Hard。基本上一天一到两道就到头了。还好坚持下来了,二月底把 50 道全干掉。这个时候感觉自己水平还可以了,应付一般面试没问题。
有个小插曲,三月份的时候徐老师看我刷得风风火火,自己也坐不住,要一起跳槽。于是我陪她把经典题又过了一遍,顺便巩固了自己的记忆。
这个时候我其实已经准备好投简历了,但很巧的是三月份我老板和 skip 通过一些操作,在全公司 hiring freeze 的情况下给我升了职。
四月到七月
四月份开始,徐老师觉得刷题没意思,不如直接转 EM。我正好看到一个 EM 职位感觉很适合她,找朋友帮她内推。因为要面 EM,我们开始一起准备系统设计。
两周后徐老师顺利拿下 offer,我正好也升了职,暂时就放下了跳槽。刷题开始有点怠慢,基本上每周打打周赛别手生就行,这个状态持续到八月中旬。
八月到十一月
八月中旬,公司里的工作量越来越大,有一天因为工作太多加耳朵发炎,一晚上没睡觉。我意识到这样下去对健康非常不利,于是又开始刷题准备跳槽。
非常巧,八月底 Google 的 recruiter 发邮件来让我申请,自此我开始全力准备。
这段时间基本上下了班吃过饭就刷 LeetCode 到一两点,而且思路完全不同了。因为要面 Google,只做 Hard,简单题基本不碰。
这段时间把难题从 50 道刷到了 200 道,也掌握了一些高级点的算法,比如线段树、树状数组、区间树、Kosaraju’s algorithm、Hierholzer’s algorithm。
刷过 200 道难题之后,感觉 LeetCode 基本被我“刷通了”,Medium 看起来像小儿科。从这开始没再专门集中准备过,基本就是每周打打周赛。
系统设计
系统设计我主要是看这个频道:https://www.youtube.com/channel/UC9vLsnF6QPYuH51njmIooCQ
里面的每一集都看了无数遍,最后做到开着 iPad 静音播放,我可以在旁边把内容完全复述出来。
另外也看一些工具的实现原理,比如 DynamoDB、LevelDB (RocksDB)、Cassandra、Kafka。
准备系统设计还是得多 mock。我在准备期间每天晚上跟自己 mock 一轮,提前准备经典题,比如 design Ticketmaster、design Instagram Stories、design Facebook News Feed。每次开一个 Google Docs,模拟真实面试,一边说一边写。
行为面试
行为面试基本就是 culture fit 的常见问题:
- Tell me about a time you had a conflict with a coworker
- Have you worked with anyone who’s hard to work with, and how do you work with them?
- What’s your biggest professional failure?
- Tell me about a time you took a risk
我提前准备了一些故事,讲清楚就行。
- 2021-10-06:recruiter screening
- 2021-10-18:technical phone screening
- 2021-11-08:virtual onsite
- 2021-11-30:加面一轮 system design
- 2021-12-10:通知过 HC,只给了 L4,开始 team matching
- 2022-01-24:match 成功,拿到 L4 口头 offer
2021 年 8 月底收到 Google recruiter 的邮件,主动介绍机会。当时觉得是命中注定该跳槽了,于是跟 recruiter 说 9 月底要结婚,打算之后再认真考虑。与此同时开始疯狂刷题,基本下了班吃完饭就回到工位做到一两点。
结完婚回来和 recruiter 打了第一通电话。她介绍了一下流程,约了两周后的电话面试。
电话面试是一个芝加哥小哥,出的题是实现一个简单的模板引擎。用有限状态机简单秒掉,后面讨论了一些 follow-up 就结束了。谷歌的算法题一般会让求职者自己定义函数名和参数,因为我以前做 blog engine 时写过模板引擎,本能地把函数起名 render。后来知道小哥那个组就是做 server-side rendering 的,感觉很巧。
一周后 recruiter 说电面过了,约了两周后的 onsite。
Onsite 一共五轮,三轮算法,一轮系统设计,一轮 behavior。
第一轮算法是个欧洲老哥,很热情。题很不符合常规,不像 LeetCode 上会看到的那种。我最后给了一个很取巧的解法,bug-free 秒掉。老哥很开心,说第一次遇到用这种思路的,最后我们聊超了十分钟。这轮我估应该是 strong hire。
第二轮也是算法,面试官没开摄像头,听口音是个亚裔。题不难,但我一开始只给了回溯解法,编码上花了比较多时间,好在最后 bug-free 而且复杂度都说对了。最后他问有没有更优化的解法,我说可以记忆化回溯,我俩讨论了 5 分钟没时间写代码了。小哥最后说 you did a great job,但我觉得应该是 weak hire。后来了解到他是做 Blaze 的,就是 Google 内部的 Bazel。
第三轮是行为面,面试官是个管 200 多人的大叔,感觉至少是 VP。聊得比较愉快,都是常见问题。
第四轮是系统设计,这轮体验最差。面试官给的题很反常,给了题就转过头干自己的了,只剩我自言自语,得不到反馈。每 5 分钟他抬头看一眼我的文档,说你这样不对,要用分布式的思路解决,然后转回去继续干别的,也不听我解释。最后也没留问问题的时间。这轮结束我就知道 L5 没戏了。
第五轮算法体验也一般。面试官给我出完题就低头玩手机,每次问他问题都是一副浪费他时间的表情。题挺有意思,但我最后只给出了朴素解法,想到了最优解但没时间实现了。他最后说自己是做 data center security 的,我也没细问。
一周后 recruiter 打电话来,说有 positive feedback 也有 mixed feedback,可能会降到 L4,问我要不要送 HC。我跟她吐槽了系统设计那轮的表现,她说会跟上司反映。两天后她说决定给我加面一轮系统设计,感恩节在前,只能约到节后一周。
第二轮系统设计态度好太多,全程都在交流。题不难,但我在细节上浪费了太多时间,没做得很好。结束的时候我专门感谢面试官,告诉他 “it’s a great interview experience”。
过了两天 recruiter 说 L5 还是很悬,问我要不要继续。我说 L4 没意见,但薪资得上 300k,她说没问题。然后她让我决定是先选组还是先送 HC,先选组过 HC 几率大一点但更花时间,问了她意见,她建议直接送 HC,过了选组也容易,我就听她的。
12 月 10 号 recruiter 打电话来,一开始说很遗憾,我还以为被拒了。结果她说很遗憾 HC 没通过你的 L5,但通过了 L4,问我继续不。她问我对 engineering productivity 感不感兴趣,我当时以为是 protobuf、Blaze 这种内部工具,就说感兴趣。后来才知道这里是个坑。当时已经快圣诞节了,她说会尽量多找几个组。知道过了 HC 我还是很开心,虽然被降级了,当晚吃火锅专门开了一瓶存了半年的可乐庆祝。
接下来周一一大早她找来第一个组,是某个产品的 EngProd。我在网上搜了一下,信息基本全是负面的。大文章都在说 EngProd 其实就是帮别的组写测试框架,以前是 SETI (Software Engineer, Tools and Infrastructure),近两年才跟 SWE 合并成一个 track,里面的人每天最关心的就是怎么跳到 product team。我果断给 recruiter 说我对 EngProd 没兴趣,之前理解错了。Recruiter 一通电话打来,说你搜索太狭窄,我担心你找不到组,谷歌内部流动性很强,她帮不少 EngProd 的人转过组,让我不要担心,bla bla。我说我现在在做核心组的 tech lead,你让我降级我认了,降级还去帮别的组写测试框架,我怎么接受。她听完也就没再说什么,就说尽量帮我找感兴趣的组。
第二天,她发来另一个组,是 Firebase,也是整个 team matching 里我最喜欢的。我约了和老板的视频通话,前一天连夜把 Firebase 的文档全看了一遍,又看了最近一年 Firebase Summit 的 keynote。第二天聊得很愉快,老板是个很 nice 的老哥,他说他们组和其他组不一样,维护产品 e2e 的全套,包括 API、control plane 和 storage node,都是不同技术栈,这点很吸引我。聊的过程中我说了自己对产品的理解,还根据文档猜了一下他们的技术栈,老板还挺惊讶。之后他又让我约了组里两个 tech lead 面谈,一个做 storage node,一个做 API layer。其中一个 TL 问我平时生活什么样,我说了几个爱好,比如弹吉他,最喜欢硬摇滚,比如枪花。他说组里的老板是枪花粉丝。
DoorDash
- 2021-11-16:朋友内推
- 2021-11-18:recruiter screening
- 2021-11-29:technical phone screening
- 2022-01-04:virtual onsite
- 2022-01-13:L5 offer
DoorDash 这家是我当时最想去的。内推之后流程走得很快,电面就是一道模板渲染类的题,onsite 基本都是 LeetCode 原题。我当时原题都刷得滚瓜烂熟了,全部迎刃而解,bug-free 结束。三周后 L5 offer 直接到手,也是三家里最早给 offer 的。
可惜的是 DoorDash base 给得实在太低,虽然总包算下来还行,但跟后面 Meta 的比明显没竞争力。当时也赶上他们股价一路往下走,我想了想还是没接,先拖到 Meta 结果出来再一起决定。
Meta
- 2021-10-19:朋友内推
- 2021-10-20:简历拒,朋友说原因是工作年限不够 E5
- 2021-11-30:recruiter 找上门,说之前搞错了,问我还申不申
- 2021-12-09:technical phone screening
- 2022-01-05:virtual onsite
- 2022-01-21:E5 offer
- 2022-01-24:签约
Meta 这边一开始乌龙还挺多。第一次内推完第二天简历就被拒了,朋友打听说是年限不够 E5。一个多月后 recruiter 又找回来,说之前搞错了,问我要不要继续申,我说申吧。
说实话当时完全没把 Meta 放在心上,觉得自己根本不会去。电面过得很快,onsite 那天我把 10 点的面试记成了 11 点,10 点 20 了还在悠闲地喝咖啡。一看 calendar,卧槽不对,赶紧冲回电脑前,面试官已经等了我 20 分钟了。
好在 Meta 的面试也是出了名的全考 LeetCode 原题,我这段时间刷得已经滚瓜烂熟了,几轮全是迎刃而解,bug-free 结束。更好笑的是中间有一轮,我当时公司的 oncall pager 还响了,需要我给别人 merge 一个 PR。我直接跟面试官说给我一分钟,我先 merge 一个 PR,面试官也说没事,不介意,等我 merge 完我们接着面。
1 月 21 号 E5 offer 到手,三天后签字。
结尾
最后为什么选了 Meta,说出来有点好笑。我一开始完全没想过去 Meta,就是为了拿个 offer 好去跟谷歌 argue。谷歌一直是我心中的 dream company,我那年从头到尾都是冲着 Google 准备的,Meta 在我心里就是个陪跑的,最后压根没想到会去。
结果最后 Google 给了 L4,还因为那轮系统设计面试的破事,先降级再加面,team match 也进行得非常困难。谷歌这边是 team match 再给 offer,没 match 上 offer 就悬着。先是 recruiter 一个劲推 EngProd,非要我去给别的组写测试框架,我不干她还 PUA 我半天,第二天好不容易找来 Firebase,又要连夜准备 Owner 聊、TL 聊,一通折腾下来还是没定数。
反观 Meta 这边完全不一样。Meta 是先给 offer,进 bootcamp 再慢慢挑组,上来就痛痛快快给 E5。签之前 recruiter 听说我手里有 Google 的 L4 offer,二话不说把 sign-on bonus 直接翻了一倍。Meta 的 E5 package 跟 Google 的 L4 比,大了不是一点半点,更何况高一个 level 相当于少奋斗一到两年。
这种情况下就是再喜欢 Google 也没法去了。L4 比 E5 整整低一级,还不说签约金这事。人总不能为了 dream company 的招牌去跟自己的简历和钱包过不去。最后就它了。