七年大厂之后的restart - 七个hot startup offer和一份新挑战

avatar 569008
Smilenceyu
58758
141
这个号又和大家见面了,去年主要精力都在放在女朋友零基础转码,成果不错(拿到 Facebook / Amazon / Samsara 的intern offer),在地里也分享过心得。帮助女朋友上岸之后,就想着可以借着刷题手熟趁热打铁自己也试试,正好跳槽市场也比较火热。

我自己EE硕士毕业之后就一直在FB工作,做的大多是产品逻辑,虽然WLB很好,工作外有很多时间和精力,但终究是荒废了事业发展,manager和同事都普遍评价我能力足够但太过“佛系”,其实就是懒。去年在全负荷带女朋友做项目和刷题的过程中,我自己学到了很多,某种意义上多过于我之前六年所学,更重要是找回了久违的紧迫感和快节奏。

这里要感激女朋友对我的督促。在她眼里,我因为自己的惰性,把一手好牌打得稀烂。很感激她,如果不是进入这段serious relationship,很可能我现在还继续在混日子。

最后还有个小动力,之前我就连在地里发言有时候都被人挤兑,“你七年前面进Facebook,跟现在难度完全不同了”,我也没法反驳,毕竟事实如此,而我当年也只拿了FB这一个offer就很满足地入职了。

所幸运气也比较好,拿到了不少感兴趣的公司的offer,家庭地位也总算提高了一丢丢。

A. 面试成果和流程

面试主要集中在 12月 到 2月,除了之前有刷算法题,其他面试内容都是边面边准备。

Offer: Airbnb / DoorDash / InstaCart / Coupang / Databricks / Confluent / Roblox

Reject: Robinhood / Pony.AI / Coinbase

[OFFER] 11月 Airbnb 那时女朋友还没上岸所以只准备了几个小时,system design碰上拒绝交流的面试官,导致只给了senior title,加上没赶上IPO的末班车就pass了;

[REJECT] 12月 Pony.AI 让我手写balanced BST变种,写完没来得及改,第一轮电面就这样把我挂了,让我至今对这公司心情复杂;

[REJECT] 12月 Robinhood 第二轮电面系统设计,面试官“very good””very good”然后把我挂了,后来想可能是因为我别处看来的那方法太特殊了不适合面试;

[OFFER] 12月 DoorDash bar raiser气场被director压制得厉害,但还是给了staff title,可能是HM一直比较看重我的相关经历;

[OFFER] 1月 Databricks 可能是bar最高的,面试官水平很高,follow-up讨论你来我往让人有酣畅淋漓的感觉。但有些面试官太aggressive,疯狂进攻弱点,让人略有不适。不过feedback说是很好,给了staff title;

[OFFER] 1月 InstaCart 看到地里的L6 2M股票offer去面的,面试比较朴实,能够让我全程主导。最后给了L7(staff) title;

[OFFER] 2月 Coupang 刚file了IPO,势头很好,TC可以说非常competitive,manager也很chill。给了Principle title;

[OFFER] 2月 Confluent 偶然知道的这个公司,过程中发现公司文化很好,也很有活力。第一轮coding开始理解错了题意过程有点波折,最后还是给到了Staff-2的Offer。升级别应该是看中了我的相关经历和为了跟别的offer compete。

[REJECT] 2月 Coinbase 回复我比较晚,当时在收尾了。其他轮都很好,在coding那一轮因为急于做follow up被发现了一个小bug,收到拒信的时候有点意外,忽然更想去这公司了。

[OFFER] 2月 Roblox 分成两天的面试,好多轮与executive聊天+brainstorm。给了Senior-2的offer,TC也不够competitive,就当体验了。

B. 学习方法

我的学习方法就是直接上手,Trial and Error的方式对Software Engineering尤其适用。按部就班“打好基础”,往往是因为畏惧一开始陡峭的学习曲线,所以才选择抱住课程/教材来获得安全感。

无论是算法,系统设计还是behavior,我都是用这个方法,直接做题再查缺补漏和总结。适应之后效率会起飞,因为你一直在专注解决那些跟目的直接相关并且你欠缺的东西。

C. Coding / 算法 面试

我对这一块是最自信的。对于超过2年没练算法的人来说,这一块准备的时候的确是最花时间,但对于senior+面试真正到了coding面试更多是及格就好,是三类面试中最简单的。

看过我总结的笔记和youtube视频的应该知道,我处理算法题的方法,就是从题目特征出发的“模式识别”。相比于按照 图 vs tree vs DP的知识点来总结,我是按照题目的特征来总结规律。做题就变成 根据题目描述识别模式 -> 用这模式对应的模板 -> 写code。碰到解决不了的新题,就扩充模式库。

比如大家说sliding window,但关键是什么时候用怎么用,首先这个题是问subarray而不是subsequence,其次题目要求的跟window长度直接相关 => 用sliding window 而不是DP => 套模板。我总共大概总结了接近20个模板,都是基础算法,比dijkstra更偏门的都没准备。知道什么题目特征用哪个模板,再解决绝大多数非Google非pony.ai的coding面试,比较轻松。

