今天我继续和你讲讲在计算机发展过程中的一些思考。当然,讲故事的目的是为了说明事倍功半vs事半功倍的做事方法。
昨天我提到最早用模块化原理实现可编程计算机的是一位德国人,他的名字叫做楚泽(Konrad Zuse),生于1910年,在德国的大学里读的是力学。
在楚泽那个年代,数学和力学是不分家的,因此他对数学算是非常精通的。大学毕业后,正值德国备战期间,因此楚泽到了一家飞机制造厂从事飞机的设计工作,这项工作涉及大量繁琐的计算,而当时真正能帮上忙的工具只有计算尺。
很快楚泽就发现很多计算其实使用的公式都是相同的,只是要代入不同的数据而已,比如计算飞机机翼宽度从10米到11米之间,每变化一厘米时它的升力。这种重复的工作完全应该交给机器去完成,而不是动用大量的专业人才。有了这个想法后,楚泽于1936年辞职回家,自己去研究这种能够计算的机器了。
在此之前,楚泽对计算机一无所知。同年,图灵博士已经在大洋的彼岸提出了可计算性理论,但由于楚泽并不属于数学家的圈子,因此直到二战结束都不知道图灵的理论,楚泽甚至不知道一个世纪前的巴贝奇的工作。当时,他才26岁,完全是凭着一股热情,加上良好的数学基础,独自一人在家研制能够计算的机器。
所幸的是,由于有了几年从事工程计算的经验,楚泽深知能计算的机器不应该只服务于一种或者几种特定的计算,而是应该能做各种计算 ,至于怎么算,应该有一些指令序列,也就是你们所说的程序来控制。也就是说,楚泽其实和图灵一样,按照第三类发明的逻辑在设计和制造计算机。
当然为了做到这一点,就要设法让所有的计算都变成一两个最基本的运算,然后用机械搭建出实现这种基本运算的模块,再大量复制这样的模块,就如同我们用乐高积木搭建各种形状一样。
如果说楚泽比巴贝奇先生有什么进步的话,想到用简单的模块实现基本运算恐怕是关键。巴贝奇试图用复杂的机械实现复杂的运算,结果那个难度超出了当时的工业水平,因此他穷其一生都没有造出自己所设计的计算机。
楚泽知道英国数学家布尔在19世纪末所发明的布尔代数,懂得用二进制来实现运算和控制机械计算机。当然他还需要实现十进制和二进制的转换,这也可以通过简单的机械模块来实现。
当然你可能会问,为什么要多此一举进行十进制到二进制,再到十进制的两次转换呢?很简单,因为0和1(或者是开和关)这两个操作在机械上容易实现,而要用机械实现十进制的运算则很难。
当时楚泽并不知道美国的香农已经提出用二值的布尔代数实现所有的计算,而是从一个工程师的经验出发发现了类似的规律。遗憾的是,楚泽不是理论专家,更像一个工匠,即使做出了实物,却不能像香农那样提出一整套理论。
最终,采用简单方法实现复杂的功能的设计思路,让楚泽能够在很短的两年时间里造出一台可编程的计算机。他把这台计算机称为Z1,Z是楚泽名字的首字母。
Z1是世界上第一台依靠程序自动控制的计算机。 在Z1之前的各种计算机无论结构多么复杂,动力来自于人还是电,都无法自动运行程序。如果你单纯数Z1零件的个数,其实它比巴贝奇设计的计算机的零件并不少,但是里面的逻辑要简单很多,因为是大量简单模块的重复。
不过Z1依然存在明显的缺陷,它并不能实现图灵机的全部功能,比如不能比较两个数值的大小。此外,这台计算机是由电机带动庞大的机械装置,因此计算速度很慢,每秒钟只能计算一次。
楚泽后来得到了纳粹德国政府的资助,这让他在战后遇到不少麻烦,但是有了钱他的工作进展顺利了很多,很快他将机械的计算机改成了继电器的,取名Z2,速度达到每秒钟五次计算。
然后他又进一步改进,制造出了第三个版本Z3。 其中特别值得一提的是这个Z3,它使用了2000个继电器,真正实现了图灵机的功能,这是人类历史上的第一次。
楚泽的成功之处,有必然的结果,也有偶然性。
首先,他没有重复巴贝奇的老路,搞一个非常复杂的计算机,而是 先实现一种(或者几种)简单的最基本的模块,然后大量复制这样的简单模块实现一个复杂的功能。
其次,他巧妙地利用了等价性原则。 十进制运算和二进制运算是等价的,但是前者实现起来非常复杂,后者就要容易得多。当然,这种等价性的转换意味着要多做一些事情,但是 两件简单的事情做起来要比一件复杂的事情容易得多。
最后,相信命运,大环境的影响。计算机在二战前后在大西洋两岸先后获得突破,是大环境使然——对这些发明的需求,相关技术的成熟等等。因此,楚泽的命很好,相比之下,巴贝奇的命就不太好。
楚泽和巴贝奇的经历给了我这样三点启发:
1. 当世界上任何东西越做越复杂的时候,就是开始从复杂往简单转变的时候了。 计算机发展历史上的第一个转折点就出现在20世纪初到30年代这段时间。在后面关于计算机思维的来信中,我还会多次讲到很多事情都是从简单到复杂,再回归简单的过程。
2. 一口吃一个胖子的结果可能是零。大的目标要分解成简单的,一个个解决, 一个复杂的问题如果能拆成两个等价的简单的问题,成功的可能性就大很多,就可以事半功倍。但是,这并不等于做两件收效小的事情,就等于一件大事,这就是事倍功半。
3. 巴贝奇的悲剧除了时机不对之外,还有一个重要的原因,就是他低估了问题的复杂度。 复杂度通常不是随着问题的规模呈线性增长的,而是呈指数上升。 巴贝奇很早就制造出一个简单的差分计算机,他本以为用原来的方法,放大一下就能够制造出精度更高的计算机,但是显然低估了它的难度。
这件事说明,对不同规模的问题要采用不同的方法。对于今天什么都是大体量、大规模的时代,你需要有超出常人的思维方式。
希望这些思考对你有所启发。