过去的”软件质量”等于”代码能不能跑”。这个定义会在一个产品团队从 50 人走向 100 人的过程中悄悄死去。远在任何团队负责人察觉之前,代码在生产环境是对的,而系统在组织架构中已经碎了——你周二发布的改动完全跑得通,却在周一打破了三个团队之外的某个契约。缺陷并不在代码里。缺陷在接缝上。在 100+ 开发者这个规模上,软件质量不再是代码的属性,而是接缝的属性。
这篇文章是一次再框定(reframe),写给负责”单一应用、100+ 开发者”的工程总监、工程 VP 和工程经理。它建立在三个框上——Conway 定律(1968)、Team Topologies 的认知负载镜头(Skelton & Pais, 2025)、DORA 的四个交付指标——并以一份管理者手册收尾:要度量什么、要改变什么、要停止度量什么,以及那个把”真正在改善质量的组织”和”只付钱买质量样子的组织”分开的那一个问题。
如果你在 30 个人的团队上,这篇文章是天气预报,不是诊断书。下面四种失败模式会在 30–50 人的规模上开始显现,到 100+ 才会急性发作。先读再框定,做笔记,等接缝开始吱嘎作响时再动手。
软件质量的两个定义
小团队的定义(适用于 1–30 人的团队):代码在生产环境能跑吗?
大团队的定义(本文的工作定义,50+ 开发者开发单一产品):这套系统能否让 100 人在周一改动它,而不会在周二打坏客户?
这两者不是同一个属性。前者是代码的属性。后者是接缝的属性——团队之间、服务之间、团队图(team graph)与可部署面之间的接缝。本文余下部分都按第二个定义工作。
质量是系统的属性
多数工程组织在思考软件质量时,会穿过三层同心圆;多数工程 leader 在处理 100+ 这个规模转型时,能够做对的关键,是能在每一个拐点指出哪一层是瓶颈。三层不是同一回事;瓶颈不是同一个;归属者不是同一个。
这张图从内向外读。每一个内圈都是外圈能正常工作的前提。代码质量是系统质量的前提。系统质量是组织质量的前提。本文的核心主张是:系统质量,是在 50 到 200 名开发者同时开发一个产品的规模上,会断掉的那一层属性。读者所管理的应用一旦超过这个阈值,你之所以点开这篇文章,是因为系统让你失望,而不是代码让你失望——而下面四种失败模式,是失望的具体形状。
把这件事做错的代价是真实的。Consortium for IT Software Quality 在他们最近的估算中,把美国每年因软件质量低下造成的损失放在超过两万亿美元。这个数字集中在系统质量那一圈,而不是代码质量那一圈。招再多测试工程师也修不好它。
四种失败模式
在 100+ 开发者共同开发一个产品时,软件质量失败不再是一条长尾——它开始变成一个分类法。四种失败模式解释了大部分代价。每一个都是诊断性的——读者应该能够指着某段话里的一句话,说”对,这正是我团队正在发生的事”。
1. Conway 定律漂移
Conway 1968 年的论文只有一句话,此后的五十八年里,整个领域都在试图逃离它:组织设计出来的系统,必然是其沟通结构的镜像。 对 100+ 开发者规模而言,这意味着系统的形状永远滞后于上季度的团队图。如果团队图变化得快,而系统的所有权边界跟得慢,系统就会意外地漂移成一片多语言乱炖——团队在哪里成立,服务就出现在哪里;团队在哪里建墙,契约就碎在哪里。最常见的一类事故,就是 A 团队那个健康的改动,调用了 B 团队一个未被记录的假设。
这种失败模式是漂移,不是错误。Conway 漂移发生在:团队图在动,而 CODEOWNERS 文件没动。接缝已经不在团队图说它在的地方。系统已经不是在镜像组织——它在滞后于组织。
最便宜的 Conway 干预
团队的边界就是所有权的边界。如果你的 monorepo 的 CODEOWNERS 文件与团队图不一致,系统一定会意外地变成多语言乱炖。要先修的不是系统——是地图。详见 Architecture Decision Log 指南——最便宜的干预,是在团队图变化时写一条 ADR,而不是在代码变化时写一条。
2. 认知负载溢出
Skelton 与 Pais 的 Team Topologies(第二版,2025)给第二种失败模式起了一个精确的名字。一个 stream-aligned 团队有认知负载(cognitive load):管理这个团队的关注点(concern)所需的总心智努力。负载有三种形式——内在的(intrinsic,团队领域本身的不可避免的复杂度)、外在的(extraneous,来源不是工作本身,而是系统形状不对)、与生成性的(germane,团队真正想要的那种”边学边做”的负载)。当三者之和超过团队的容量,团队不会放慢——它会从组织速度里减去自己,因为每一次改动都会变成对其他某个关注点的部分回归。团队的实工时产出下降,而回归的成本在下游复利。
业内的经验法则是:当一个 stream-aligned 团队的并发关注点超过大约六个时,它就开始从组织速度里减去自己。这不是软偏好。这是 Team Topologies 十年咨询经验里报告的经验拐点。多数 100+ 开发者规模的组织,每个团队都跑在 8、10、12 个并发关注点上——他们正在为慢代码评审、漏掉的边缘情况、和”重写吧”的 PR 付出代价;后者几乎都是负载溢出的症状,而不是质量判断。
3. 联邦化质量
质量是团队之间接缝的属性。如果没有人拥有这条接缝,就没有任何一个团队的 owner 把系统当成自己的关注点——而缺陷会从所有权的缺口里冒出来。联邦化质量发生在:每个团队负责”自己的”代码,但没有任何团队负责自己代码与系统其余部分之间的契约。团队各自的代码评审都能过;系统在生产环境集体地失败。
这个框来自 DORA 研究项目(Forsgren, Humble, Kim——《Accelerate》)。他们提出的四个指标在构造上就是系统级的:你没法只看一个团队的 PR 就测出它们。它们是质量被正确联邦化时的实证信号——或者,当它们很差时,是质量变成了一个没有国家(state)的联邦。这正是 反模式原文 从工程师视角所警告的那种失败模式;在 100+ 这个规模上,相同的反模式变成了团队之间的反模式,单个工程师看不见。
4. 激励倒挂
第四种失败模式,是所有其他干预都打不死的那一种。如果团队级指标是 DORA 的 change fail rate,但管理者级评估的是每个工程师的个人速率(individual velocity),那全局最优就永远达不到——团队被奖励快速发布,工程师被奖励发布更多,而系统为这种错位买单。Ron Westrum 的组织文化类型学——2004 年发表在 Complexity 期刊上——把这种动态命名为病态(pathological)组织文化:一种惩罚吹哨人、奖励”看起来在产出”的文化的特征。
2026 年最常见的版本是:团队已经采纳了 DORA——四个指标在仪表盘上,海报贴在墙上——但同时在绩效考核周期里继续奖励个人速率。指标说”我们是精英团队”;组织架构的现实说”我们在奖励错的东西”。这正是 Shift-Right, Shift-Left 那篇 隐含地警告的那种失败模式:DevOps 流水线 ≠ DevOps 激励结构。一条快速发布的流水线,配上一套奖励局部吞吐优化的激励,所产生的矛盾,最终由客户来承担。
DORA:唯一的度量框
对软件交付性能来说,唯一的度量框,是经历了十年同行评审复现仍站得住的那个。DORA 项目——全球持续时间最长的对高绩效技术组织的研究——产出了四个指标;它们合在一起,是唯一有实证履历去支撑”the canonical set”这一称谓的指标集。
四个指标是:
- 变更前置时间(Lead time for change)——从一次可合并的提交,到它在生产环境运行。
- 部署频率(Deployment frequency)——组织多久向生产环境发布一次。
- 恢复平均时间(MTTR)——一次生产事故从发生到恢复所用的时间。
- 变更失败率(Change fail rate)——在生产环境造成服务降级或需要修复的变更百分比。
四个指标在构造上就是系统级的:你没法只看一个团队的 PR 测出任何一个。DORA 项目每年通过 State of DevOps 报告发布精英与落后之间的差距。截至撰文时点能拿到的最新报告,精英团队发布频率约为落后团队的 208 倍,恢复事故的速度约为 2,604 倍,变更失败率约为落后团队的七分之一。定性结论——精英发布更频繁、恢复更快、失败更少——才是承重的那个。
四个指标各自抓住一个失败模式。变更前置时间抓 Conway 漂移。部署频率抓联邦化质量。MTTR 抓认知负载溢出。变更失败率抓激励倒挂。四个指标合在一起,是诊断框。
Team Topologies:为什么人多了没用了
为什么过了 100 人,再招人不会让速度变快?直觉上的答案——沟通成本——对,但不精确。精确的答案是:团队已经超载,而超载的团队对新来的边际贡献者一无所能。
认知负载框之所以重要,是因为它告诉管理者要修什么。当”我们发布得不够快”时,常规修法是招更多工程师。认知负载框说:问题不在工程师数量,而在团队内在负载。修法是降负载——拆团队、削掉外在负载、把关注点移到平台团队——而不是再招人,让新人的协调成本本身成为下一轮负载。
这就是 Team Topologies 词汇体系的位置之所在。四个团队类型与三种交互模式,给了管理者一个重新设计团队负载的词汇表。如果团队超载,下一轮迭代不是”再招人”——是”重新设计团队的负载”。
Conway 在 100+ 上的应用
Conway 定律最有用的地方是诊断,最没用的地方是处方。诊断是更容易的那一步。挑你架构里的任何一个服务。看团队图。问:哪个团队拥有这个服务? 如果答案是”两个团队共同拥有”或”平台团队拥有,但 stream-aligned 团队 X 拥有数据模型”——Conway 漂移已经在动了。修法不是重新设计服务。修法是重新设计团队图,让所有权边界变得清晰,然后等服务跟上。
最便宜的具体干预是架构决策日志(ADR)——团队图变化时,一条 ADR 记录它,架构随之而来。架构决策日志那篇就是这个论证的操作版。先把团队图做对,架构会跟着来。
这张图是两条平行路径。左路径是纪律——团队图与 CODEOWNERS 干净对位,服务有稳定的所有权。右路径是漂移——团队图在动,但 CODEOWNERS 没动,系统正在为漂移付出代价。
用你自己的数字看一看
四种失败模式认出比度量容易。下面这个计算器是一个快速诊断。它用每个工程经理手上都有的三个代理变量:团队规模、迭代节奏、缺陷逃逸率。输出是每位开发者每周的评审负载,红绿灯是基于 DORA 精英团队表现的一条已发布的启发式。
默认读数(team_size=100, cadence=2 weeks, defect_pct=8)是一个典型的 100+ 开发者组织。输出(57.1 → 红色)不是 bug——它就是诊断。看到红灯的读者,就是身处本文所指四种失败模式之一的读者。
算一下你今天的数字 — 投入产出比
读数:红色 — 评审过载模式(取自下方脚本中已发布的启发式)。
90 秒自检
第二个诊断针对的是激励倒挂——任何其他干预都打不死的那一种。覆盖四个失败模式的十二道是非题。输出是组织在 Ron Westrum 的组织文化类型学(Reactive / Local / Federated / Generative)上的位置。
工程总监的 12 题自检(点击展开)
—
—
管理者手册
四元素表。它把文章从诊断带到行动。每个元素都装得进一个季度,且能在管理者现有权限内验证——不需要重组。
1. 要度量什么
四个 DORA 指标,按优先级排序。每个指标抓住一个(或多个)失败模式。
| DORA 指标 | 抓到的失败模式 | 为什么是它 |
|---|---|---|
| 变更前置时间(Lead time for change) | Conway 漂移 | 合并到生产太慢,意味着接缝太厚。 |
| 部署频率(Deployment frequency) | Conway 漂移 / 联邦化质量 | 频率太低,意味着接缝没有被跑动。 |
| 恢复平均时间(MTTR) | 认知负载溢出 | MTTR 太高,意味着 on-call 团队已超载。 |
| 变更失败率(Change fail rate) | 联邦化质量 / 激励倒挂 | 失败率太高,意味着接缝没有被测试。 |
如果你今天连这四个数字中的一个都报不出来,那这就是要修的第一件事。前置时间与变更失败率是两个最诊断性的。
2. 要改变什么
四个失败模式按优先级排序,每一项配一个不需要重组的 ≤ 90 天干预。
| 失败模式 | ≤ 90 天干预 | 为什么不需要重组 |
|---|---|---|
| 激励倒挂 | 把管理者级评估切到团队级 DORA 指标;将个人速率退出一级信号。 | 在现有组织图内的运营模式变更。 |
| 联邦化质量 | 指定一个单独团队拥有跨团队契约;在 leadership 层面发布系统级 DORA 仪表盘。 | 授权委托,不是重组。 |
| 认知负载溢出 | 对每个 stream-aligned 团队跑一次认知负载审计;把负载最高的团队关注点减到 ≤ 6。 | 团队形状的变更,不是组织形状的变更。 |
| Conway 漂移 | 把”CODEOWNERS 必须镜像团队图”做成 CI 检查;让每一次团队图变更都写一条 ADR。 | 仓库级纪律,不是组织级变更。 |
这个顺序不是随意的。激励倒挂排在第一,因为所有四个失败模式都会被”奖励错东西”的激励放大;把激励先修对,下三项干预会容易得多。Conway 漂移排在最后,因为它的修法最机械——靠写 ADR 与更新 CODEOWNERS 的纪律。
3. 要停止度量什么
四个与质量负相关的反向指标。
| 反向指标 | 为什么与质量负相关 |
|---|---|
| 代码行数(LOC) | 奖励 LOC 奖励冗长代码,不奖励正确代码;最高密度的模块行数最少。 |
| 每开发者 PR 数 | 奖励 PR 数奖励小 / 拆分的 PR,而不是设计良好的端到端变更。 |
| 个人速率(故事点 / 个人 cycle time) | 奖励个人速率奖励本该是团队职责的工作。 |
| 代码覆盖率(作为目标) | 奖励覆盖率奖励”写 assert true”的测试——无缺陷代码,脆弱测试。 |
四个反向指标之所以诱人,是因为容易度量。四个 DORA 指标更难落地,但是反馈形状是正确的。
4. 那一个问题
一句管理者在 1
中可以问同事或工程经理的诊断句。答案会揭示哪个失败模式对该团队最活跃。“你们团队最后一次发布了一个、其他团队直到生产环境才知道的改动,是什么时候?”
如果答案是”这个季度”,那失败模式是 Conway 漂移。如果答案是”这个月”,那就是 Conway 漂移加上联邦化质量。如果答案是”我们不知道——我们没在度量这个”,那失败模式是激励倒挂。如果答案是”从来没有”,那团队就在自检的 Generative 象限里,手册是预防性的。
这个问题被校准为:能放在 1
里问,又不像审计。它的措辞故意做成可证伪的——“我们不知道的那一次”——可以在团队的事故历史里搜到。参考文献
文章的三层框不是作者发明的。它们是软件工程领域被复现最频繁的发现。下面的文献是让这些主张站得住的最小引用足迹。
- DORA — DevOps Research and Assessments——产出四指标度量框的项目;本文把那个框视为唯一的规范集合。年度 State of DevOps 报告是上文精英与落后差距数字的数据来源。
- Forsgren, Humble, Kim — Accelerate——DORA 研究的学术发表;四个指标的实证基础。
- Skelton, Pais — Team Topologies, 2nd Edition (IT Revolution, 2025)——认知负载框;四个团队类型与三种交互模式。
- Conway, M. E. — “How Do Committees Invent?” (Datamation, 1968 年 4 月)——原文;一句话,份量很重。
- Westrum, R. — “A Typology of Organisational Cultures” (Complexity 期刊, 2004)——自检使用的 Reactive / Local / Federated / Generative 类型学。
- Consortium for IT Software Quality (CISQ) — “The Cost of Poor Software Quality in the US”——§2 引用的”两万亿美元”质量低下代价的实证依据。
如果你在 30 个人的团队上,这是预报,不是诊断
四种失败模式在 30–50 人的规模上是预报性的,在 100+ 才会急性发作。先读再框定,做笔记,等接缝开始吱嘎作响时再动手。
收尾
100+ 开发者规模上的软件质量,是接缝的属性,不是代码的属性。四种失败模式并不新。手册并不新。四个 DORA 指标并不新。新的是组合:四种失败模式一起,DORA 作为诊断框,手册作为干预——被应用在原始来源未曾专门覆盖的规模上。
那个把所有失败模式装在同一个词下的伞,是系统质量(system quality)。这个词是本文为论证目的而造出来的——质量作为团队之间接缝的属性。读到最后仍然带着这个问题走的读者,是把手册带走的读者。
一句话版
“招更多测试工程师修不好系统质量问题——而在 100+ 开发者规模上,系统质量问题是唯一重要的问题。”
评论
请接受“功能性”Cookie 类别以查看和发表评论。
评论加载失败。您可以重试,或前往 GitHub 查看讨论。
在 GitHub 上查看