估算题拆解:费米问题与系统容量规划
我面试过上百个候选人,问过这么一道题:
"你知道芝加哥有多少钢琴调音师吗?"
大多数人的反应是:第一秒愣住,第二秒说"这怎么算啊",第三秒开始瞎猜。
有个学员跟我说:"这题根本不可能算出来,除非你是统计局的人。"
我说:"错。这道题考的不是你的知识储备,而是你的思考框架。"
费米估算(Fermi Estimation)是我在面试中非常喜欢用的一类题,因为它能快速检验候选人的逻辑思维能力和框架感。今天把这类题的解法彻底讲透。
一、费米估算的核心思想 🔴
1.1 问题拆解
费米估算的经典问题:
芝加哥有多少钢琴调音师?
第一眼看上去确实不可能。但费米的厉害之处在于:把一个不知道的大问题,拆成若干个可以估计的小问题,然后乘起来。
1.2 ❌ 错误示范
候选人原话:"芝加哥大概有几百万人吧...钢琴调音师的话,可能有几千个?"
问题诊断:
- 没有拆解问题的意识,直接给答案
- 缺乏量级感——几百万人和几千钢琴调音师,比例完全不对
- 无法解释自己是怎么得出这个数字的
面试官内心 OS:"这种候选人,上来就给数字,完全没有推理过程。说明他平时就不习惯做系统性的思考。" :::
1.3 标准回答
核心方法:分步拆解
把"芝加哥有多少钢琴调音师"拆成三个问题:
第一步:芝加哥有多少架钢琴?
先估计总人口:
- 芝加哥人口约 300万
有钢琴的家庭比例:
- 大概 10%~20% 的家庭有钢琴
- 平均每家有钢琴 1~1.5 架
- 芝加哥大约 100万个家庭
钢琴数量:
第二步:每架钢琴每年调几次?
- 正常使用下,每年调 1~2 次比较合理
- 取平均值 1.5 次/年
每年调音总需求:
第三步:每个调音师每年能调多少架?
- 每个调音师每天大概调 2~3 架
- 一年工作 250 天左右
每个调音师年工作量:
最终结果:
所以芝加哥大约有 300~400 名钢琴调音师。
实际数据是芝加哥大约有约 200~300 名钢琴调音师(不同统计口径有差异)。这个估算已经相当接近了。费米估算的目标不是精确,而是量级正确。
1.4 追问升级
追问1:你这个估算的误差可能在多少?
答:最坏情况下,假设每个因素都有2~3倍的误差:
- 人口误差:300万可能是200万~400万
- 钢琴比例:15%可能是10%~20%
- 工作量:750架可能是500~1000架
综合误差可能在 10 倍左右,但量级(几百人)基本不会错。
追问2:如果我把"调音师"改成"出租车",该怎么估算?
答:同样用分步法:
- 芝加哥人口 300万
- 有驾照人口比例约 70%
- 打车频率:平均每周打车2~3次
- 每天总打车次数 = 300万 × 70% × 3次/周 ÷ 7天 ≈ 90万次/天
- 每辆出租车每天载客约 20~30 次
- 出租车数量 = 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 辆
第五步:计算总需求和总供给
每天总加油需求:
所需加油站数量:
实际上纽约市大约有 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 美元:
球花了 0.05 美元,球拍花了 1.05 美元。
验证:0.05 + 1.05 = 1.10 ✓,1.05 - 0.05 = 1.00 ✓
这道题看似简单,但很多候选人会在"直觉陷阱"里绕不出来。面试官要看的不是你的计算能力,而是你是否会验证自己的答案。
3.4 追问升级
追问1:如果把"球拍比球贵1美元"改成"贵2美元",球和球拍各多少钱?
答:
无解。这说明在给定的约束下,"贵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 保守估计
第四步:计算服务器数量
实际生产考虑:
- 至少 2 台(主备)
- 加上缓存、数据库、负载均衡,需要 5~10 台
4.3 追问升级
追问1:如果要支持100万并发在线用户呢?
答:并发用户和日活不同。假设5%的用户同时在线,就是5万并发。每秒请求数约 5万 × 平均请求率。
追问2:100万日活需要多少数据库连接?
答:连接池大小和并发有关。如果5万并发,连接池 50~100 个差不多了。
【面试官手记】 能做出系统容量估算的候选人,基本上都有实际做过项目的经验。他知道服务器能扛多少QPS,知道连接池要设多大。这种经验只能从实战里来。 :::
五、估算题万能公式
估算题的精髓是:把不知道的大问题,拆成若干个知道的小问题。每个小问题的误差乘起来可能会很大,但量级不会错。
六、生产避坑
有人问:估算能力和写代码有什么关系?
场景1:容量规划 上线前要估算系统能扛多少QPS、需要多少内存、磁盘要多大。这些本质上都是费米估算。
场景2:性能优化 优化前要知道瓶颈在哪里。如果每秒能处理1000个请求,现在只能处理200个,那优化目标就是5倍。
场景3:成本估算 给老板汇报需要多少机器,要先估算业务增长、每台机器的成本、运维成本。
【面试官手记】 我在复盘学员面试时发现,能把容量规划讲清楚的,基本上都拿到P6+了。因为能做好容量规划的人,说明他不只是写代码,而是有全局视野。 :::
七、工程选型
遇到估算类面试题,记住"三步走":
第一步:拆解 把大问题拆成若干小问题,每个小问题要能估计。
第二步:估算 给出合理的数值,解释你的假设。
第三步:验证 检查答案是否自洽,如果明显违背常识要修正。