编程与抽象建模
我们每天都在学习新的知识。知识就是我们大脑对这个世界的各种认识的抽象模型。
编程是对世界本质的思考,所以编程也可以看成是我们的大脑在抽象建模。
编程中的抽象建模是可被计算机检验的(因为必须能够在计算机上运行),并且可以在全世界被成千上万的人反复使用,所以可以说软件编程建立的抽象模型是经过了大量的检验的抽象模型。
正是因为这个原因,我们可以通过学习编程去更好的认识这个世界,以及各种软件在不断进入更多的领域和更深的层次,改变了我们的生活。
所以首先的我们要了解抽象建模。
抽象模型:算术
大家都学过算术。算术是我们对数字的认识的一个模型。比如自然数以及加减乘除就构成一个模型。
自然数是1,2,3,4,5,6这样的数,顾名思义,就是自然世界里有的数。我们可以对这些数进行加减乘除运算,在我们的生活中我们经常需要对这些数字进行这些运算。
但是当你用一个较小的数减去一个较大的数,比如2-6,就不够减了。为了让我们的算术模型更加完善,我们可以引入负数,这样我们就有:2-6=-4
负数可能就没有自然数这么自然了,它更像是我们头脑里的一个抽象概念。
当你用一个自然数除以另外一个自然数的时候,你很可能也得不到一个自然数。为了让算术模型更完善,我们引入分数或者小数这个更加抽象的概念。
引入负数和分数以后,我们看到我们的算术模型就比较完整了。
抽象模型:拼音
汉字拼音也是一个模型。你可以用26个字母拼出所有的汉字。
不过对于拼音模型,26个字母只是其最基本的单元,字母之上,还有更高层次的结构:声母,韵母。另外汉语拼音还有4个音调。
知识也是抽象模型
总结一下我们上面讲述的抽象模型:知识是我们大脑里的模型,代表了我们对这个世界的认识。这个模型是建立在我们生活中经历过的其它重要的感官体验基础上的(我们称之为重要体验)。因此死记硬背是无法真正学会知识的,我们必须用双眼、双手去体验,找到事物间的相似之处,建立起抽象模型。
大脑中的知识是建立在我们的重要体验的基础上的,它代表了我们对这个世界的认识的抽象模型,可以帮助我们更好的理解我们所处的世界。
学习就是抽象建模的过程(学习是探索并建立各个领域的知识模型),编程也是抽象建模的过程(编程也是找到各个领域的知识模型并将其数字化,也就是说这个模型必须能够运行,还要被很多人使用来接受检验)。所以编程是在思考事物的本质。
并且上面我们通过算术模型和拼音模型大概体会到建模其实可以包含非常丰富的内容,比如如何完善我们的模型,对比较复杂的模型如何分层等等。我们将在后面的章节具体去学习这些内容。
下面我们以一个更常见的建模的例子来说明上面的道理。
大家看下面这张图里是什么?
火箭模型如果你说是火箭。这并不是个真的火箭。
那为什么你要说这是火箭呢?是不是因为它满足了你大脑里的关于火箭的模型呢?比如有尖尖的头,圆柱形的身体,和几个作为支架的脚。这个可能是我们大脑里里关于火箭的模型。正是因为有这样一个模型,我们看到这种图片,我们可以识别出火箭。
这个例子说明,抽象建模在我们生活中是无处不在的。抽象建模就是我们俗称的“知识”。
编程这种建模是可被验证的,因为必须能够执行,并且要被很多人使用。
生命中心
这里我们引入“生命中心”的概念。简单的讲,我们能够识别出火箭这个模型,是因为上面这个模型里包含了几个构成火箭模型的生命中心,比如尖头,身体,支架。有了这几个生命中心,我们就可以识别出火箭这个生命体。
在算术模型里,自然数和加减乘除就是我们的生命中心。在拼音模型里,26个字母是最基本的生命中心,在其之上的声母韵母是更大的生命中心。
Paracraft3D动画编程界面“生命中心”是克里斯多夫亚历山大在其著作“NatureofOrder”里提出的概念。克里斯多夫亚历山大认为我们周遭的所有我们可以识别的东西都有生命,包含多个生命中心,其生命中心的组成结构决定了生命体的生命度。
当然克里斯多夫亚历山大主要是把这些概念用在建筑学上。克里斯多夫亚历山大深刻影响了软件业的发展,他在-年代提出模式语言,直接催生了对象化编程和设计模式的发展,包括后来的敏捷编程。
但当在一次公众演讲中被问及如何看待他自己在软件业的巨大影响时,他却说,软件从业者很大程度上并没能正确理解他所说的概念。简单的说,他认为软件业用他的概念确实有利于软件人士彼此的思想的沟通,但是目前的使用仅此而已,停留在简单的工具和方法学上,而缺少对生命本质的理解,从而无法从整体上去连接一切,在各个层面各个领域做整体系统的阐述与运用。
本书中使用的软件编程的抽象建模的分析方法,与软件行业使用的不少方法有类似或相通的地方,但又有不同。
我们希望通过本书的尝试,能够建立起软件业需要的对克里斯多夫亚历山大的理论正确的理解。如克里斯多夫亚历山大在”NatureofOrder”里所说,传统西方科学自笛卡尔以来,刻意追求主客体的分离,不让主观去影响客观的观察。
帕拉卡3D动画编程但主观其实也是客观的,客观本质也是主观的。科学的进一步发展,就是要突破这种机械的对立。这种对立在软件业的发展中也有很多的体现,简单的说,为什么编程对普罗大众来说这么难学难懂,就是这种机械对立的一个结果。而我们在本书里所介绍的方法,就是在生命体系的各个层次的建立上,有(创造性的)人的主动的参与,去感知在每个层面需要建立的生命中心,去构建一个富有生命的生命体。
软件编程里需要学习的方法,和其他各个行业,只要是面对复杂系统的,都是一样的。我们希望通过对“生命中心”概念的正确运用,我们能够把软件编程真正普及开来。
根据相似性原理,表面复杂的系统都是由最简单的基本单元组成的。比如生物体除了病毒,都是由细胞组成的,不管他们的形态和生命特征多么不同。再比如整个宇宙的组成其实就是一些基本粒子。
我们所看到的一切,就是来自于这些简单的基本单元的不断变化和组合。我们需要的是找到这些最基本的单元,以及它们是组合与变化的规律。而这些基本的单元以及其上的大的单元,就是我们要寻找的生命中心。
同样的基于相似性原理,所有的事物都是相连的,比如知识是广泛相连的。正是因为生命中心不停的变化组合成不同的事物,才形成了各种事物之间的相似性。
我们将在后面的章节里让大家逐渐掌握在抽象建模中如何一层层的识别出各层的生命中心,直至能够转化成指令代码的细节。
编程的抽象模型
编程作为我们建模的数字工具,其本身又有其抽象模型。那么编程又是怎样的抽象模型呢?
编程是在抽象建模。大家学习编程就是学习如何去给不同的事情去抽象建模。
下面我们结合Paracraft这个3D世界里的编程来了解编程的抽象模型是什么样子的。
Paracraft3D动画编程首先是指令。编程就是通过一些指令去操控一些东西。在Paracraft的世界里,我们有指令可以让角色移动,向前走,旋转,说话等等。
有一类指令是跟事件相关的,用来响应外部或内部的事件,比如键盘被按下或者鼠标被按下等等。
在paracraft里有一类事件是广播消息,发出的消息所有的角色都能接收到,需要响应该消息的角色可以去响应。
然后就是这些指令需要被一定顺序执行。最简单的就是顺序执行,即从上到下一条一条指令的执行。也可以循环执行甚至永远重复。也可以根据一定的条件选择执行,即如果那么语句。除了顺序执行,其他都有相应的控制语句。
好,差不多这就是最简单的编程模型了。