读书笔记(下)系统匠艺与落地16
在系统层面,作者提醒我们,规模会改变一切,小项目和大项目的构建方式截然不同,不能把写个人小工具的经验直接套到大型系统上。集成应该频繁、增量地进行,最危险的是那种所有人各写各的、最后一次性合并的大爆炸集成,往往会带来灾难性失败。工具很重要,但工具不能替代工程判断。
最后一部分回到人。布局和风格的意义在于让代码结构变得可视,一致性远比争论哪种风格更好更重要,所以格式化应该交给工具自动完成。自文档代码这一章尤其精辟:最好的注释是不需要注释的代码,注释应当解释为什么,而不是解释做了什么,因为做了什么代码本身已经说了;而过时错误的注释,比没有注释更危险。个人性格这一章或许最被低估,作者说编程能力很大程度上取决于一个人的谦逊、好奇心和理智的诚实,取决于他愿不愿意承认自己会错、愿不愿意把事情做到对为止。软件匠艺则把编程看作工程与艺术的结合,一种对质量有内在追求的手艺。
书中沉淀出一批核心概念,值得单独记下。构建是软件开发的中心活动,包含从详细设计到评审的全过程。管理复杂度是全书主线,也是软件工程师唯一真正的工作。抽象是关注是什么而忽略怎么做,封装是把数据和操作数据的方法绑在一起并隐藏实现,信息隐藏则是把可能变化的细节藏起来。耦合衡量模块间的依赖,松散为好;内聚衡量模块内部的一致性,高度为好。防御式编程是假设别的代码会出错,用断言、异常、校验和隔离来保护自己。伪死代码指向那种看似有用、实则永远不可能执行到的代码,是应当警惕的坏味道。表驱动用查表替代分支,把规则变成数据。重构是在不改变行为的前提下改善结构,过早优化则是在尚未测量时就动手提速,被作者和高德纳一致列为大忌。
落到实际使用上,这本书有相当一部分内容,无论用什么语言、什么年代都成立,值得学生和开发者直接内化。命名的力量、单一职责与短函数、先写正常情况的条件判断、循环三要素清晰、断言与异常的分工、绝不吃掉异常、表驱动、先测量再优化、小步重构加测试保护、自文档代码、代码评审和边界值测试,这些基本功没有任何过时风险。尤其是个人性格那一章所讲的谦逊、好奇与诚实,恰恰是一个学生从写作业式的编程迈向专业程序员的分水岭。与此同时,也有些内容因时代局限需要辩证地看。代码调优技术那一章罗列的大量手工优化技巧,比如位运算、手写汇编、循环展开,在现代编译器和硬件面前大多已失去意义,与其在奇技淫巧上花力气,不如把精力放在算法和架构层面。伪代码编程过程的思路依然有用,但今天更多人用测试先行和接口设计来替代。关于 goto 的争论在现代语言里几乎已不存在。书中的代码示例以 C、C++、早期 Java 和 VB 为主,语法细节早已过时,读时应忽略具体语法,只吸收背后原则。至于“函数参数不超过七个”这类心理数字,是经验值而非铁律,当作参考即可。
如果用一句话概括这本书,那便是:管理复杂度,是软件工程师唯一真正的工作;而所谓好代码,就是让读它的人不费力气的代码。读它最好的方式,是先啃下开篇的构建定义、设计的核心特性,以及函数、防御式编程和命名这几章的“心法”,再把它当作一本随时查阅的工具书,每读一章就回到自己最近的代码里找反面教材,动手改一遍。唯有如此,这些原则才不会停留在纸面上,而是真正变成手上写出来的东西。
浙公网安备 33010602011771号