跳到主要内容

质量:人人都要,各说各话 — 在定义它之前,别谈追求它

这一章讲三件事: 为什么「质量第一」喊着容易做着难;质量和开发效率之间的兑换率是多少; 以及为什么不趁早谈质量、事后就再也没有机会。 全书剩余的 190 多条原则,做的都是同一件事:给「质量」这个词的不同侧面各修一条路。

1. 先看现象:质量会议开不出结果

项目例会上,「提高质量」通常全票通过。然后:

  • 开发负责人说:质量是设计优雅、代码干净;
  • 客户说:我要的是响应快、不宕机;
  • 老板说:质量是按期、不超预算;
  • 市场说:质量是什么需求都满足

四个都说的是「质量」,四个说的是四件事。更麻烦的是,它们互相冲突: 把代码写得极其优雅往往要拖工期,把响应时间压到极限往往要堆成本。 作者把这叫温伯格的「政治困境」:你优化任何一个人关心的质量时,通常就在损害另一个人关心的质量1

这一章要解决的不是「怎么提高质量」,而是更前面的问题:先承认质量是个多义词,再逼项目把词义钉死。

2. 顶层全景:质量的兑换链

「质量第一」(原则1)
│ 但质量没有唯一定义(原则2)

项目必须自选:优化谁眼里的质量?
│ 选完就付出了价签(原则3):效率下降

极高质量买得起吗?──买得起(原则4):有实价


但只有一条路:开发时就做对(原则5)
└─ 优先买哪种质量?(原则6):可靠性 > 效率

图说:本章六个原则排成一条单行道:先认账(多义词)→ 付价签(效率)
→ 看天花板(做得到)→ 记住唯一入口(开发时)→ 站位(可靠性优先)。

3. 核心原理

3.1 质量第一:什么意思,什么不意思

原则 1 的原文态度极端:质量必须放在首位,没有可商量的余地。 作者承认,「即使质量没达标也按时交付」看起来是政治正确,但这是短视,「从中长期来看,这样做是自杀」2

这条原则的可执行部分,是 Yourdon 给的三句「不」2。当有人说出下面的话,正确回答是说「不」:

场景危险在哪
「测试压缩一周,先上线」没跑过的缺陷直接到了用户手里
「剩这几个小 bug 就别管了」「小」是谁判的?修 bug 越晚越贵(第 04 章给数字)
「需求和设计还没定,就先写代码」基础没打就开始盖楼(第 07 章专讲)

3.2 质量的四张脸

同一份软件,四个相关方看到四种质量1:

谁在看他说的「质量」是
开发者设计优雅、代码干净
紧张环境里的客户响应快、吞吐(单位时间里能干完的活)也大
成本敏感的项目便宜
另一些客户已知和未知的需求全满足

这个表的含义不是「相对主义」,而是一条纪律:项目必须挑出优先级,并且向所有相关方明说1。 不挑,就等于把挑选权交给了嗓门最大的人。

3.3 主走查:五个团队,同一份需求,五种「质量」

「优化谁眼里的质量」不是一个哲学问题——它直接决定交付物长什么样。 书里引用了一个里程碑式的实验(Weinberg 与 Schulman):五个开发团队拿到完全相同的需求, 唯一的区别是每个团队被告知优化的东西不同:开发时间、程序大小、占用的数据空间、程序清晰度、用户友好度。 结果:除一个团队外,其他四个团队做出的程序,都恰好在自己被指定的那个属性上排第一3

把这个实验走成一张具体的账(交付物的各项数字是为演示编的,量的规律来自原实验):

团队被要求优化交付时长代码量内存占用可读性打分
开发时间6 周(最快)
程序大小12 周最小
数据空间11 周最小
程序清晰度10 周最高
用户友好度9 周

(时长与打分的具体数字为演示编的;实验的真实结论只有一句:告诉团队优化什么,团队就真的优化出了什么。)

倒过来读这张表,就是这条原则的管理用法:

  • 你对团队说「工期、大小、可维护性、性能、友好度重要」——结果是什么都得不到优化4;
  • 你只点名一两个,其余明说「这次不重要」——被点名的就会真的变好。

3.4 质量和效率的兑换率:有实测数字

