【分享经验】大厂码农跳槽 聊聊自己比较顺利的求职季

avatar 618730
sayastark
17526
55
个人情况
楼主毕业后就加入某FAANG大厂,就职四年,今年八月因为对薪资不满意、对项目打不起兴趣,决定重回求职市场找下家。主动或被动一共与25家公司recruiter取得联系,申请的都是Senior/Staff Eng的职位。通过了18家公司的店面并拿到onsite invite. 因为时间原因退掉了9家的on-site,参加了9家onsite, 全部拿到offer。

楼主从准备面试到收工一共用时两个月,期间从地里获得了大量宝贵信息。借这个帖子回馈一下这段时间的总结和经验,希望能对大家有所帮助。汝之蜜糖,彼之砒霜,楼主不能保证这些经验具有广泛的适用性,毕竟每个人的情况都是不一样的。只能说提供一种思路,可以批判性接受。

公司详情
拿到offer的公司:Figma, Reddit, Better, Marqeta, Lattice, Duolingo, Cameo, DoorDash, Stripe
推掉onsite的公司:Dropbox, LinkedIn, Two Sigma, Citadel, Square, Smart News, Clear street, Palantir
店面悲剧:Asana, Color, Robinhood, Jane Street, Step, Uber
回家作业悲剧:Datadog, Plaid
如果小伙伴对其中某家公司感兴趣,欢迎留言交流。

具体的offer详情楼主会在其他板块分享细节。

简历申请
楼主交流的公司里大概有一半是主动申请,另外一半是在LinkedIn上的recruiter reachout。基本都是在官网投递简历,一到两天内收到recruiter的回复约聊。较高的回复率个人归结为简历上有大厂经历并且涉足过不同类型的项目,包括全栈、用户增长、后端。经验总结如下:
1. 对于New Grad还是建议优先考虑大厂,简历上的金字招牌,海选关基本零难度。
2. 在本公司里不要只呆在自己的comfort zone里。多换组多尝试不同的项目,拥有多样性的技能,之后的选择会海阔天空。
3. 在本公司里积极参加具有一定难度和复杂性的项目,并能用通俗易懂的语言熟练地解释给亲戚朋友听。
4. 经常更新自己的LinkedIn页面,在公司允许的情况下加入大量丰富细节。信息越多,越能招蜂引蝶。

做题练习
长时间远离求职市场,刚准备面试时大概只能解决Leetcode easy的难度。楼主以大概每天两到三题的频率练习,前后一共做了大概五六十道题。
主要选题方法是根据Leetcode整理的topics,比如Search, Graph, Recursion, Tree, Greedy, Dynamic Programming等等。在每个topics里会选择人气最高的几道medium或hard做做看。在实战中如果发现一些薄弱的topics/algorithms,也会针对性地强化训练,比如:
1. 有时分不清什么时候可以Greedy什么时候必须DP,因此特地抽出一两天只做类似的题目并练习Sliding Window等算法。
2. 常常遇到graph search problem需要记录search path,在跑Leetcode常常会出现因为copy path data不够efficient出现timeout。因此特地强化训练了一下backtracking的方法 (用来use a single data structure to record temporary results recursively)。

因为本职工作的原因时间有限,因此做题往往带有强烈的目的性,并且着重反思归纳总结,经常比较Leetcode Discussion里别人的答案来分析优劣。在较短的时间里可以迅速覆盖基础的算法知识,后期基本可以不靠提示解决大部分hard难度的问题。

一家之言,并不是很认同根据公司历史选择题目,通过海量做题寄希望于在面试中押对题的策略。主要原因是:
1. 押题往往会导致心态不稳,一旦面试中遇到没有见过的题目或变种或延伸,可能会导致心理崩溃,临场应变能力反而打折。不如打好基本功,轻装上阵。
2. 因为押对题而熟练给出最优解给面试官提供的正面信号往往少于经过一番挣扎思索后给出最优解或次优解。以楼主自己作为面试官的经历来看,面试不是唯结果论,而是发现问题解决问题的思考过程和交流方式。如果演技欠佳,一般人很难在押对的题上展现出完整的思考过程和充分的交流。
3. 重量则难求质。在短时间内苦刷几百道题,很难有时间进行归纳反思,也很难有耐心去Discussion里研究别人的答案。每一道题的边缘效益会大打折扣。
4. 不scalable。同时面多家公司,尤其是面经稀少的小公司,这种方式很难实践。

题目是无限的,而题目背后的算法和数据结构是有限的。刷题是应对trick question的好方法,但是以楼主经历过的面试来看,大多数公司都在避免trick question而是着重考basics。因此个人建议尽量避免刷题押题,而是根据自己的知识盲区针对性地选题,保证自己对每一个topics都有充足的理论知识和一定的熟练度。

楼主大部分coding interviews都是现场一番思考后成功交卷。几次马失前蹄的经历如下:

Asana: 面试官问了一个比较unconventional的问题,并且没有提供足够的instructions和hints,楼主浪费了大量的时间在口头讨论,导致最终没有时间写code。
Color: 没有清楚地理解面试官的意图,直到最后五分钟才明白题目是次要的,主要是在考Object-Oriented Design。最终疯狂refactor成功,但是一周后仍然悲剧。
Robinhood: Karat interview卡bug,最终也没有发现问题所在。面试官全程冷漠脸,没有提供任何帮助。
Jane Street: 被问题难倒,在多次hint的情况下才给出答案,名正言顺的gg了。
Step: DP问题全程没有用DP的思路去解,最后十分钟突然开窍,但是为时已晚。
Uber: 没有在短时间内看明白题目的graph本质,在重要提示之后才想明白思路。
事后反思,一部分失败是不可控因素(比如经验不够丰富的面试官),而另一部分则是知识盲区,事后也立即进行了针对性补课,避免重蹈覆辙。

