包子吧 - 我的帖子我做主!
My Experience and Advice for Senior SWE Interviews - 可打印的版本

+- 包子吧 - 我的帖子我做主! (https://baozi8.com)
+-- 版块: 求职大典 (https://baozi8.com/forumdisplay.php?fid=1)
+--- 版块: 面经分享 (https://baozi8.com/forumdisplay.php?fid=3)
+--- 主题: My Experience and Advice for Senior SWE Interviews (/showthread.php?tid=211)



My Experience and Advice for Senior SWE Interviews - foo - 09-30-2024

TL;DR:市场形势严峻,高级职位要求高,认真对待准备和自我投资。

# 关于我
7年FAANG级别的工作经验,前10名计算机科学学校,之前的总薪资超过450k,今年早些时候被裁员。

# 我的面试过程
被裁员后,我休息了几个月,以从一些残留的倦怠中恢复过来。在这段时间里,我每天花1-2小时做LeetCode,磨练我的编程和算法技能。我更新了我的简历,突出我的顶级经历和成果。在开始投递申请之前,我进行了研究,最终确定了11家公司作为我希望工作的目标。我主要的标准是大型上市公司,薪资优厚,并且有一些远程工作选项。我花了两周的时间为这些公司收集推荐人和招聘人员的联系方式,然后开始了面试过程。在这段网络交流和技术筛选的时间里,我准备了系统设计和行为面试的回答。

在我的网络交流完成后,我发送了所有11份申请,并安排现场面试,以尽量提高我的谈判筹码。在这11家公司中,有4家立即拒绝,1家筛选失败,1家现场面试失败,2家给出了offer,而由于时间原因我取消了最后3个现场面试。我很幸运,其中一个offer是我最想要的,总薪资稍低于400k。我使用了一项谈判服务来进行谈判,但招聘人员和薪资团队并未让步——幸运的是,我得到了全额退款。当然,我对我的总薪资下降感到失望,也没有得到即使是小幅的提升,但这就是现在的市场。整个过程从第一次申请到签约offer花了6周。我承认这是相对较快的,因为我已经做好了准备,并且为每个招聘人员施加了一些紧迫感。

在接下来的部分中,您可以找到我对每种类型面试的详细建议。我希望提供有价值的建议,这些建议在Blind上很少被讨论。

# 编程面试
这是最容易准备的面试。一旦你完成了几十道LeetCode题目,你会意识到其实只有5-7种模式需要学习。你的任务是深入理解这些模式,如何调整它们,并能够快速实现。例如,写BFS/DFS和二分搜索应该和写for循环一样自然而然。如果你是一个认真对待高级角色面试的候选人,编码面试应该对你来说是一种形式。你应该对自己能够轻松通过这些面试充满信心。

你的行动项:
- 如果你在表达思路时遇到困难,录下自己并观看,或者进行模拟面试,直到你可以自如地表达。能够清晰沟通是不可谈判的。我失败的那次筛选就是因为沟通不当。
- 直接购买LeetCode Premium。你可以获得公司标记的问题、书面解决方案以及论坛帖子,其中有时包含非常有用的信息。一年的订阅费用大约是1-2小时的工资,如果它能帮助你找到工作,就值了。
- 你应该能够在冷场状态下在20-25分钟内解决90%的随机中等难度题目。有些中等难度的题实际上标记错了,应该是难题,所以如果你偶尔卡住也不要太难过。
- 学习Python。使用其他语言会让你在时间上处于劣势。
- Collections、heapq、sortedcontainer和bisect库是你最好的朋友。好好熟悉它们。
- 能够至少解决过去30天内每个公司标记的问题,最好是3个月。这些基本上是免费的秘籍。

# 系统设计
这可能是满足高级标准的最重要的面试。在这个市场上,仅仅有一个功能性的解决方案会让你被拒绝,或者充其量被降级。你的主要目标是展示你进行和讨论权衡的能力。你可以通过展示你广泛而深入的技术经验和知识来做到这一点。由于现在存在众多技术、基础设施解决方案和设计模式,这比编程面试更难以完善。

我个人希望自己在学习和实践系统设计概念上花费的时间比在LeetCode上多。我知道我的一次现场面试失败是由于在系统设计面试中的表现不佳。话虽如此,这里是对我有效的建议以及我认为你应该做的事情。

- 时间管理是关键。以下结构相当常见:
  - 澄清问题(1-2分钟)。尽量保持这一部分非常简洁。
  - 功能需求(2-3分钟)。这是一系列“用户应该能够X”的陈述。经过练习后,这应该变得自然而然。确保询问哪些需求在范围内。始终询问在继续之前是否还有其他需要考虑的内容——列出需求很简单,但如果遗漏一个,那么你就已经失败了。
  - 非功能需求(3-5分钟)。在高级别的面试中,这一点相当重要。不要浪费太多时间说它应该是高效的、可用的、符合CAP定理等。你想要澄清的是一致性模型、身份验证/安全性、延迟、耐久性等。你设计的每个服务都必须是高规模、高可用性、低延迟——通过超越这一点给面试官更多积极的信号。
  - 数据估计(0分钟)。我发现这一环节是浪费时间。你实际上并没有给面试官什么信号。最多,如果有持久数据,评论一下数据的增长是否显著,需要定期清理。
  - 数据模型(2分钟)。许多资源会告诉你在这里制定你的模式和属性。我建议只列出你知道的主要实体,并说明你会稍后决定模式。
  - API(3-5分钟)。在这里花点时间,明确你要发送的请求类型、提供的参数和返回的内容。拥有一个出色的API比拥有一个功能性API更能提供强有力的积极信号。
  - 高级别图(10-15分钟)。首先处理功能需求,并告知面试官你将稍后处理非功能需求。你也可以这样处理你的数据存储,并告知你将在处理非功能需求时选择特定的技术。
  - 处理瓶颈(剩余时间,15-25分钟)。详细说明,什么样的模式/数据库最适合需求,在哪里添加缓存,哪些流程可以或应该异步处理。这是你真正展现自己能力的时刻。如果你在某个领域有深厚的经验,现在是展示它的好时机。如果你能够教会面试官一些他们之前不知道的内容,你可以成为一位出色的候选人。
- 每当你做出一个决定(例如,我们将使用X),列出替代方案及其权衡。你做得越多,就能提供越多的积极信号。
- 我没有阅读《Grokking》,发现《Designing Data-Intensive Applications》部分有用。我会推荐以更动手的方式学习,但这可能只是个人偏好。
- 我非常喜欢System Design Fight Club(SDFC)的YouTube视频,真希望我花更多时间学习它们。
- 每个系统设计问题都有一个核心瓶颈,通常是问题的关键。尽早识别这一点,迅速处理所有简单的需求,然后把大部分时间集中在解决通常是高读取规模/数据吞吐量、高写入规模/热点分片或数据一致性/事务等问题上。
- 数据库是最重要的概念之一。仅仅说“使用关系数据库以支持事务和强一致性”是不够的,因为许多NoSQL数据库也具有类似的功能。至少,你需要能够深入讨论如何扩展读取/写入以及如何处理复制/一致性。更好的是,了解你选择的数据库的更多细节(例如,写入是如何被复制/传播的,最终/强一致性是如何实现的)。
- 常见的权衡可以提及:Websocket与HTTP(或较少情况,与UDP),单体与微服务扩展,同步与异步,推送与拉取,高延迟与最终一致性,缓存策略(本地、远程、TTL/LRU/LFU、读/写策略),分区策略。
- 主动指出设计中的瓶颈(即,随着规模扩大首先失败的组件)以及如何解决。
- 尽可能展示你的广度和深度,即使只是对替代方案的简短评论。
- 相反,如果你知道自己在某个领域知识有限,不要主动提及这一点,并在必要时做出明智的猜测。
- 模拟面试在这里非常重要。我做了4次,花费大约一千美元,这是我花过的最好的钱之一。通过专业的、有资质的面试官进行的付费模拟,不论是系统设计还是行为面试,直接帮助我在这个市场上成功获得offer。
- 针对你正在面试的公司的相关问题进行研究。例如,对于Netflix,练习视频流媒体平台的问题。对于Doordash,练习餐厅搜索/发现问题。

# 行为面试
这些面试特别难以

准备,尤其是因为有大量的文献对“行为面试”的定义不一致。由于许多行为面试的形式在于标准化,因此你可以通过理解STAR方法(情境、任务、行动、结果)来准备自己。

根据我的经验,行为面试主要集中在你是如何与其他团队合作、你所取得的成就以及你在影响组织方面的经验。我认为你可以将你的经历总结为几个要点(例如,我成功组织了一次跨职能的团队合作,使每个人都有参与感,最终使整个项目比预期提前一周交付),并针对每个要点准备一个完整的故事(记住STAR),因为这会为你提供一种结构化的方式来表述你在面试中的答案。

此外,我在下面列出了一些在我与10多家公司的行为面试中有效的问题。这些问题的形式主要围绕“团队合作”——这是大型公司的文化中的关键主题。

- 描述一次你与他人共同工作的经历。是什么让你们合作得如此成功?是什么让你们的合作如此困难?(旨在了解你是如何与他人合作的以及你的沟通方式。)
- 描述一次你解决过的非常复杂的技术问题。你采取了什么步骤来解决这个问题?(旨在了解你是如何处理复杂的技术问题的。)
- 描述一个你克服重大挑战的经历。你采取了什么措施?(旨在了解你的适应能力和如何处理压力。)
- 描述一次你需要与不同意见的人进行合作的经历。你是如何达成共识的?(旨在了解你的影响力和沟通技巧。)
- 描述一次你需要在截止日期之前快速解决问题的经历。你是如何确保按时完成的?(旨在了解你如何管理时间和优先级。)
- 描述一个你在技术上推动改变的经历。你是如何让其他人加入这个想法的?(旨在了解你的影响力和推动变化的能力。)

我为每个问题准备了一些要点,但我没有对自己提出的故事进行剧本化。这让我能够在面试中更加自信。

总之,准备充分是关键。您的准备越充分,您在面试中的表现就会越好。了解即将面试的公司是至关重要的,包括公司的文化、价值观和关键目标。希望这些建议能帮助您顺利通过面试并获得理想的职位!