Notion 是近年最受候选人青睐的中型科技公司之一——产品文化强、工程团队精简、面试流程也"很 Notion 风格":给你一个 take-home 项目,让你像在工作中一样写完整的功能,再加上 onsite 的协作编辑系统设计题,整体下来更像是"试岗"而非"考试"。
但正因为流程独特,社区里关于 Notion SDE 面试的描述常常零碎,候选人要么准备不足、要么过度准备 LeetCode。这篇文章是站内首篇 Notion 面经长文,把 Recruiter → Take-home → Tech Phone → Onsite 4 轮 + Founders Round 的完整流程逐一拆解,给每一轮的真题与回答骨架。
Notion SDE 招聘流程总览
| 阶段 | 时长 | 平台 | 决策权 |
|---|---|---|---|
| Recruiter Screen | 30 min | Zoom | 入门 |
| Take-home Project | 4-8 hours | GitHub | 关键过滤 |
| Tech Phone | 60 min | CoderPad | 关键过滤 |
| Onsite Round 1 | 60 min | Coding | 决定 |
| Onsite Round 2 | 60 min | System Design | 决定 |
| Onsite Round 3 | 60 min | Take-home Walkthrough | 决定 |
| Onsite Round 4 | 45 min | Hiring Manager | 决定 |
| Founders Round | 30 min | Behavioral / Culture | 一票否决 |
整体特点:take-home 占 30% 决策权,这是 Notion 与 FAANG 最大的区别。
Recruiter Screen:Why Notion 与产品深度
Notion 的 recruiter 比 FAANG 更愿意深聊产品本身。你必须能回答:
- "What's your favorite Notion feature and why?"
- "How do you currently use Notion (or similar tools)?"
- "What kind of team / product do you want to work on at Notion?"
- "Tell me about your most ambitious side project."
回答策略:
- 至少深用过 Notion 1 个月,能讲出具体场景(如用 Notion 管理 OKR / 知识库 / dev wiki)
- 团队偏好要具体到 product surface(Editor / Collaboration / API / Mobile)
- Side project 体现工程品味,不要堆 toy projects
Take-home Project:4-8 小时实操
真题:实现一个简化版 Block Editor
用 React + TypeScript 实现一个支持以下功能的 block editor:
- 多种 block 类型(text / heading / list / quote)
- 通过
/唤起 block 切换菜单- 支持 drag-and-drop 排序
- 支持基本快捷键(Cmd+B / Cmd+I)
提交:GitHub 仓库链接 + 部署 demo(Vercel)。
回答策略(Q-S-T-D:Quality / Scope / Tradeoff / Demo):
- Quality:用 TypeScript 严格类型,至少 80% 测试覆盖
- Scope:MVP 先实现 block 切换 + 文本编辑,drag-and-drop 放最后
- Tradeoff:写一份 README,列出你做了什么、放弃了什么、为什么
- Demo:必须能跑,部署一个 Vercel 链接,面试官会真的去用
关键心态:Notion 不期待你完美完成所有功能,期待你做出 production-grade 取舍。
Tech Phone:CoderPad 算法 + 工程感
真题:实现一个简化版 OT (Operational Transform)
给两个用户在同一段文本上的并发编辑操作 op1 =
{type: "insert", pos: 5, text: "world"}和 op2 ={type: "insert", pos: 3, text: "hello "}。请实现transform(op1, op2)函数,返回 op1 在 op2 已应用后的等效 op。
def transform(op1, op2):
"""Transform op1 to be applied after op2."""
if op1["type"] == "insert" and op2["type"] == "insert":
if op2["pos"] <= op1["pos"]:
# op2 在 op1 之前插入,op1 的 pos 要后移
return {**op1, "pos": op1["pos"] + len(op2["text"])}
return op1
if op1["type"] == "insert" and op2["type"] == "delete":
if op2["pos"] < op1["pos"]:
return {**op1, "pos": max(op2["pos"], op1["pos"] - op2["len"])}
return op1
# ... 更多 case
return op1
关键考察点:你能否设计 OT 的对称性(transform(a, b) 与 transform(b, a) 必须满足收敛性)。
Follow-up:Notion 实际用 CRDT 而非 OT——为什么?答案:CRDT 更适合 P2P 同步与 offline-first。
Onsite Round 1:Coding(典型题)
真题:Markdown Parser to AST
实现一个 markdown 解析器,把字符串转成 AST。支持:标题(
#-######)、列表(-/1.)、粗体(**x**)、斜体(*x*)。
import re
def parse_markdown(text):
blocks = []
for line in text.split("\n"):
line = line.rstrip()
if not line:
continue
# 标题
m = re.match(r"^(#{1,6})\s+(.+)$", line)
if m:
blocks.append({"type": "heading", "level": len(m.group(1)), "children": parse_inline(m.group(2))})
continue
# 无序列表
m = re.match(r"^-\s+(.+)$", line)
if m:
blocks.append({"type": "bullet", "children": parse_inline(m.group(1))})
continue
# 默认段落
blocks.append({"type": "paragraph", "children": parse_inline(line)})
return blocks
def parse_inline(text):
nodes = []
i = 0
while i < len(text):
if text[i:i+2] == "**":
j = text.find("**", i+2)
if j != -1:
nodes.append({"type": "bold", "text": text[i+2:j]})
i = j + 2
continue
if text[i] == "*":
j = text.find("*", i+1)
if j != -1:
nodes.append({"type": "italic", "text": text[i+1:j]})
i = j + 1
continue
# 默认普通文本
nodes.append({"type": "text", "text": text[i]})
i += 1
return nodes
Follow-up:处理嵌套(bold 内有 italic)、转义(\* 不算斜体起点)、性能优化(O(N) parser)。
Onsite Round 2:System Design 协作编辑
真题:设计 Notion 的实时协作编辑系统
要求:
- 1000 人在同一文档上协作不卡顿
- 支持 offline 编辑后自动 merge
- 历史版本可以追溯到任意时刻
回答骨架(5 层 + CRDT):
- Client:本地 CRDT 副本,用户操作即时本地应用
- Sync Layer:WebSocket 长连接,每个 doc 一个房间
- Server:保存最新 CRDT state,处理 merge 与 broadcast
- Storage:
- 当前 state:Postgres / Cassandra
- 操作日志:S3 + 时序压缩
- 快照:每 1000 ops 一次 snapshot,加速回放
- History:CRDT 自带 causal history,不需要额外 versioning
关键 tradeoff:
- CRDT vs OT:Notion 选 CRDT,因为 offline-first
- Postgres vs Cassandra:写多读多场景倾向 Cassandra
- 快照策略:snapshot interval 与回放性能 tradeoff
Onsite Round 3:Take-home Walkthrough
你必须准备好回答
- "Walk me through your code structure - why this folder layout?"
- "What did you choose not to implement, and why?"
- "If we 10x'd your code's user base, where would it break first?"
- "How would you write tests for the drag-and-drop feature?"
- "What would you do differently if you had another 4 hours?"
关键心态:Notion 在测你的 self-awareness。承认局限比掩盖局限更得分。
Onsite Round 4:Hiring Manager
必问的 5 个问题
- "Why are you leaving your current job?"
- "What kind of manager / mentor do you thrive under?"
- "Describe a time you owned a project end-to-end."
- "How do you handle disagreement with a peer?"
- "What's your 5-year career trajectory?"
回答策略:诚实 + 具体。Notion 文化反对"政治化回答"。
Founders Round:Culture Match
Notion 的核心文化
- Craft:把每个产品细节做到极致
- Minimalism:少即是多
- Honesty:直接表达,不绕弯
- Velocity:快速迭代,但不牺牲品质
Founders 必问:
- "What does great craft look like to you?"
- "Tell me about a time you said no to a feature request."
- "If you could only ship one thing in your first quarter, what would it be?"
关键:Founders Round 是一票否决的。技术再强,culture mismatch 也会被挂。
FAQ
Q1:Take-home 项目可以用 ChatGPT / Cursor 吗? Notion 明确允许使用 AI 工具——他们更看你能否做出 production-grade 取舍。但 onsite walkthrough 必须能解释每一行代码。
Q2:算法题难度和 FAANG 比? 整体偏中等,Hard 题极少。但工程感 占比比 FAANG 高得多——代码是否好读、是否能扩展。
Q3:System Design 必须用 CRDT 吗? 不强制,但选 OT 后必须解释为什么 OT 也能 work。CRDT 是 Notion 实际用的,分会更稳。
Q4:从面试到 offer 多久? 平均 4-6 周。最快 2 周(HM 急招)、最慢 8 周(Founder schedule 难配)。
Q5:薪资范围? Notion SDE 总包 280-380k(base 180-220k + equity)。Senior SDE 总包 400-550k。
正在准备 Notion SDE 面试?
如果你想做 take-home 项目代码 review、CRDT 系统设计演练,或希望 Onsite 那天有真人 VO代面 / VO辅助 全程陪跑、Founders Round culture 答案打磨,可以聊聊看完整的 OA代面 / VO辅助 / VO代面 方案。
联系方式
需要面试真题与定制备战计划?立刻联系微信 Coding0201,获取真题。
Email: [email protected] Telegram: @OAVOProxy