TL;DR
总共花了一周时间,飞了三个城市(三番 + 西雅图 + 波士顿),面了四家公司,进行了23轮面试:Adobe 7轮( 6轮现场 + 1轮远程视频); Compass 4轮现场;Amazon 6轮(4轮现场+1轮远程+1轮午餐);Wayfair 6轮(5轮现场 + 1轮午餐),最终有幸拿到四家Offer。
对我来说这是一次非凡的经历,可能多年以后再回看也会感慨自己居然计划并坚持了下来。
这打鸡血的一周里,我见了近30个面试官,遇到了各式各样有挑战的、但也很有意思的一些题目。因为这是一个双向选择的过程,我自己其实也问了他们很直接也很好奇的问题,从他们身上接触到看待事物不同的角度和思维方式。有时候真的要迈出舒适区才能看到新东西。
前情提要
促成想跳槽的原因主要有以下这些:
- 想要搬去科技氛围更浓的大城市。有好几次想参加当地的meetup,但是怎么都找不到自己感兴趣的内容,去过其中一个介绍相对较好的发现志同道合者也甚少。其实美国稍具规模的大城市屈指可数,想要科技氛围好基本也就三番和西雅图,因为之前来过一次波士顿,非常喜欢当地的历史感和环境,所以这三所城市成为我主要考虑的地点。
- 公司6月份进行了一次大变动,导致我手头的项目一度停滞不前,所做的内容也逐渐变无趣。
- 今年有幸抽到了H1B,拿到的面试机会会多很多。
- 在纽瓦克的朋友越来越少。2年master + 2年工作经历,一共在这里待了四年,一路上遇到了很多很好的朋友,但是大家都逐渐离开了这个地方。这是个很安逸的地方,环境优美、生活惬意,但是对年轻人来讲,机会却不是很多。
- 大城市的待遇好很多。
- 希望加入一家更大的公司有所提升。其实现在的公司里也有很多我崇拜和仰望的人,比如我们组的Tech lead,我从他们身上学到很多东西。但是项目的影响力或多或少还是与公司的成长速度和规模相关。
市场并不好,但机会还是要争取
首先必须承认,今年的跳槽市场并不是很友好(这里针对Senior以下的,因为Senior一直都有人抢着要)。
Facebook因为一些众所周知的原因以及内部消化了大量Intern,今年除了New grad,直接不招三年工作经历以下的人,很多岗位都要5年+的经历,所以简历连内推都推不进去。Airbnb, Linkedin也基本都是如此,只要三年以上经历的(至少front end 以及 full stack 都是这个要求)。
Google则是传言因为去年年底针对Google Cloud疯狂招聘,今年L3的职位空缺非常少,秋招开启不久之后就停招了entry-level的职位,感觉难度上也大了很多。我一共电面了两轮,在被加面那一轮直接被考了一道很新的LC hard题,最终没有完全做出。
另外今年几个独角兽诸如Uber, Lyft,Pinterest上市之后表现也都不是很好。尤其是Uber,在今年IPO之后进行了三轮一千多人的裁员。我拿到他们家面试的时候刚进行到第二轮。我十分好奇地询问为什么边裁员边招人,recruiter答说Uber ATG, Uber EATS都还不受影响。于是我硬着头皮面了Uber ATG, 面完感觉挺好,题目也都做出来了,但是一周后被通知决定不move forward。大概两周之后,在新闻上看到ATG和EATS也裁了300多工程师。
情形很不好,但同时机会还是有的。并不是所有公司的工作经历要求都像FB那么严格,我后面投的很多岗位都要求3-5年经验,但是最终都给了面试。而像亚马逊面的岗位,recruiter直接说其实网站上还没放出来,但是内部系统有空位。
关于亚马逊,确实比较玄学。其实在此之前已经找亚马逊的朋友内推过了很多遍,每次查系统都是显示 No longer under consideration
。在拿到Compass的面试之后,我在网上找到一个华人recuiter主动介绍了我的情况,询问有没有 front end 相关的职位。这位Recuiter相当认真负责,说自己手上并没有前端相关的职位,但是可以推荐给她的同事。她当天给我发了OA, 我做完后基本第二天就确定了Onsite面试。事实证明,简历拒在亚马逊是没有冷冻期的。
不要盲信网上的人云亦云,甚至官方网站或者Lindedin Post的职位都是滞后的,能直接和HR或是Recruiter沟通是效率和真实性最高的。
Most things are negotiable
因为想一次性面四家,所以在行程安排上就要相对灵活。
最终在相互协调下,Adobe负责我从费城飞往三番的机票和一晚酒店,Compass负责我从三番飞往西雅图的机票加一晚酒店,Amazon负责了我后续两晚的酒店,Wayfair帮我定了从西雅图到波士顿,再从波士顿回费城的机票,另加一晚酒店。
很多人害怕和公司提太多要求,觉得公司可能会撤回面试。美国这边的HR、recruiter最终目的还是为了招到人,而且也理解很多面试者会同时面好几家,一般对于面试者合理的要求都会尽可能满足。
在Wayfair的最后一轮和HR直接一对一交谈的时候,她和我说这时候她绝对是站在我这一边的,因为她的目的就是促成这一次招人。她此时已经知道了我在面好几家公司,所以她告诉我如果其它公司给了任何数字都尽量及时告知,如果是待遇方面的问题,她绝对尽可能帮我向公司谈。
亚马逊那边也是同样的体验。虽然亚马逊的Recruiter在我这次感受中是最aggressive的(比如不提前发邮件约时间直接打电话过来),但是在面试安排上也是相当得配合,经常在周末或者下班时间还会回复邮件。我在做完OA的时候离我开启面试之旅只有一周时间,约了18号面试直到15号才能确定下来。最后Recruiter也是争取找到了有合适面试时间的面试官们,在面试前一天给我发了整个面试官名单。当然,后面有一些临时的变动,但是整个过程我能感受到她们为了招人所付出的努力。
可以商量的甚至还有面试内容。谷歌的recruiter就问我想面前端岗还是general hire,最终结合他给我的建议是选择了general,因为考虑到算法相对好准备,而且general的选择更多。网上就有人Po出面试经历,一个转专业的PHD,和recruiter说不要安排任何系统设计相关的题,只想面算法,最后也是给安排了四轮算法面并拿到了offer。
当拿到Offer之后,具体想去哪一个城市也是可以谈的。Adobe在三番和西雅图都有组,所以当时也是让我从两者中选其一。对于程序员来说,选不同的地点只是换个地方写代码而已,交流基本都可以根据视频会议或者Slack之类的解决,所以公司很大程度上并不在意是否一定要在一栋楼里。更有甚者像Github, Gitlab是只要入职了,全球范围内供选择,并且在文化上也是鼓励员工远程工作。
绝大多数不涉及到原则性问题的东西都是可以谈的,这种协商能力其实也是程序员们除了代码能力之外很重要的一点,在面试后续的offer compete过程中尤为重要。如果对北美程序员薪资待遇感兴趣的朋友可以访问
https://www.levels.fyi/ 数据相对还是比较准确的。
面试经过
Adobe
Adobe不是我今年的第一家Onsite(大概在几周之前去面过一家费城startup),却是这一周面试的第一站。公司总部在San Jose,但是我面的这个组在三番市内,Mission bay边上。
一共10轮面试,Onsite 6轮+视频4轮
因为我是remote candidate的缘故,在Onsite之前已经进行了三轮视频面试,和两个manager和一个senior谈得还挺顺利,主要还是围绕简历项目和JS相关的。
面试时间约在中午,所以第一轮就是午饭轮。Adobe内部是有食堂的,但是不像硅谷其它大公司那样是对员工免费,据说相对于外面吃会便宜很多,反正面试者是可以免费吃的。因为是一位印裔面试官,所以直接跟着点了些印度菜。
前一天刚到三番就发生了地震,所以见面的时候还开了几句玩笑说被地震欢迎了,没想到随口一说的事变成了一道面试设计题。。。本以为面试轮就是纯聊,但没吃几口就要开始白板画图。
后面几轮就是比较常规的算法以及简历项目讨论。其中一轮比较有趣,面试官是Senior director,他自称相当于整个项目的VP。经历了前面几轮后,我心态慢慢放松了下来,开始询问一些自己感兴趣的问题,比如如何从一个程序员转型做管理,经历是如何的,难点在哪里。这位主管说之前没有人问过他类似的问题,然后饶有兴致地开始给我介绍职业变迁历程。
这位大神七几年UC系毕业之后最开始给Unix写Boot system,后来开始在苹果机上做开发,那时候连Linux都还没诞生。他在九十年代加入了Pixar开始做图形处理相关的工作,之后慢慢转型做管理之后加入了Adobe。他说做管理的难点在于计算机是determistic, 而人不可测的地方太多。做管理需要很高的情商以及共情能力。发现这些转型做管理的都有些共性,回望的时候都会说还是想念当初能写代码的日子。
聊完故事之后他出了一道非常不寻常的题目,在我看来就是类似中国小学奥数题,而我的做法也非常得“小学奥数”,写了好几个分数相乘就直接得出来了,让他非常惊讶了一会,说从没见人这么做。所以面试中不按常规出牌的事还是经常发生,见招拆招就好。
最后一轮就是Hiring manager,一位挺有趣的法国人,中间想问我一个关于API 设计里Idempotency的概念,但是说了半天见我不解直接在白板上写了这个词,说可能他的法国口音给我造成了理解困难。事实是他写出来我也不知道,后来才想起来是考察幂等的概念,赶紧解释了一番。
面试从中午12:15面到了下午4:45,平均45分钟一轮,一共六轮。总体来讲我觉得难度适中,他们对于技术栈以及文化是否匹配看得比较重要,聊不聊的来感觉非常关键。
回来第二天后recruiter发信说他们的想让在巴黎的一位主管再面一轮。因为时差的缘故以及我个人想一周内全部面完,所以马上约了第二天早上7点半的面试,总体也是以问答为主。至此不算HR电话总共十轮,终于面完了Adobe。
Compass
Compass是这几年很火的一家房地产独角兽公司,总部在纽约,拿到了孙正义愿景基金第一期的投资,声称以科技的力量简化买卖房屋的流程。去年他们从微软挖来了AI的CTO来主管技术,在西雅图新开了一个office,今年在疯狂招人中。可是我去面之前其实对地产行业是有担忧的,尤其是今年发生了Wework IPO泡汤这样的事件。不过也正是有这些疑问,让我在面试中非常坦诚地可以发问,最后过程体验反而令我感觉挺好的。
正如前面所说,Adobe临时安排了一场视频面试。我当天早上7点钟爬起来面完,然后十点多就去了Compass进行第二场面试,好在公司离酒店不远,楼就在亚马逊大楼边上(估计也是因为挖人方便)。
原本安排了连续四轮四个小时,但后来临时安排了午餐,不过就纯吃饭聊天了。面试内容覆盖比较全面,有常规的LC算法题(白板),也有专门考察JS的函数式编程题(现场跑代码),另外还有系统设计加简历详述。
这里有趣的一轮同样是和manager聊得那轮。他提到在微软干了十几年,后来去了Airbnb,去年才刚到Compass来。
- 为什么来Compass?
我就直问Airbnb明年马上要IPO了为什么这个时候选择跳槽来这里。他的解释是因为Airbnb已经过了高速增长阶段,整个平台的搭建已经趋于稳定,很难再推到重来做一些奠定基础的事情,而现在加入Compass是有机会能从头开始参与一些系统的设计和研发,影响力很不一样。
- Compass VS Wework
我另外也表达了我对Compass可能重蹈Wework覆辙的担忧,两者同处于地产行业,都接受了愿景基金的投资,又都有IPO的计划,有如此多的相像之处。他解释道这是两个不同商业模式的公司,Wework是重资产型公司,如果没有人接手,那么所有滞留房屋的租金就是极高的成本;而Compass只是一个平台,成本无非就是工资以及网站维护费用,完全不是一个数量级的。同时Wework之前以极度烧钱的方式来获得高速增长,每个季度都亏损极大;Compass虽然也在增长,但是基本实现了收支平衡,现金流上没有很大的压力,而且今年的营业额也已经提前几个月达到了预期计划。
- 地产行业的前景
按照美国经济运行的规律,大家都觉得下一轮经济危机很快就要来临,而一旦发生地产行业肯定受冲击最大。我也就问了关于今年房价下跌对Compass是否有影响。他回答如果发生经济危机,影响肯定有,但是几乎所有行业都会受影响,根据上一次经济危机情形来看,房市往往是比股市恢复更快的。另外关于公司的增长要从两个方面看,如果整个行业发展,那么保持市场份额不变公司也在增长;而如果行业增长放缓甚至停滞,那么如果能蚕食掉老牌公司的份额也是一种增长,而看数据确实市场份额增长惊人。
当然这只是一家之言,不过能提供这样一些看待问题的角度我觉得也是受益匪浅,尤其是从公司运营甚至商业的角度。毕竟技术只是一种工具。
Amazon
在此感谢一下亚马逊的华人recruiter,如果没有她我也没法及时拿到OA以及Onsite。他们家的Onsite算是时间最长的,总共六轮(一轮午餐)六个小时,从早上八点一直面到下午两点,面到后面答LP的时候脑子都已经快不转了,还好例子都大致准备到了。这也是面过公司里要求时间最早的,早上7:45就要check in,真的是“充分利用”面试官和面试者的时间了。
因为我面的岗位是Front End Engineer,所以考察的内容大致与前端或者全栈有关系,算法部分倒不是很难。不过亚马逊面试的特点就是Behavior question 特别多且详细,主要围绕它自身的14条军规展开: https://www.amazon.jobs/en/principles 。
关于 Leadership Principles
可以说如果准备过亚马逊的LP,基本所有公司的文化行为面试都是可以轻松应付了,从这点上来说还是很值得深入研究一番。
其实每个公司都有独特的文化,甚至一些明文标准来支撑它自身的运行和发展。然而亚马逊确实是少见的把这些准则看得如此重的,我甚至听说很多时候开会意见不合大家就开始抛LP来吵架,什么“你们要有Think big”,“我们要Insist on the highest standards”,虽然外人听来有点滑稽,但如果所有员工都能朝这个方向努力,确实是能产生巨大影响力的。有时候也确实十分佩服亚马逊在人员如此之多、岗位流动性如此之大的情况下还能保持系统的稳定和高速增长,可能LP起了很大的作用。
我面试中也是能体会到几乎人人都会把LP挂在嘴边。比如我其中一轮问道前后端的职责分工是怎么样的,面试官回答在亚马逊大家讲究“Owenership”,所以通常做一个项目前后端都要负责。
其实如果抛开面试来讲,LP的很多理念是可以指导工作的,即使你不在亚麻,它也能让你成为更好地工程师。
一轮没面好并不影响拿offer
因为我的时间安排的很紧,面试官时间的协调不是很容易,直到面试前一天才拿到面试官名单。第二天依然是有变动,本来全部是现场面试的,但是有一轮被临时调整成了视频远程面试。
这一轮的题比较难,不是常规的算法题,主要关于JS异步回调设计。我一开始完全没有什么思路,但是又不能停在哪里,所以我一般写辅助函数名一边说出我所有的思路和想法,期待面试官可以给一点提示。我问面试官,“Am I on the right track?”。面试官面无表情,回了一句,“Continue.”。我整个人都快崩溃了,最后硬着头皮写了一些思路,但是我自己内心知道这样明显是不对的。
最后感觉就是这一轮和面试官的交流特别不顺畅,结束后十分沮丧。我发现我是那种面试中更喜欢去和面试官眼神交流,寻求面试官反馈的,如果全程对面十分冷淡,将会极大影响我自己的心态和节奏。
这当然和我自己的心态不够强大有关,但是面试官的冷淡让我十分不爽,中途感觉他还在处理别的事务,中间问了两个问题对面都没有反应,反正我回来就向HR举报了。
最后结果证明有一轮没有面好并不完全说明Offer无望了,但确实在定level的时候会受一定的影响。每一轮结束的时候只能是及时调整心态,不要影响后续的发挥。
Wayfair
面完亚麻在西雅图待了一个周末放松了一下,飞往波士顿面最后一家。其实到这个时候我已经大概知道前面面的三家至少会有两家会给offer了,所以心态已经相当地放松。
Wayfair是美国最大的在线家具电商之一,地点在波士顿市中心一个mall里面,其中有七层都是他们的。他们给面试还是挺痛快的,基本在Karat面试完过了就直接约Onsite。
Wayfair给我提前发的面试官名单还是有点令我意外,基本全是Senior级别的,要么是Senior Director,要么是Senior manager/director。我到了现场之后才发现原来他们是把我作为senior面的。一共也是六轮,一轮系统设计,一轮白板代码,一轮codepen直接跑js,一轮UI组件设计,一轮午餐纯聊,一轮behavior。非常的全面,但是总体来说难度不是特别大。
系统设计那轮给我的反馈是最好的,基本面完我就知道稳了。出的题目正好是我准备过的,所以答的非常流畅,在这里感谢某章。我给出的几种思路都几乎是某章讲解的最优解,面试官甚至表示其中一两个是第一次见到,让我详细解释一番后能感觉整个表情都舒展了。最后Wayfair给我的level也是定到了Senior,个人觉得这一轮至关重要。
最后面完直接驱车奔往机场,赶晚上的飞机回费城。在车上时候长长舒了一口气,终于结束了。
面试准备
其实这一部分如果有时间我希望能单独拿出来做一次总结。以下只是一些简要的描述。
因为我主要还是以前端(Front end)为主,全栈(Full Stack)主要围绕系统设计做了些准备。
算法与数据结构
这部分准备好不一定是充分条件,但几乎是必要条件,至少东西部的大公司是这样。不管你是做什么方向的,前端后端,移动端也好,首先你是一个软件工程师,所以他们肯定会考察你的代码基本功。
个人觉得不必纠结于用什么语言,挑一个自己习惯的就好。出于面试省时间的考虑,基本上我在面试以及准备过程中,能用Python写的都选择了它,前端的题则都是用JavaScript写。用Python确实节约了我很多在白板上的空间和时间,个人也总结了一些Python刷题的小技巧,有兴趣可以移步: 一些刷题常用的 python 技巧。我在做的过程中也给自己做了记录和总结,所有的Leetcode练习代码都放在了Github上:https://github.com/HanchengZhao/Leetcode-exercise
我个人的习惯是每次按题型来,比如这周专门写树和图的,下周专门做动态规划的,这样做多了容易总结出规律,在这个过程中用到的资料主要有:
- Cracking the coding interview ,主要做参考和入门用。
- 极客时间的一门实战课,一门理论课。实战课是视频讲解的,侧重面试技巧;理论课是侧重基础和原理讲解,对一题多解很有帮助。
- Leetcode + Discussion. 我建议每次即使做出了题目也要去Discussion里看一看别人的解法,很多边界处理或者递归的写法很受启发。
系统设计
系统设计我其实不太有发言权,自身准备得也没有那么充分。很多公司对Junior岗位其实期待不会很高,但是如果面得好对定级别相当重要。这部分相对于算法更难准备,因为非常灵活,很看实战经验,但是套路也是可以总结出来的。比如Consistent hashing基本是scalability必考,涉及地理信息的系统比如Uber, yelp必考Geo hash的实现原理等等。
另外就是一定要一步一步来,不同的量级分析测量很不一样,比如如果就几千个用户你非要盲目加cache、加load balancer是一件非常不讨巧的事。
个人主要学习的一个是九章的课,其它就是
前端
前端的面试在我看来是最难整理和准备的,因为它非常地杂,不同公司考法很不一样。有的会考很JS的细节,有的会考具体的功能实现,而有的侧重点又在HTML和CSS上面。个人遇到过的(包括在TripleByte和Pramp上)有
- 实现一个tic-tac-toe
- 实现Event emitter
- 实现一个异步的Shopping cart类
- 实现一个计算器
- 实现一个Debounce函数
- 实现一个To do list
- 实现一个简易版Trello
- 解释一下JS的某个特性(this, prototype, closure, scope…)
大部分都是要求Vanilla JS,所以对于工作中大量依赖框架的开发是有一定挑战性的。但总体来说还是孰能生巧,里面有很多的共通性。
国内可能Vue占据了大半江山,但是美国React还是主流,前端面试中也会充斥很多React技术讨论的地方,比如为什么选React;好处是什么; Redux vs Mobx; 为什么要hooks之类。这里十分推荐Redux作者 Dan Abramov的个人博客:https://overreacted.io/
他是那种能把很多问题细化整理,讲得非常明白的人,真正做到了他所说的“explain with words and code.”
另外就是一些前端工程化可视化相关的问题,这些都比较特殊,只能是按个人经历准备,但是这里工具的选择并不重要,选择的权衡过程才重要,如果能把这个权衡的逻辑和思考讲清楚,是很加分的。
题外话
“造长城”
这次到西雅图有幸和几个亚马逊的朋友聊天,感觉每个人对于亚马逊的想法挺不一样的,感情也很复杂。有人会觉得这种高压和死抠的文化让人很难适应,即使报酬很高工作起来也没有很开心;而有人却觉得这种环境会促使着你去成长去学习,而且大公司做的方向很多,内部转组找到自己喜欢做的东西非常方便。
我之前在网上看到一个从亚麻离职的员工形容在亚麻工作就像“造长城”。毋庸置疑,亚马逊是一家伟大的企业,就像在造一个长城一样,它对社会所创造的价值是巨大的,但是参与建造的过程不一定都是有趣的,往往压力巨大,困难重重。而且,你基本想不起来建造长城的任何一个工人的名字,可能第一个想起来的居然是孟姜女,还不是长城的建造者。在亚麻疯狂扩招的今天,你要进入亚麻之前可能真的要想清楚自己适不适合这种文化。
当然,这只是一种观点,我还是很敬佩亚麻得员工的,尤其佩服它在人员流动这么快速的状态下还能保持系统的稳定和高速运行,整个制度和框架肯定起到了很大的作用。据说亚麻程序员几万人,senior及以上的员工也才800+,真的个个都是中流砥柱了。另外我听到一种说法是亚麻员工跳槽都非常受其它公司的欢迎,而几家养老公司出来的可能就要接受各样的质疑。
“你刷的每一道题都会有所回报”
我之前和一起mock的朋友开玩笑说,我们要像一题一千刀那样去刷题。因为Faang级别的公司一般电面都会出一到两题,过了就会包机票包酒店包餐饮请你去他们公司面试,这一两题就基本值这个价了。
这当然只是个段子,一家公司真正面试就算电面+现场加起来最多也不过10题,但是你往往要刷几百甚至上千题来保证你能流畅地做出那几题。很多题你刷过了没有考不代表就没有作用,它让你更从容、更有底气去面对那些陌生的题目,毕竟面试中气场和心态非常关键。
“面试心态”
讲到心态,我觉得面试的时候一定要将面试官当成平时工作的同事来对待,假设对方目前不知道这题的解法,你要一步一步推演给TA,而不是一场考试。
而关于如何调整好心态,我觉得无他,唯手熟耳。所有的信心都来自平时的训练和反馈,你不能指望平时没刷过题的人面试时候能有强大的内心调整好状态。
“挂了其实不是坏事”
我个人感觉是一般面试完就知道会不会拿offer,对方适不适合自己了。所以很多时候挂了并不是一件坏事,只能说目前双方还不适合。面试者往往是你将来要每天共事得伙伴,如果他们面试的时候处处刁难你,那即使大发慈悲给了你Offer, 你将来每天也会过的很难受。这样不如一开始就不要选择强行“撮合”。
另外就是一定要接受批评。很多时候是需要一些在一旁指出你不足和缺点的朋友的。我在投简历初期想让一个朋友内推,被狠批了一顿,开始恍然大悟全部重新排版改写,然后才有了后来很多的面试机会。
以上就是今年的面试经历,真的要感谢很多无私帮忙内推的朋友(特别致谢某烨同学一共帮我内推了三四次),见识了很多,学习了很多,但是这个过程并不想再来一遍了,真的是累。。。