在北美 Tech 圈里,Bloomberg 一直算是个“异类”。不走 FAANG 的刷题内卷路线,但 New Grad 的 TC 常年在 $170k–$200k,WLB 也相对稳定。很多人面 Bloomberg 翻车,并不是题不会,而是没踩对评估点。OOD 权重极高,类的拆分、命名和职责边界都会被细看;Think Aloud 是硬性要求,只写不讲基本直接扣分。题目也常带变种,面试官会追问并发、异常处理和数据一致性。我们上周协助的一位 USC CS Master 学员就被这套体系卡过一次,后来针对 Bloomberg 风格系统调整,第二次 Phone Screen 顺利通过。下面整理要点,供准备 Bloomberg 2026 NG 的同学参考。

真题重现:Design Underground System(表面 Medium,实际 OOD)
题目描述(高度还原):
设计一个地铁系统,支持:
- 乘客进站
checkIn(id, station, time) - 乘客出站
checkOut(id, station, time) - 查询任意起终点的平均通行时间
getAverageTime(start, end)
Bloomberg 面试中的隐性要求:
- 需要清晰区分「实时状态」与「历史统计」
- 需要能口头讨论并发与异常场景(即使代码不写)
- 需要工业级命名与结构,而不是刷题式写法
常见翻车点包括:
- 用一个 Map 硬塞所有数据,逻辑迅速失控
- 忘记处理重复 check-in / 非法 check-out
- 解释不清楚为什么是 O(1)
架构核心:双 HashMap 解耦(Bloomberg 最爱)
这道题的关键不在算法,而在 数据建模。
设计原则
- Single Responsibility:
- 一个结构只负责「当前行程」
- 一个结构只负责「历史统计」
- Write-Optimized:Bloomberg 更关心写入效率与稳定性
数据结构拆解
check_in_map:- Key:userId
- Value:
(startStation, startTime) - 职责:只表示“正在发生的行程”
route_stats:- Key:
(startStation, endStation) - Value:
[totalTime, tripCount] - 职责:只做统计,不存个体信息
- Key:
在真实面试中,能说出一句: “I intentionally decouple in-flight trips from historical aggregates to keep responsibilities clean.” Impression 直接拉满。
高质量实现(Python,面试可直接过 Review)
class UndergroundSystem:
def __init__(self):
# id -> (start_station, start_time)
self.check_in_map = {}
# (start_station, end_station) -> [total_time, trip_count]
self.route_stats = {}
def checkIn(self, id: int, stationName: str, t: int) -> None:
# In production, we might validate duplicate check-ins
self.check_in_map[id] = (stationName, t)
def checkOut(self, id: int, stationName: str, t: int) -> None:
if id not in self.check_in_map:
# Defensive coding: invalid checkout
return
start_station, start_time = self.check_in_map.pop(id)
route_key = (start_station, stationName)
duration = t - start_time
if route_key not in self.route_stats:
self.route_stats[route_key] = [0, 0]
self.route_stats[route_key][0] += duration
self.route_stats[route_key][1] += 1
def getAverageTime(self, startStation: str, endStation: str) -> float:
route_key = (startStation, endStation)
if route_key not in self.route_stats:
return 0.0
total_time, count = self.route_stats[route_key]
return total_time / count
为什么这版代码“像 Bloomberg 工程师写的”?
- 命名即文档:无需额外解释变量含义
- O(1) 全覆盖:所有接口都是 Hash 查找
- 状态可预测:不会出现幽灵数据
面试官 Follow-up 高频追问(90% 的加分点)
如果你代码写完就停,大概率只是 Neutral。
Q1:如果是多线程环境怎么办?
答题方向:
- Python 可提
Lock/ Java 可提ConcurrentHashMap - 或说明:写操作需要原子性,读可以 eventual consistency
Q2:为什么不用数据库?
标准话术:
- 面试场景强调 in-memory latency
- 数据规模与访问模式适合 HashMap
- 持久化是系统层面的扩展,而不是这道题的核心
Q3:如果 station 数量非常大?
加分点:
- 站点对是稀疏的
- 只记录真实发生的路线
ProgramHelp 的价值:不是“帮你写”,而是“帮你过”
很多人会说:
“这题我早就刷过了。”
但 Bloomberg 面试真正淘汰的是:
- 不会讲设计的人
- 紧张状态下表达崩盘的人
我们在实战中做的不是代写,而是:
- 实时提醒 OOD 结构是否偏离
- 即时修正英文表达与专业术语
- 在 Follow-up 环节给出可直接复述的话术
你在面试官眼里呈现的,是一个:
思路清晰、表达成熟、像“提前一年转正”的工程师
最后一句真心话
当一个 $180k+ 的 Offer 摆在你面前时, 真正昂贵的从来不是辅导费用, 而是 因为一个表达失误而错过的机会成本。
如果你不想在 Bloomberg、Meta、Apple 这种 OOD 重度公司“裸考”, ProgramHelp 的专家团队,已经替你把所有坑踩完。
你只需要,在关键时刻,做对选择。