原则 3 说效率与质量密不可分,而且给了配对的数: 贝尔实验室实测,要求每千行代码 12 个缺陷(bug,指程序里会造成错误行为的毛病)时, 一个人的产出是每月 150300 行代码;一旦想再提速,缺陷密度就上升5

先解释两个计量单位,后面全书都要用:

  • 人月:1 个人干 1 个月的工作量,用来量「投入」;
  • 代码行(KLOC 里的 K=千):用来量「产出」。两个都是粗糙的尺子,粗糙在哪,第 10 章专讲——这里先用。

这组数字的价值在于配对:「每千行 12 个缺陷」是当时相当严格的质量线, 对应「每月 150300 行」的产出线。它们是一枚硬币的两面—— 想把产出线抬高而质量线不动,实测结果是质量线先破5

3.5 极高质量买得起吗?买得起,看价签

原则 4 给了一个正面例子,数字完整,值得整段走一遍6:

IBM 为美国宇航局航天飞机开发的机载飞行软件:约 300 万行代码; 造价每行高达 1000 美元(参照:同一个书架上的另一组数——普通商业项目做不到这个价,它的参照物是下面的质量线); 发布后每万行代码发现的缺陷少于 1 个

拿 3.4 节的数当参照物:贝尔实验室那条「严格」的质量线是每千行 12 个缺陷, 航天飞机软件是每万行不到 1 个——**好上 1020 倍**。价签也明确:每行 1000 美元,300 万行就是 30 亿美元量级 (乘法是我们做的,书里给了单价与行数)。

作者随后开列「怎么做到」的清单,恰好是后面各章的目录6:

方法在哪一章细讲
让客户参与第 03 章
原型设计(全面开发前验证需求)第 03 章
保持设计简单第 06 章
审查代码第 07 章
雇最优秀的人第 09 章

3.6 唯一的入口在开发时;先买可靠性

质量没法事后补。 原则 5 的论证是一句反问:你全力做,高质量都不容易; 不全力做,凭什么指望改进的时候补回来?这也是「一次性原型不能转成产品」的主要原因—— 粗糙的东西改不成精致的东西,只能重做7

要买质量,先买可靠性。 原则 6 给了排序的理由:效率低,通常还能定位到拖时间的部件, 单独重做它(书里预告了这个办法,第 12 章的性能剖析一节兑现);而可靠性差, 问题可能上线多年才暴露、难以隔离,极端情况会伤人8

把这一节和 3.5 合起来,就是本书质量观的全图: 质量的极致买得起(但按行计价);它只有一个入口(开发时);入口处先排座位(可靠性坐第一排)。

4. 作者的判断与证据

说法谁的证据
质量没达标也交付=自杀作者(原则 1)2论断;附 Yourdon 的三句「不」
质量多义且互斥作者引温伯格1观察;「政治困境」是温伯格的命名
五团队各赢所求作者引实验3有对照的实验(一个团队未达标,书里没说是哪个、差多少)
质量线↔产出线配对作者引贝尔实验室5实测数据(样本范围书里未给)
零缺陷不等于有价值温伯格「无差错谬论」9论断;书里用它反过来钉住需求侧(开发错系统,一切白费)

判断(我们的,不是书里的): 把 3.3 的实验结论放到今天,它的现代版本是: 代码评审关注什么,提交就长什么样。 团队被要求「小步快跑」就真的一堆小提交, 被要求「测试覆盖」就真的多测试——这条规律的适用范围早就超出了当年的五个团队。 如果错,会错在: 如果团队的产出主要由个人能力而非被告知的目标决定(见第 09 章:工程师之间差 25 倍), 那么目标设定的作用就会被高估——稳妥的读法是:目标决定方向,能力决定幅度,两者都在起作用。

5. 边界与局限

  • 数字是 1980 年代前后的。 贝尔实验室的产出线(每月 150~300 行)、航天飞机的价签(每行 1000 美元) 都属于大型机与汇编的年代;「代码行」这把尺子本身的问题第 10 章会拆。 配对的规律(质量线紧则产出线松)没有过时,具体的数不能直接套用。
  • 「质量第一」没有给出仲裁机制。 作者说项目必须排优先级并明示各方(3.2 节), 但谁来拍板、冲突时听谁的,书里留给了管理者(第 09 章)。
  • 「效率不重要了」是误读。 作者 2021 年复审时说「先正确再提速」这条可以少担心(硬件快了)10, 但被松掉的是微优化,不是 3.6 的排序:可靠性优先于效率的排序,他没有收回。

