计算机革命是有关我们如何去思考的方式, 以及我们如何去表达自己的思考的一个革命。- SICP
应当避免控制中的复杂性,将精力集中到数据的组织上,以反映所模拟世界里的真实结构。- Joel Moses
一切工具都是为了解决人的问题,软件也不例外。但人类世界的现实问题到软件的解决方案的实现路径跨越太大,无法一步跃迁,这就需要设计分解成一系列的跃迁步奏,这就是软件设计的本质。
而编程的本质就是用编程语言对这一系列过程进行描述。所以编程语言是逻辑的载体和描述工具。
但就像一位大师说的“语言磨砺了我们的思维方式,也决定了我们的思考范围”,所以不同的编程语言又反过来影响了软件的定义。
从过程式范式来看,
软件 = 数据 + 算法;
从面对对象范式来看,
软件 = 对象 + 控制;
从函数式范式来看,
软件 = 解释 + 应用(eval-apply loop);
从逻辑范式来看,
软件 = 逻辑 + 控制。
从数学模型来看,
软件 = 计算模型 + 语义。
其中计算模型是对特定领域的数学抽象。语义是对特定领域的具象表达。
从计算机硬件模型来看,
软件 = 数据 + 控制。
因为冯.诺依曼计算机模型的物理设计,数据和控制是分离的,运行在其之上的软件,也必然受其影响。
而我们常说的软件架构、框架和设计模式,它们的一个显著差异就是,
软件架构是从问题域对软件进行描述;
设计模式是从软件的解决方案域对软件进行描述;
框架是对一系列设计模式进行逻辑和概念上的封装。