第 18 章 ·《人月神话》的观点:是与非
题记是塞缪尔·勃特勒的一句俏皮话:“我们理解也好,不理解也好,描述都应该简短精练。“这一章正是照此办理——把全书论断压成一张清单,且一个字都不改。
这一章讲了什么
作者的动机写在开头:现在对软件工程的了解比 1975 年多得多,那么旧版里的观点,哪些得到了数据和经验的支持,哪些被证明不正确,哪些随着世界变化显得过时?为了便于判断,他把 1975 年版书籍中的论断毫无更改地抽取出来,以摘要形式列出,只标注"我认为是正确的:是客观事实和经验中推广的法则”;方括号里的评论是新版新增的内容。
所以这一章形式上很像附录,但读法不同:前面的章节是论证,这一章是判决。它的价值不在于新信息,而在于一位作者在二十年之后,回头给自己当年的断言逐条打分。
清单的覆盖范围与组织
命题按原书章节分组,从第 1 章《焦油坑》一直列到第 15 章《另外一面》——也就是 1975 年原版的全部内容。每一条都是陈述句,可以独立判断真假,例如"编程系统产品的开发工作量是供个人使用的独立构件程序的 9 倍”、“人月是危险和带有欺骗性的神话,因为它暗示人员数量和时间是可以相互替换的”、“Brooks 法则:为进度落后的项目增加人手,只会使进度更加落后”。
有几条被压缩得极好,几乎可以直接当格言用:“良好的烹饪需要时间,某些任务无法在不损害结果的情况下加快速度”;“任何创造性活动都伴随着枯燥艰苦的劳动,编程也不例外”;“人们通常期望项目在接近结束时收敛得快一些,然而情况却是越接近完成,收敛得越慢”。
最有意思的部分:他标注了什么
清单里最值得读的是那些带方括号的更新,以及少数几条被直接判为过时的命题:
| 原命题 | 二十年后作者的批注 |
|---|---|
| 暂存区空间尺寸与每次磁盘访问的程序数量是关键决策 | 已显得过时——起初因为虚拟内存,后来因为内存成本低廉;现在用户通常会买能装下主要应用全部代码的内存 |
| 库中每个组件需要两个版本(快的和短小的) | 现在看来,这有些过时了 |
| 软件工程师不会常规地对试验性系统做现场测试 | 现在这已成为普遍实践,beta 版本不同于有限功能的原型,alpha 版本同样是他倡导的做法 |
| 系统编程可供合理选择的语言是 PL/I | 不再正确 |
| 只有懒散和惰性会妨碍高级语言与交互式编程的广泛应用 | 如今它们已在全世界使用 |
| 流程图是被吹捧得最过分的文档 | 补一句更狠的:流程图是图形化的高级语言;并说在"很少需要超过一页纸流程图"这一点上,MILSPEC 军用标准文档需求实在错得很厉害 |
| OS/360 是画蛇添足(第二系统效应)的典型 | Windows NT 似乎是 20 世纪 90 年代的例子 |
| 采用时间块安排稀缺机时 | 在 1995 年依然如此 |
| Gold 实验:交互式调试中第一次交互的进展是后续的 3 倍 | 我认为在 1995 年依然会如此 |
他也如实记录了自己的判断分歧:第 8 章的 1.5 次幂规律旁边注明"Boehm 的数据并不完全一致,在 1.05 和 1.2 之间变化";第 4 章"功能与复杂程度的比值"后面补充说这个比值是对易用性的一种测量,要由简单与复杂应用共同验证;“体系结构与实现分离"则被追认为同样适用于小型项目。
还有一条我认为是整章最诚实的自我修正。第 7 章工作手册一节里,1975 年的原文写道:
Parnas 强烈地认为使每个人看到每件事的目标是完全错误的;各个部分应该被封装,从而没有人需要或者被允许看到其他部分的内部结构,只需要了解接口。 Parnas 的建议的确是灾难的处方。(Parnas 让我认可了该观点,使我彻底地改变了想法。)
括号里的那句话,是二十年后加上的——他公开写下了自己当年判断错了。
此外他从别人的实践里补进了几条当代经验:微软的 Jim McCarthy 说"如果你错过了一个最终期限,确保完成下一条最终期限”;有个微软团队采用了非常小而频繁的阶段(量子)变更,结果每天晚上都需要重新编译生成增长中的系统。
我的判断
- 这一章的方法本身值得学:把论断写成可判真假的陈述句,逐条留档,多年后回头打分。绝大多数作者(包括我自己写文档时)会把判断埋在流畅的叙述里,以至于几年后无法分辨哪句是当时的观察、哪句是一时的情绪。
- 他标注过时的那些条目有一个共同规律:它们都依赖于当时的资源约束(内存贵、机时稀缺、语言选择有限、原型不被接受)。约束一变,结论就失效。这印证了第 5 章的提醒——评估任何建议之前,先问它依赖的假设是否还成立。反倒是"人月不可互换"“概念完整性优先"“缺陷修复会引入新缺陷"这类关于人与认知的命题,二十年过去一条都没过期。
- “Parnas 让我认可了该观点,使我彻底地改变了想法"这句,是全书对我触动最大的一处。它不是客套,而是把一段具体的技术分歧记录成了判断的变更史。承认自己当年错了,比坚持一条正确结论更需要底气——尤其在书已经被引用二十年之后。
- 我对"流程图是图形化的高级语言"这个说法持保留:作为对流程图崇拜的反讽很精彩,但它也解释了他为何整体看低可视化表达;在第 17 章里他仍然承认图形化编程"没有令人信服的进步”,而今天的数据流图、状态机图、时序图在工程沟通中的价值是有目共睹的。这是他的一个持续盲区,而不是精确判断。
- 清单里有一类命题我认为被高估了:那些以经验数值形式出现、但样本很小的结论(比如"两个人团队常是最佳的人员使用方法”)。它们在清单里被列为事实,可实际上更接近当时的观察。作者本人在别处承认数据稀缺,这一章却把它们统一称做"客观事实和经验中推广的法则”,标准略宽。
- 不过这一章的存在本身给出了一个反例,反驳了"方法学无用"的悲观解读:一份可被逐条检验的论断清单,正是方法学能提供的东西。它不保证结论正确,但它保证结论可被证伪。
和我手上的工作有什么关系
- 我打算借用这个方法给自己的工作留一份"论断清单":在
docs/sessions/里把当时的判断写成可以判真假的句子,而不是只记"做了什么"。理由很实际——我现在回看几个月前的技术选择时,常常分不清当时是权衡后的结论,还是顺手为之。 - 那些"依赖资源约束"的失效命题,正好是我评估旧技术笔记时最需要的判据。我的笔记里也有大量类似判断(“某某方案太占内存所以不用”),而内存价格与工具链已经变了几轮。以后写这类结论时要显式写下它依赖的假设,方便未来的自己判断是否已过期。
- “Parnas 那一句"给了我一个具体的写作纪律:当我在笔记里不认同某个做法时,要写清是哪一类理由(知识不足、逻辑不通、还是约束不同)。这样即便后来改主意,也能知道是被什么说服的。这正是阅读协议里"评论要落到具体理由"那一条的实践价值。
- 他补进来的当代经验提醒我:这一章的更新大多来自别人告诉他的事。这一节几乎全是引用 Jones、Boehm、McCarthy、Yourdon、DeMarco、Parnas 等人的来信与评论。对我这种独立工作的人来说,这是个缺口——我缺少这种"同行来信"式的纠错渠道,能做的替代是把结论公开写出来,接受读者的反驳。
- 最后一条与这个系列本身有关:这份读书笔记写到现在,已经有十八篇结论。按这一章的思路,我应该在结束语那一篇里回头做同样的事——列出自己从这本书里得到的论断,并标明哪些是我确认的、哪些还在存疑。这比再写一段抒情式总结有用得多。
一句话记住
把论断写成可判真假的句子、逐条留档,二十年后回来打分——这既是对读者的诚实,也是唯一能让经验真正沉淀下来的方式;而经受住时间检验的,几乎都是关于人和认知的命题,不是关于当时资源约束的命题。