估算题拆解:费米问题与系统容量规划

我面试过上百个候选人,问过这么一道题:

"你知道芝加哥有多少钢琴调音师吗?"

大多数人的反应是:第一秒愣住,第二秒说"这怎么算啊",第三秒开始瞎猜。

有个学员跟我说:"这题根本不可能算出来,除非你是统计局的人。"

我说:"错。这道题考的不是你的知识储备,而是你的思考框架。"

费米估算(Fermi Estimation)是我在面试中非常喜欢用的一类题,因为它能快速检验候选人的逻辑思维能力和框架感。今天把这类题的解法彻底讲透。

一、费米估算的核心思想 🔴

1.1 问题拆解

费米估算的经典问题:

芝加哥有多少钢琴调音师?

第一眼看上去确实不可能。但费米的厉害之处在于:把一个不知道的大问题,拆成若干个可以估计的小问题,然后乘起来。

1.2 ❌ 错误示范

候选人原话:"芝加哥大概有几百万人吧...钢琴调音师的话,可能有几千个?"

问题诊断

  • 没有拆解问题的意识,直接给答案
  • 缺乏量级感——几百万人和几千钢琴调音师,比例完全不对
  • 无法解释自己是怎么得出这个数字的

面试官内心 OS:"这种候选人,上来就给数字,完全没有推理过程。说明他平时就不习惯做系统性的思考。" :::

1.3 标准回答

核心方法:分步拆解

把"芝加哥有多少钢琴调音师"拆成三个问题:

1. 芝加哥有多少架钢琴?
2. 每架钢琴每年需要调几次音?
3. 每个调音师每年能调多少架钢琴?

第一步:芝加哥有多少架钢琴?

先估计总人口:

  • 芝加哥人口约 300万

有钢琴的家庭比例:

  • 大概 10%~20% 的家庭有钢琴
  • 平均每家有钢琴 1~1.5 架
  • 芝加哥大约 100万个家庭

钢琴数量:

100万家庭 × 15% 有钢琴 × 1.2架/家庭 ≈ 18万架钢琴

第二步:每架钢琴每年调几次?

  • 正常使用下,每年调 1~2 次比较合理
  • 取平均值 1.5 次/年

每年调音总需求:

18万架 × 1.5次 = 27万次调音需求

第三步:每个调音师每年能调多少架?

  • 每个调音师每天大概调 2~3 架
  • 一年工作 250 天左右

每个调音师年工作量:

3架/天 × 250天 = 750架/年

最终结果

27万次 ÷ 750架/人 ≈ 360人

所以芝加哥大约有 300~400 名钢琴调音师

💡

实际数据是芝加哥大约有约 200~300 名钢琴调音师(不同统计口径有差异)。这个估算已经相当接近了。费米估算的目标不是精确,而是量级正确

1.4 追问升级

追问1:你这个估算的误差可能在多少?

答:最坏情况下,假设每个因素都有2~3倍的误差:

  • 人口误差:300万可能是200万~400万
  • 钢琴比例:15%可能是10%~20%
  • 工作量:750架可能是500~1000架

综合误差可能在 10 倍左右,但量级(几百人)基本不会错。

追问2:如果我把"调音师"改成"出租车",该怎么估算?

答:同样用分步法:

  1. 芝加哥人口 300万
  2. 有驾照人口比例约 70%
  3. 打车频率:平均每周打车2~3次
  4. 每天总打车次数 = 300万 × 70% × 3次/周 ÷ 7天 ≈ 90万次/天
  5. 每辆出租车每天载客约 20~30 次
  6. 出租车数量 = 90万 ÷ 25 ≈ 3.6万辆

【面试官手记】 能把出租车估算也做出来的候选人,我基本都会给P6+。因为他不只是学会了公式,而是理解了这个框架可以迁移到任何类似问题上。 :::

二、纽约有多少加油站?🔴

2.1 问题拆解

纽约有多少加油站?

2.2 ❌ 错误示范

候选人原话:"纽约大概有几千个加油站吧?"

问题诊断

  • 没有分解问题的步骤
  • "几千"这个量级太模糊——1000是几千,9000也是几千

面试官内心 OS:"上来就给个数字,没有任何推理过程的候选人,说明他没有系统思考的习惯。" :::

2.3 标准回答

分步拆解

第一步:估算纽约总人口

  • 纽约市人口约 850万
  • 大纽约都市圈约 2000万

我们用纽约市 850万来算。

第二步:估算有车人口

  • 纽约公共交通发达,大概 50% 的家庭有车
  • 纽约市约 300万个家庭
  • 有车家庭约 150万个

第三步:估算每辆车每天加油次数

  • 一般家用车每周加油 1~2 次
  • 取 1.5 次/周
  • 每天加油比例 = 1.5 ÷ 7 ≈ 0.2 次/天

第四步:估算每个加油站每天服务多少车

  • 假设每个加油站每天营业 16 小时
  • 每小时服务约 10~15 辆车
  • 每天约 150~200 辆

第五步:计算总需求和总供给

每天总加油需求:

150万辆 × 0.2次/天 = 30万次/天

所需加油站数量:

30万次 ÷ 175辆/加油站 ≈ 1700个
💡

实际上纽约市大约有 2000~2500 个加油站,1700这个估算偏保守,可能是因为纽约公交出行比例确实高。量级(千级别)是对的。

2.4 追问升级

