跳到主要内容

预言与人性 — 原则管不到的地方

这一章讲五件事: 性能问题的两条戒律(别早优化、没有万能药); 布鲁克斯法则的算术;康威定律与组织编排;第二系统综合征与功能蔓延; 以及车轮和牦牛这两个自我陷阱。收尾接原书后记:回到人。 主走查:12 人月项目的排期算术(书里原例)。

1. 性能:两条同源的戒律

这一节回答:什么时候可以追求「快」——答案的形态是两条禁令,而不是一个方法。

优化(原书叫「性能调优」:让程序跑得更快、更省内存与磁盘的修改)有一条反直觉的铁律, 两条箴言的说法互相印证1:

  • 「不要在编程之初就对代码进行优化」(对所有人);
  • 「编程之初暂时不要对代码进行优化」(「暂时」二字是给专家留的2)。

为什么这么狠?因为过早优化是一笔六重的亏本买卖3:

代价机制
可读性变低优化改掉「简单直接」的逻辑,难以表达意图
质量变差复杂化藏得住故障;「答不出正确答案也枉然」
复杂度增大用后门强化模块依赖,失去可移植性
阻碍维护不自然的描述让流程难追踪,还限制可扩展性
与环境冲突为特定处理器选的数据类型,在别的处理器上反而更慢
工作量增多优化本身是额外工程,找错对象=纯亏

深层机制,UNIX 优化原则一节讲得更透:过早优化会同时破坏透明性与简单性, 而「代码越简单,可优化之处就越容易被找到」——先优化反而堵死了后优化4。 正确顺序:先写正确、简单、可读的代码(哪怕它慢),再系统地找收益最大的地方动手5

收益最大的地方怎么找?热点——占用大部分处理时间的那一小段代码。 书里给的调优流程是一台测量机器6:证明优化必要(用户可能根本没那么在意)→ 测量、找出热点 → 只优化热点 → 再测量(「性能差的部分是无法推测出来的」, 优化效果只能靠测量得知)→ 验证没引入新问题。 配套的一条现实感:软件整体性能的大头常在架构、中间件、库、部署这些代码之外的因素, 一行行代码的影响「十分渺小」7——所以深层的性能设计要趁早(如通信协议), 但那是设计决策,不是代码优化8

还有一条与本书其他原则汇合的暗线:热点的存在本身就是 80:20 定律 (帕累托法则:整体中约 20% 的元素贡献约 80% 的结果)在代码上的形态—— 20% 的代码集中 80% 的故障、80% 的处理时间(实际比例「更小」)9。 这给了「先测量再动手」一个统计学的底气:优化者最大的敌人不是慢,是找错地方

万能药:同一个错误的另一副面孔

预言的第二个灾区是工具。80-10-10 原则:再好的高水平工具, 也只能在短时间内实现用户需求的 80%;剩下 20% 里,10% 要下苦功, 10% 完全不可能——追求 100% 满足,开发就进退两难10

这不是猜想,是全行业花十几年做过的实验:从 1990 年代中期起,业界举全行业之力 造「让平庸技术人员效率飞跃」的万能工具——这就是所谓「模型驱动开发」、4GL(第四代编程语言, 按业务概念描述程序的高级语言),结论是「用一个工具解决所有问题的万能药路线显然走不通」—— 工具的功能限制造出自己的「防守范围」,而软件要处理的问题范围是无限的11。 正确姿势:积极导入工具,但先做模拟开发验证适用范围再正式导入; 实在缺的 10%,按项目特征造「对症药」(用元编程能力强的动态语言造专用小语言)12

与「早优化」「万能药」同源的,还有 UNIX 多样性原则那句判词: 对任何宣称「唯一正确方法」的言论都应持怀疑态度——人的想象力有限, 「『存在唯一正确的方法』这种态度既狂妄又不成熟」13。 三条戒律一句话归并:别替未来做你没有信息做的决定

2. 布鲁克斯法则:人数和月数不可交换

这一节回答:进度落后了,加人为什么火上浇油——全书最著名的一条「法则」。

