※ [本文转录自 Soft_Job 看板 #1VgEvL3p ]
作者: punk86862001 (赵MAN) 看板: Soft_Job
标题: [心得] Facebook/Robinhood/Coinbase/DoorDash
时间: Mon Nov 9 15:22:55 2020
硅谷资深软件工程师后疫情时代面试心得 Facebook/Robinhood/Coinbase/DoorDash
Medium 好读版 https://bit.ly/2Ii9vLc
Apple Podcasts https://apple.co/36fLCMh
Spotify https://spoti.fi/2IcyJdv
2020 年是个动荡不安的一年,因为疫情的关系,很多公司都在年中进行了规模不小的裁
员,包含大家耳熟能详的 Airbnb、Uber、Lyft、Yelp、LinkedIn、Mozilla、Intuit、
Salesforce 以及 WeWork 等等族繁不及备载。根据 layoffs.fyi 的统计,这波裁员潮集
中在今年的 3 月到 7 月,8 月以后逐渐趋缓。
这对于在这段期间要找工作的绝对不是件好事,因为很多人被裁员,意味着同样的职缺会
有更多竞争者,也因为景气不好以及疫情不确定性的关系,很多公司开始减缓招人的脚步
。不过 7、8 月以后情况逐渐好转,随着美国各大城市解除封城,人们意识到必须跟疫情
共存好一阵子,于是实体经济活动恢复了,美国人毕竟是拥有自由的灵魂不能随便被囚禁
的呀!最近是美国各公司的财报季,各大科技公司纷纷发布第 3 季的财报,表现都非常
好,也应证了在疫情下经济转好的事实。
我在 8 月下旬的时候开始投递履历,9 月初开始电话面试,10 月中结束 Onsite 面试 (
都是线上进行),面试了四间公司:Facebook、Robinhood、Coinbase 以及 DoorDash,最
后拿了前三间公司的 Offer,级别都是资深工程师。在这篇文章我会分享各公司的面试流
程以及体验、我做了什么准备、怎么谈薪水以及我最后的决定,希望可以对在美国求职的
人有帮助!由于有签保密协定的关系,我只会提到面试的流程,不会提到具体的题目以
及 Offer 数字。
面试的动机
蛤!?面试不就是为了换工作吗?对大部分的人或许是如此,但对我而言这次并没有非换
工作不可的理由。我在 Square 待了三年多,整体的满意度一直都很好,公司的股票从我
加入以后基本上都是一个上涨的趋势,最近也来到历史新高。一年多前从 Android 开发
换到后端的 Traffic Infrastructure 组以后,更是一直处在学习的状态,了解怎么规模
化公司的后端架构,支援更多的应用场景,工作上也需要一直动脑,思考各种方法的优缺
点、我们为什么要这样做并且撰写许多技术文件,负责的专案也很有影响力,最近的成果
是把公司很重要的 reverse proxy 升级成 Envoy,让系统的效能更好并且支援更多新的
功能。或许因为疫情一直在家工作的关系让我有点工作倦怠,但这个倦怠并不是源自于工
作的不开心,而是真的在家太久了,很需要好好放个长假让脑袋放空充电一下。
言归正传,这次面试的主要目的是测试自己的市场价值,看看自己能否适应资深工程师面
试的强度,毕竟上次面试已经是四年前了 (当时的面试心得),很多当时对于面试的理解
也需要进行修正,我的心态是保持开放的态度,如果遇到很好的机会,当然可以考虑换工
作,没有的话待在现在的公司也很好!另外我自己过去的主要经验都是 Android 行动开
发,在后端只有一年多的经验,也很好奇这些公司会不会让我面资深后端的缺,还是会将
我过去经验打折?事实证明是我多虑了,我面的这几间公司都有把我在 Android 的年资
完整算进去,最后也给了我资深软件工程师的 Offer,Facebook 甚至帮我安排 E6
(Staff Level) 的面试,只是因为系统设计表现得不够好,最后给我的是 E5 (Senior
Level) 的 Offer。
我还蛮建议大家即便没有特别想换工作,也可以定期去外面面试看看,在没有非换不可的
情况下,习惯面试的紧张感跟压力,这样会让你以后的面试更自在,跟面试官可以像是在
平常工作时一样互动,发挥自己的实力。一开始会有这个观念是在几年前读 hello,
startup 这本书时看到,作者建议大家每一年定期去外面面试,审视自己的能力,进而补
足自己不够好的地方,当然我觉得每一年对一般人来说可能有点难,毕竟边工作边准备面
试不是易事,而且还得跟公司请假去面试,但至少每两三年可以去外面看看,避免自己的
能力跟求职市场脱勾太久。在硅谷以专门招收资深工程师闻名的 Neflix 甚至在他们的文
化守则里提到:“员工的薪水取决于他们个人最高的市场价值,我们鼓励员工去外面面试
并且跟他们的主管讨论,我们认为这是健康的行为。”
资深工程师的优势
在一般情况下,5 年以上工作经验可以面资深工程师 (L5) 的职位,10 年以上工作经验
可以面 Staff level (L6) 以上的职位,我有约 6.5 年的工作经验 (3 年台湾 + 3.5 年
美国),所有公司都是让我面资深工程师以上的职缺。
这次找工作我感受最深刻的事情就是:我再也不用海投一大堆公司了!四年前当我还是求
职市场里的菜鸡的时候,投了超过 150 间公司,只有 1x 间公司回应我,转换率不到
10%。这次 Facebook 跟 Robinhood 都是 recruiter 主动从 LinkedIn 联系我进行面试
邀请,Facebook 的 recruiter 更是从 2019 年初就开始定期联络我,到后面我真的不好
意思持续拒绝她,于是接受了面试的邀请,真的还蛮感谢她不断地尝试,让我定期思考一
下要不要面试。Coinbase 跟 DoorDash 我都是从官网直接投履历,没有透过内推,一个
礼拜内就收到了 recruiter 的来信,而这也是我唯二主动申请的公司,真的从以前我找
工作,到现在变成是工作机会找上我了。
另一个很大的改变是:刷题不再是最重要的一环。随着你越来越资深,系统设计跟行为面
试所占的比例也会越来越高,而且除了年资以外,这两种面试的表现基本上就决定了你的
职等,Facebook 的 recruiter 也在电话中跟我说,针对比较资深的应征者,Coding 的
要求会比较宽容 (lenient),所以建议大家不要对刷题过度着迷,一昧的追求题数不是好
事,而是应该重质不重量,题目是无限但观念是有限的。
最后一个体悟是在拿到 Offer 之后,谈判的空间变得很大。美国科技业的求职市场一直
是呈现一个两极化的状态,对于刚毕业的人来说,竞争者多而且职缺少,公司有较高的话
语权。但是当你是资深工程师以上的时候,情况就反过来了,大多数公司不管景气如何,
任何时候都在招有经验的工程师,职缺一直开在那但总是招不满。上次找工作的时候,能
够让公司提高年薪 1 ~ 2 万美金就欢天喜地了,但是这次有两家公司给我的初始 Offer
跟最终 Offer 都差了好几万美金。
准备过程
软件工程师的面试主要分成三种:Coding、系统设计以及行为面试。我自己是花比较多时
间在系统设计上面,再来是 Coding,最后是行为面试。
关于系统设计的准备,我在软件工程师系统设计面试准备指南有比较完整的介绍,这边补
充说明一下,准备系统设计最好的方法是来自于工作,最好你工作上就是要去思考怎么设
计系统,各种方法的优缺点以及思考各种 edge case 以及解法,这样子学到的深度跟广
度都远多于看那些准备素材。如果工作上没有碰到也没关系,可以先从 system design
primer 看起,理解系统设计的各种面向。另外我推荐看一些公司的 Tech talk 来了解他
们实际上怎么设计系统,为什么要这样做以及不同方法的 Trade-off 又是什么,理解为
什么要做这个决定是最重要的。如果已经接近面试了,建议可以看 InterbiewBit 的系统
设计篇,总共有八题,我认为写的还蛮好的,比 Grokking the System Design
Interview 还深入,看个两次完整理解以后对面是很有帮助。
Coding 的部分我还是要再强调一次,不要过度迷信刷题的数量,应该要重质不重量,重
点放在在训练你的解题思维以及逻辑思考,练习使用常见的资料结构并且把想法转成可以
执行的程式码。刚开始写题目的朋友,我会建议相同的题型一起刷,培养对同类型题目的
敏锐度,题目难度主要以 Medium 为主,搭配少量的 Hard 题。
很多题目一开始写不出来,或是写不出最佳解是很正常的,如果一题你卡超过一个小时,
建议可以参考讨论区的最佳解,但是切忌直接照抄别人的解答,因为那可能不是最适合你
的方式,比较推荐的方式是你去理解背后的算法,清楚地知道每一个步骤,再用你自己
方式写出来,这样即使换了一个程式语言,你应该也可以写得出来。当你开始发现没看过
的题目你也可以自己想出最佳解,并且实作出来,程式码也很精简,那代表你已经成功培
养出解题的思维了。
我自己还会做一件事,就是想办法分辨好的题目跟坏的题目,有一些题目的答案很明显就
只适用于这一题,用一些很特殊且不好理解的方法、实际上工作也不可能用到,这类型的
题目我就不会花太多心思在上面,如果真的被考到,我会认为这是面试官的不用心。相反
地,有一些好的题目:在观念上很实用、有好几种解法、工作上有机会用到或是系列题,
这种就很值得练习,比方说 Graph 或是 Design 题就是我很喜欢的类型。
虽然说题数不重要,还是提供我的数据给大家参考,我在写了 50 题的时候开始安排电话
面试,最后一个 Onsite 结束时写了约 120 题,我是以比较新的题目以及高频题为主。
最后是行为面试,要再细分的话可以分成两种,一种是 Project Deep Dive,你选一个你
最近做过的专案,解释一下专案内容、解决了什么样的问题、你的角色是什么、最后的成
果以及中间遇到的困难,另一种面试是来判断你是否符合公司的文化以及价值,衡量你过
去解决冲突跟沟通的能力。不管是哪一种面试,只要你好好回顾你过去做过的事情,能够
完整讲述前因后果,把自己的故事清楚地讲给面试官听,辅佐一些例子,基本上就不会有
太大的问题。
远距面试 Virtual Onsite
因为疫情的关系,大家都在家工作,所以所有的面试包含电话面试都改成线上视讯进行,
这个情况至少要到 2021 年的夏天。远端面试的好处就是你不需要舟车劳顿,时间安排上
也比较弹性,但是坏处是跟面试官的沟通比较没那么顺畅,线上的交流绝对是没有实体见
面来得好,而且有的面试官网络很差,我甚至有遇到差到面试官需要把影像关掉的情况。
另一个要注意的点是,系统设计的面试会需要用到线上白板来画图,我自己觉得没有实体
的白板顺畅,主要有两种方法,你可以使用 iPad 搭配 Apple pen,或是用键盘鼠标直接
拉,选一个自己习惯的方式,面试前稍微熟悉一下白板软件的使用,面试也会比较顺利。
DoorDash
第一轮是一个小时的电话面试,前 20 分钟聊过去的工作经验以及这个组在做的事,后
40 分钟 Coding。题目是一道经典的 Hard 题,我对于该题印象很模糊,于是在面试中慢
慢想,最后是有跌跌撞撞的写出来,当时自我感觉良好,面试官给我的感觉也蛮算满意的
,但是隔天还是收到了拒信。事后回想应该是因为这是经典题,所以标准相对高,我并不
是一次就写对,而是慢慢修正,所以相对于其他应征者表现不算太突出。
Robinhood
他们家固定有两轮各一个小时的电话面试,第一轮前 15 分钟给你一段程式码,要找到潜
在的 bug 并且问你要怎么修正,后面 45 分钟 coding,题目比较偏向 Robinhood 工作
上会遇到的算法题。第二轮是系统设计,这是我第一个系统设计面试,微紧张,原本以
为表现不够好,但从 recruiter 那得到的反馈是还蛮好的。
Onsite 出乎我意料只有三轮,一轮 45 分钟 coding,一轮一小时的系统设计,以及 45
分钟的 Project Deep Dive,Coding 也比较偏向实作工作上会遇到的问题,面试官提到
不用特别在意效能,以实作出来并且跑过测资为主,最后 10 个测资我只过了 9 个,不
算完美。接下来两轮跟面试官都聊得蛮开心的,并且有蛮不错的讨论,最后顺利拿到
Offer!面 Project Deep Dive 有个小插曲,面试官到一半网络突然挂了,他后半段只能
打电话加入简直尴尬。
Coinbase
Coinbase 的面试体验是所有公司里最赞的!从面试的流程跟题目都可以感受到他们的用
心,面试官的平均素质也很好,你可以感受到他们是真心想要认识你这个人,面试过程中
对于很多问题都有深入地讨论,对于我问的问题他们往往也能给出很好很真诚的答案。
不过他们的面试过程也是最累的,电面是一小时的 Coding,Onsite 总共有五轮,其中居
然有两轮各 90 分钟的 Coding!你可以在自己的电脑使用平常的开发环境,并且分享萤
幕,题目不是传统的算法题,而是要你实作一个小型专案,其中一轮是实作一个小游戏
,另一轮则是实作一个系统,最后要 call Coinbase 的 API,所以对于送出网络请求并
且处理 JSON 要有一定的熟悉度才行。整体的面试过程还蛮好玩的,面试官也会帮你,但
一轮 90 分钟真的有点太久。另外有一轮一小时的系统设计,以及各 30 分钟的行为面试
跟 Hiring Manager 面试。总共五轮五小时,中间休息一小时,面完真的气力放尽了。我
对整体的表现还算满意,没有一轮有感觉明显不好,最后顺利拿到了 Offer。
Facebook
虽然 Facebook 都是进去以后再经过 Bootcamp 新生训练选组,但是应征的时候就要分不
同的 Track,主要的分类有 Product、Infrastructure、Android、iOS 以及 Machine
learning,Coding 的部分应该都差不多,而系统设计会根据你选的 Track 而有所不同。
recruiter 一直建议我选 Android ,毕竟我的履历上 Android 还是占了一大部分,她提
到 Facebook 现阶段非常缺 Android 的人,不过她也补充说明这不代表面试的标准会比
较低就是了。我最后还是坚持选择面 Infrastructure,这样对我来说准备起来比较方便
,不用再额外花心思准备 Android。
我的 recruiter 觉得我可能也适合面另一个职缺 Production Engineer,于是就介绍了
另一个 recruiter 给我,我可以选择同时面两个缺,最后如果拿到两个 Offer 可以到时
候再决定。实际聊过以后我还是婉拒了,因为不想花时间准备 Linux System 面试。
我们也聊到了预期的级别,她说以我的经验我可以选择面 E5 或 E6,这让我感到蛮意外
的啦,平心而论我认为不管是年资和能力我都还没有到 Staff Engineer 的水准,不过既
然 E6 只比 E5 多一轮系统设计面试,我就大胆地挑战 E6 了!
Facebook 除了系统设计是一小时以外,其余的面试都是 45 分钟,电话面试是一轮
coding,Onsite 总共有五轮,两轮 coding、两轮系统设计以及一轮的行为面试。最后
Facebook 给了我 E5 的 Offer,原因是两轮系统设计一轮还不错另外一轮普普,没有达
到 E6 的标准。
虽然我最后有拿到 Offer,但我还是必须说 Facebook 的面试体验蛮差的,面试官给我的
感觉是他们不在乎我这个人,只想赶快在有限的时间内尽可能地蒐集一些讯号来判断我有
没有通过,我并不反对有效率地蒐集一些讯号,但是面试是双向的,作为应征者的我们同
样也在面试这间公司,面试时我也在看未来我会不会想要跟这个面试官一起工作?而
Facebook 在我的标准里显然是不及格的。当然也有可能是我运气不好,刚好遇到这样子
的面试官,但这也代表 Facebook 对于面试官的训练不够严谨,导致素质参差不齐,又或
者是面试体验并不在 Facebook 优先考虑的事情,不管是什么原因,这都是一个警讯。
这个现象在 Coding 面试尤其明显,面试官就是在看你能不能在有限的时间快速写出最佳
解。不过我倒是没想到在行为面试也会遇到一样的问题,我的面试官就按着他预先准备好
的问题一个一个问,大部分的时间他的眼睛都盯着萤幕在做笔记,我实在是不确定他有没
有在听我说话,有时甚至还会问我刚刚已经回答过的内容。
除此之外,Facebook 要求在 45 分钟内解出两道程式题,通常都是 LeetCode 原题并且
要求最佳解,即使这种面试或许对我是有利的 (其中一轮我只花了 30 分钟就写出两题的
最佳解,然后我们闲聊了 15 分钟),但我认为这种填鸭式的面试方式完全不能反应一个
人的工作表现,这或许可以招到一定聪明程度以上的人,但是他们不一定是个好的工程师
或是很好合作的人。我认为维持这种大考式的 Coding 面试也是一种偷懒的表现,但这个
面试形式却会深深地影响招进去的人的类型,是我的话我会尽量避免跟这类型的人合作,
因为我认为思考过程跟沟通比你能不能快速写出最佳解还要重要。
如果这段文字有冒犯到在 Facebook 工作的朋友的话,我在这边先说声抱歉,但这确实是
我面试完以后真实的感受。
谈薪水
近年来由于 levels.fyi 的关系薪水变得越来越透明,这对求职者来说是个好事,你可以
知道某公司的某个级别合理的薪资范围在哪里。如果你对谈薪水这个主题有兴趣的话,可
以参考这两篇经典文章:
1. Ten Rules for Negotiating a Job Offer
2. How Not to Bomb Your Offer Negotiation
我自己谈薪水的策略没有那两篇文章写得那么复杂,我认为最重要的原则是诚实,不要假
装你拿到其他公司的 Offer,也不要虚报你其他 Offer 的数字 (即便这个数字是合理的)
,你可以选择性揭露你的资讯,对方问到你不想揭露的资讯时,你可以礼貌地说你不方便
透露,但绝对不要说谎。
公司在给你 Offer 的时候会考虑到很多因素:年资、面试表现、现在的薪水以及职等、
其他公司 Offer 以及其他的面试者等等。这其中大部分资讯我们是不会知道的,比如说
每个因素占的比重、总共有多少面试者、我们在所有面试者里面的表现如何,而且年资跟
面试表现基本上已经确定了,所以实际上你能够用的资讯就是其他公司的 Offer 或是你
现在的薪水以及职等 (当然是要比较高才有用)。
当然最有用的谈判手段,就是你拒绝掉这个 Offer 也没关系。公司招人需要成本,从一
开始收履历、电话面试到 Onsite 面试,他们已经在你身上花了这么多时间,也给你
Offer 了,所以在这个阶段公司也很希望你能加入,除非这是你梦想中的公司,你很怕谈
薪水所带来的风险,不然一般来说求职者在这个阶段是有比较大的话语权。
另一个建议是请把 recruiter 当成你的伙伴,通常他们是要看业绩给奖金的,所以她是
跟你站在同一阵线,要帮助你跟公司谈出更好的薪水说服你加入。Facebook 的
recruiter 这方面做得很好,她很多资讯都很透明地分享给我,包含这个级别可以拿到最
好的 Offer 以及我的面试表现,一开始给我初始 Offer 的时候还告诉我这只是标准包裹
,她不预期我会接,整个很 Real!后来给我的 Offer 也比原来的高出了不少,并且我如
果下定决心要加入 Facebook 的话,她可以帮我要到这个级别的顶包。
Robinhood 也对我蛮有诚意的,在过程中不断沟通,安排我跟主管以及同事聊天,有必要
的话还可以让我跟上面的 VP 聊聊,解答我对于 Robinhood 所有的疑惑。后来在得知我
有 Facebook 跟 Coinbase 的 Offer 以后,给了一个很有诚意而且超过 Facebook 的
Offer,真的是受宠若惊。Coinbase 给的 Offer 相对前两家低了不少,而且往上谈的空
间不高,他们给的理由是他们现在使用的估值是两年前募资的数字,所以实际上的股票价
值远高于那个数字,而且他们 Refresh 也会给的比较大方,让你在四年以后薪水不会降
。
最后的决定
我在选择公司时,通常会考虑三个点,第一个是这个职位本身,我在什么组、负责的产品
、使用的技术、发展的机会以及同事跟主管的做事风格等等,尽可能知道每天工作的样貌
,判断自己未来的开心程度。第二个是关于公司,我会问自己两个问题:
1. 公司的文化跟价值我是否认同?人生很短,千万不要浪费时间在帮跟自己核心价值不合的
公司卖命。
2. 我是否相信公司所描述的愿景,公司在未来的 5 ~ 10 年内能持续成长并且有好的发展吗
?
第三个是薪资结构,包含了底薪、股票、签约金、奖金以及 Refresh 等等,来预期未来
几年的薪资。
除了以上三点以外,还得考量到现在都是远距上工,跟同事以及主管建立感情也相对比较
困难,所以在新公司的适应难易度也得列入考虑。在综合考量之下,我这次还是选择先留
在 Square,或许明年再看看有没有更好的机会!
如果这篇文章有帮助到你,欢迎按赞拍手,有任何问题也可以在底下留言,或是到
Facebook 以及 Instagram 的粉丝专页私讯也行,我同时也有经营 Podcast 硅谷轻松谈
Just Kidding Tech,每周末定期更新,欢迎订阅收听!
Podcast传送门:
Apple Podcasts https://apple.co/2wizvzO
Spotify https://spoti.fi/3aeP9KY
Google Podcasts https://bit.ly/2vureZq
其他平台 https://anchor.fm/jktech
FB 粉专 https://www.facebook.com/jktech.io