1,软件的首要技术使命:管理复杂度;
2,管理复杂度的重要性:
项目的失败大多数由不尽如人意的需求、规划和管理导致的。当项目确实由于技术原因导致失败时,通常是就是失控的复杂度。
有关的软件变得异常复杂,没有人能够知道它究竟是做什么的,也不知道如何才能正确使用不同层次上的代码。结论:复杂度管理关系到项目成败。
Dijkstra还指出,没有谁的大脑能够容得下 一个现代的计算机程序。也就是说,作为软件开发人员,我们不应该试着在同一时间把整个程序都塞进自己的大脑,而应该试着以某种方式去组织程序,以便能够在一个时刻可以专注于一个特定的部分。这么做的目的就是尽量减少在任意时间所要考虑的程序量。结论:复杂度管理受限于大脑工作方式,应该以适应大脑工作方式的形式来组织代码。
在软件架构的层次上,可以通过把整个系统分解为多个子系统来降低问题的复杂度。人类更易于理解许多像简单的信息,而不是一向负载的信息。所有软件设计技术的目标都是把复杂问题分解成简单的部分。子系统间的相互依赖越少,你就越容易在同一时间里专注问题的一小部分。精心设计的对象关系使关注点相互分离,从而使你能在每一个时刻只专注于一件事情。在更高汇聚的层次上,包(packages)提供了相同的好处。
3,如何应对复杂度?
高代价,低效率的设计源于下面三种根源:
- 用复杂的方法解决简单的问题;
- 用简单但错误的方法解决复杂的问题;
- 用不恰当的复杂方法解决复杂的问题。
正如Dijkstra所指出的,现代的软件本身就很负载,无论你多努力,最终都会与存于显示世界问题本身的某种程度复杂度不期而遇。这就意味着要用下面这两种方法来管理复杂度:
- 把任何人在同一时间需要处理的本质复杂度的量减到最少;
- 不要让偶然性的复杂度无谓地快速增长。
一旦你能理解软件开发中任何其他技术目标都不如管理复杂度重要时,众多设计上的考虑就都变得直截了当了。