PureStorage 把自己定義為「現代化資料體驗公司」——這意味著它的工程團隊對介面抽象、回呼機制、長生命週期資源管理這類基礎設施常識極其敏感。和 FAANG 不同,PureStorage 的面試不偏 LeetCode hard,反而高頻出現**「實作一個小型框架」**類型題(callback、event bus、cache invalidator),考的是你能不能把物件導向的邊界設計穩。
本文基於一位通過 PureStorage 面試的候選人複盤,拆解 OA 兩道高頻題 + VO 第二輪的 Callback / Event 實作題,給出 Python 與 Java 完整程式碼、邊界踩坑,以及面試溝通話術。
PureStorage 面試整體節奏
| 輪次 | 形式 | 時長 | 內容 |
|---|---|---|---|
| 0. OA | HackerRank / Codility | 60 - 90 min | 2 道字串 / 模擬題 |
| 1. Tech Phone Screen | Buddy + O1set 共享文件 | 60 min | 演算法實作 + follow up |
| 2. VO Round 1 | 視訊會議 | 60 min | 小型框架實作(如 Callback / Event) |
| 3. VO Round 2 | 視訊會議 | 60 min | 系統設計 + 資源生命週期問題 |
| 4. Hiring Manager | 視訊 / 現場 | 45 min | 專案深挖 + 團隊 chemistry |
整體特點:PureStorage 的面試官很看重**「邊界控制 + 重複觸發安全」**——這一點和它做儲存 / 快取基礎設施的屬性強相關。
OA 題 1:Bakery Quality Control(烘焙坊質檢)
題目
烘焙坊會依「模板」裝盒:每個盒子和對應模板都用字串表示,例如:
"cm"= cookie + muffin"pmc"= pie + muffin + cookie
判錯規則:
- 順序無關(
"cm"匹配"mc") - 重複有關(
"cc"≠"c") - 數量必須完全一致
給定一批 (box, template) 對,傳回不符合數量的盒子數。
input = [("cm","mc"), ("ccm","mc"), ("pm","mc"), ("c","mc")]
output = 3
Python 解法
from collections import Counter
def count_bad_boxes(pairs):
bad = 0
for box, template in pairs:
if Counter(box) != Counter(template):
bad += 1
return bad
時間複雜度:O(N × L),L 是字串平均長度 空間複雜度:O(L)
必處理的 3 個邊界
- 空字串 box:如果模板也是空,應當算正確(不計入 bad)
- 多字符上限:題面給出 box 內最多 10 個 item、最多 1000 個盒子——不需要做最佳化,樸素 Counter 就夠
- 模板裡出現重複字符(如
"mmc"):必須依數量匹配,不要去重
OA 題 2:子字串最大連續出現次數
題目
給一個短串 short_s 和一個長串 long_s(最長 1,000,000),求 short_s 在 long_s 中連續出現的最大次數。
short_s = "AB", long_s = "ABCABCABAB"
output = 2 # 末尾 "ABAB" 連續 2 次
Python 解法
def max_consecutive_occurrence(short_s, long_s):
if not short_s:
return 0
n = len(short_s)
max_run = 0
i = 0
while i + n <= len(long_s):
if long_s[i:i + n] == short_s:
run = 0
while i + n <= len(long_s) and long_s[i:i + n] == short_s:
run += 1
i += n # 跳到下一段,強調「連續」
max_run = max(max_run, run)
else:
i += 1
return max_run
時間複雜度:O(N × M),N 為長串長度,M 為短串長度 空間複雜度:O(1)
易錯點
| # | 易錯點 | 正解 |
|---|---|---|
| 1 | 誤以為求總出現次數 | 題目要求是最長連續段,不是總次數 |
| 2 | 滑動 1 個字符而不是 M 個 | 命中後必須 i += M,不然 "ABAB" 會被算成 3 次 |
| 3 | 短串為空 | 直接 return 0,避免死迴圈 |
| 4 | 長串可以達到 10^6 | 樸素切片就夠;不需要 KMP(90 分鐘內來不及寫) |
VO Round 2:實作 Callback / Event 機制
這道題是 PureStorage VO 的招牌題——表面是 OOP 設計,實際上考「重複觸發安全 + 註冊時機控制」。
題面
實作兩個類別:
Callback:只有一個execute()方法Event:register_cb(cb):註冊一個 callbackfire():觸發事件,依序執行所有已註冊的 callback- 觸發後再註冊的 callback 不再生效
- 重複
fire()不應重複執行 callback
Python 解法
class Callback:
def execute(self):
raise NotImplementedError
class Event:
def __init__(self):
self._callbacks = []
self._fired = False
def register_cb(self, cb):
if self._fired:
# 觸發後註冊無效,但不報錯,保持冪等
return False
self._callbacks.append(cb)
return True
def fire(self):
if self._fired:
return
for cb in self._callbacks:
cb.execute()
self._fired = True
Java 解法(面試官更喜歡看的版本)
interface Callback {
void execute();
}
class Event {
private final List<Callback> callbacks = new ArrayList<>();
private boolean fired = false;
public boolean registerCb(Callback cb) {
if (fired) return false;
callbacks.add(cb);
return true;
}
public void fire() {
if (fired) return;
for (Callback cb : callbacks) {
cb.execute();
}
fired = true;
}
}
面試官常見 follow-up
| Follow-up | 建議回答 |
|---|---|
如果 fire() 被併發呼叫怎麼辦? |
用 synchronized 包住 fire() 和 registerCb(),或換 ReentrantLock |
| Callback 拋出例外怎麼辦? | 在迴圈裡 try/catch 單個 callback,避免一個失敗拖垮整批;同時記錄失敗清單給上層 |
| 如何支援「事件只能被訂閱一次」? | 在 registerCb 裡維護一個 Set<Callback>,重複註冊回傳 false |
| 怎麼支援 unregister? | 把 list 換成 LinkedHashMap<Id, Callback>,依 id 刪除,保持插入順序 |
溝通話術(PureStorage 閱卷重點)
面試官真正在聽的是**「你怎麼用一段話講清楚邊界控制」**。推薦這樣開口:
"I'll model this as an Event class that maintains a list of Callback objects plus a
firedflag. Two invariants matter: (1) once fired, no more registrations take effect, and (2)fire()is idempotent — repeated calls do nothing. I'll keep insertion order for the callback list so thatfire()invokes them in registration order."
這段話說完,程式碼還沒寫,面試官就已經在心裡給你打高分了——因為它涵蓋了 PureStorage 閱卷最在乎的兩個不變量。
FAQ
Q1:PureStorage 面試一共幾輪? A:通常是 1 輪 OA + 1 輪 Tech Phone Screen + 2 輪 VO + 1 輪 Hiring Manager,共 5 關。OA 在第一週內安排,整個流程通常 4-6 週走完。
Q2:PureStorage OA 難度如何? A:兩道題都不算 hard 級,題型偏字串 / 模擬(如烘焙坊質檢、子字串連續出現)。但邊界 case 極嚴——重複字符、空串、單元素都會被打分,所以「寫得對」比「寫得快」更重要。
Q3:PureStorage VO 為什麼愛考 Callback / Event 這種「框架題」? A:因為它做儲存 / 快取底層基礎設施,回呼機制 + 長生命週期資源 + 重複觸發安全是日常工作。面試官想看你能否在不熟悉的業務 context 裡設計出乾淨的 OOP 邊界。
Q4:必須用 Java 寫嗎?
A:不必。Python / C++ 都可以,但寫 Java 時面試官能直接套用他們日常的 mental model(介面、不可變欄位、synchronized)。如果你 Java 熟,強烈建議用 Java。
Q5:PureStorage 給的 hiring bar 高嗎? A:中等偏高。比 FAANG L4 略鬆、比 quant 緊。最大的扣分項是「邊界沒說清」或者「程式碼能跑但不能解釋為什麼」,純演算法不強但表達清楚反而能過。
Q6:和 NetApp / Dell Storage 比有什麼不同? A:PureStorage 更年輕、更偏分散式系統抽象設計;NetApp / Dell 更偏傳統硬體 + driver 層。面試題取向上,PureStorage 高頻「小型框架實作」,NetApp 高頻「C / pointer 細節」。
正在準備 PureStorage OA / VO?
PureStorage 的面試看似溫和,實則在**「邊界控制 + 溝通清晰度」**兩個維度篩得很狠。如果你需要 1v1 OA 輔助 / OA 代面 / VO 輔助 / VO 代面,我們依 PureStorage 實際題型陪你過一遍:從 OA 字串題到 VO 框架實作題,再到 Hiring Manager 跟進話術,全流程覆蓋。
我們的方法不是替你寫程式碼——而是在你思考的同時給出結構清晰的口播 + 邊界提醒,讓你能在面試官面前自然地展示思路。這一點對 PureStorage 這種「聽溝通」的公司尤其關鍵。
立即加微信 Coding0201,取得 PureStorage 完整題庫 + 1v1 備考方案。
聯繫方式
Email: [email protected] Telegram: @OAVOProxy 微信: Coding0201