布鲁克斯法则(出自《人月神话》,布鲁克斯是 IBM 大型机系统 OS/360 的负责人): 开发进度滞后的项目,后半程添加人手,只会让进度延误进一步加重14

主走查:12 人月的算术(书里原例)

项目工作量以「人月」计(1 人干 1 个月=1 人月)。书里的例子走一遍15:

需求:一个 12 人月的项目

客户:6 个月交付
12 人月 ÷ 6 个月 = 2 人 —— 合理

客户:很急,2 个月交付!
12 人月 ÷ 2 个月 = 6 人 —— 按乘法该成立
现实:「6×2」和「2×6」并不相同。
2 人协作的效率,与 6 人协作的效率不可同日而语[^16]。

加人为什么亏?两个机制[^17]:
① 工作有依赖:拆分任务、互相确认、沟通路径都要新增负担
——人不是独立产能,加 1 人加的不只是 1 份力,还有 N 条沟通线
② 培训占用产能:新人要先学本项目知识,教他的又是项目成员
——新团队整体效率下滑,「在新人真正发挥作用之前,
整个项目的进度都是滞后的」

图说:书里的解毒剂——重排时间表、与用户协调优先级、阶段式发布[^18]。

布鲁克斯自己给这个法则配的比喻已成名言:「把 10 个孕妇凑到一起, 妊娠过程也不可能缩短到一个月」——生产效率不是劳动力相加16

法则还有一维同样冷峻:人与人不可交换。物理空间里的人差距最多几倍, 信息空间不受物理制约——程序员之间的差距「据说能差 30 倍」; 而且真正的差距不在「同一时间写多少代码」,在有无之别:能不能用、bug 多少、 快慢、可读性——每一项都让维护成本差出量级17。 结论是管理动作:能干的程序员不是可交换的「1 人月」,要留任固定职责18

3. 康威定律:架构是组织的影子

这一节回答:系统的形状为什么总跟团队的形状一模一样——以及能不能反过来。

康威定律:软件的结构(架构)反映创建它的组织的结构。 书里的经典例子:三个组做编译器,得到三遍扫描的编译器(Three-Pass); 四个组做,得到四遍扫描的19

机制在信息流动:组织内部的信息交流沿组织结构走, 而架构以信息交流为基础——「软件的架构是由组织结构的通信路径形成的」20。 这不是道德问题,是物理问题:谁跟谁能频繁说话,谁们的产物就连得紧

对策是一个顺序反转:先设计架构,再按架构编排组织—— 让组织从属于架构,而不是架构从属于组织21。但书里补了两个时间的陷阱22:

  • 架构早期是半成品、不稳定,过早绑定组织,组织会跟不上架构的变化;
  • 架构充分验证之后再定组织,比较高效。 以及三角铁律:组织、架构、过程(开发方式)互相咬合——按技术分工的组 (数据库组、前端组、测试组)硬跑敏捷,「即使采用了敏捷开发,也不能一点一点地进行发布」23。 (这一条在今天演成了「按业务边界建团队」的实践,书里给出了机制,未用今天的名词。)

4. 第二系统综合征:成功的诅咒

这一节回答:为什么最危险的版本是第二版——以及功能蔓延怎么杀死一个软件。

第二系统综合征(Second system syndrome):由同一批人做的第二版软件, 倾向于功能过多、质量下降、使用体验变差24

机制是心理的,书里给得很清楚25:做第一版时未知多、风险高,判断慎重—— 想到的好功能都忍着留给下次;做第二版时信息多了、自信了, 把保留功能和想到的新功能一股脑加进去。结果:代码复杂难维护, 功能本身也复杂难用——「添加的功能也没能得到人们的青睐」。 还有一层浪费:第一版时保留的那些功能,到第二版可能已经过时——白做了。

两个对策26:

  • 自制力:它的抓手是把用户具象化——写代码时反复问: 用户是谁?用户需要什么?用户认为什么是必要的?用户想要什么? 心里有一个具体的人,加功能的冲动就戴上了枷锁;
  • 敢于说 NO:与核心无关的功能,「我们要明确地说『NO』」; 实在拒绝不了,做成插件或扩展,不进主体——软件核心保持简单27

