瞎扯淡 系统论与《SICP》 (二) :从信息流角度看,如何一步步构造系统

whitecrow · 2018年04月06日 · 最后由 whitecrow 回复于 2018年04月07日 · 1909 次阅读

这是第一篇:系统论与《SICP》 (一) :什么是系统

  1. 所有软硬件系统,都是 input -> 系统 -> output
  2. input 和 output 越复杂,他们之间的差距越大,所需要系统也越复杂(用户规模也可看做 input 的一部分)。
  3. 如果把这 100 种 input,比如转化为 500 种 output,我们需要为其中每一种映射关系,至少构建一个一元函数——output = f(input)。但是我们如果为每一种映射关系都构造一个函数,那么这个软件就是纯 hard code。成本太高,也无法响应需求的增加和变化。
  4. 先把某些 input 的相同维度抽象出来,这时候有两种率抽象方式:
    1. 过程抽象:归纳为一个多元函数,也就是 output = f(input1, input2);或多层函数 output = f(f(input1), input2)。
    2. 数据抽象:把 input 抽象为一个复合数据,比如 output = f(data(input1, input2))
  5. 但是,这种抽象还是太浅了,这时候有 3 种新的抽象方法:
    1. 如果我们把 function 也看成一种新的 input,一种新的信息,对 function 的构造做处理,f(f)(inputs),这就是高阶函数。
    2. 把数据抽象和过程抽象结合起来,标识为一个单独的 object,就是面向对象了。
    3. 如果我们把这些 input、object、高阶函数,重新用另外的、更通用的方式分解为单个字符。再重新做词法、语法分析,就是元语言抽象。(先降维,再升维)
  6. 更复杂的函数式程序:f1(f2)(data(input1, input2), f3(input3)),对 f(x) 做了三重变换:一元函数 -> 多元函数,单层函数 -> 多层函数,一阶函数 -> 高阶函数
  7. 更复杂的对象:object1(inputs, data(inputs), object2(inputs); f(inputs), f(objects)) ,对简单对象做了三重变幻:数据抽象(简单属性 -> 组合属性),过程抽象(简单函数 -> 复杂函数),对象包对象(一阶对象 -> 高阶对象)。
  8. 如果把那些类、高阶函数的共同维度总结出来,放入一个文件夹,就是模块了。
  9. 模块和模块之前做通信,通信消息就是“协议”了。
  10. 可以把通信消息,看成一种新的 input,消息以结构简单为宜。
  11. 为了响应变化,抽象信息的维度时,原则是选取那些不会变化(或者难以变化)的维度,首选是低层数据结构(list \ dict \ stack)维度;低层函数(map \ select \ reduce);低层元语言抽象(状态机、CPS)。次选环境依赖,比如对操作系统和 HTTP 协议进行抽象。再次是是业务模型中的核心业务流程和数据结构(比如证券系统中的 portfolio)。
  12. 系统有纵横,纵为层次,横为划分。经天纬地之谓文。

本系列由浅入深,先给个概述。
最后吐个槽,计算机教材还原论太严重。

等更新。

suffering 回复

多谢捧场,估计一周一更

需要 登录 后方可回复, 如果你还没有账号请 注册新账号