追问1:如果考虑电动车的冲击,20年后这个数字会怎么变?

答:这个问题考的是候选人对趋势的判断。如果电动车渗透率达到 50%,加油站需求可能下降 30%~40%。但同时,充电站会补上。

追问2:那电动车的充电桩怎么估算?

答:充电桩的逻辑不同。家庭慢充桩按有电动车家庭计算,公共快充桩按里程需求和充电频率估算。

【面试官手记】 被追问到趋势分析的候选人,10个里有8个会愣住。能结合新能源趋势分析的,基本上都有P7的视野。 :::

三、Google面试题:球拍和球 🟡

3.1 问题拆解

这道题曾经是Google的经典面试题:

一个球拍和一个球总共花了1.10美元。球拍比球贵1美元。问:球花了多少钱?

3.2 ❌ 错误示范

候选人原话:"球是0.10美元。"

问题诊断

  • 用直觉给答案,没有验证
  • 0.10 + 1.00 = 1.10,看起来对了
  • 但验证一下:球拍 = 0.10 + 1.00 = 1.10,总花费 = 0.10 + 1.10 = 1.20 ≠ 1.10
  • 所以答案是错的

面试官内心 OS:"这道题 90% 的人会第一反应 0.10 美元。但如果你验证一下,就会发现不对。能验证的候选人,说明有检查的习惯。" :::

3.3 标准回答

设球花了 x 美元,则球拍花了 x + 1 美元:

x + (x + 1) = 1.10
2x + 1 = 1.10
2x = 0.10
x = 0.05

球花了 0.05 美元,球拍花了 1.05 美元

验证:0.05 + 1.05 = 1.10 ✓,1.05 - 0.05 = 1.00 ✓

⚠️

这道题看似简单,但很多候选人会在"直觉陷阱"里绕不出来。面试官要看的不是你的计算能力,而是你是否会验证自己的答案

3.4 追问升级

追问1:如果把"球拍比球贵1美元"改成"贵2美元",球和球拍各多少钱?

答:

x + (x + 2) = 1.10
2x = -0.90
x = -0.45

无解。这说明在给定的约束下,"贵2美元"在1.10美元的框架下是不成立的。

【面试官手记】 能主动验证答案的候选人,说明他有工程思维——代码上线前要测试,答案给出前要验证。这种习惯在工作中非常宝贵。 :::

四、系统容量估算 🟡

4.1 问题拆解

面试中还会有一类更贴近工程的估算题:

如果要设计一个支持100万日活用户的系统,需要多少台服务器?

4.2 标准回答

分步拆解

第一步:估算用户行为

  • 假设每个用户每天使用 3 次
  • 100万日活 → 300万次请求/天

第二步:估算高峰流量

  • 假设高峰是平均的 3 倍
  • 高峰 QPS = 300万 ÷ 86400 × 3 ≈ 100 QPS

第三步:估算服务器能力

  • 单台 Java 服务器(4核8G)大概能处理 500~1000 QPS
  • 考虑到冗余,用 500 QPS 保守估计

第四步:计算服务器数量

100 QPS ÷ 500 QPS/台 ≈ 1台(保守用2台)

实际生产考虑

  • 至少 2 台(主备)
  • 加上缓存、数据库、负载均衡,需要 5~10 台

4.3 追问升级

追问1:如果要支持100万并发在线用户呢?

答:并发用户和日活不同。假设5%的用户同时在线,就是5万并发。每秒请求数约 5万 × 平均请求率。

追问2:100万日活需要多少数据库连接?

答:连接池大小和并发有关。如果5万并发,连接池 50~100 个差不多了。

【面试官手记】 能做出系统容量估算的候选人,基本上都有实际做过项目的经验。他知道服务器能扛多少QPS,知道连接池要设多大。这种经验只能从实战里来。 :::

五、估算题万能公式

题型拆解步骤关键假设
人口类总人口 → 有需求比例 → 需求频次 → 供给能力比例和频次要符合常识
系统类日活 → 人均请求 → 高峰QPS → 服务器能力性能数据要有依据
价格类设未知数 → 列方程 → 验证必须回代验证
💡

估算题的精髓是:把不知道的大问题,拆成若干个知道的小问题。每个小问题的误差乘起来可能会很大,但量级不会错。

六、生产避坑

有人问:估算能力和写代码有什么关系?

场景1:容量规划 上线前要估算系统能扛多少QPS、需要多少内存、磁盘要多大。这些本质上都是费米估算。

场景2:性能优化 优化前要知道瓶颈在哪里。如果每秒能处理1000个请求,现在只能处理200个,那优化目标就是5倍。

场景3:成本估算 给老板汇报需要多少机器,要先估算业务增长、每台机器的成本、运维成本。

【面试官手记】 我在复盘学员面试时发现,能把容量规划讲清楚的,基本上都拿到P6+了。因为能做好容量规划的人,说明他不只是写代码,而是有全局视野。 :::

七、工程选型

遇到估算类面试题,记住"三步走":

第一步:拆解 把大问题拆成若干小问题,每个小问题要能估计。

第二步:估算 给出合理的数值,解释你的假设。

第三步:验证 检查答案是否自洽,如果明显违背常识要修正。

级别期望回答判分标准
P5能正确拆分问题,给出量级估算拆解框架清晰
P6能考虑误差范围,解释假设依据有验证意识
P7能结合系统设计做容量规划有工程视角