《软件设计的哲学》读书笔记(三):结论

640 阅读5分钟

读书笔记

《软件设计的哲学》是一本很薄的书,这本书通篇都在说一件事:复杂性。处理复杂性是软件设计中最重要的挑战。这是使系统难以构建和维护的原因,并且也是系统变慢的原因。在本书中,作者试图描述导致复杂性的根本原因:例如依赖和模糊。本书也已讨论了可以帮助识别不必要的复杂性的危险标记,例如信息泄漏,不必要的错误情况或名称过于笼统。而且已经提出了一些通用的思想,可以用来创建更简单的软件系统,例如,努力研究更深和更通用的类,定义不存在的错误以及将接口文档与实现文档分离。最后,讨论了产生简单设计所需的投资思路。

设计是一个令人着迷的难题:如何用最简单的结构解决特定问题?探索不同的方法很有趣,找到一种既简单又强大的解决方案是一种很好的感觉。干净,简单和明显的设计是一件美丽的事情。

成为优秀设计师的好处是,你可以在设计阶段花费大部分时间,这很有趣。可怜的设计师花费大量时间在复杂而脆弱的代码中寻找错误。如果提高设计技能,不仅可以更快地生产出更高质量的软件,而且软件开发过程也将变得更加愉快。

本书中讨论的最重要的软件设计原则

  • 复杂性是逐步增加的:你必须留意一些小东西。
  • 仅仅能执行的代码是不够的。
  • 持续进行少量投入以改善系统设计。
  • 模块应该比较深。
  • 接口设计应尽可能简化最常见的方法。
  • 一个模块具有一个简单的接口比一个简单的实现更重要。
  • 通用模块更深入。
  • 通用和专用代码分开。
  • 不同的层应该有不同的抽象。
  • 降低复杂度。
  • 定义不存在的错误(和特殊情况)。
  • 设计两次,“三设计而后行”。
  • 注释应该描述代码中不明显的内容。
  • 软件设计应易于阅读而不是易于编写。
  • 软件开发的增量应该是抽象而不是功能。

本书讨论的一些危险信号

系统中任何这些症状的存在表明系统的设计存在问题:

  • 浅模块:类或方法的接口并不比其实现简单得多。
  • 信息泄露:设计决策反映在多个模块中。
  • 时间分解:代码结构基于执行操作的顺序,而不是信息隐藏。
  • 过度暴露:API 强制调用者注意很少使用的功能,以便使用常用功能。
  • Pass-Through Method(透传方法):一种方法几乎不执行任何操作,只是将其参数传递给具有相似签名的另一种方法。
  • 重复:一遍又一遍的重复代码。
  • 特殊通用混合物:特殊用途代码未与通用代码完全分开。
  • 联合方法:两种方法之间的依赖性很大,以至于很难理解一种方法的实现而又不理解另外一种方法的实现。
  • 注释重复代码:注释旁边的代码会立即显示注释中的所有信息,代码完全可以取代注释。
  • 实施文档污染了接口:接口注释描述了所记录事务的用户不需要的实施细节。
  • 含糊不清的名称:变量或方法的名称太不精确,以至于它不能传达很多有用的信息。
  • 难以选择的名称:很难为实体提供准确而直观的名称。
  • 难以描述:为了完整起见,变量或方法的文档必须很长。
  • 非显而易见的代码:一段代码的行为或含义不容易理解。

总结

工程和设计的每个分支都有自己的技术文化。在大多数工程领域中,就一个专业人员的素养组成来说,有些不成文的素养具有与标准手册及教科书同等重要的地位(并且随着专业人员经验的日积月累,这些经验常常会比书本更重要)。资深工程师们在工作中会积累大量的隐性知识,他们用类似禅宗“教外别传”的方式,通过言传身教传授给后辈。软件工程算是此规则的一个例外:技术变革如此之快,软件环境日新月异,软件技术文化暂如朝露。然而,例外之外也有例外。确有极少数软件技术被证明经久耐用,足以演进为强势的技术文化、有鲜明特色的艺术和世代相传的设计哲学。

——《UNIX 编程艺术》

良好的规范和经验绝非是教条主义,随着时代的发展,技术的进步,技术文化和规范也需要更新和改革。所以,我们在接收良好经验、遵守良好规范的同时,也要保持自我,并不一定每一条都适用于自己所处的环境。任何状况,我们都要坚守一条,去恶扬善,知行合一!