假设我们身边的一切都是用制造材料加以描述的:空调不是“空调”,而是“由金属和塑料做成的物体”;书不是“书”,而是“由纤维和墨做成的物体”。沟通时我们也不用“空调”和“书”这样的词汇,而是“金属和塑料做成的物体”和“纤维和墨做成的物体”。可以想象大脑在面对这些信息时会让我们觉得多么的痛苦,显然这样的事情在现实中很少发生,因为我们的大脑具备很强的抽象能力 ,会通过抽象塑造“空调”和“书”这样的概念提升沟通效率和维持思维秩序。我们学习知识的过程其实就是不断精确掌握(抽象)概念和建立思维秩序的过程。
对于程序员来说除了生活在现实世界,还“身处”由程序所构建的虚拟世界中。程序设计其实是在个人头脑中构建虚拟世界的过程,而维护代码则首先是通过程序所表达的虚拟世界与其他程序员间接沟通的过程。为了提高程序员间的间接沟通效率,我们一定希望虚拟世界也象现实世界那样充满着象“空调”和“书”这样的概念,也希望程序员们在虚拟世界所使用的概念相似。由于现实世界中程序员们已掌握了大量的相似概念,如果能将这些概念带入虚拟世界,那将显著提升程序员间通过虚拟世界(即程序)沟通的效率。因此,作者认为软件设计的真谛,是通过程序构建与现实世界相似的虚拟世界。通常,设计质量越高就越能在虚拟世界中找到现实世界的影子。
软件设计活动的关键又是什么呢?还是让我们回到现实世界去寻找答案吧!
在远古时期,人类只能通过徒步从一个地方到达另一个地方。后来发现马可以被驯服,通过马车能更快地从一处到达另一处。再后来,人类逐步发明了自行车、汽车和飞机,且每一次发明都使得交通效率得以大幅提高。在这里,马车、自行车、汽车和飞机都共同地为了解决交通效率问题。很显然,马车、自行车、汽车和飞机都是不同的概念,人类通过抽象发明这些概念,并通过相互学习的方式使得大家掌握其含义。如果将焦点放在交通工具上,我们会发现交通效率越高则其概念越抽象,复杂度也越高。或者说,越是抽象的概念,其所隐藏的复杂度就越高。
从这个关于交通的例子中我们不难发现,现实世界中我们是通过转移复杂度的方式解决复杂问题的,且每一次不同的转移都伴随着抽象概念的建立,转移的复杂度越多所建立的概念就越抽象。由于复杂度被转移了后,使得一小部分人专注于被转移的复杂度(比如制造飞机),而其他绝大部分人在享用复杂度被转移所带来好处的同时不用关心被转移走的复杂度(乘飞机的人不用关心飞机的驾驶与制造)。同样的事情也发生在软件行业!不同的是软件行业“制造”的不是汽车和飞机,而是编程语言、数据库、平台和框架等。
不难发现,软件设计的关键活动应是抽象,通过抽象建立新的概念并将部分复杂度转移到概念背后。尽管不断的抽象增加了新概念的复杂度,但也简化了所需解决问题的复杂度。显然,好的设计应是其简化的复杂度要大于因为抽象所创造的复杂度。