6. 可带走的

  1. 开质量会前先问一句:这次优化谁眼里的质量?——四个相关方四种答案,不点名就等于弃权;
  2. 「工期、质量、成本、功能都重要」等于什么都没说;只点名一两个,并且明说其余的代价;
  3. 质量线与产出线一起动:实测「每千行 12 个缺陷」对应「每月 150300 行」,提速先破质量线;
  4. 极高质量买得到:航天飞机软件每万行缺陷不到 1 个,代价是每行 1000 美元——把「不可能」改成「报价」;
  5. 质量无法事后补:粗糙的原型改不成精致的产品,要精致就重做;
  6. 买质量先买可靠性:效率低有救,可靠性差会埋雷多年;
  7. 零缺陷对价值什么也没说:消除了所有缺陷,也救不了「开发的不是客户要的系统」。

7. 原文地图

主题原书章原文位置
质量第一、三句「不」第2章 一般原则text/14-ch02.txt:11(搜「自杀」)
质量四张脸、政治困境第2章 一般原则text/14-ch02.txt:19(搜「政治困境」)
效率与质量配对数字第2章 一般原则text/14-ch02.txt:27(搜「150~300」)
航天飞机软件的价签与质量线第2章 一般原则text/14-ch02.txt:35(搜「1000美元」) · text/14-ch02.txt:35(搜「300万行」)
质量无法事后补第2章 一般原则text/14-ch02.txt:45(搜「一次性原型」)
可靠性优先于效率第2章 一般原则text/14-ch02.txt:53(搜「人员伤害」)
五团队实验第7章 管理原则text/19-ch07.txt:175(搜「五个软件开发团队」)
都重要=都不优化第7章 管理原则text/19-ch07.txt:177(搜「同等重要」)
无差错谬论第6章 测试原则text/18-ch06.txt:89(搜「无差错谬论」)
「先正确再提速」2021 改口作者序text/08-fm.txt:51(搜「94」)

Footnotes

  1. 出处:「第2章 一般原则」第 19 段(text/14-ch02.txt:19,搜「政治困境」)。四种质量口径与「必须确定优先级并清晰传达」同段。 2 3 4

  2. 出处:「第2章 一般原则」第 11 段(text/14-ch02.txt:11,搜「自杀」)。Yourdon 三句「不」的原文:加速测试、忽视剩余的少量 bug、在需求或设计达成一致前就开始编码。 2 3

  3. 出处:「第7章 管理原则」第 175 段(text/19-ch07.txt:175,搜「五个软件开发团队」)。Weinberg 与 Schulman 的实验;原文说「除了一个团队之外,其他所有团队……都为最佳」。 2

  4. 出处:「第7章 管理原则」第 177 段(text/19-ch07.txt:177,搜「同等重要」)。

  5. 出处:「第2章 一般原则」第 27 段(text/14-ch02.txt:27,搜「150~300」)。贝尔实验室数据,原书括注 Fleckenstein,1983。「试图提高开发效率时,bug 的密度就会增加」同段。 2 3

  6. 出处:「第2章 一般原则」第 35 段(text/14-ch02.txt:35,搜「1000美元」)。「300 万行」「每万行代码中发现的错误少于一个」以及方法清单(客户参与、原型、简单设计、代码审查、最优秀的人)同段。 2

  7. 出处:「第2章 一般原则」第 45 段(text/14-ch02.txt:45,搜「一次性原型」)。

  8. 出处:「第2章 一般原则」第 53 段(text/14-ch02.txt:53,搜「人员伤害」)。

  9. 出处:「第6章 测试原则」第 89 段(text/18-ch06.txt:89,搜「无差错谬论」)。温伯格的原话:大量错误证明软件毫无价值,但零错误对软件的价值什么也不能说明;除非在开发正确的系统,否则消除错误是浪费时间。

  10. 出处:「作者序」第 51 段(text/08-fm.txt:51,搜「94」)。原条目见「第5章 编码原则」第 19 段(text/17-ch05.txt:19,搜「正确」)。