大纲:principles-of-programming
书型裁决:汇编体,101 条方法(第1章 3 条、第2章 7 条、第3章 64 节、第4–6章各 6 条、第7章 9 条)。拆解的出路是重组——不按原书七章顺序走,按一条因果链重新归置:代码必然被改 → 改前先要有人读懂 → 读懂还要改得起 → 改得起也挡不住腐坏 → 腐坏来自日常,所以要有出错预案 → 单体做不大只能小而组合 → 日常执行靠习惯与手法 → 最后剩下的失败模式全在人与组织。原则名当例子用,不当清单背;每条主线讲透因果与失效边界。本书特色:原则背后的技术史——每条出处都指向一部经典(布鲁克斯/Myers/Raymond/Kent Beck/Meyer/温伯格/福勒/埃文斯),前言明说「技术是为实现原则的目的而诞生的」,原则(慢变量)与技术(快变量)两层演化的线索贯穿全书。导航章(版权页/目录/谢辞/版权声明)不读不引;序章(读法)与后记(做人三原则)承载全书口径,引。
主线:软件难不是因为做得不好,而是因为它的四个本质性质(复杂、同步、可变、不可见)——所以一切原则的靶子是「必然到来的修改」:让修改前有人读得懂,修改时波及面小,修改后不加速腐坏;修不动的时候就拆小、组合;而最容易让一切失效的,不是技术,是人和组织怎么排。
章节(10 章)
01-no-silver-bullet.md前提:软件为什么难,代码为什么必然被改- 进来时以为:软件难是水平问题,总有一天会有更好的工具一劳永逸 → 出去时知道:四个本质性质(复杂性/同步性/可变性/不可见性)决定了没有银弹;编程全是设计、制造是编译器的事(所以代码才是真正的设计文档);代码写完那天起就注定被改——这三条是后面所有原则的地基;「技术会消亡、原则会留存」是全书读法
02-code-for-humans.md代码写给人看:读的账比写的账大- 进来时以为:代码是给编译器看的,可读性是加分项 → 出去时知道:读的时间远多于写,所以「读的效率」优先于「写的效率」和「执行的效率」;代码是了解软件怎么运行的最可靠线索(文档都靠不住);SLAP 让函数像目录、命名是面向阅读者的界面、坏名字要靠「环回检测」当场验;命名这种慢功夫其实是设计本身
03-duplication-and-excess.md重复是税,多余是债- 进来时以为:复制粘贴省时间,为将来多写点是远见 → 出去时知道:每处重复都让修改从「改一处」变成「排查 N 处+逐处判断该不该改」,抽象化(命名/函数化/常量化)把 N 收敛成 1;阻抗失配那类重复消不掉但可集中;YAGNI 的依据是预想大多不成真,简单方案往往比通用方案更好改;KISS 的三个日常诱惑(新技术/备用功能/擅自加需求)就是多余的来源
04-layout-for-change.md布局:让修改只发生在一个地方- 进来时以为:模块怎么划分是口味问题 → 出去时知道:有一条可以操作的布局学——效应局部化/变动率(按修改时间分组,税法例子)是目标,封装/信息隐藏/接口与实现分离/策略与实现分离是手段,OCP 是它们的复合结果;预估变化不可行,可行的是预估「哪部分会变」并把它关进接口(先挨第一发子弹);可逆性是架构层的保险
05-cohesion-coupling.md模块的松紧:内聚、耦合与正交- 进来时以为:内聚高耦合低是两句口号 → 出去时知道:它们是可打分的刻度(内聚七级从巧合到功能,耦合六级从内容共享到纯参数);全局变量为什么是万恶之源可以从公共耦合推出来;判断标准最后落到「能不能把对方当黑箱」;正交性+层次化是大规模版本;连 HTTP GET 为什么要设计成幂等都在这条线上
06-entropy-and-debt.md老化与保养:腐坏的征兆与还债- 进来时以为:代码写坏了才需要重写,平时没必要动 → 出去时知道:代码有熵,放着不动也会变腐(七个征兆是自查表);技术负债的「利息」机制解释了为什么烂代码越放越贵;破窗效应说明腐坏是心理传染的;童子军规则是唯一被验证有效的日常对策——每次离开让代码更干净一点;软件老化的四个原因都是可干预的
07-when-errors-happen.md出错的那一天:契约、路障与响亮的失败- 进来时以为:错误处理就是多写几个 if → 出去时知道:要分两类——预想之内的错误(用户输入)用错误处理,预想之外的错误(代码 bug)用断言立刻崩溃;路障战术(手术室消毒区)给出两类检查的分界线;契约式设计用「前置严格、后置宽容」的懒惰代码换 正确性;修复失败就大声停止(静默破坏数据是最坏结局);正当性 vs 坚固性的选择取决于软件是医疗还是文字处理
08-unix-philosophy.md小、专、能组合:UNIX 哲学- 进来时以为:UNIX 哲学是一堆老古董格言 → 出去时知道:它是一条完整的体系——单责(工作唯一)→小(小就是美)→文本接口(过滤器化)→可组合(管道)→组合产生杠杆;沉默原则和最小意外是组合的前提(输出会被别的程序当输入);三系统论回答「为什么不能跳过第一版直接做对」;这条 1969 年的路线在今天的微服务/CLI/脚本生态里仍是主流
09-daily-craft.md日常手法:从曳光弹到橡皮鸭- 进来时以为:高手靠灵感和爆发 → 出去时知道:高手的日常是一组可模仿的习惯——曳光弹(先打通端到端骨架,与原型的区别是留不留下)、一步一步走(混着改回不了滚)、橡皮鸭(说明行为本身完成调试)、内测、三大美德(懒惰/急躁/傲慢=自动化/预想/自尊);流态与语境切换解释了为什么程序员讨厌被打断(一通电话 20 分钟的账)
10-people-and-prophecy.md预言与人性:原则管不到的地方- 进来时以为:项目失败是技术选型失误 → 出去时知道:最后一批失败模式全在人与组织——布鲁克斯法则(人数和月数不可交换,12 人月的算术)、康威定律(架构反映组织,先设计架构再编组织)、第二系统综合征(第二版必然堆功能,对策是用户具象化)、重新发明车轮(NIH)、给牦牛剃毛(脑内栈溢出);性能问题上「不要早优化」和「没有万能药」是同一条:别替未来做决定;后记三原则(关怀/道德/中庸)把全书收回「代码背后是人」