第1章
序曲:从古到今话计算
我们人类对计算的需要,可能起源于逐渐开始积累物质财产这个大的背景。这样的需要很快演变成为我们需要记录家庭或部落所拥有的财产,比如多少头牛和羊,等等。一旦可以做简单的加减法,与之相关的“记录信息的需要”也随之而来,有了记录,信息保存的时间可以更长,而且还可以分享给其他的人。早期用来记录信息的载体是鹅卵石或实物,但发展到后来,人们发现可以用符号来代替。
人类不断进化并开始以部落的方式定居之后,产生了其他的需要,比如需要测量砖瓦的尺寸和标定地界。一旦有空闲时间,我们人类又在好奇心的驱使下想要计算时空的距离和恒星的位置。
很快,与计算有关的活儿被视为是一种繁重而乏味的体力活儿。于是,很快出现了可以帮助提高计算速度的机械装置。算盘是第一个具有开创性的计算器。
最后,不同的决策支持工具先后问世。对快速计算、永久性数据存储和复杂决策的需要是最终启发我们人类设计和开发计算机及相关软件的关键因素。
人类对计算的需要
这样一本讲软件工程和计算机发展史的书,不应该开门见山就直接从某个具体的时间(比如1930年)开始。没错,数字计算机和软件设计的确是1930年到1939年之间才首次明确提出来的,但它们的出现实际上离不开历史上几千年以来的许多发明。
古往今来,人类对计算有不同形式和类型的需要。当然,更需要以固定格式来保存计算结果。
还有一种不太容易明确的需要是对不同的选项进行逻辑分析。一个典型的例子是产品的市场化是走平稳的长线还是走快而陡峭的短线。再比如,某块特定的土地最适合种植哪一种农作物?
更重要的决策还有某个部落是否应该对另一个部落发动战争。在今天,有些决策关系到健康,甚至生死攸关,比如,对付抗药性肺结核这一类大病,究竟用什么疗法才最有效?
再有就是影响到经济发展的决策。一个典型的例子是共和党与民主党。哪些选择对美国经济最有利,双方的观点截然不同。
要在不同的对立选项之间做出选择,虽然不可能双方都对,但双方显然都有可能选错。(也可能有其他更好的选择或压根儿就没有什么更好的选择)通过对民主党与共和党的辩论进行分析,我们发现双方貌似都是错的,而且,无论采取哪个党派的执政路线,最后都可能不利于美国经济健康发展。
在计算机或软件设计专业人员看来,建一个强大的数学模型来比较提高税收(民主党目标)、减少开支(共和党目标)或兼顾两者所造成的经济影响,应该不是特别困难吧。
然而,民主党与共和党都没有用真实的财政模型来展开理性的辩论,而是停留在巧言辞令的层面,没有任何实质性的信息或论据来支撑自己的论断。共和党与民主党的演讲简直让人大跌眼镜,双方都在极其能事指责对方,但都拿不出什么确凿可信的数据。
这类问题在美国很多州和市也发生过。比如,2012年美国大选前,罗德岛州议会通过一项不明智的决议,每个投票站的选民人数提高一倍,目的是使投票站的数量减半。
这个愚蠢的决定造成一个不可避免的后果,选民必须排成长队,足足等上四个小时才能投票,有些投票站甚至还得开放到深夜。
这个问题并不是特别复杂。每个投票站每小时的人流量在很多年前就是知道的。但罗德岛州议会疏忽了对投票站减半后之于选民等待时间的影响进行充分而必要的计算。
结果,2012年大选中,罗德岛州很多选民等不起四个小时,有的甚至没有投票就直接走人。他们的选举权被这个“脑残”议会所通过的愚蠢决议给剥夺了。议会的这项决议太差劲儿了,在没有对投票站减半对投票时间的影响进行建模之前,绝对不应该予以通过。
今天,政府出台的法律是否明智,颁布的法规有没有经过大脑,其决策影响评估都可以用计算机和软件轻松算出来,甚至还能够从根源上消除可能出台类似愚蠢决议的任何想法。
事实上,古往今来,人类一直都在运用数学知识做出逻辑选择,记录数据和信息,在这样的大背景下演绎出软件和计算机的发展历程。下面几个问题与软件和计算机的发展史紧密相关:
* 我们用的是什么类型的计算?
* 我们需要保存什么类型的信息或数据?
* 对于需要长期保留的信息,哪些存储方法最合适?
* 面对复杂的选项或决策,哪些分析方法对我们有帮助?
* 在进行数据与知识的交流时,有哪些最佳方法?
穿越古今,从大历史观的角度来考虑这五个问题,纵览计算机和软件逐步用于解决这些问题的过程,是非常有意思的。
对数字序列的早期认识
说起来,我们人类可能是先学会说话,后来才慢慢开始学会数数的,至少可以数手指头,从1数到10。早在3.5万年以前,尼安徳特人①和克罗马农人②可能就会数数,有考古发现为证:捷克斯洛伐克距今3.3万年的狼骨和非洲距今3.5万年的狒狒骨,上面都有并排的划痕。
这些划痕记录的是过去了多少天,还是多少件物品,或只是单纯记录过去了多少时间,我们对此不得而知。狼骨最有意思,因为上面的55个划痕被分成5组,很有可能是用来记录物品或时间的。
考古还发现,距今5万年的乳齿象象牙上有16个孔,这些孔的用途也是个未解之谜。尼安德特人和克罗马农人在公元前4.3万年~公元前3万年之间融合,所以这些饰品可能来自其中任何一方,也可能来自同时代但现在已经灭绝的其他部落。
有趣的是,虽然现代人额前叶更宽、更高,但尼安德特人和克罗马农人的头颅和脑容量都略大于现代人。虽然脑容量与智力水平并不直接相关,但确实可以表明很早以前就存在某种形式的抽象和推理。岩洞壁画的历史可以追溯到4万年以前,这说明人类在当时至少已具备某种形式的抽象能力。
除了计算物品和财产,对时间流逝保留类似的跟踪记录也十分重要。对于年,人类有主观的了解可能是距今1万年前的事。随着1万年前农业时代的到来,了解特定农作物的种植时间和收割时间对粮食生产有很大的帮助。
目前已知的第一批人类定居点是公元前7000年土耳其的加泰土丘。这个泥砖构造的小镇大概有几百个居民。考古人员在此发现了农业时代的小麦、大麦和豌豆。肉类食品来自牛和其他野生动物。
箭头、锤头、陶器、铜和铅等考古发现表明这里发生过某些形式的交易。如果没有物品记录方法,交易是很难实现的。此外还有许多壁画,或许可以说明人们对艺术有兴趣。
早期人类对数学的认知可能来源于几个关键问题。
* 史前的数字和数学知识
通过计算物品来记录主权(所有权)
理解加法和减法两种基本运算
测量角度,比如东向或西向,以免迷路
计算时节,用来辅助农业生产
计算日常时间,用来协调集体活动
* 早期文明后出现的数学和数学知识
为建筑用途而计算实际的长宽高
为交换物品而计算重量和体积
计算长途距离,比如两个城市之间
计算山体的高度以及太阳高出地平线的位置
理解乘除法数学运算
* 牧师或巫师传授的数字或数学知识
计算天文时间,比如日食,比如恒星的运行位置
测量运动物体的速度
测量曲线、圆和不规则的多边形
测量加速度等变化率
测量音速和光速等不可见的物理现象
* 数学家提出并发展起来的数字和数学知识
对博弈和赌博中的概率进行分析
理解抽象概念,比如0和负数
理解复利等复杂问题
理解非常复杂的问题,比如无限性和不确定性
理解抽象概念,比如无理数及量子的不确定性原理
经过仔细观察,借助于石头或划痕以及用来测量长度的木棒,史前的数字和数学知识很容易理解和掌握。加减法的演示也很容易,从一堆石头中简单增减石头即可。
早期文明中,为了了解数字和数学知识,需要物理设备与抽象推理相结合。显然,有些刻度尺用来称重,有些角度计算器用来测量山体高度。有些记录方法用来跟踪系列事件,例如长时间观测和记录恒星在空中的位移。
来自祭司或巫师的数字和数学知识,结合了抽象推理、精准计时、精准实测,让人清楚认识到数学所代表的东西是看不见、摸不到或不能直接测量的。这就要求有人花时间做智力研究,不再像以前那样继续从事农耕或狩猎。
数学家提出并发展起来的数字和数学知识,可能是促成计算设备以及计算机和软件最终问世的主要原因。要求对以前的事物有系统化的认知,同时还要结合精准的测量以及对数学推导有强烈的求知欲。这些知识可能起源于数学素养良好并可以在新的方向以创造性思维扩展早期数学概念的人。
考古发现,古城摩亨朱-达罗③曾经有过复杂的数学运用。事实上,天平秤和称重计就是在这里发现的。
古城摩亨朱-达罗在巅峰时期可能有3.5万居民。它的街道布局为紧凑的网格状,砖和建筑物都有标准的尺寸,显示出重复使用的迹象。显然,这些都是需要精确测量的。
摩亨朱-达罗和印度北部城市哈拉帕在建筑风格上很相似,表明古印度曾经有过中央机关。两个古城都发现过一大批描有动物图像和符号的石版,只不过其含义目前还无法破译。有些石版的封泥时期甚至可以追溯到公元前3300年。
其他古代文明也发展了计数、算术以及长度、重量和尺度单位。埃及和巴比伦在公元前2000年就有算术。
随着城市成为定居点并逐渐扩大,人们的闲暇时间也增多,出现了非体力劳动和狩猎的职业。这些职业不依赖于体力,毫无疑问,牧师和巫师就属于这一类。他们的时间从生存和觅食中脱离出来之后,开始进一步理解以更多形式出现的数学知识。
长期跟踪恒星的运行轨迹,测量更远的距离,如不同村庄的产权边界和距离,测量船只的航行轨迹和位移,这些都需要更复杂的数学计算,需要精确测量角度和时间段的变化。造船业的到来,还需要更高深的数学知识,因为船体必须要能弯曲,单是直线测量还不够。
在河里或海边荡舟或划船,不需要太多或根本不需要用到任何数学知识。但是,一旦驶入大海开始远航,就必须认识星座,以免迷失方向。
由于大陆漂移的原因,澳大利亚远离其他所有大陆,没有陆桥在任何位置与它连接。然而,大约距今4万年前,就有人类在此定居,显然是通过长途远洋航行过去的。波利尼西亚群岛和复活节岛也远离所有大陆,但几千年前也有人类定居,这说明人们对星座有早期认识,也用到过某些数学知识。
埃及、美索不达米亚、中国、印度和南美等很多古文明很快就积累了相当复杂的数学知识。这些数学知识往往都与基本功扎实的专业人员有关。
大家都知道,许多古文明,如中国、苏美尔人、巴比伦人、埃及人、希腊人,都在儿童教育上投入了大量时间和精力。但很多人不知道,印度、中美洲和南美洲其实也曾经大力提供类似的训练,比如奥尔梅克人、玛雅人、印加人以及后来的阿兹特克人。
日本也有正规的培养体系。针对上层阶级,日本的培养体系既包括兵器的运用,也包括智力教育,比如阅读、写作和数学。所有这些古文明都建立了正规的儿童培养体系和信息记录方法。
印度北部那兰陀大学④大约建立于公元前472年,后来一直持续到大约12世纪。公元500年左右,这所大学的招生规模达到顶峰。这是古代人员规模最大的大学之一,有1万多名来自亚洲及世界各地的学生,教职人员2000多名。它是世界上第一批开展数学、物理、医学、天文和外语教育的大学。
那兰陀大学曾经有一个活跃的翻译团队,他们把梵语和印度语的文献翻译成了多种其他语言。事实上,那兰陀大学图书馆在12世纪穆斯林入侵印度时被毁于一旦,关于那兰陀大学的许多信息都来自中国保存下来的中文翻译文献。据说图书馆规模很大,大火一直持续了六个星期。
即使与希腊和罗马相比,印度的学者也很先进。零的概念和对星座的认识都早于欧洲(美洲中部奥尔梅克人对零的了解和运用也早于希腊人)。
在古代,每1000个人中超过950人是文盲或只会简单的计数和简单的测量。然而,有极少数人有能力学会更复杂的计算,天文、建房搭桥、导航和造船等行业的发展需要用到这些数学知识。
那些为数学发展提供原动力的发明
自从开始知道计数和数字概念,使用数字化信息的人就饱受困扰,因为总是需要运算速度更快、结果更可靠(相较于不借助于任何设备的人脑)。为了理解计算机和软件的重要性,我们有必要先了解早期人类为提高计算性能而做出的许多尝试。
同时,更有必要思考计算机和软件的真实作用及价值。各种计算装置为人类思维能力提供的服务包括但不限于:
* 加减乘除基本运算
* 科学数学,包括功率、正弦和余弦等
* 金融数学,包括单利、复利和利率等投资回报率
* 逻辑计算,比如不同替代方案的路径和选择
* 时间、距离、高度和速度的计算
* 从大量分散信息的集合中推导收敛,得出有用的归纳和总结
* 演绎逻辑,从规律中得出结论
在为写本章内容而展开调研时,我从网上搜到大量有趣、有用的资源。比如,IBM制作了一个图解数学史,甚至还可以下载到iPad上看。⑤维基百科和其他网站资源也有数十个计算机硬件史以及多个软件发展史。现在全球各地已经有十多个计算机博物馆,比如英国的伦敦科学博物馆,就陈列了一个还可以正常使用的巴贝奇分析机。
本书将综合介绍六大发明,它们彼此促进,最后相互关联并促成了现代软件的诞生。
在这六大发明中,排在第一位的是数学。计算设备、计算机和软件的初衷都是为了加快数值计算。数学运算大概是从加减运算开始,而后才引入乘除运算。再之后,出现其他更多更抽象的运算形式,比如几何、三角、代数和微积分等。
第二种形式的发明是记下想法和信息,以便于分享、传播和长期保管。这类发明包括写入系统和物理存储设备。针对写下的数据,存储方式包括石板、泥版、纸莎草、动物皮、纸以及最后出现的磁存储和光存储。存储位置包括手稿、书籍、图书馆以及最后出现的数据库和云存储。
第三种形式的发明是物理计算设备,用于协助人类学者进行(比单凭人的脑力和体力)更快、更准确的计算。常用数值表是第一个用来加快计算速度的方法。物理设备包括算盘、量角器、星盘、测量设备、机械计算器、计算尺、模拟计算机和最后出现的电子数字计算机。
第四种形式的发明是信息发行渠道。毫无疑问,第一种渠道是口头传播,让学生或学徒记下来。但不久之后,出现了信息的传递,包括石头和骨头上的划痕,泥版上留下的记号,最后出现的象形文字、表意文字(比如汉字这样的方块字)和最后的字母表。
第五种形式的发明是软件。这是最近出现的,2013年所用的所有软件使用年限都不到50年,50%以上的软件使用年限可能还不到20年。
第六种形式的发明是间接发明。这些催生发明的发明虽然与计算机或软件不直接相关,但有助于促成发明本身的问世。这些激发新发明的发明中,一个是专利系统,另一个不容忽视的是塑料。