软件的本质
计算机革命是有关我们如何去思考的方式, 以及我们如何去表达自己的思考的一个革命。- SICP
应当避免控制中的复杂性,将精力集中到数据的组织上,以反映所模拟世界里的真实结构。- Joel Moses
Program to an 'interface', not an 'implementation'.
Favor 'object composition' over 'class inheritance'. - GoF
软件的本质
一切工具都是为了解决人的问题,软件也不例外。但人类世界的现实问题到软件的解决方案的实现路径跨越太大,无法一步跃迁,这就需要设计分解成一系列的跃迁步奏,这就是软件设计的本质。
而编程的本质就是用编程语言对这一系列过程进行描述。所以编程语言是逻辑的载体和描述工具。
但就像一位大师说的“语言磨砺了我们的思维方式,也决定了我们的思考范围”,所以不同的编程语言又反过来影响了软件的定义。
从过程式范式来看,
软件 = 数据 + 算法;
从面对对象范式来看,
软件 = 对象 + 控制;
从函数式范式来看,
软件 = 解释 + 应用(eval-apply loop);
从逻辑范式来看,
软件 = 逻辑 + 控制。
从数学模型来看,
软件 = 计算模型 + 语义。
其中计算模型是对特定领域的数学抽象。语义是对特定领域的具象表达。
从计算机硬件模型来看,
软件 = 数据 + 控制。
因为冯.诺依曼计算机模型的物理设计,数据和控制是分离的,运行在其之上的软件,也必然受其影响。
而我们常说的软件架构、设计模式、框架和库,它们的一个显著差异就是,
- 软件架构是从问题域对软件进行描述;
- 设计模式是从解决方案域对软件进行描述;
- 框架是对一系列设计模式进行逻辑和概念上的封装;
- 从调用关系上来说,框架:don't call us, we'll call you;库: call me please。
虽然不同范式对软件的理解和分解方式不尽相同,但都有异曲同工之处,即软件分为两部分:
- 一部分是数据,不管是叫对象、逻辑还是模型;
- 一部分是控制,不管是叫算法、解释还是语义。
这就是软件的本质:
软件是数据和控制的有效结合,其中数据部分才是真正有意义的(What),控制部分只是影响数据部分的效率(How)。数据和业务或领域模型有关,无法标准化;但控制是可以标准化的,比如:遍历数据、查找数据、多线程、并发、异步等,都是可以标准化的。
数据和控制的分离手段
如何有效表达数据和控制?如何抽象数据和控制,提高其表达能力?这篇文章有较详细的介绍,本文就不再赘述。但在描述数据和控制之前,首先要分离数据和控制。具体到不同的编程范式,数据和控制分离的具体手段也有差异,如:
- 过程式编程:数据驱动,状态机
- 面向对象:委托模式、策略模式、桥接模式、修饰模式、IoC/DIP、泛型
- 函数式编程:修饰器、管道、拼装、lambda