Snowflake 的面试很看重 工程实现的完整性和系统设计的 trade-off,尤其是 Infra 方向。整体流程是 两轮 phone screen(纯 coding)+ 四轮 Virtual Onsite(两轮 coding + 一轮 BQ + 一轮 system design)。题目难度中等偏上,但面试官看得非常细,边界处理和数据结构选型的理由是评分重点。下面完整复盘。
一、Snowflake 面试概览
| 阶段 | 轮次 | 内容 |
|---|---|---|
| Phone screen | 2 轮 × 1h | 纯 coding:LRU Cache / Range Module |
| Onsite | 4 轮 | 2 轮 coding + 1 轮 BQ + 1 轮 system design |
| 难度 | 中等偏上 | 边界处理 + 数据结构选型理由是重点 |
| 风格 | Infra 导向 | system design 要落到具体实现 |
Phone Screen 两题速记
- 第一轮:LRU Cache——自己实现
get/put,O(1)。双向链表维护访问顺序 + 哈希表快速查找。面试官很熟这题,盯 node 更新逻辑和 delete 指针操作。 - 第二轮:Range Module——线段树简化版,实现
addRange/queryRange/removeRange。用 TreeMap 做区间合并,讨论了插入重叠、删除拆分等 corner case,还追问 TreeMap 的复杂度。
二、Onsite 题 1:滑动窗口众数
给定一个整数数组和窗口大小 k,返回每个窗口中出现次数最多的元素。要求高效查询,不能每次重新扫窗口。
思路转化:HashMap 记频次 + 懒删除的最大堆。窗口滑动时更新频次并把新频次推入堆,堆顶若与当前真实频次不符则懒删除。
import heapq
from collections import defaultdict
def window_mode(nums, k):
freq = defaultdict(int)
heap = [] # (-count, value)
res = []
for i, x in enumerate(nums):
freq[x] += 1
heapq.heappush(heap, (-freq[x], x))
if i >= k - 1:
# 懒删除:堆顶频次过期就丢弃
while -heap[0][0] != freq[heap[0][1]]:
heapq.heappop(heap)
res.append(heap[0][1])
# 移出窗口最左元素
left = nums[i - k + 1]
freq[left] -= 1
return res
讨论重点:面试官反复问 如何高效处理已被移除的元素——懒删除的核心是「堆里存的频次快照过期就跳过」。时间复杂度:O(n log n);空间复杂度:O(n)。
三、Onsite 题 2:带频次的区间合并(line sweep)
区间可能重叠多次,需要按出现频次输出合并后的区间及其频次。
思路转化:line sweep。把每个区间拆成起点 (+1) 和终点 (-1) 事件,按时间排序后扫描,维护当前活跃区间数(频次),频次变化处即为分段边界。
def merge_with_freq(intervals):
events = []
for s, e in intervals:
events.append((s, 1)) # 进入:频次 +1
events.append((e, -1)) # 离开:频次 -1
events.sort()
res = []
active = 0
prev = None
for pos, delta in events:
if prev is not None and pos > prev and active > 0:
res.append((prev, pos, active)) # [prev, pos) 频次 active
active += delta
prev = pos
return res
讨论重点:边界处理——起点和终点是否同一时间点、区间是否 inclusive。把端点排序时让 -1 与 +1 的顺序定义清楚是关键。时间复杂度:O(n log n);空间复杂度:O(n)。
四、Onsite 系统设计:Log Ingestion Service
设计一个日志摄取服务(简化版),支持 high throughput ingest、durable storage,并支持查询最近 N 条日志。
架构思路(要落到具体实现,不能只讲高层):
| 层 | 选型 | 作用 |
|---|---|---|
| 接入 | Load Balancer | 分摊写入压力 |
| 缓冲 | Kafka / 自建 ring buffer | 削峰、解耦 ingest 与存储 |
| 存储 | S3(落盘)+ RocksDB(索引) | 持久化 + 快速查询 |
| 查询 | time-based index | 加速「最近 N 条」 |
面试官追问的 trade-off:log 去重、乱序处理、consistency。整段对话偏 infra,考察对系统瓶颈的理解——比如写入热点、index 大小、查询延迟之间的取舍。
五、BQ 轮速记
面试官问了不少项目处理类问题:
- "Have you ever disagreed with a teammate, and how did you resolve it?"
- "Tell me about a time you made a technical tradeoff."
我讲了一个异步数据处理系统里如何权衡 批处理延迟 vs 资源使用率 的故事。面试官很在意你能否在模糊场景下做判断。
六、备考建议
- LRU / Range Module / 滑动窗口 / line sweep 这几类要练到能讲清每个数据结构选型的理由。
- 懒删除堆、TreeMap 区间操作是 Snowflake 高频,corner case 一定要主动覆盖。
- System design 准备「Infra 落地」版本:buffer / 存储 / 索引 / 一致性都要能展开到实现。
FAQ
Q1:Snowflake 面试一共几轮?
两轮 phone screen(纯 coding)+ 四轮 onsite(两轮 coding + 一轮 BQ + 一轮 system design)。整体偏 Infra 方向,看重工程实现完整性。
Q2:Snowflake 的 coding 难吗?
中等偏上。题目本身(LRU、Range Module、滑动窗口、line sweep)不算最难,但面试官看得极细,懒删除、TreeMap 复杂度、区间拆分等 corner case 会反复追问。
Q3:Snowflake 的 system design 怎么准备?
一定要落到具体实现,而不是只讲高层结构。以 log ingestion 为例,要能展开 buffer(Kafka / ring buffer)、存储(S3 + RocksDB)、索引(time-based)以及去重 / 乱序 / 一致性的 trade-off。
Q4:怎么高效准备 Snowflake VO?
把高频数据结构题练到能讲清选型理由,system design 准备 infra 落地版本。如果想要这几道真题的限时陪练、line sweep / 懒删除堆专项,或需要 VO 辅助 / VO 代面 的实时对接,可以发岗位 JD 先做题型预测再排练习计划。
正在准备 Snowflake Onsite?
Snowflake 考的是工程实现完整性 + Infra 系统设计 + 沟通 trade-off。oavoservice 提供 Snowflake / 数据基础设施方向的 VO 全流程陪练:滑动窗口 / line sweep 限时模拟、log ingestion 系统设计推演、BQ trade-off 故事打磨,也支持 VO 辅助 / VO 代面 的实时对接。教练含前大厂 Infra 工程师,熟悉 Snowflake「抠实现细节」的评分风格。
立即添加微信 Coding0201,获取 Snowflake VO 真题与陪练。
联系方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy