← 返回博客列表 Notion SDE 面试流程深度复盘:从 Recruiter 到 Onsite 五轮全拆解
Notion

Notion SDE 面试流程深度复盘:从 Recruiter 到 Onsite 五轮全拆解

2026-06-02

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 更愿意深聊产品本身。你必须能回答:

  1. "What's your favorite Notion feature and why?"
  2. "How do you currently use Notion (or similar tools)?"
  3. "What kind of team / product do you want to work on at Notion?"
  4. "Tell me about your most ambitious side project."

回答策略

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):

  1. Quality:用 TypeScript 严格类型,至少 80% 测试覆盖
  2. Scope:MVP 先实现 block 切换 + 文本编辑,drag-and-drop 放最后
  3. Tradeoff:写一份 README,列出你做了什么、放弃了什么、为什么
  4. 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 的实时协作编辑系统

要求:

回答骨架5 层 + CRDT):

  1. Client:本地 CRDT 副本,用户操作即时本地应用
  2. Sync Layer:WebSocket 长连接,每个 doc 一个房间
  3. Server:保存最新 CRDT state,处理 merge 与 broadcast
  4. Storage
    • 当前 state:Postgres / Cassandra
    • 操作日志:S3 + 时序压缩
    • 快照:每 1000 ops 一次 snapshot,加速回放
  5. History:CRDT 自带 causal history,不需要额外 versioning

关键 tradeoff

Onsite Round 3:Take-home Walkthrough

你必须准备好回答

  1. "Walk me through your code structure - why this folder layout?"
  2. "What did you choose not to implement, and why?"
  3. "If we 10x'd your code's user base, where would it break first?"
  4. "How would you write tests for the drag-and-drop feature?"
  5. "What would you do differently if you had another 4 hours?"

关键心态Notion 在测你的 self-awareness。承认局限比掩盖局限更得分。

Onsite Round 4:Hiring Manager

必问的 5 个问题

  1. "Why are you leaving your current job?"
  2. "What kind of manager / mentor do you thrive under?"
  3. "Describe a time you owned a project end-to-end."
  4. "How do you handle disagreement with a peer?"
  5. "What's your 5-year career trajectory?"

回答策略:诚实 + 具体。Notion 文化反对"政治化回答"。

Founders Round:Culture Match

Notion 的核心文化

Founders 必问

  1. "What does great craft look like to you?"
  2. "Tell me about a time you said no to a feature request."
  3. "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