logo
Introduction

Software Engineer 面试:你需要准备的全部内容

你会遇到什么、怎么准备、以及如何在 Software Engineering 面试里表现出色

没人有时间刷几百道 LeetCode,good news 是,你其实不需要刷那么多也能拿到 FAANG 的 offer!

我在东南亚的 ridesharing 公司 Grab 工作时很 frustrate,想转去 FAANG,但不知道怎么下手。经过几个月的 research、学习和练习,我面了 11 家公司,拿到了 9 个湾区 top tech company 的 offer——Facebook、Google、Airbnb、Palantir、Dropbox、Lyft,以及一些 startup。这个过程很折腾,我绝对不想再来一次。我已经踩过坑了,所以有这份 guide,你不需要再踩。

这份 guide 会给你一个软件工程面试准备的 top tips 快速概览——涵盖 technical 和 non-technical 的面试轮次。需要更详细的内容,你可以点 overview 里的链接,或者通过网站左侧的 sidebar 深入阅读。

System Design

系统设计从这里系统学起

核心概念 + 经典案例,快速补齐面试短板。

进入 System Design

如何准备 software engineering 面试:

  1. 最大化你被 shortlisted 的机会
  2. 弄清楚面试格式
  3. 选一门编程语言
  4. 夯实面试需要的 Computer Science 基础
  5. 练 coding interview
  6. 准备 system design interview(适用于 mid/senior)
  7. 准备 behavioral interview
  8. 谈 offer package

最大化你被 shortlisted 的机会

你还在为进不了一些(或全部)top tech company 的 shortlist 发愁吗?你的 resume 可能是问题。

Resume 是进 FAANG / MANGA 这类大厂 shortlist 的最关键入口。一旦你被 shortlisted,你过去的 achievements 就没那么重要了,反而 coding interview skills 更关键——而这些是可以系统学习的。所以,能把你的过往成果讲清楚、讲到位,对过筛非常重要。

很不幸,就算是我认识的很强的候选人,也常常不会写好 resume,结果过不了筛选。很多人没进 FAANG / MANGA 会以为自己不够强,但实际上,大多数时候只是 framing 不够好。

如果你想学怎么写一份好的 software engineer resume,我写了一份软件工程简历准备的 step-by-step guide,针对 Google、Facebook、Amazon、Netflix、Apple 等公司,并带了例子供你参考。

弄清楚面试格式

在 software engineer 面试里,你可能会遇到不同的面试形式(从 early 到 late stage):

1. Quiz

Frequency: Occasional

Quiz 通常是 quick and dirty 的第一道筛选,用来过滤掉明显很弱(甚至 non-technical)的候选人。它是结构化问题、答案明确,便于由 recruiter / non-technical 人员或自动化系统来评估,一般出现在流程早期。

Examples:

  • What is 4 & 5 (in binary)? Answer: 4
  • What is the time complexity of bubble sort? Answer: O(n2)

2. Online coding assessment

Frequency: Occasional

和 quiz 一样,online coding assessment 通常在流程早期。会给你一个 algorithm problem,提供明确的 input/output,你需要在在线 coding interface 里写 code 解题。HackerRank 是常见的平台。LeetCode 也是练习这类 problem solving 的好方式。但在 HackerRank 里你通常要从 stdin 读入、stdout 输出,如果不熟悉相关 API 很容易翻车。

3. Take home assignment

Frequency: Rare

关于用 algorithm questions 评估能力是否合理,一直有争议,因为这些技能并不是日常工作最 relevant 的。Take home assignment 的目的就是弥补 algorithm interview 的不足,让候选人做更大的 project 来展示 software design 能力。

不过这种形式对候选人和公司都更耗时,所以在大公司里不常见;更多见于 startups 和小公司。Examples:

  • Build a flights listing app
  • Build a kanban app
  • Build a snake game

4. Phone screen interviews

Frequency: Common

Phone interview 是最常见的形式,几乎每个候选人都会遇到至少一次。你会和面试官通过电话或 VoIP(BlueJeans/Skype/Google Hangout)交流。面试官给你一个问题,你在在线协作编辑器里解题(如 CoderPad/CodePen/Google Docs)。

