灵感:以人的DNA和计算机代码类比来认识世界。
我们的身体构造是严格按照DNA来组织的。而DNA的编码正如程序的编码嵌套一样,手是由好几个部分组成的,而每个不同的部分又可以分成很多很小的部分,正如不断嵌套的函数,每个函数可以由多个不同的函数组成。就像俄罗斯嵌套瓷娃娃,也像我们世界的组成方式。实际上我们世界是由一些最基本的物质组成的,就像计算机中最原始的二进制编码,然后往上是汇编语言,高级程序语言,然后组成过程、函数,函数再形成一个个对象。这就好比基本的物理粒子组成一个复杂的人。再举一个例子,我们的知识瀚如烟海,因此我们将知识写成一本本的著作,然后给书添加章节和目录,然后再按书名添加书目,再按类别整理成一块块的种类。由此想到了:任何东西和事物都是由这种从大到小、从粗到细、从简到繁的方式组成的,我们不必从最细粒度去整理和分析,因为最细粒度都是最原始最基本的颗粒,它本身不含更有有用的、冗余的信息。信息本身蕴含的秘密集成在颗粒的组成方式上。如果我们从最细粒度出发,而没有一个框架图的话,会陷入数据的海洋。这些数据我们很难找到其中的规律。而事实上,我们最重要的就是发现这些数据的组成规律。往往是这些组成规则决定了组成后的粒子的功能和属性。是如何组合的,是如何层级嵌套的,这样我们就能站在更高的粒度去观察和分析它,发现它的本质规律。我们在化学的层面上来看物质之间的反应,就像我们将许多函数组成一个个函数或对象后再编码一样,如果从物理粒子层面解释化学反应,就如同将这些一层层函数由外而内代入,写成最细粒度的代码(对于程序员来说,可读性相差了好几个“数量级”!这也解释了为什么越细粒度的代码越难理解,为什么软件界要求提高代码复用程度,高内聚低耦合。因为这样的代码简洁、规范、易懂)。(因此,我们经常反其道而行之,即用函数和类、对象来增加代码的复用程度,这也解释了为什么复杂的化学反应例如燃烧用以物理粒子为单位太复杂而很难解释,当前用大型计算机也无法模拟)。明白这一点后,我发现,无论是在理解事物还是在着手一件工作的时候,都应该注意事物的这种构成性质,从而很好地把握事物的颗粒度。太细,一是陷入了数据的海洋而找不到正确的方向,二是太细颗粒本身不含有更多有用的信息。太粗,则无法深入了解该事物的运行原理和构造方式,如果不能很好理解就不能很好地利用。因此,我们在研究事物(对象)的时候一定要把握一个层次粒度,正如编程时候的合理封装好的接口,在这个层面上,细节既不会过于复杂,对很多具体的复杂动作进行了封装,又不会过于笼统,能让我们了解该事物深层次的规律,有什么属性和功能,能在什么时候被调用和被触发都能够一目了然。这样,我们就能很好地应对任何工作并快速上手。
另外我想到的是:我们读书时,先查书目,再查索引,最后查自己感兴趣的章节。我们工作时,从最细粒度干起,基于该粒度做一个“索引”,再在索引上按工作流程分类,进行一个类似于函数封装的过程。我们了解和接手工作的时候,就像查书一样,只要对方交接时将工作整理好了,我们不必理会大量细致而繁复的工作,我们只需要找到每“块”(封装的块)工作的“接口”,这“块”工作的作用和目的是什么。通过交接的文档,我们以“块”为单位进行查阅,从而对整个工作有一个全面的了解。以查书为例,一般这个“块”的就是每本书的“目录”。通过目录你能知道这本书大致在说明什么,然后通过书目列表你就明白了得到的这些书的涉及到的大致领域。程序代码也是这样:有了最细粒度的代码,然后有以函数为单位的数据流图(标注清楚每个函数的功能和接口),然后有以模块为单位的功能图,最后才是软件用户说明文档。这样,有了中间两个图,我们在接触软件的时候就对一堆堆代码在干什么一目了然。从这里我想到了人类基因图谱,我们的DNA就是最基本的二进制代码,我们必须将它反编译为高级程序语言,然后将后面的三个文档补齐(数据流图、以模块为单位的功能图、软件用户说明文档——粒度由细到粗),这样,我们才能声称破译了人类的DNA。否则,永远从最细粒度去看DNA,就如同永远从二进制数据层级去看一个超级大型网站的代码一样,毫无疑问,我们很容易陷入数据的海洋,哪怕你是一位很有经验的工程师,你也仅能破译出你熟悉的部分,而大部分的数据你是无法看明白的,因此,就像目前的基因工程师们干的这样:只能宣称剩下的大部分代码是冗余的、无意义的。
从我们的身体由DNA构造组成,我由此想到一个推论,我们是不可能有来世今生的。因为用计算机的语言来说,我们的DNA相当于计算机中的“类”。我们是根据“类”造出的一个个实实在在的“对象”。而我们的大脑就是这个对象的“运行环境”,当给出一个个发生的“参数”,也就是初始条件的时候,我们的“意识”就开始在“大脑”的这个世界运行了。我们的意识(计算机的对象)在大脑中运行(程序在具体环境中被调用、触发)会产生一系列的结果(思维活动)。正如对象被调用后产生的返回值,我们将其存储在变量中,这个变量对于大脑来说是“记忆”。一旦程序运行结束(大脑死亡),变量的值总是会被清空掉的(意识消失,记忆没有了)。我们唯一能够做的就是根据我们的经历继续完善我们的类—NA)使之更加适应当前的环境,让下一代更适合在这个世界生存。这相当于程序不断地增加和修改类,类继承原来的属性并增加新的属性。
另外,我从元数据管理平台中得到了更多的启发。我们只需要最细粒度的代码,其它的可以通过新做的程序自动生成。我们新程序是这样写的:首先找到有哪些最外层的函数,其次在每个函数内部找调用了哪些函数,这些被调用的函数处于外层函数的内部,再次在这些被调用的函数内部找是否仍存在调用函数,以此类推。这样,一个函数层级结构图谱便形成了。另外再增加一个表示同级之间相互关系的图,这样,数据结构图便出来了!最为关键的是,它是自动生成的,而不是人身体力行手工画的,如果程序变动,就节省了很多工作量!
我在研究的时候意识到,如果任何一项技术和理论不和我们这个世界的运行规律相结合,不参考这个世界的对象和方法,而靠个人凭空想象出来的话,那它就是浮漂之萍、无根之木,经不起推敲的。进一步说,你研究的任何东西都要从这个世界中去寻找参照物。我们从来不是发明家,是发现家,发掘世界一层层本质规律,再加以利用的人。例如对计算机的对象建模。我们不能凭空去想象一个数学模型,仅仅满足方程上的自洽,需要和我们这个世界的真实存在的对象联系起来,研究真实世界对象是如何运作的。这种建模,才经得起检验,才有丰富的内涵,才是真正的“科学”的。另一方面,我们研究的一些框架和理论,一定要在现实中找到可以对应研究的例子,这样还可以参考大自然的精巧构造。例如我们用类图搭建的系统架构,大自然不也用基因图谱搭建我们身体的架构吗?事实上,他写得比我们好很多。对我们有很大的启发和帮助。我们的科学还远远没有参透上帝创造这个世界的奥秘,甚至连我们自身都不够了解,那又为什么要去拍脑袋空想你钻研的东西呢?路线错了,一切都错了!做研究最害怕的就是这种。就如同我们在中国学习英文一样,很多高中老师出的艰深的英文题(当然语法是对的),老外来也不会做。因为它是老师们拍脑袋想出来的,在国外的真实语境中,不会那么去使用。有很多种比它简单得多的表达方法。这就是脱离实际的一个例子。我们虽然明白这个道理,但在实际工作和学习中老是不经意就违背了这样的一个原则,所以,建霖注意并牢记!