它还有个慢性的后续:第二系统后综合征——持续发布的软件(如数据包软件) 功能只增不减,「功能一旦发布就很难有机会删除」28。 与之配套的现象是功能蔓延(feature creep):无条件满足用户愿望, 「该现象意味着软件开始迈向破灭(或者已经破灭了)」29。 书里点出的悖论值得抄录:越是简单优质、用户众多的软件,需求越多; 忠实满足所有需求,软件就会失去简单性,变成没人用的软件30

5. 车轮与牦牛:两个自我陷阱

这一节回答:最后两个失败模式不在系统里,在工程师自己身上。

重新发明车轮:明明有现成的代码、库、标准协议,却自己重写一遍31。 动机分两种32:

  • 不知道车轮:知识不足——重写标准库已有的功能、放着标准协议不用自造格式; 解法是动笔前先查:标准库、源码公开的现成库、标准协议,「编写代码之前,一定要先确认」;
  • 想制作车轮:NIH 综合征(Not Invented Here,「非我发明」)—— 出于技术兴趣或排斥别人做的东西而重造。 解法是提醒自己:软件的目的是满足用户,不是满足程序员的欲望。

书里也给了允许重造的两个例外,同样有力33:

  • 商业核心:用现成件=对核心失去控制权+放弃差别化;核心必须自己长;
  • 学习:借来的代码用得再熟也是黑箱,「只看水面的话,我们是无法得知水下隐藏着何种危险的」—— 从零亲手做一遍的失败,比黑箱的顺利宝贵34

给牦牛剃毛(Yak Shaving):为了解决问题 A,发现要先解决 B,B 又牵出 C…… 一环套一环,最后忘了 A 是什么。书里的例链是装一个任务自动化工具: 文件太大→装下载工具→下载工具要前置模块→注册用户→浏览器太老→升级浏览器→ 装好了还跑不起来→要操作系统补丁……(「后面依然没完没了」)35

它的可怕在认知结构:问题冒出的速度超过解决的速度,大脑像 (后进先出的暂存结构)一样把问题一层层压进去,「出栈速度赶不上入栈速度, 导致脑内栈溢出」36。对策三条37: 发觉偏离就,回想最初的目标;时间成本明显不划算就换路; 把过程写进团队共享笔记,防止别人在同一头牦牛上剃第二遍。 写代码、读代码时同理:边操作边记——「不做记录的话就可能会有陷入循环思考的状态」38

6. 经济原则:算账的收尾

把本章的「人」主题合拢的,是 UNIX 思想里最不像技术的一条——经济原则: 程序员的时间是宝贵资源(最该省着用的东西),值得珍惜39。 浪费它的常见因素:开发机太慢(编译等待、窗口切换)、装不了需要的工具(手动顶替)、 连不上需要的网站(「信息处理技术人员是不能与信息相隔绝的」)40

账很直白:省设备钱省的是小头,花在程序员身上的钱远高于设备; 对设备投资=间接对人投资,「收支必然为正」41。 规章制度同理:安全是目的,但「如果规章制度阻碍了开发,降低了商业效率,那就本末倒置了」—— 越优秀的人越容易被束缚、失去热情42。 这是全书唯一一条「花钱解决问题」的原则,也是最诚的一条: 前九十九条都在优化时间的使用,这一条提醒你别把时间饿死

7. 后记:回到人

原书后记把主题从编程升到做人,三条,收束全书43:

  • 关怀(Mayeroff《关怀的力量》):帮助他人成长,本身完成自己的自我实现。 程序员的关怀对象是代码和读代码的人——写出能让人轻松读懂的代码, 「这些关怀最终会回报到自己身上」;
  • 道德法则(康德):永远把人当目的,绝不只当手段。用户不是流量、不是 KPI, 「软件的用户和自己一样都是拥有人格的人类」——程序员与用户互相贡献,不是互相利用;
  • 中庸(亚里士多德):德是过剩与不足之间的恰到好处。落到本书最实用的一句: 解决方案的选项是「渐变色」——黑与白之间有无数种灰, 不存在二选一;选哪种灰,靠语境(第 02 章的那个人)给的信息找平衡点44

