第一章:介绍

所有编程都需要具有创造力的头脑和组织思想的能力。

这意味着编写软件的最大限制是我们了解所创建系统的能力。
程序越大,工作的人越多,管理复杂性就越困难

人擅长的是创造力,当需要记录系统庞大的复杂性时,记忆力的短板会显现出来,导致复杂性成为了我们创造软件的限制。

复杂度会随着时间的推移而增加,但是更简单的设计使我们能够在复杂性压倒性优势之前构建更大,功能更强大的系统。

复杂性是不可避免的,会随着时间而增加;能对抗复杂性的是尽可能保持系统的简单干净。这非常困难

有两种解决复杂性的通用方法
第一种方法是通过使代码更简单和更明显来消除复杂性。例如,可以通过消除特殊情况或以一致的方法使用标识符来降低复杂性
第二种方法是封装它,以便程序员可以在系统上工作而不会立即暴露其所有复杂性。这种方法称为模块化设计。在模块化设计中,软件系统分为模块,例如面向对象语言的类。这些模块被设计为彼此相对独立,以便程序员可以在一个模块上工作而不必了解其他模块的细节。

当我们聚焦在某一模块进行开发,只需要了解该模块的上下文时,需要的认知负担可以极具下降,让我们更加从容地设计系统,也许这是模块化,甚至后续微服务化的一个出发点吧。

由于软件具有很好的延展性,因此软件设计是一个贯穿软件系统整个生命周期的连续过程。

当今大多数软件开发项目都使用诸如敏捷开发之类的增量方法,其中初始设计着重于整体功能的一小部分。设计,实施和评估此子集。发现和纠正原始设计的问题,然后设计,实施和评估更多功能。

增量方法适用于软件,因为软件具有足够的延展性,可以在实施过程中进行重大的设计更改。

增量开发意味着永远不会完成软件设计。
设计在系统的政哥 生命周期中不断发生:开发人员应始终在思考设计问题。增量开发还意味着不断的重新设计。

以前参加过敏捷开发,但是随着迭代次数的增加,慢慢会发现系统改不动了。虽然迭代模型适合增量开发,但是如果不在每次迭代开发中优化和改造现有的代码,会导致后面的开发成本越来越大。从而使得敏捷开发失去了价值。

作为软件开发人员,您应该始终在寻找机会来改进正在开发的系统的设计,并且应该计划将部分时间花费在设计改进上。

有两个总体目标。
首先是描述软件复杂性的性质:“复杂性”是什么意思,为什么重要,以及当程序具有不必要的复杂性时如何识别?
第二个也是更具挑战性的目标是介绍可在软件开发过程中使用的技术,以最大程度地减少复杂性。

如何使用这本书

使用本书的最佳方法是与代码审查结合使用。
阅读其他人的代码时,请考虑它是否符合此处讨论的概念,以及它与代码的复杂性之间的关系。

改善设计技能的最好方法之一就是学会识别危险信号:信号表明一段代码比需要的复杂。

在应用本书中的思想时,务必要节制和谨慎。