通常不允许执行 code,即使编辑器支持。所以不要依赖运行结果来验证你的解法。不同职位的形式略有不同。很多公司会用 CoderPad。CoderPad 也支持运行,所以你可能会被要求修复 code 让它能跑起来。对于 front end 面试,很多公司会用 CodePen,建议你熟悉这些 web-based coding environment 的 UI。

也可以看看 coding interview best practices 里的 do’s and don’ts,帮助你应对 phone screen。

5. Onsite

Frequency: Almost always

如果你进到这一步,恭喜!这通常是 offer 决策前的最后阶段。Onsite 会要求候选人到公司进行现场面试。如果你是海外候选人,公司甚至可能帮你安排机票和住宿。

Onsite 通常包含多个轮次(coding、system design、behavioral),持续几个小时。因为在现场,你可能会被要求 whiteboard 演练,通常是 algorithm question 或 system design question。也可能要求你带自己的 laptop,当场完成一个 project 或解决 coding problem。

对于较小(非上市)公司,通常允许(甚至更喜欢)你用自己的 laptop,所以提前准备好 development environment 很重要。

如果公司提供午餐,你可能还会和员工一起吃个 lunch,顺便了解 company culture。

选一门编程语言

Resume 搞定后,下一步很简单也不会花太久:选一门编程语言。除非你面的是 mobile 或 front end 这种有 domain-specific language 的职位,否则 algorithmic coding interview 可以用任何语言。

通常你心里已经有答案了——选你最常用、最顺手的。面试里最常见的语言是 Python、Java、C++、JavaScript。我不建议为了面试临时学一门全新语言,因为要熟练掌握一般至少要几周,而且面试本身已经够 stressful 了。我的个人首选是 Python,因为它很简洁,标准库的数据结构和函数也很强。

更多内容见: Picking a programming language

学习与练习 coding interviews

最关键的一步是用你选的语言练 algorithm questions。Cracking the Coding Interview 很好,但我更喜欢通过实际做题来学习。

有很多平台:LeetCode、HackerRank、CodeForces。我的经验是,LeetCode 最适合面试准备,HackerRank 和 CodeForces 更偏竞赛。

不过 LeetCode 题很多,容易不知道从哪开始、怎么系统练。我在这里整理了推荐的准备 plan 和资源:

Coding interview study plan

比较完整的准备周期建议 3 个月(每周 11 小时,也就是每天 2-3 小时)。我分享了一个3 个月 study plan,列出你每周应该优先学习的 topics、资源和练习题。我也会补充 1 个月和 1 周的计划。

如果你不到 3 个月,可以用我做的 Grind 75 tool 自己生成 study plan,会根据剩余时间推荐题目,并平衡 breadth 和 depth。背后的 algorithm 会给题目排序优先级。

实践中可以用的资源

市面上资源很多,大多数只想赚你钱但没什么价值。如果只选核心资源,我会这么搭配:

  1. Grokking the Coding Interview: Patterns for Coding Questions
  2. AlgoMonster
  3. 我的(免费)coding interview best practices guide
  4. 我的(免费)coding interview techniques guide
  5. 我的(免费)algorithms study guide

AlgoMonster

AlgoMonster 除了帮你通过练习掌握常见 data structures 和 algorithms 题,还会整理常见 interview question patterns,让你能迁移到从没见过的题目上。它由 Google 工程师制作,质量比“刷 LeetCode”的非结构化方式更高。覆盖语言包括 Python、Java、C#、JavaScript、C++、Golang 等等。今天加入可享 70% discount →

Grokking the Coding Interview: Patterns for Coding Questions

Design Gurus 的课程在推荐练习题基础上,从 pattern 视角来学习,我也非常认同这种方法,并亲自用它提升了 coding interview 能力。课程提供 Java、Python、C++、JavaScript 的题目练习和 sample solutions,还有 step-by-step 的可视化。学 pattern,而不是背答案! Get lifetime access today →

我的(免费)coding interview best practices guide

如果你看过 top tech companies 的 coding interview evaluation rubric,可能会被要评估的维度吓到,也不知道如何稳定地展示 hire behaviors。

这份 coding interview best practices guide 会把这些标准转化成可执行的建议,告诉你面试前、面试中、面试后该做什么。

我建议你在练题时就配合这份 guide 使用,从一开始就养成好 habits 和 muscle memory。