「中庸」这条其实是全书的方法论宣言:101 条原则没有一条是无条件的, 序章早说过相悖时取平衡、追求「更优解」45——后记只是给它安上了两千年前哲学的名字。

8. 作者的判断与证据

书里给了证据的:

  • 布鲁克斯法则与 12 人月例子出自《人月神话》,软件工程史上被复现讨论最多的管理观察之一;
  • 4GL/模型驱动开发的行业实验是真实历史(1990 年代大规模投入后普遍退潮);
  • 康威定律出自 Fred Brooks 时代的组织研究(原书经《组织模式》转引),有半个世纪的实证讨论。

作者的推测与展开,要分开看的:

  • 「30 倍」的程序员差距,书内自己用的是「据说」——传闻级数据,本书只作量级参考;
  • 「第二系统后综合征」是对经典理论的延伸,作者自己划了适用条件(用户群体不固定);
  • 十诫、三大美德属于社区行话的转述,证据强度是「行业共识」,不是研究结论。

9. 边界与局限

  • 布鲁克斯法则不反对一切加人。它反对的是后半程赶工式加人;项目前半程的扩容、以及把任务切到真正独立后再加人,不在法则射程内——书里的两个机制(依赖、培训)正好给出判据。
  • 康威定律的「先架构后组织」在快速变化的市场里可能倒挂:组织定下来后架构反复重构是今天更常见的次序;书内也承认架构早期不稳定,但没展开倒挂情形。
  • 80-10-10 的比例是经验值,不是测量值;它的用途是心理预期管理(承认有永远做不完的 10%),不是排期公式。
  • 热点只覆盖时间性能;内存、能耗、网络成本等其他性能层面书内点到(效率性一节)但未展开调优流程。
  • 2016 年后的进展:AI 辅助编程正在改变「程序员时间」的单位成本,经济原则的比价关系在变——原则(珍惜人的时间)仍在,参考价(设备便宜、人贵)需要重估。补充(不在书里,来自通用知识)。

10. 可带走的

  1. 测了才许优化:先证明必要性,再找热点,改完再测——「性能是无法推测出来的」;
  2. 记住 80:20 的形态:少数代码吃掉多数时间、多数故障——优化和排错都从热点下手;
  3. 警惕万能药:任何工具都有 10% 做不到的地带;导入前先做一次模拟验证;
  4. 排期紧,调整优先顺序;别加人——人数乘不出工期,孕妇的比喻记住就好;
  5. 能干的工程师不是人月:留人比补人便宜;
  6. 改组织之前先定架构,架构稳定之前别定死组织;按业务边界建团队,敏捷才跑得动;
  7. 第二版危险:上功能前先具象出一个具体的用户,再问一遍「他真的要吗」;
  8. 敢说 NO,或者做成插件——核心保持简单;
  9. 动笔前先找车轮:标准库、源码公开的现成库、标准协议;想造轮子时,问是学习还是 NIH;
  10. 牦牛出现就停下来写下路标:目标是什么、走到哪了、别让下人再剃一遍;
  11. 给程序员买设备别抠——设备钱是所有人时间里最便宜的杠杆。

11. 原文地图