有公司还考了multithreading的coding,我从没写过这些。我复习的策略还是一样的,就是直接做题和看面经,参照网上类似问题的代码,直接上手写code和测试来理解,有疑问再Google stackoverflow查,要比回过头去看OS要好的多。我觉得文字、图画和各种比方,都远没有code来的清晰和没有歧义。最后面试的效果都非常好。

D. Behavior / Experience 面试

如果是面试Senior+,就要不得不重视起behavior / experience 面试。一方面这轮会决定你的level,另一方面直接影响在决定是否offer和offer negotiation的时候,HM是否能帮你说话。

我从面试经验中总结出了这几点:

  • 最重要的是自信和气场,只要言之有理言之凿凿,面试官就会被你的热情所感染,进而相信你这个人能做好工作
  • 和第一点是相关,虽然工作经历可以写好准备好,但不要背,否则没有感染力,更关键的是和面试官缺乏互动
  • 工作经历不要说成流水账,可以想好这个例子是想突出自己的哪些能力,比如说对senior+很重要的两点我认为是 (1) 自己发现opportunity and motivated (2) enable其他人
  • 对为什么换工作和喜欢的工作可以多说一些,展示热情和motivation


E. System Design 面试

这一部分对于senior+的面试算是重头戏,大多数人可能都挂在这里。市面上材料很杂,但大多只说结论不解释为什么,不足以应对这个级别的面试。大多数人工作中没有机会接触完整的distributed system design,好在这个其实比coding更套路,有一定工程思维完全可以突击准备,别想的太玄乎。

虽然我不喜欢按部就班系统学习,但为避免后期疑问太多,我还是看了这两个材料:

  1. 我朋友Jerry写的blog,非常严谨:luanjunyi.medium.com (一天阅读量)
  2. DDIA 的 5,6,7,10,11 这几个章节 (5 - 7天阅读量)

之后我就直接在lucidchart上练习面经和经典设计题,每一步决策都要有理由,比如

  1. 需求是不是可以分成Read 和 Write,read还是write heavy
  2. 根据read和write数据之间的关系,用online,batch processing还是stream processing
  3. 根据ACID的需求,决定SQL vs noSQL
  4. 根据sample query,决定sharding key 和 index column …

像Database,Cache,Message Queue这样的重要component,每种选一个典型产品比如MongoDB/Reddis/Kafka ,带着问题去看sample code和tech blog。

学习过程中疑惑越多越好,找权威资料去刨根问底,包括几个来源:

  1. 公司的tech blog和论文
  2. 主流商业产品的documentation
  3. DDIA这本书
  4. 类似InfoQ这样的tech conference的视频 (比如设计slack,有什么能比slack的engineer来介绍他们是怎么build的更权威么?)

为了偷懒去找网上其他乱七八糟的资料和视频,很可能就掌握个大概,一到面试就露馅。

另外面试的时候有个要注意,就是别说一些很特定的技术和算法,我吃过不少亏。面试官不懂你得给他解释,最好情况就是将信将疑,最差情况直接觉得你是错的。比如当你需要用distrubuted lock去解决问题的时候,大概率你想偏了,面试官要的是简单得多的方案。

F. 总结

最后有一个想跟senior+ candidate说的,就是整个面试过程中自信和气场都非常重要,哪怕是技术面试。我教我女朋友转码的时候发现她作为junior candidate,有个不利因素是上来就在被judge的位置,面试官在judge的位置有心理优势,容易挑三捡四。但是对于senior+,我们换工作只是寻找更好的mutual fit,不存在谁挑谁,这个要有底气。自己气场一强,对方反而不好意思去考一些奇技淫巧,也就不会对一些细枝末节太过细究。当然这个自信和气场都来自于充分高效的准备。

这次面的基本都是Pre-IPO公司,你会发现大家对这些公司都会有自己的主观判断,但连public company炒股我们都预测不了,更何况公开信息很少的未上市公司呢。这点上我比较信任investor实打实的投钱对应的估值,毕竟人家了解的多得多。但至于未来到底会怎么样,太多不确定因素,靠的是命。

既然这样,还不如picture一下自己在新公司工作的画面,是不是能够在新环境里如鱼得水。这次换工作,最初的确是为了更好的TC,但在整个过程中学到很多,甚至境界也提高了,最后放弃了可见利益更好的公司(HM说可以再加点钱,我居然真的说出了"不是钱的问题,你们给的够多了"),而选择了文化更契合,对我的长远发展更有利的机会。这里也非常感谢Jerry,罗总,艾总和马总对我的指点和帮助,感谢女朋友对我的鼓励和鞭策。希望大家事业发展顺利🚀!

补充内容 (2021-3-6 00:40):
补充一点就是面试实战本身就是效率最高的发现问题和提高水平的方式。幸好我先面了一些并没有那么想去的公司,后来就越来越老练了。

补充内容 (2021-3-6 13:53):
system design很多时候题目就是个场景,最后还是看你对一些核心component的理解,什么时候用什么,怎么用;不过也有些非常特定的,比如job scheduler,recommendation system,这些没看过相关的确实不会

补充内容 (2021-04-04 02:24 +8:00):
最近我注册了个ch玩玩 id和我论坛id一样,欢迎互相follow
  • 1097
141条回复