《软件设计哲学》千字总结(1)
- 2026-11-05 11:12:23
《软件设计哲学》千字总结(1)《软件设计的哲学》这本书是斯坦福教授John Ousterhout的著作。作者John既是一位学术研究大佬,也是在编程界实践的顶级程序员。《软件设计的哲学》这本书对工作过一段时间,通过摸索经验总结而有所感悟的程序员可谓醍醐灌顶,鞭辟入里。John用经验和理论给我们构建一个软件设计的哲学系统,犹如我们在软件开发世界拿到了一张可以按图索骥的地图。 我们编写程序,随着程序的发展和功能增多,程序会变得复杂,组件之间依赖性变得更多。当时间流逝,复杂性不断积累,程序员修改程序变得越来越困难。这种困难如作者所述,是因为“依赖性与模糊性的持续积累”。所以复杂性是怎么定义的: C = Sum(C(p) * T(p)) 系统的总体复杂度C由每个部分的复杂度C(p)乘以开发者在哪些部分上花费的时间T(p)加权组成。可以这样理解:如果某个部分非常复杂,但是开发者几乎不会进行接触和修改,那么它的权重将为0,对系统整体复杂度不会有太大的影响。那么复杂性有哪些特征: 1. 变更放大,一个看似简单的变更需要系统中多个不相关的地方进行修改 2. 认知负荷,开发者为完成一个任务,需要掌握大量信息,关联性强且易遗漏的细节。比如典型如,C语言中,malloc后,必须记得free。 3. 未知的未知,开发者并不能明确“需要修改哪些代码”,“需要掌握哪些信息”,只能通过试错和通读代码才能确认。 复杂性是怎么产生的,作者认为是因为系统中的两大问题积累产生的: 4. 依赖性,一段代码无法独立理解和修改,需要关联其他代码才能正常工作 5. 模糊性,系统的关键信息(设计意图,约束规则,依赖关系)未明确呈现,开发者需要通过“推测”而非“直接获取”来理解逻辑 复杂性还有2个属性: 6. 增量性,复杂性不是由单个灾难性设计错误导致的,二十百个、数千个小依赖小模糊逐步叠加的结果。 7. 局部性,复杂性的影响取决于“开发者接触的频率” 作者很好地定义了问题。接下来给出了最佳实践: 8. 从战术编程思路转为战略编程 战术编程思维着眼于功能尽快运行,它是短视的,不会花费太多的时间来寻找最佳设计,易引入临时的复杂性。这样随着不断积累小的复杂性,最终系统变得难以维护。战略编程以长期系统为目标,愿意投入时间优化设计,修复问题,虽短期稍慢,但长期能够降低复杂度,提升效率。以下不同策略时间投入和进度对比,我们看到战术编程会在某个时间点开始进度变缓而战略编程会持续平滑的增长 9. 模块设计:深模块更优 系统会被分为多个模块,模块可以采用多种形式,比如子系统,服务和类。模块之间需要交互,模块之间存在依赖关系。模块化设计的目标就是最大程度减少模块之间的依赖。模块分为接口和实现,最好的模块是接口比实现简单很多的模块。功能强大(隐藏实现复杂)但是接口简单称之为“深模块”,功能薄弱但是接口复杂称之为“浅模块”,如Linux I/O系统调用,5个简单的接口隐藏了大量复杂的逻辑,它是深模块,而浅封装函数通常会产生浅模块。浅模块有几个特点:1.接口复杂,认知负荷大,使用难度大;2.功能薄弱,提供价值有限,无法隐藏核心复杂性;3.信息泄露,内部设计决策会扩散到外部;4.粒度不合理:过度拆分,模块沦为代码片段容器。浅模块会加剧变更放大,简单修改需要联动多模块,提高认知负荷,开发需要掌握大量冗余信息,导致系统膨胀,接口与模块数量爆炸,维护成本剧增。作者强调,浅模块是复杂性的直接推手,其本质是未实现模块化设计的核心价值,反而通过复杂接口,碎片化功能,信息泄露增加系统的认知负荷与变更成本。 10. 信息隐藏和通用化 实现深模块最重要的技术是信息隐藏。比如B树模块,隐藏信息B树如何存储,如何高效的访问它。信息隐藏仅仅通过接口暴露必要信息,减少依赖与认知负荷,避免设计决策泄露在模块之外,导致增加依赖性。模块能够隐藏很多信息,则往往会增加模块提供的功能,同时还会减少接口数量,结果这个模块更加深。除了信息隐藏还有另外一个方面,通用化,通用化定义为:模块的接口设计不绑定特定使用场景,同时隐藏场景差异的实现细节。接口与场景接口,模块的核心功能不依赖某个特定业务逻辑和使用方法,而是提供基础能力,让使用者可以灵活组合使用。但应该平衡通用和易用,避免过度设计,应该以当前需求为基础,设计适度通用的接口,接口简单能够覆盖当前以及可以预见的相似场景。合理使用信息隐藏和通用化可以降低系统复杂度和认知负荷。 11. 抽象和分层 分层和抽象是软件设计的两大基石,分层是系统结构的组织方式,抽象是每层功能的呈现方式,二者结合可让开发者仅面对当前层的复杂性,无需理解全部细节。抽象的本质是:有用信息保留,无关细节隐藏。抽象是对复杂实体的简单描述,提炼实体的核心功能和行为。抽象能够有效降低认知负荷,隔离复杂性。但抽象应该避免过度抽象和虚假抽象:过度抽象,抽象层过于泛化,脱离实际使用场景;虚假抽象,抽象未真正隐藏细节,使用者仍需理解实现。分层是将系统按照抽象级别与职责拆分为垂直层级,每层基于下一层的抽象提供新的抽象,形成依赖链。分层的核心原则是不同层不同抽象,应当避免抽象重叠和跨层依赖,相邻层的抽象应该有明确的差异同时不能跨越邻层,导致变更扩散。分层的核心价值是隔离关注点,简化系统维护。分层通过垂直拆分将系统拆解为可管理维护的部分,抽象通过简化描述让每个部分易于理解。 以上就是《软件设计的哲学》中前几章节。作者阐述了复杂性问题的定义,构建能够降低复杂性的体系并详细阐述了细节。
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。