主题原书章原文位置
优化两条箴言5.3 性能调优的箴言text/72-ch05.txt:218(搜「编程之初」) · text/72-ch05.txt:219(搜「适用于专家」)
六笔代价5.3 性能调优的箴言text/72-ch05.txt:230(搜「可读性变低」) · text/72-ch05.txt:247(搜「复杂度增大」) · text/72-ch05.txt:265(搜「与环境相冲突」)
软件性能的大头5.3 性能调优的箴言text/72-ch05.txt:301(搜「执行环境」) · text/72-ch05.txt:313(搜「渺小」)
调优流程与热点5.3 性能调优的箴言text/72-ch05.txt:334(搜「证明优化的必要性」) · text/72-ch05.txt:344(搜「热点」) · text/72-ch05.txt:355(搜「推测出来」)
架构层性能早测5.3 性能调优的箴言text/72-ch05.txt:316(搜「架构的性能」)
先正确后快、删除键3.52 优化原则text/58-ch03-52.txt:6(搜「正确性」) · text/58-ch03-52.txt:19(搜「透明性」) · text/58-ch03-52.txt:47(搜「删除键」)
80-10-10 定义7.5 80-10-10原则text/74-ch07.txt:410(搜「80%」) · text/74-ch07.txt:412(搜「进退两难」)
万能药实验7.5 80-10-10原则text/74-ch07.txt:422(搜「万能工具」) · text/74-ch07.txt:427(搜「防守范围」) · text/74-ch07.txt:440(搜「模拟开发」)
对症药7.5 80-10-10原则text/74-ch07.txt:443(搜「对症药」)
80:20 帕累托7.5 80-10-10原则text/74-ch07.txt:450(搜「80:20 原则」) · text/74-ch07.txt:466(搜「80%的故障」) · text/74-ch07.txt:471(搜「更小」)
多样性:唯一正确方法3.53 多样性原则text/59-ch03-53.txt:8(搜「多种方法」) · text/59-ch03-53.txt:17(搜「狂妄」)
布鲁克斯法则定义7.1 布鲁克斯法则text/74-ch07.txt:11(搜「火上浇油」)
12 人月算术7.1 布鲁克斯法则text/74-ch07.txt:25(搜「12 人月」) · text/74-ch07.txt:28(搜「6×2」)
依赖负担与培训7.1 布鲁克斯法则text/74-ch07.txt:37(搜「依赖关系」) · text/74-ch07.txt:46(搜「培训新人」)
重排时间表7.1 布鲁克斯法则text/74-ch07.txt:54(搜「重新制订时间表」)
生孩子比喻、30 倍7.1 布鲁克斯法则text/74-ch07.txt:65(搜「妊娠过程也不可能缩短」) · text/74-ch07.txt:77(搜「30 倍」)
人与人不可交换、留任7.1 布鲁克斯法则text/74-ch07.txt:85(搜「计算差距已经没有意义」) · text/74-ch07.txt:111(搜「1 人月」)
康威定律、编译器例7.2 康威定律text/74-ch07.txt:149(搜「反映了」) · text/74-ch07.txt:150(搜「Three-Pass」)
通信路径、顺序反转7.2 康威定律text/74-ch07.txt:166(搜「通信路径」) · text/74-ch07.txt:167(搜「先设计架构」)
半成品陷阱、过程契合7.2 康威定律text/74-ch07.txt:179(搜「半成品」) · text/74-ch07.txt:188(搜「敏捷过程」)
第二系统定义7.7 第二系统综合征text/74-ch07.txt:547(搜「最危险」)
心理机制7.7 第二系统综合征text/74-ch07.txt:554(搜「慎重」) · text/74-ch07.txt:557(搜「一股脑」)
用户具象化7.7 第二系统综合征text/74-ch07.txt:569(搜「具象化」)
第二系统后、功能蔓延、说 NO7.7 第二系统综合征text/74-ch07.txt:582(搜「第二系统后」) · text/74-ch07.txt:601(搜「功能蔓延」) · text/74-ch07.txt:607(搜「NO」)
车轮两种动机7.8 重新发明车轮text/74-ch07.txt:644(搜「不知道车轮」) · text/74-ch07.txt:659(搜「NIH」)
允许重造:商业与学习7.8 重新发明车轮text/74-ch07.txt:679(搜「商业目的」) · text/74-ch07.txt:693(搜「学习目的」) · text/74-ch07.txt:703(搜「水下」)
牦牛对话链7.9 给牦牛剃毛text/74-ch07.txt:747(搜「任务自动化工具」) · text/74-ch07.txt:762(搜「补丁包」)
栈溢出、写下来7.9 给牦牛剃毛text/74-ch07.txt:788(搜「栈」) · text/74-ch07.txt:793(搜「写下来」)
尽早收手、共享笔记7.9 给牦牛剃毛text/74-ch07.txt:772(搜「尽早收手」) · text/74-ch07.txt:117(搜「共享」)
经济原则3.50 经济原则text/56-ch03-50.txt:8(搜「宝贵资源」) · text/56-ch03-50.txt:39(搜「回本」) · text/56-ch03-50.txt:41(搜「本末倒置」)
后记:关怀/道德法则/中庸后记text/75-fm.txt:6(搜「关怀」) · text/75-fm.txt:21(搜「道德法则」) · text/75-fm.txt:40(搜「中庸」) · text/75-fm.txt:48(搜「渐变色」)

