组合思维与继承思维的不同

2015-03-15 16:05 "@jdon007"的内容
两种比较常用的思考方法(或解决方法),用哪一种,还是取决于问题域 ...

讲得很好。
我这几天思考发现组合和继承实际可能代表两种完全不同的思维方式。这两种思维体现在Unix和Windows的不同上。

Unix是典型的组合思维,包括Go语言,我们使用Unix命令行,比如“ps -ax | grep java”,这种管道式过滤能力非常强大和灵活,缺点是初学者不容易掌握,不形象。

而Windows是典型的继承思维,大窗口里有小窗口,不断打开小窗口,就进行树结构的深入层次,这种方式非常形象,适合初学者,但是问题也是显然,不够灵活强大,以至于我们经常借助于DOS的bat来完成各种特定的要求,以至于需要编程,使用编程语言组合成我们希望得到的功能。

Windows这种窗口方式非常对象化,也是微软长期对操作系统这个业务掌握后的抽象,它是一种形象化的树形结构,带领初学者进入深处。

Unix的命令组合是一种动态的树形结构,类似函数编程,通过通过函数碎块组合成使用者想达到的强大功能。

很多人思维如果局限在Windows这种继承思维中,会觉得Unix好像不人性化,对程序员不够尊重,这其实是身在庐山中不识庐山真面貌。

什么是人性化?让程序员想做他想做的任何事,给予程序员最大的自由如同Unix风格才是对程序员最大尊重,将自由选择权交给了程序员自己,而Windows是对初学者最大尊重,限制一定自由,但是能够循循善诱。所以,是否对程序员尊重是分层次的,不同层次程序员的需求不同,就像人的层次不同,需求不同一样,没有吃饱饭认为吃饱饭是最大幸福,而吃饱饭的认为精神自由才是人生最高境界。

总结,两种比较常用的思考方法(或解决方法),用哪一种,还是取决于问题域 ,我们千万不能厚此薄彼。对于复杂问题域,使用组合无疑强大,对于熟悉的简单的问题域,使用继承比较形象,一目了然。

对于人来说:组合思维总是暗示自己“我们总是目光短浅,组合的风险比继承少”, 依靠范畴论的科学工具步步为营前行,而继承思维需要牛人,“如果有人能够综观某个事物(行业)几十年的发展,也就是常说的吃透了业务,在这种假定之下来用继承来设计业务,那一定会成为经典”,一旦成为经典,牛人会认为自己是天才。这就是经验与科学的区别。
[该贴被banq于2015-03-17 16:54修改过]



继承和组合关系是可以形象化的。在一个系统中,在根节点下是一片森林,是好多棵树。树是个二维的图形,而组合关系最终也是由(a, b)这样的基本二元组开始的构建的。最终构建出来的复杂的组合其实是跟一片森林描述的事物完全一样的。

比如数据库表中的一条记录,这一条记录可以看作是由field1、field2、field3三个字段在一个有限的空间中的聚合(组合,而不是交差,树形是不会交差的,而是在有限的空间中紧挨在了一起却并不是交差),而field1、field2、field3可以看作分别来自于系统下的三棵树。这种对问题的处理方法可以一直使用下去,一直到每一个字段的每一个取值都可以看作是来自于森林中的树上的节点。系统下的每一个实体都是来自于多棵树上的节点在有限的空间中的聚合体,这个体上如果有n个来自于n棵树的字段的话就有n个变化的维度(n个变量,需要确信是来自于真正的正交n棵树,n个字段间没有别的关系,不能从一个推导出另一个,n个字段的唯一关系是它们聚合在了同一个有限的空间单元中。比如无法从“张三(人)”的来自于颜色树的“黑色”肤色取值推导出他的来自于尺寸树的“身高”取值)。虽然是一片森林,虽然是n个维度,但是最终会成为空间和时间两个维度,而由于时空是一体的,结果最终会是只有一个维度——连续。我们听说过,人们在研究世界的时候发现世界有11个维度,人们可能错了,那只是11棵树,只是用来管理时空的11棵人造的树。
这些来自于森林中的节点在空间单元的聚合组成的元组如果被平铺到一个平面中就成了矩阵。
[该贴被anycmd于2015-03-17 20:46修改过]

2015-03-17 20:28 "@anycmd"的内容
继承和组合关系是可以形象化的 ...

