当初写MFC程序,开窗口动鼠标之类的函数都是现成的,我也不知道到底怎么实现,反正调用一下就完了。实际上,一个最简单的图形操作,背后的代码就可能有上百行,而且牵扯到几何计算,繁不胜繁。
树与表
不光这样,就算那背后的代码,转化到机器码还要经过几道手――由编译器将程序从高级状态一步步低化,看上去人模狗样的程序最后化成冷冰冰的loadirl这样的东西,最后是0和1一通乱闪。好像美女经过医疗映像透视后,只是骨骼血液组织,跟丑女没有什么区别。在这个过程中分配内存,要找地址。编译器的针尖在一格格的堆栈间扫描也够辛苦,成效当然有赖于我们存放变量的方式,也就是表格式,需要知道某两个数值间的地址差别,也需要知道一个萝卜占几个坑。我们当然想知道的少点,越少越好,然而,还是需要对地址空间有一定的控制。而要实现连续、迅速,尤其是确定的控制,表哥是常用之道。
而树则是和表格截然相反的东西。树结构是这样的,如果要寻某个点,从根开始,沿某顺序,比如父-左子-右子,就可以找下去,不必知道现在自己在第几层,好比闭着眼顺藤往下出溜,找到拉倒。最好玩的还不是这个,而是它跟字典的联系。字典就是树,字幕A和C之间可以插入无数单词,A开头的单词增加或删除,不影响C开头的单词(前提是查字典不依靠页码)。而建树的过程也是这样,随便哪个节点加点再加点,不影响兄弟点,所以可以无限加下去。
冒险把世上的结构组织方式分成这么两大类:树和表,一是允许在各处无线增长(开放0,一是稳稳当当固定结构(一定方向上封闭)。当然,表并非不可插入和删除数据,只是它总归是单方向的。想当初,上帝造世是树式的,弄出天地日月亚当夏娃,剩下的你们就自己折腾去吧,反正这最基本的几样已经有了,爱生什么生什么去。原来都是野物儿出身的你我于是子又有了子,子又有孙。。。。。。最后茫茫宇宙,大树成了什么样,恐怕上帝也不清楚,以后会成什么样更不清楚。而人对世界的认识,却是表格式的,要将玩物系统化、概念化,要做标记、分类、命名,才能有知有识。相对于无穷无尽的世界,知和识是有限的,不时需要修正。当年阿基米德、普林尼以至牛顿等,都雄心勃勃地造了大网,似乎把表格完善得有头有尾。最后呢?还不是要后人点滴修正,拆开来塞入新表格线?然而不造表,用树的方式蛮干,又如何嫩借助已知来追索原因结果,获得新知?难道你我如今算个3+5也要从开天辟地开始,用小石头挪来挪去一个个数出结果?不用小石头而用方法计算,则类似于查表,也就是确定解法和输入值,等待输出。先知道加号代表什么,再找3和5各自是什么,然后用现成方法操作,完事大吉。
想穿了,这个世界千变万化无非是树与表的争斗和互动:表死缠烂打要罩住树,树生生不息要逃脱表。
反秩序――加密
在我们的网络安全课上,老师说了句极有意味的话:在工业上,不能用轨迹(trick)来实现加密,因为花招迟早要被人识破。一旦识破,它就很脆弱,不再有任何用处。那么管用的、能够持久的加密是什么样的呢?答案是:在加密被标准化之后,也就是算法已知、解密程序存在的情况下,仍然需要长时间运算才能解开的编码。时间要长到什么程度?理论上说,用世界现存的数学算法,理论上都不能在可行时间内算完。典型的如RSA,该算法虽然不断改进,但其思想近30年铁打不动,就是因为大质数的幂运算本身有着很高的复杂度。理论上说,你等它算完的成本,高于解开秘密的成本。或者你算完的时间,比密码有效期还长。当然,这是理想情况。密码被破解的可能性还是存在的。
这里面的哲学,真是非常有趣。人活着,一边攻破一边设障。最有效的设障,不是靠小聪明,一个一旦告诉你答案就不堪一击的秘诀。而是靠数字本身的复杂度和无序性来实现的。
而解密,往往就是找规律,用统计分析的方式。比如某个字母出现的频率,分析多了就可以对应上答案。所以加密也是针对于此。大家知道熵这个概念有时可以用来表示一种混乱度,熵值越高越混乱,我们加密的理想正是找到一种编码方式,达到比较高的无序状态,让你看不出哪个字母出现频率高,并且在你设想出一条规律的时候来迷惑你,让规律显得似是而非。这样你只好一个个可能性尝试着去破解。信息安全研究的有趣在于,多数时候科学研究都是寻找规律,降低你研究那个对象的熵值,但加密是相反,把牌洗到最乱,淹没规律――这当然是为了对付人。所以人和人、人和自然的关系转了个圈:你要掌握一个东西,要减低其熵,等你获得它之后要用盾对付别人的矛,也就是增加其混乱度。其实世上的逻辑攻防,也就是非物理、物质的防守,都可以解释成刻意提高混乱度,即防止别人发现规律,结果往往是此规律输给彼规律――往往是复杂度比较高的规律获胜。
当然,计算机中的解密也可以不那么光明正大地跟真正的科学问题对决。它可以通过分析时间来接近解密,特别是对某些算法。比如,加密中某些运算,比如耗时较长的乘法、时间较短的移位,等等。因为其计算复杂程度有差别,解密者分析时间,可以大概猜测到到底什么运算进行的比较多。后来加密者想出对策,把这些运算统统改成查表,也就是说,无论快慢运算,索性不算了,都改成查表找结果,这样一来,不但加快了速度,还统一了时间。不过后来有论文表明,查表也不是万灵药――万灵药是不存在的,在秩序和反序之间,从来都是道高一尺,魔高一丈,而对解密的成就,往往带来纯数学研究的进展。
关系与秩序
举了树、表和加密的例子,无非想说明窝的一种观察:事物和秩序的关系。加密技术多多,基本可以归纳为隐藏,换句话说,是让有序的东西看上去无序,从而无法获得有意义的信息。而意义,不就是秩序吗?打乱(不管是认为还是自然)和生成秩序的方法有多种,并且随着人的认知能力的增加而增加,此间的生生不息,不是一种类似树和表之间的循环吗?
说道认知,思考是最活跃的动力。粗略归纳一下,科学思考,无论是发明创造还是学习、理解知识,往往始于现有关系,终于找到新关系,而关系终将导致秩序,也就是说,学习也好发明也好,最终要将新的感性经验吸纳到秩序之内。
比如,镭元素是一种天然物质,被居里夫人发现后命名,但是如果人类若不是先有了物质、元素这类概念,也就不可能把它归为元素,并关注它作为元素的特性。所以,跟人现有认知完全无关的发现,是不会成其为发现的。好比一个人冒险而不慎闯入无人之境,不知此为何处,又无法做了记号以后再来,并将之归为自己可以反复进入的版图,那么这次陌生然而无效的旅行,与梦境无异。故发现总会跟已知的东西有些联系。某事物或抽象规律一旦被发现、命名、归类,就进入或者扩大了知识体系。所以科学史看上去是滚动更新的。