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