你的形象化画得很好,非常棒。

不过我之前想表达的是,继承是形象化,组合则不是,我们可以用形象化表达它们,但是它们真的不属于同一个世界。

用时空来说,继承是用空间上的成本换得时间的不变,继承的树形结构一般保存在内存中;而组合是用时间的成本换得空间不变,组合的树形结构组装每次都得通过CPU花时间计算。

后者有时很难想象,因为我们的思维是对空间变化敏感,对时间变化不敏感,因为我们自己也处于随着时间动态适应环境之中。

组合其实体现了宇宙本质是计算这个一观点。

2015-03-18 07:45 "@banq"的内容
用时空来说,继承是用空间上的成本换得时间的不变,继承的树形结构一般保存在内存中;而组合是用时间的成本换得空间不变,组合的树形结构组装每次都得通过CPU花时间计算。 ...

同意。这段话让我对时空一体的场,对时空的相互转化有了更形象的认识。

人们的认知很难凭空出现,会有一个连续的慢慢积累的过程。记得有道友在道场发帖问人们是怎么深入思考的?其实只是内在和内在,内在和外在的普通相互作用,相互作用起来,运动起来就可能有新认知。

如果我们从“时间 + 空间”这样的角度去看问题,整个计算机世界就清晰了。主体是个时空一体的体,客体也是个时空一体的体。计算机世界的本质是去构建时空,然后由主客体在那个时空中去相互作用。主体和客体也是相互的,A是B的客体,B也是A的客体。所谓体:一个时空单元,来自于目录森林上的节点聚合在一个有限的空间单元中,它们紧挨着而不是交叉着,它们彼此相互作用着存在一个有限的时间,它们的存在到了某个度后系统将它们解散,它们本是目录森林中的节点的投影(投影是值,而非实体,值是可以随意复制的,而那个森林中的节点是实体,我们的世界有多大完全在于我们识别(标识)了多少世界,完全在于我们造的目录树上有多少节点,而目录树是上不封顶下不封底的,自然数就属于目录森林中的一棵树,实数也是一棵树,它们都是无顶无底的东西),它们的使命达成,它们的生命结束,它们化作一个无序的数据集合消失地无影无踪(但它们影响了目录森林,它们在森林中留下了微小的变化,它们变换了整个时空)。


系统作用一批资源(时间和空间,系统的资源包括外部的主体在系统内的分神(投影)),系统将这些资源聚合在到一个有限的空间中去,将它们挂接在系统树上,让它们存在一个有限的时间,让它们之间相互作用,它们是一个有限的时空节点。这个有限的时空的输入来自于它被挂接在的父节点,它的输出通过父节点返回系统,它们的使命结束后,它们被父节点解散。我们也是这个时空承载的一小簇内聚的信息,不知道是谁把这簇信息承载到这个有限的时空上的,不知道什么时候这个有限的时空会被父节点解散,但我们影响了整个时空,这种影响无法用定量来衡量了,因为森林没有顶也没有底。


这里面肯定有数学,可是我上学的时候没有好好学,结果那些数学知识已经不在了,我现在只能研究性质了。

2015-03-19 13:34 "@anycmd"的内容
主体是个时空一体的体,客体也是个时空一体的体。 ...

不是很理解你的时空一体的概念。

从我的意思角度看,时空是无法一体的,这世界总是在时间与空间之间有所侧重,要么是侧重空间忽视时间,要么是侧重时间忽视空间。

侧重空间忽视时间:比如建筑结构,一旦空间上构建好,如果不考虑材质等因素,几乎一直存在,这也是很多历史建筑存在至今的原因。计算机上是存储系统,内存缓存,数据库,文件等等都是这种。

侧重时间忽视空间:股票行情等变化的系统,包括地球转动,宇宙正在膨胀等等,当然,这些随时间变化的事物经常也反映在空间变化上,在太空宇宙研究中使用光年这个时间单位来衡量空间距离,也说明了时间是根本,如果我们能够进行时间旅行,那么我们就可能很快到达很遥远的一个星球。

也正是因为这点,我们可能常认为时间与空间可能是一体的(这是从结果观察导致的),其实不是,只要带有时间参数的都是与时间有关,变化的都是与时间有关,函数本质就是研究变化的事物,也就是研究与时间有关的。

