质量 vs 速度:什么时候该妥协
一句话速记
质量和速度不是对立的——在给定的时间和人力下,你做的所有 trade-off 不是在”质量”和”速度”之间,而是在”哪些质量的哪些部分”和”哪些功能的哪些部分”之间。核心原则:① 正确性不妥协——付了钱没订单、数据丢了,这是系统在骗用户;② 韧性可分级——新功能可以先不做到 99.99%,手动恢复可接受;③ 优雅可延迟——“不够漂亮”永远不是 bug。上线决策 = 以当前的质量水平上线,出问题的后果能不能接受?
通俗解释(5 分钟版)
错误的 trade-off 思考方式:
"PM 逼着这周上线,只能牺牲质量了。"
→ 牺牲的是什么质量?所有质量?代码乱写?测试不写?
这种"牺牲质量"的模糊说法,导致上线后事故频发。
正确的 trade-off 思考方式:
"这周上线的话,我们可以:
✓ 核心路径(下单→支付→发货)质量不变:全量测试 + 灰度
✗ 次要路径(优惠券校验降级时的手动恢复):先不做自动恢复,
出一个 runbook,oncall 人手动恢复
✗ 管理后台的一个筛选功能:可以先不做,下周补
✗ 代码可以下周重构一轮(现在有重复代码但不影响功能)
所以下周能上线,风险区间是:
- 优惠券校验挂了 → oncall 手动恢复(10 分钟)
- 概率:过去类似模块的故障率约每月 1 次
→ 后果可接受。上。"
关键细节
质量分层
质量不是一块铁板——分层,每一层有不同的妥协空间:
层 1:安全 — 绝对不妥协
涉及用户数据、钱、越权访问的——没有任何理由。
再赶也不能:SQL 拼接、明文密码、越权不做校验。
原因是:这些不是线上故障,是线上事故 + 合规风险。
出一次 = 公司可能被罚款百万。
层 2:正确性 — 核心路径不妥协,非核心可观察
核心路径(用户的核心操作):不能有数据错误。
如果订单创建了但扣款没记录,这是公司在亏钱。
非核心路径(如用户偏好设置显示不对):
可以不完美,但错误必须可被发现(有日志 + 有监控)。
层 3:韧性 — 可分级
核心路径:必须有降级 + 手动恢复方案
非核心路径:挂了可以给用户报个错,下次重试就行
内部工具:挂了就挂了,上班再修
(注意:对内部工具的标准和对用户的完全不同)
层 4:完备性 — 可分期交付
一期上线:覆盖 80% 用户场景
二期:覆盖剩余 20%(比如边缘的设备/浏览器/地区)
如果你要等到所有情况都完美才上线,
你就永远上不了线。
层 5:优雅 — 可无限延迟
代码重构、变量命名、模块拆分——这些永远值得做,
但永远不值得阻塞上线。用 TODO 标记,下个 sprint 改。
上线前决策问题
每次上线前,TL 问自己三个问题:
1. 如果这个功能现在上线,最差的结果是什么?
(不要问"可能",问"最差")
2. 这个最差的结果,我们的监控能在几分钟内发现?
(如果答案是"不知道"或者"可能要等用户投诉" → 不上)
3. 如果最差的结果发生了,我们能在多长时间内修好?
(如果答案是"不知道"或"可能要回滚整个服务" → 不上)
如果 3 个问题都能具体回答(具体到"3 分钟发现,15 分钟修复"),
就可以上——即使方案不完美。
不同阶段的取舍策略
0-1 阶段(新产品 / 新功能):
核心问题:这个东西有用户需要吗?
质量策略:核心路径质量拉满,非核心路径可以粗糙。
因为:你最大的风险不是"某些边缘 case 挂了",
是"做了 6 个月结果用户完全不需要"。
1-10 阶段(增长期):
核心问题:用户量在涨,系统能不能跟上?
质量策略:开始建立质量标准——CI、灰度、监控、oncall 流程。
这阶段投入在质量上是"省未来的时间"。
10-N 阶段(成熟期):
核心问题:稳定性——一次事故可能影响千万用户。
质量策略:质量和速度的 trade-off 偏向质量。
此时"慢一点上线"的成本低于"出事故"的成本。
延伸追问
- Q:如果 PM 施压一定要按时上线,但你知道质量不够,怎么办? → 不争辩”不能上”。把风险翻译成 PM 能听懂的后果:“如果按现在的质量上,预期有 5% 的订单会遇到 XX 问题,每次需要运营手动处理 10 分钟。我们能承担吗?“让 PM 一起做风险评估。如果 TA 说”可以承担”,那也告诉老板——不是告状,是让老板知道这个 trade-off 你和 PM 一起做的。
- Q:怎么跟团队传达”速度优先”但又不鼓励写烂代码? → 说清楚边界。“这周我们需要先上核心功能。代码可以有 TODO 标记——这些 TODO 在接下来两周的 sprint 里要修完。“让团队知道:快是有代价的,但这个代价有时效——不能永远欠着。
- Q:线上故障后,怎么在复盘里不让 trade-off 变成”谁批准上线的”追责? → 如果 trade-off 是公开做的(在群聊/文档/会上明说的、后果被评估过的),出问题了是”评估的信息不够准确”而不是”某人冒进”。这就是为什么你不应该一个人在脑子里做 trade-off——把它记录下来、沟通出去,大家一起承担。
我的记法
- 质量分层:安全 > 正确性 > 韧性 > 完备性 > 优雅。每层有不同的妥协底线
- 上线三问:最差结果?多久发现?多久修复?——三个答不上 = 不上
- 0-1 vs 1-10 vs 10-N:不同阶段有不同的质量优先级
- 一句话:「质量 vs 速度不是对立——你 trade-off 的不是质量,是哪些质量在哪些路径上可以暂时放一放」
状态
- 已背速记
- 能讲通俗版
- 能答追问