zoukankan      html  css  js  c++  java
  • 软件的本质

    计算机革命是有关我们如何去思考的方式, 以及我们如何去表达自己的思考的一个革命。- 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
  • 相关阅读:
    Zk学习笔记——权限控制
    guava学习笔记
    Elasticsearch学习笔记——别名
    Kafka学习笔记——存储结构
    分布式协议——Paxos、Raft和ZAB
    图解 Java 中的数据结构及原理!
    牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力!
    你必须了解Spring的生态
    盘点 35 个 Apache 顶级项目,我拜服了…
    前后端分离如何做权限控制设计?
  • 原文地址:https://www.cnblogs.com/wahaha02/p/10371332.html
Copyright © 2011-2022 走看看