今年早些时候我在 Notion 面了一个 senior 的 SWE role,走完了全流程。因为我面之前几乎找不到相关信息,所以把 system design 这部分写出来分享。
Notion 不像 Google 那样有 L3-L8 这种公开 level 名称,但从我了解来看,他们大概会把 senior 映射成大公司里「L5 equivalent」的水平。Recruiter 也确认我面的是 senior level,这意味着 system design 这一轮的权重会比 coding 更大。
形式。 60 分钟,和一位 senior 或 staff 的 eng 1:1。没有白板(全程远程),用共享文档。前 5-10 分钟是自我介绍和一些轻量的 scope 问题,了解你的背景。然后进入正式设计题。
问了什么。 我拿到的 prompt 大概是:设计一个协作文档编辑系统,支持多用户实时同步。对,就是基本等于「design Notion.(设计一个类似 Notion 的系统)」(设计 Notion)。我不知道是不是每次都问这个,或者我只是幸运或倒霉,取决于你怎么看。
整个对话停留在架构层面。他们很关注: 两个用户同时编辑同一块内容时怎么处理冲突(operational transforms vs. CRDTs 会聊到) 你对 block-based 文档结构的数据模型 你会怎么做同步层(WebSockets、轮询兜底、离线时怎么办) 扩展性:并发从几千到几百万时你的设计怎么扛
他们不会深挖实现细节。整体更像产品加系统的讨论,而不是纯分布式系统刷题。面试官明显在看你有没有想过 tradeoff,而不是你有没有背教科书。
我希望当时做得更好的点。 我在数据模型上花太久,没给扩展性讨论留够时间。我也没有足够早地主动提 offline-first 行为。看起来这是他们会在意的,毕竟和产品相关。
总体是一轮很扎实的面试。不算 FAANG-hard,但也绝对不水。OT/CRDT 这一问会把真正思考过的人和没思考过的人拉开差距。