反映在计算机上,CPU是典型的与时间有关的事物,计算机由存储和计算组成这个现象已经暗示我们,时空是不可以混合在一起,尽管最终结果是组合在一起任务。

以上两种区别其实常常体现在我们思维中,比如unix命令 ps -ax | grep java,这是每次需要计算才能得到结果,而windows大窗口里面的小窗口可以缓存在内存中,下次打开时直接读取即可,无需麻烦CPU再进行计算。

以上概念区别需要有Windows和Unix双重经验的人才能体会,现在大数据计算 函数编程等等计算概念都是偏重CPU的。

人的逻辑思考也是和时间有关,与空间无关,在时间上呈现顺序,先来后到,因果前后的。

如果有分布式系统经验,对向量时钟在分布式系统之间数据复制一致性有认识,也会意识到,时间是统一分布式节点的最终唯一法门。

从我个人经验来看,达到用时间维度而不是空间维度思考,相当于用理性思考,比如股票买卖点,当你进行买卖时,都是某个时刻,而股票是随时间变化的,因此你不可能买在最低点,卖在最高点,最低点最高点是时间过去以后的一种空间结果而已,而你买卖总是当下时刻,正如抽刀断水几乎不可能一样。

我现在常常想:我眼睛看到 听到的都是基于空间的结果,而我脑子里经常是想象时间维度中世界是怎样的?那是一个怎样的世界?大概唯有枯燥的数学帮助我们去探索,还有一种办法,将时间维度转为空间维度观察,因为时空是可以转换的(这可能是另外一种时空一体概念),这样转换以后,我们不一定借助数学而能大概了解时间维度的世界。



[该贴被banq于2015-03-19 15:44修改过]

2015-03-19 15:20 "@banq"的内容
不是很理解你的时空一体的概念。 ...

我是这样理解的:有一个空间单元,如果它在变它就有它的时间,如果它不变它就没有时间只有空间。可是这个世界中任何空间单元都在变,即使a单元不变,但是它临近的b单元变了,结果它与b的相对空间和时间就变了。变和不变都是相对的。

windows和linux中都有变和不变。都管理的良好,也都有提高的空间。问题也是空间,它们作用域不同的问题空间会耗费不同量的时间。linux的命令大部分人看不懂,它会耗费我太多人的时间,但是却能为能看懂的人节省不少时间。

今天有个想法,想把世界看作计算机。
在计算机的指挥下制造了一辆车子,然后又是在计算机的指挥下识别出了正在路上跑着的这两车子,计算机把这两车子当成了一个记录,计算机把这个世界当成了个数据库。计算机在到处指挥者生产力去建造事物,然后给它们打上标识,计算机随时可以识别这些东西控制这些东西。计算机的世界跟我们的世界是同一个宇宙。
车子制造好了被存入宇宙数据库中,然后需要的时候再被读出来。宇宙数据库太大了,宇宙的运行速度有极限,那个车子被存入了宇宙数据库,但是它无论怎么运动都跑不了太远。这个车子不可能会被10亿光年外的计算机读取到,因为这个车子跑不到它能触及到的范围内,等10亿年外的计算机的读取请求到达这里时这个车子早就消失的无影无踪了,车子的寿命只有100年。
如果我们的文明体系能够延续10亿年,10亿年后我们的后人终于发现了除他们之外的文明,他们发现的那个可能是我们,我们发现的那个也可能是他们。
我们找到的外星人能比我们高明到哪去?我们由碳水组成,这些物质的变化就已经挺快了,变化了几十亿年才变到我们这样的存在,外星人用什么组成呢?用金刚石,金刚石的变化太慢了,变化这么慢的东西怎么可能在我们有生之年排布出智慧。即使它有了智慧,它只会在它那个变化速度上去影响世界,它影响世界的速度太慢了,它影响不到我们。如果我们在几十亿光年内找不到和我们能力相当的东西,这样的能够跟我们打交道的东西就不可能存在了。
然后人们问我们考虑上面那些的意义是什么?意义是绕了一圈再回来,通过绕一圈从而消灭远处的世界,改为从眼前出发。远处的是空想,落实到实处就是保护局部,权限引擎只能保护局部,保护不了整体,因为整体没有边界。从眼前出发放弃遥远的远处就是落实了。