系统设计和行为问题
楼主只在大学毕业时面过New Grad的职位,因此系统设计和行为问题是绝对短板,准备期间特地进行了一定程度的训练。

有关系统设计,楼主主要是通过以下资源进行恶补:
1. educative.io: 吐血推荐,前后大概看了两遍。清晰易懂,几乎点到了所有的basics。
2. educative.io: 对于系统设计的Deep Dive环节有很大帮助,尤其是被问到how to solve concurrency/inconsistency的具体细节。
3. educative.io: 一个很详细的cheat sheet。

在反复熟读上述资料后,在实战中基本顺风顺水。一些事后的经验之谈:
1. 没有必要太过于按部就班,可以适当程度地自由发挥。如果真的错过了某些重要环节面试官一般会给予提醒。比如楼主注意到几乎所有的prep guide都会强调back-of-envelope estimation,但是实操中发现很多时候算出来的numbers往往不会直接影响到最终的design。因此楼主经常忽略这一步,一开始先着重于面试官比较感兴趣的部分,如果的确需要capacity estimate来决定设计细节时再进行计算。
2. 知道并了解一些常见问题以及解决他们的轮子。比如 Message Queue → Kafka, Structured Data → Postgres/MySQL, Unstructured Data → MongoDB/BigTable/Cassandra, Distributed Cache → Redis, File Storage → S3. 最好能对这些工具有着一定程度的深入了解,比如他们是如何实现某种功能,他们的利与弊等等。部分面试官会钻牛角尖询问轮子的内部构造,心里要有一定准备。
3. 不怕啰嗦,在给出答案之前陈述所有的assumptions, pros & cons, alternatives等等。(对于大部分面试官这算是正信号,如果过于啰嗦他们会适时地打断你。)
“I propose this solution with the assumption that...This assumption should hold true most of the time because...”
“However, it might not work in certain cases. For example... To handle those cases, we need to...”
“Alternatively we can use... This might be a more preferable solution if...The reason I picked the original tool is because...”

关于行为问题,楼主的建议是:

对自己的工作经历进行系统性的反思,常见的问题有
1.最引以为豪的项目经历。这基本是个必考题,而且能引申出很多子话题,比如这个项目技术上最难的部分,可以事后诸葛亮的部分,如何跟peers一起合作等等。项目不一定要多难多大,但是要体现出自己的主动性、热情和迎难而上的精神,要强调自己在整个项目中不可或缺的作用。
3.和同事发生冲突、给出建设性反馈的经历。这个问题比较容易踩雷,楼主采用的是自己带实习生的经历,既展现出了给反馈的能力,又侧面强调了自己帮助指导新人的经历。
4.自己犯过最大的错误。在本厂犯下的错误一箩筐,楼主挑了一个恐怖故事分享。这道题考的不是错误本身,而是成长的经历。要着重谈犯错之后自己的心路历程和改正过程。
5.自己喜欢和什么样的EM/PM合作。基本上如实回答就没什么问题,大家本质上都是喜欢乐于助人、善于倾听、张弛有度的上司和同事。

建议最大程度的照实回答。行为问题很难有red flag,不诚实算一个。有时候面试官会刻意问一些细节反复核对,撒谎容易露馅。面试官表面不说但心里会减分。

可以把事例提前准备好,但是最好不要照本宣科,争取让面试像是一个organic conversation。不要出现自己准备过的问题滔滔不绝,而没准备的follow-up就支支吾吾的情况。

回家作业
楼主收到了两家公司Datadog和Plaid的回家作业,牺牲了大量周末的宝贵时间,结果依然悲剧。楼主的反思是,对于大部分求职者而言,回家作业是付出与收益极不成正比的面试方式。除非是自己的梦想公司,或者自己的风格是编程的巨人、面试的矮子,否则回家作业能推辞就推辞。五六个小时的时间足够一个其他公司的全部面试流程了,用在一个作业上非常不值。

作为面试官
楼主做了两年的面试官,感觉这段经历对自己作为一个求职者帮助很大。主要体现为:

1.能够清晰地看穿面试官的意图和想要考察的信息,经常先于面试官一步提出follow ups, pros & cons等等,手把手帮助面试官捕捉communication和coding中自己展现出的正信号。
2.心态稳定,掌控面试的节奏。面试官有时也很慌,面对一个有信心有思路的面试者是可以被带节奏的,比如面试的时间分配,hints的程度,测试的方式等等。强势的面试者可以将面试的节奏往自己有利的方向去引导。
3.能在面试后第一时间知道自己的表现是否拿到offer或进入下一轮,不会抱有侥幸心理,也不会出现心理落差。帮助自己及时止损,合理的安排接下来的日程。同时能够清醒地意识到哪些失败是自己控制范围之外的,不会因此而影响自己的心态。

如果本公司提供做面试官的机会,强烈建议同学勇于尝试。如果还没有上岸,也可以偶尔尝试mock interview别人,把自己放在面试官的鞋里去增加自己对面试流程的理解。


小结
两个月的求职经历心态发生了很大变化。一开始因为长期远离市场,对自己的能力信心不足,选择了广撒网的策略。抱着最坏的打算去准备,结果反而过程意外地顺利,导致现在深陷选择焦虑症中。归根结底还是得益于大厂提供的起步平台和自己比较科学的准备方法。希望能给小伙伴们一些启发。也鼓励在大厂心痒的同僚,如果不享受现状就不要将就,积极争取下一个机遇。
  • 519
55条回复