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