我的(免费)coding interview techniques guide

有没有系统方法提高你找到好解法的概率?能不能更好地优化 time/space complexity?我的 coding interview techniques guide 会教你一套方法来处理“从没见过”的题,比如 problem visualization、hand-solve、拆分子问题等。

我的(免费)algorithms study cheatsheets

这些更像是 1 页的 “study cheatsheets”——列出最值得学的资源、最值得练的 LeetCode 题、以及要记住的关键点。在时间不够时尤其有效。这些笔记也是我拿到 top tech offer 的关键。

更多 coding interview 准备内容,可参考我的 full coding interview preparation guide

试试 mock coding interviews(和 Google/Facebook 工程师)

在面试官面前现场 coding 很容易紧张,尤其是没经历过的人。所以 hands-on 经验非常重要。

interviewing.io 是目前最好的 mock technical interview 资源之一。你可以匿名预约 Google/Facebook 的工程师做 mock coding interview,也可以约 Mobile、Front End、Engineering Management 等 specific roles。更棒的是,你还能看录屏,了解 phone interview 的真实感觉。

而且,如果你在 mock interviews 表现好,你可以解锁 “jobs page”,直接约 Uber、Lyft、Quora、Asana 等 top companies 的面试。我自己既当过 interviewer,也当过 interviewee,体验非常好。

准备 system design interview

如果你是 mid 或 senior 级别,通常会有 system design questions。LeetCode 对这部分覆盖不足,而高质量资源也相对少。

System design interview 的目标是评估候选人设计真实软件系统(含多个组件)的能力。

利用最好的 system design interview 资源

一些我认为最好的系统设计准备资源:

  1. ByteByteGo - Alex Xu(System Design Interview 系列书作者)新出的 System Design course。先讲基础,再 deep dive 10+ 常见产品的系统设计(例如 Designing YouTube、Facebook Newsfeed 等),以及 big data/storage 系统(例如 Designing a Chat System)。讲解清晰,配有高质量 diagrams,适合各个 seniority。
  2. "Grokking the System Design Interview" by Design Gurus - 最知名的 system design interview 课程之一。它纯文字,非常适合喜欢阅读的人(比如我)。包含热门 system design problems 和基础概念的 glossary。我自己完成过,也强烈推荐。
  3. "System Design Interview Course" by Exponent - 课程覆盖系统设计基础,并有大量热门题目及 mock interview 视频。有些问题还提供 text answers、database schema 和 APIs(这点很实用)。订阅价格略贵,但他们也有不错的 Data StructuresAlgorithmsBehavioral Interviews 内容,一站式很方便。
  4. "Grokking the Advanced System Design Interview" by Design Gurus - 我没上过,但和上面同一团队出品,质量应该不错。我觉得除非你非常 senior 或面 specialist role,否则可能不需要。

更多 Systems Design 准备指南与资源看这里。

准备 behavioral interview

每个 top tech company 都至少有一轮 behavioral interview。通常会包含:

  • 讲述 resume 上的经历细节
  • 提供过去情境的具体例子,展示某些 behavioral attributes(比如 conflict management、data-driven)
  • 分享你的 ambitions 和 career plans

看起来这些面试有点 “fluffy”,但其实是有方法的:

1. 了解 STAR format

STAR format 可以帮助你组织 behavioral 问题的回答,特别适合讲述过往经历。

  • Situation: 交代背景与情境
  • Task: 说明你要达成的目标或要解决的问题;重点包括
    • Scope
    • Severity
    • 需要达成的具体 benchmarks / outcomes
  • Action: 讲你做了什么、有哪些选项、为什么这么决策
  • Results: 讲结果以及你学到了什么

Read more: The STAR format for answering behavioral questions

2. 练习最常见的 behavioral questions

参考 top 30 most common behavioral questions for Software Engineers。

更多 behavioral interview 准备技巧,可看我的 full behavioral interview preparation guide

谈 software engineer 的 offer package

最后,在面试前你一定要准备的一件事是 salary negotiation。面试过程的任何阶段,都可能会聊到薪资。我们也有更深入的 negotiation strategiessoftware engineer compensation 指南。

以上就是全部内容。想看每一步更详细的细节,建议通过 sidebar 逐个深入阅读,或直接跳转到下一页。