方法

可上生产(Production-Ready)

你可以把它摆在真实用户面前、而不会在凌晨三点被告警叫醒的软件:每个端点都有授权、输入经过校验、客户端里没有密钥、有错误处理、有回归套件、有可观测性、有回滚。一个能跑的演示,并不等于可上生产。

最近审阅: 审阅人Christof Jori wiki ↗

可上生产,是"演示时能用的软件"和"你睡着、一个陌生人在错误地使用它时仍然能用的软件"之间的区别。它不是一种感觉,也不是你宣布的一个里程碑。它是一份具体的清单,而演示与可上生产之间的差距,恰恰就是那张清单上的东西,这些东西在失败的那一刻之前都没有可见回报。

把清单直白地说出来:每个端点都做授权,而不只是登录处做认证;对一切跨越信任边界的东西做输入校验;客户端打包里、仓库里都没有密钥;错误处理是失败时安全(fail-safe),而不是泄露一段堆栈跟踪;一套在每次改动时都跑的回归套件,好让下一个修复不会重新捅开旧 bug;可观测性,让你从仪表盘而不是从一个暴怒的客户那里得知出事;以及一条以分钟计的回滚路径。少了其中任何一项,你拥有的就是穿着生产戏服的演示。

举个例子。同一款订票 App 的两个版本,在演示里看起来一模一样。版本 A 在只检查你是否登录之后,按 ID 返回一张订单。版本 B 会检查登录用户是否真的拥有这张订单,校验 ID 格式,记录这次访问,并在某个账号开始枚举 ID 时告警。一样的界面、一样的 happy path、一样的演示。版本 A 是一场等着某个好奇者的泄露;版本 B 可上生产。用户可见的产品是相同的,这恰恰是为什么"它在演示里能用"完全说明不了它是否可上生产。

诚实的取舍:做到可上生产要花真实的时间,而其中大部分时间换不来任何客户会看到或感谢你的东西。当一个演示看起来已经做完时,这确实让人沮丧,也正是团队过早上线的唯一原因。对任何存有用户数据的东西来说,这笔交易并非可选,但诚实地讲,这份账单感觉就像纯粹的额外开销,直到凌晨三点的告警或那封 GDPR 信件,把它变成你花过的最便宜的钱。对一个真正用完即弃的原型来说,跳过它才是正确的决定。

Wavect 的生产就绪检查,是从一个 vibe-codedAI 生成的原型,通往一个你能收费的东西的桥梁,这在 Software Quality Assurance 下进行。我们按影响半径的顺序来处理清单:先做授权,因为最糟糕的漏洞住在那里,然后是校验、密钥、错误处理,再然后是 TDD 回归套件,以及让它保持绿色的 CI/CD 闸门。目标不是完美。目标是没有人会在凌晨三点,因为某件你本可以在上线前读一读的事情,被叫醒。

// FAQ

常见问题

具体来说:每个端点都有授权、输入经过校验、客户端里没有密钥、错误处理失败时安全、一套在每次改动时都跑的回归套件、可观测性,以及一条快速的回滚路径。它是一份清单,不是一种感觉。一个能跑的演示,证明不了上述任何一项的存在。
演示只走你点过去的那条 happy path。生产要走的是恶意路径、粗心的用户、改 URL 里 ID 的好奇用户、意料之外的输入、并发负载。可上生产,恰恰是 happy path 演示从不触及、也从不会暴露其缺失的那部分工作。
这取决于原型是怎么搭的,但因为 AI 生成代码里的缺口是系统性的,这一遍通常比人们担心的要快。我们按影响半径的顺序推进(先授权,然后校验、密钥、错误处理,再然后测试和 CI 闸门),好让最危险的窟窿先被堵上,即使预算不够用。