每个工程师的工位上,都坐着一个“算不对”的幽灵。你以为我说的是那把用了三年、按键都包浆的计算器?不,我说的是我们自己。
我干了这么多年工程,最深的体会就是:一个项目能不能成,根本不取决于谁算得最准,而是取决于谁能最快发现自己算得不准。那些“啥都算不对”的至暗时刻——容量规划少算了一个零、工期评估漏掉了天气、成本预算忘了算运维的人——几乎构成了我们职业生涯的全部笑点和泪点。今天不聊那些“一次就过”的虚假传说,专门聊聊我们是怎么一步步接受“算不对”才是常态,以及如何在这种常态下,把项目体面地交付掉。
1. 工程估算的灵魂三问:量级、容差、边界
1.1 先搞懂你说的“对”是哪种对
入行头两年,我总把“算对”理解成小学数学意义上的“唯一正确答案”。被现实毒打几次之后才明白,工程里的“对”,压根不是同一个物种。
工程语境下的“对”,至少分三种:
第一种是量级对。你说这个接口每秒能扛一万请求,结果压测出来是九千八,这是量级对,恭喜你,方案基本成立。但如果你估的是每秒一千,实际一压就崩,这是量级错了,神仙也救不了。量级错了,后面所有细节都是给错误的大厦贴瓷砖。
第二种是容差对。你说这个页面首屏加载要控制在两秒内,结果测出来两秒一,这事能不能接受?取决于你当初留没留余量。工程上几乎所有关键指标都不是一个点,而是一个区间。你把宝压在一个精确点上,就是对概率的侮辱。
第三种是边界对。你说这条流水线每分钟能处理一百件,这是正常工况。但双十一峰值来了,流量乘以十倍,你的“对”还剩多少?边界条件覆盖不到,平时算得再准,峰值一来就是“算不对”的大型公开处刑现场。
所以,“啥都算不对”的头号病根,不是计算能力差,而是根本没定义清楚:你要在什么范围内、以什么容错率、覆盖到什么边界条件下去谈“对”。这三件事定不下来,你拿什么算都是错。
1.2 几百次翻车换来的教训:容差是留给世界的,不是留给你的
很多人有个误解,觉得容差就是“我故意算松一点,好显得我厉害”。恰恰相反。
世界是充满噪声的。CPU 的主频会因为散热而波动,数据库的查询计划会随着数据分布而改变,你隔壁团队可能在你不注意的时候偷偷上了个定时任务抢资源。这些噪声加起来,可能轻松让你的理论值偏离百分之二三十。
所以,我个人的铁律是:对外承诺的量,永远要在你的安全区间上再打七八折;而对内追求的量,永远要在理论值的基础上留出测试验证的余量。这不是怂,这是给物理规律和人性弱点交的保险费。你留的这百分之二三十,不是给世界看的,是给那个“不够准确的自己”兜底的。
2. 一个深刻的反省:要命的不是算错,是用错地方
我们这行有个有趣的现象:越是不常被人复核的估算,越是错得离谱;越是每天被人盯着的指标,反而越准。
2.1 为什么工期评估总是一场大型翻车现场
这么多年,我观察下来,工期估算翻车率几乎是百分之百的,区别只是翻多翻少。问题出在哪?我们总是把工期估算当成“纯计算”问题,但它本质上是“行为预测”问题。
你算的是“写这个模块要多少小时”,但实际上这背后是:需求会不会变、产品经理会不会有新想法、依赖的第三方接口文档是不是一坨废纸、你自己的状态是不是每天都能拉满八小时。这里面任何一项,都不是一个简单的“工时 = 工作量 / 速度”能算出来的。
我的经验是:工期估算永远要做两次加法。第一次,按理想状态、满血输出地加一遍,这是下限;第二次,把沟通成本、返工成本、等待成本、摸鱼成本全算上,这是上限。对外报永远报两次加法的中间偏上值,对内排期永远按下限去挤自己。只有这样才能既不被团队骂画大饼,又不至于把自己逼到天天加班。
2.2 性能指标:压测数据的正确打开方式
另一个“算不对”的重灾区是性能。随便拉个新人,你问他这个系统能抗多少并发,他可能张嘴就来一个数,问他是怎么来的,他说“感觉”。然后你就看着他在压测环境里把并发拉上去,看着监控面板上的曲线像过山车一样优雅地起飞,然后优雅地崩溃。
但这里面有个特别容易被忽略的点:压测环境的硬件配置、网络拓扑、数据规模,是不是跟线上一致?不一致的话,你压出来的那个“能抗一万并发”,就是一个精心计算出来的幻觉。很多“算不对”,根本不是算数的问题,是前提条件就没对齐。
我自己踩过最大的坑,是用四核八 G 的测试机压出来的一份数据,直接拿去支撑了线上六十四核机器的容量规划,结果上线当天就把数据库连接池打满了。那次之后我养成了一个习惯:任何性能数据,先看环境对比,再看压测结果。环境不一致的数据,参考价值趋近于零。
3. 工程估算的玄学与科学:从“拍脑袋”到“有依据”
3.1 拍脑袋怎么拍得理直气壮
我得承认,很多时候我们就是被迫拍脑袋的。需求方站在你面前,目光灼灼地盯着你:“下午能把方案给我吗?”你手里只有一页 PPT,能算出个鬼?
但老油条和愣头青的区别在于:愣头青直接拍,拍完后悔;老油条也拍,但拍之前先在心里过三个问题——
第一,这个事我有没有做过类似的?做过,哪怕只有两三分相似,也比完全没做过强。用相似案例作为锚点,再根据差异点做修正,这叫“锚定估算”。比纯瞎拍靠谱十倍。
第二,这个事最乐观要多久,最悲观要多久?把两个值写下来,取一个偏向悲观偏离一点点的值,这叫“三点估算”的穷人版。虽然依然粗糙,但至少比“感觉一天能搞定”有结构。
第三,这个事如果做砸了,最坏结果是什么?会不会把整个项目的关键路径堵死?会不会影响外部客户的承诺?如果会,无论你的估算多有信心,都必须把风险预留时间加上去。
有了这三个问题打底,哪怕你还是只能给一个范围,也能给得理直气壮。别人问“到底几天”,你可以说“如果一切顺利,四天;如果正常展开,六天;现在我只能按六天来排”。这就叫有职业素养的拍脑袋。
3.2 算不对的本质,是不理解量纲和边界条件
我必须怼一下那些“算得特别准”的新人。他们最常犯的错,是拿着一个公式,代入一堆来源不明的数字,然后用计算器按出一个小数点后五位的结果,自信满满地发到群里。
但你问他:这个结果的单位是什么?这个数字在什么条件下成立?超出这个条件会怎样?他大概率一脸茫然。这就是典型的“算得越精确,错得越离谱”。
我特别推崇一个习惯:任何计算结果,都要先做量纲检查,再做边界条件检查。量纲检查,就是看看你这个结果的单位合不合理。比如你算出来“每秒处理 0.5 个请求”,想想也知道不可能——你是做搜索的,不是做手工工艺品的。边界条件检查,就是想想这个公式适用的前提还在不在。
这两个检查完全不费时间,但却能拦下百分之八十的低级错误。那些“啥都算不对”的时刻,绝大多数不是数学不好,是压根没想过要检查。
4. 给自己的方案装上“纠错机制”:算不许不中,但可以纠得快
4.1 用“预估值 + 实测值”的回馈循环替代“一步到位”
咱得承认一个扎心的事实:人算不如天算,天算不如实测算。工程环境太复杂,任何静态的估算都只是起点,不是终点。所以,我现在做任何方案,都会刻意地设计一个“估算 vs 实测”的对照表格。
比如,我预估这个接口的 P99 延迟是 200 毫秒,我就在代码里埋上日志,上线后跑一跑真实流量,回来再看一眼实际值是多少。把实际值和预估值的差距记下来。久而久之,你脑子里就会形成一个“个人误差校准库”——你知道自己在哪类问题上的预估偏乐观,哪类问题偏悲观,下次估的时候就能自动带着修正系数。
这个方法特别土,但特别有效。本质上,它是在给你自己的“估算直觉”做训练。训练多了,你拍出来的脑袋,就不再是那颗纯粹的脑袋了,而是一颗带着数据库索引的脑袋。
4.2 一场关键的自我纠错:容灾切换的演练
这里分享一个我印象极深的实操经历。有一个核心服务,设计上做了跨机房容灾,平时一切正常,谁也没觉得有啥问题。按照预案,每个月要做一次容灾切换演练,把流量从一个机房切到另一个机房。
我第一次负责这个演练的时候,信心满满。流量切换脚本是现成的,数据库同步延时监控了三个月都在 100 毫秒以内,理论上一切尽在掌握。但真到演练那天,一切换,线上监控直接报警——数据库账号在主备机房之间的权限配置漏掉了一个,备用机房根本连不上主库。
那一瞬间我脸都绿了。谁能想到,平时掐指一算觉得稳如老狗的事,真到验算的时候能崩成这样?但换个角度看,这正是“算不对”最好的归宿:你在可控的环境里把错犯掉,比在线上事故里把错暴露出来,划算太多。演练就是给方案装上的纠错机制,你平时舍不得做,真正出事的时候,系统会用最惨痛的方式帮你做。
5. 工程师的自我修养:与“算不对”和解,但永不投降
5.1 你的“算不对”分几种?对号入座一下
摸爬滚打这么多年,我把“算不对”总结成几个流派,你可以对号入座看看自己属于哪一类:
- 乐观派:所有参数都取最优值,方案看起来永远完美,直到上线。这种是“算得过于好看”型,治疗方法是强制给自己加一个悲观系数,在心中默念三遍“一切都会老化和衰减”。
- 教条派:完全照搬教科书公式,不考虑实际情况。比如拿理论带宽算网络传输时间,完全忽略协议开销和拥塞控制。这种的克星是实测——拉个小样先跑一下,让现实教育你。
- 失忆派:上一次踩过的坑,这个项目照样踩。不是不记打,而是没建立“复盘-归档-检索”的机制。我个人的解法是,每次项目复盘都写一页纸的“估算走查单”,下次开工先看一遍。
- 万能派:什么东西都想自己算,不想着去查行业基准值、看开源压测报告、翻竞品的公开数据。其实,很多“算不出来”的东西,别人早就踩过坑并留下了数据,你只要肯花半小时搜一下,就能把误差从“离谱”拉回“合理”。
5.2 当全组都算不对时,leader 在干嘛
最后聊聊团队视角。如果你是个小组长、技术负责人,你会发现一个更微妙的局面:下属报上来的估算,几乎没有一个是准的,但你又必须基于这些数字去做排期和承诺。
这时候最忌讳的事,就是亲自动手把他们的数字逐个“修正”。因为你不是在修正估算,你是在替他们背锅。
我的做法是:把每个模块的估算,按“置信度”分成三档。置信度高的,直接采信;置信度中的,按一个固定的折扣系数折算;置信度低的,单独拎出来,要求负责人给出拆分拆解和验证计划,而不是逼他给一个更准的数。
这么做的好处是:你不再追求“一次性算对”,而是建立了一个“知道哪些数不可信、并针对不可信区间布置验证”的机制。这套机制运转起来,就算下属没有一个数是准的,你手里的整体计划依然能打。
6. 从“算不对”到“算得有用”:给你一份可直接抄的检查清单
6.1 五个问题,做完再开口
现在每次开口报数之前,我都会在脑子里强制过一遍下面这五个问题。你可以把这页截下来,贴在工位上。
- 这个数的量级是拍胸脯拍出来的,还是从历史数据/相似案例推出来的?如果两者皆否,请回去补数据。
- 我取的是中位数、平均数,还是最差值?对外承诺用最差值,对内推演用中位数,给你的读者留出预期管理的空间。
- 我的假设条件里,哪一条最不牢固?把这条单独拎出来,作为最大的风险点写进方案。
- 如果这个数偏了,偏多少以内是不影响决策的?如果影响决策,请把余量加到这个偏差点上。
- 我给这个数附上“验证时间和验证方法”了吗?没有验证计划的估算,本质上只是给需求方的情绪价值,不是工程资产。
每次过完这五问,我都能明显感觉到,自己报出去的数,从“啥都算不对”进化到了“虽然不一定对,但错得明明白白”。
6.2 最后的最后,说一句大实话
干了这么多年,我终于接受了这个残酷的设定:我们不是“算不对”,而是“永远无法提前算对”。所有工程系统,本质上都是一个持续逼近真实的过程。估算只是这个过程的初始输入,真正让系统成立的,是你有没有为“输入有偏差”做好兜底的机制——实验、灰度、监控、回滚、试错、复盘。
所以,“啥都算不对”并不可怕。可怕的是,你算得不对还觉得自己天下无敌,或者算得不对就不敢再报数了。
真正的老工程师,不是算得准的那批人,而是“算错了也能把项目救回来”的那批人。如果你现在正被某个估算折磨,别慌,深呼吸,把上面这五个问题过一遍,再给你的方案多装一个纠错机制。
你依然可能算不对,但你会成为一个“算不对但稳得住”的工程师。这,才是我们这行真正的护城河。