Footnotes

  1. 出处:「5.3 性能调优的箴言」第 218 段(text/72-ch05.txt:218,搜「编程之初」)。

  2. 出处:「5.3 性能调优的箴言」第 219 段(text/72-ch05.txt:219,搜「适用于专家」)。

  3. 出处:「5.3 性能调优的箴言」第 230 段(text/72-ch05.txt:230,搜「可读性变低」)、第 239 段(text/72-ch05.txt:239,搜「质量变差」)、第 247 段(text/72-ch05.txt:247,搜「复杂度增大」)、第 255 段(text/72-ch05.txt:255,搜「阻碍维护」)、第 265 段(text/72-ch05.txt:265,搜「与环境相冲突」)、第 273 段(text/72-ch05.txt:273,搜「工作量增多」)。

  4. 出处:「3.52 优化原则」第 19 段(text/58-ch03-52.txt:19,搜「透明性」)与「怎么做」第 47 段(text/58-ch03-52.txt:47,搜「删除键」)。末句引文「代码越简单,可优化之处就越容易被找到」见 text/58-ch03-52.txt:39(搜「可优化之处」)。

  5. 出处:「3.52 优化原则」第 37 段(text/58-ch03-52.txt:37,搜「系统地」)。

  6. 出处:「性能调优的流程」第 334 段(text/72-ch05.txt:334,搜「证明优化的必要性」)、第 344 段(text/72-ch05.txt:344,搜「热点」)、第 355 段(text/72-ch05.txt:355,搜「推测出来」)。

  7. 出处:「软件的性能」第 301 段(text/72-ch05.txt:301,搜「执行环境」)与第 313 段(text/72-ch05.txt:313,搜「渺小」)。

  8. 出处:「架构的性能」第 316 段(text/72-ch05.txt:316,搜「架构的性能」)。

  9. 出处:「80:20 原则」第 466 段(text/74-ch07.txt:466,搜「80%的故障」)与第 471 段(text/74-ch07.txt:471,搜「更小」)。

  10. 出处:「7.5 80-10-10原则」第 410 段(text/74-ch07.txt:410,搜「80%」)。

  11. 出处:「7.5 80-10-10原则」第 422 段(text/74-ch07.txt:422,搜「万能工具」)与第 427 段(text/74-ch07.txt:427,搜「防守范围」)。

  12. 出处:「7.5 80-10-10原则」第 440 段(text/74-ch07.txt:440,搜「模拟开发」)与第 443 段(text/74-ch07.txt:443,搜「对症药」)。

  13. 出处:「3.53 多样性原则」第 17 段(text/59-ch03-53.txt:17,搜「狂妄」)。

  14. 出处:「7.1 布鲁克斯法则」第 11 段(text/74-ch07.txt:11,搜「火上浇油」)。

  15. 出处:「7.1 布鲁克斯法则」第 25 段(text/74-ch07.txt:25,搜「12 人月」)。

  16. 出处:「生产与生孩子」第 65 段(text/74-ch07.txt:65,搜「妊娠过程也不可能缩短」)。

  17. 出处:「人与人也不可交换」第 77 段(text/74-ch07.txt:77,搜「30 倍」)与第 85 段(text/74-ch07.txt:85,搜「计算差距已经没有意义」)。

  18. 出处:「人与人也不可交换」第 111 段(text/74-ch07.txt:111,搜「1 人月」)。

  19. 出处:「7.2 康威定律」第 150 段(text/74-ch07.txt:150,搜「Three-Pass」)。

  20. 出处:「7.2 康威定律」第 166 段(text/74-ch07.txt:166,搜「通信路径」)。

  21. 出处:「7.2 康威定律」第 167 段(text/74-ch07.txt:167,搜「先设计架构」)。

  22. 出处:「7.2 康威定律」第 179 段(text/74-ch07.txt:179,搜「半成品」)与第 181 段(text/74-ch07.txt:181,搜「充分验证」)。

  23. 出处:「组织结构与过程」第 188 段(text/74-ch07.txt:188,搜「敏捷过程」)与第 192 段(text/74-ch07.txt:192,搜「也不能一点一点地进行发」)。

  24. 出处:「7.7 第二系统综合征」第 547 段(text/74-ch07.txt:547,搜「最危险」)。

  25. 出处:「7.7 第二系统综合征」第 554 段(text/74-ch07.txt:554,搜「慎重」)与第 557 段(text/74-ch07.txt:557,搜「一股脑」)。

  26. 出处:「7.7 第二系统综合征」第 569 段(text/74-ch07.txt:569,搜「具象化」)。

  27. 出处:「功能蔓延」第 607 段(text/74-ch07.txt:607,搜「NO」)与第 435 段(text/74-ch07.txt:435,搜「插件」)。

  28. 出处:「第二系统后综合征」第 582 段(text/74-ch07.txt:582,搜「第二系统后」)与第 589 段(text/74-ch07.txt:589,搜「很难有机会删除」)。

  29. 出处:「功能蔓延」第 601 段(text/74-ch07.txt:601,搜「功能蔓延」)。

  30. 出处:「功能蔓延」第 603 段(text/74-ch07.txt:603,搜「终极之美」)。

  31. 出处:「7.8 重新发明车轮」第 629 段(text/74-ch07.txt:629,搜「重新开发」)。

  32. 出处:「7.8 重新发明车轮」第 644 段(text/74-ch07.txt:644,搜「不知道车轮」)与第 659 段(text/74-ch07.txt:659,搜「NIH」)。

  33. 出处:「允许重新发明车轮的情况」第 679 段(text/74-ch07.txt:679,搜「商业目的」)与第 693 段(text/74-ch07.txt:693,搜「学习目的」)。

  34. 出处:「允许重新发明车轮的情况」第 703 段(text/74-ch07.txt:703,搜「水下」)。

  35. 出处:「7.9 给牦牛剃毛」第 747 段(text/74-ch07.txt:747,搜「任务自动化工具」)至第 762 段(text/74-ch07.txt:762,搜「补丁包」)。

  36. 出处:「勇于面对『给牦牛剃毛』」第 788 段(text/74-ch07.txt:788,搜「栈」)。

  37. 出处:「7.9 给牦牛剃毛」第 772 段(text/74-ch07.txt:772,搜「尽早收手」)与第 117 段(text/74-ch07.txt:117,搜「共享」)。

  38. 出处:「编程中的『给牦牛剃毛』」第 807 段(text/74-ch07.txt:807,搜「循环思考」)。

  39. 出处:「3.50 经济原则」第 8 段(text/56-ch03-50.txt:8,搜「宝贵资源」)。

  40. 出处:「3.50 经济原则」第 11 段(text/56-ch03-50.txt:11,搜「硬件性能不足」)与第 32 段(text/56-ch03-50.txt:32,搜「隔绝」)。

  41. 出处:「3.50 经济原则」第 39 段(text/56-ch03-50.txt:39,搜「回本」)。

  42. 出处:「3.50 经济原则」第 41 段(text/56-ch03-50.txt:41,搜「本末倒置」)。

  43. 出处:「后记」第 6 段(text/75-fm.txt:6,搜「关怀」)、第 21 段(text/75-fm.txt:21,搜「道德法则」)、第 40 段(text/75-fm.txt:40,搜「中庸」)。

  44. 出处:「后记」第 48 段(text/75-fm.txt:48,搜「渐变色」)与第 53 段(text/75-fm.txt:53,搜「语境」)。

  45. 出处:「序章 本书导读」第 197 段(text/04-fm.txt:197,搜「更优解」)。