“We Are 90% Done” Is the Most Expensive Sentence in Software Delivery“我们完成了 90%”是软件交付中最昂贵的一句话
Sonal JainSonal Jain
The easy 90% is behind you. The invisible 10% is often half the real work, and it is where projects quietly die.那轻松的 90% 已经过去了。而那隐形的 10% 往往占据了实际工作量的一半,也是项目悄无声息走向失败的地方。
I have sat in a lot of status meetings. If I had to pick the one sentence that has cost my clients the most money over the years, it would not be “we found a bug” or “the client changed the scope.” It would be this one, said with total confidence: “We are 90 percent done.”我参加过很多状态更新会议。如果非要我选出一句多年来让我的客户损失最惨重的话,那绝不会是“我们发现了一个 Bug”或“客户更改了需求范围”。而是这句带着十足自信的话:“我们完成了 90%。”
Here is the uncomfortable truth. “90 percent done” almost never means 90 percent of the work is finished. It means the easy, visible, satisfying 90 percent is finished. The screens are built. The happy path works in a demo. Everyone feels good.这里有一个令人不安的真相。“完成 90%”几乎从不意味着 90% 的工作已经结束。它只意味着那 90% 简单、可见且令人满意的部分完成了。界面建好了,演示时的“理想路径”也能跑通,每个人都感觉良好。
And the last 10 percent, the invisible part, is still sitting there. Edge cases. Real data. Integrations that only misbehave in production. Client sign-off. Deploy and rollback. In my experience that final 10 percent is routinely 40 to 50 percent of the actual effort. That is the gap between a demo and a shipped product, and it is where timelines go to die.而剩下的 10%,即那些隐形的部分,还堆在那里。边缘情况、真实数据、只在生产环境中才会出错的集成、客户验收、部署与回滚。根据我的经验,最后这 10% 通常占了实际工作量的 40% 到 50%。这就是演示版本与正式发布产品之间的差距,也是项目进度走向死亡的地方。
Why “90 percent” is a feeling, not a fact为什么“90%”是一种感觉,而非事实
The number is honest, it is just measuring the wrong thing. A developer who says 90 percent is usually reporting how much of the code they can see is written. That is a real signal. It is not the same as “this is ready for a paying customer to use on a Tuesday morning.”这个数字本身是诚实的,只是它衡量错了对象。开发者说 90% 时,通常是指他们所能看到的代码已经写完了。这是一个真实的信号,但它并不等同于“这已经准备好让付费用户在周二早上使用了”。
The problem is that the easy 90 percent is the part you can point at. The hard 10 percent is mostly things that do not exist yet in a demo: the error states nobody clicked, the load nobody simulated, the third-party API that returns a slightly different shape on live keys.问题在于,那轻松的 90% 是你可以指出来的部分。而那困难的 10% 大多是演示中尚未呈现的东西:没人点击过的错误状态、没人模拟过的负载、以及在真实密钥下返回格式略有不同的第三方 API。
So the percentage climbs fast to 90, then sits there for three weeks while the team fights the part that was never actually visible. If you have ever watched a project hover at “almost there” for a month, this is why. Nothing was wrong with the team. The measurement was wrong.所以进度很快攀升到 90%,然后就在那里停滞三周,团队在与那些从未显现的部分进行抗争。如果你曾目睹一个项目在一个月里徘徊在“快完成了”,这就是原因。团队本身没问题,是衡量标准错了。
What actually hides in the last 10 percent最后 10% 里到底藏着什么
When a client asks me why “nearly done” turned into another two weeks, I walk them through what was hiding. It is remarkably consistent. Here is the short version of what the final stretch usually contains:当客户问我为什么“快完成了”又变成了再等两周时,我会带他们梳理一下那些隐藏的问题。它们非常具有规律性。以下是最后冲刺阶段通常包含内容的简述:
- The refund that spans two billing cycles. Works fine inside one month. Breaks the moment a customer refunds across a boundary.跨越两个账单周期的退款。在一个月内运行正常,但一旦客户跨月退款就会出错。
- The integration that only breaks on real data. Test data is clean and polite. Real user data has emojis in the name field and a phone number in the email column.只在真实数据下才会崩溃的集成。测试数据总是整洁且规范的,但真实用户数据会在姓名栏里填入表情符号,在邮箱栏里填入电话号码。
- Browser and device edge cases. It looked perfect on the developer’s machine. Then Safari, then an older Android, then a slow network on a train.浏览器和设备的边缘情况。在开发者的机器上看起来完美无缺,但在 Safari 上、在旧版安卓上,或者在火车上的慢速网络环境下就不是这样了。
- Client sign-off. Not a formality. This is where the person paying finally clicks around and says “oh, I assumed it would also do this.”客户验收。这绝非形式。这是付钱的人终于开始实际操作,并说出“噢,我以为它还会做这个”的时候。
- Deploy plus rollback. Getting it live, and being able to un-live it safely at 6pm on a Friday if something goes sideways.部署与回滚。不仅要上线,还要确保在周五下午 6 点如果出了意外,能安全地撤回。
None of this shows up in a demo. All of it is required to actually ship. That is why “90 percent done” and “done” can be weeks apart.这些在演示中都不会出现,但它们对于正式发布缺一不可。这就是为什么“90% 完成”和“真正完成”之间可能相隔数周。
The fix: track “done-done,” not “code-complete”解决方案:追踪“彻底完成”,而非“代码完成”
The cure is not to work harder in the last stretch. It is to stop letting “code-complete” masquerade as finished.补救措施不是在最后阶段更努力地工作,而是停止让“代码完成”伪装成“项目完成”。
On my projects there are only two honest states for a piece of work. It is either not done, or it is done-done: in production, on real data, verified by someone who is not the person who built it. There is no 90 percent. A feature is either shippable or it is not, and “the code is written” does not clear that bar.在我的项目中,工作状态只有两种诚实的定义:要么没完成,要么彻底完成(done-done):即已上线、使用真实数据、并由非开发者本人进行了验证。没有 90% 这种说法。一个功能要么可以发布,要么不可以,“代码写完了”并不代表达到了这个标准。
Two habits make this real, and neither one requires a fancy tool:两个习惯可以让这一点落地,且都不需要什么复杂的工具:
- Define “done” before you start, in writing. Deployed. Tested against real or realistic data. Edge cases named up front, not discovered later. Signed off by the client. If it fails any of those, it is not done, it is 90 percent, and 90 percent is not a status I report.在开始之前,以书面形式定义什么是“完成”。包括:已部署、通过真实或模拟数据的测试、预先列出而非事后发现的边缘情况、以及客户验收。如果没达到其中任何一项,它就不是“完成”,而是 90%,而 90% 不是我汇报的状态。
- Count shippable slices, not percent-complete. “8 of 12 features are live and verified” is a fact anyone can check. “We are 90 percent done” is a feeling nobody can verify. One of those numbers can only go up. The other can quietly lie to you for a month.计算可发布的功能切片,而不是完成百分比。“12 个功能中有 8 个已上线并验证”是任何人都能核实的事实。“我们完成了 90%”则是没人能核实的感觉。前者只会增加,后者却能悄无声息地欺骗你一个月。
How we run delivery at Shanti Infosoft我们在 Shanti Infosoft 如何进行交付
This is the part I care about most as a delivery lead. We do not report progress as a single percentage that nobody can audit. We break a build into thin, shippable increments and track them by measured flow: what actually reached production and got verified, not what feels close. When a client asks “where are we,” the answer is a count of live, working slices, not a vibe.作为交付主管,这是我最关心的部分。我们不会用那种没人能审计的单一百分比来汇报进度。我们将构建过程拆分为精细的、可发布的小增量,并通过量化的流程来追踪:什么真正上线并经过了验证,而不是感觉上接近完成。当客户问“进度如何”时,答案是已上线且可工作的切片数量,而不是一种模糊的感觉。
That discipline is a big part of how a distributed team across the UK, US, UAE, and Australia has delivered 700-plus projects without the classic “stuck at 90 percent” death march. If you want to see what done-done looks like rather than take my word for it, our portfolio of shipped work is the honest version of a status update: things that are actually live.这种纪律是一个分布在英国、美国、阿联酋和澳大利亚的团队能够交付 700 多个项目,而没有陷入“卡在 90%”的经典死亡行军的关键。如果你想看看什么是“彻底完成”,而不是听我的一面之词,我们的交付作品集就是状态更新最诚实的版本:那些真正上线的东西。
The mindset shift is simple. Stop measuring how much code exists. Start measuring how much of the product a real user can actually use, right now, without you standing next to them.思维转变很简单。停止衡量代码写了多少,开始衡量产品有多少部分是真实用户现在就能用,且无需你在旁协助的。
“90 percent done” is the most expensive sentence in software because it feels like the finish line when it is really the start of the hardest part. The teams that ship on time are not faster. They just refuse to call the easy 90 percent “almost done.”“我们完成了 90%”是软件开发中最昂贵的一句话,因为它让人感觉已经到了终点,而实际上那才是最艰难部分的起点。那些能按时交付的团队并非速度更快,他们只是拒绝把那轻松的 90% 称为“快完成了”。
So here is my honest question for you: think about the last project that ran late. Was it truly running late, or was it 90 percent done for a very long time and nobody had the language to say so?所以,我有一个诚实的问题想问你:回想一下上一个延期的项目。它是真的延期了,还是说它在很长一段时间里都处于“90% 完成”的状态,只是没人有合适的语言把它表达出来?
Written by Sonal Jain, delivery lead at Shanti Infosoft — we build AI and custom software for teams in the UK, US, UAE, and Australia.作者:Sonal Jain,Shanti Infosoft 交付主管——我们为英国、美国、阿联酋和澳大利亚的团队构建人工智能及定制软件。
