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