尼尔·盖曼有部小说《美国众神》,这是一本很有意思的书。它说的是在美国这片历史并不长的土地上,随着移民文化而到来的各路新旧大神,彼此之间的阴谋与斗争。
书中有一个让我觉得很新奇的设定,就是新生事物也有着各自的神。例如高速公路之神、计算机之神、互联网之神等。这些神所获得的祭祀,就是来自人类频繁的使用。
当我看到布莱恩·W·克尼汉(Brian W. Kernighan)所著的《Unix传奇》一书时,我忽然发现,现代操作系统终于也有了自己的神。
不过,这并不是某一个人的故事,而是前后几十年间,一批又一批顶尖智慧的头脑共同创造出一个新世界的传奇。就是这样一群卓尔不凡之人,可称为Unix操作系统的众神。
这是一长串闪耀着光芒的名字,在这串智慧珍珠之中最耀眼的有肯·汤普森、丹尼斯·里奇、道格·麦基尔罗伊、阿尔·阿霍、彼得·温伯格、比尔·乔伊,还有布莱恩·克尼汉……
要讲述众神创世的故事,自然要先从他们的神殿说起。
从美国的金融中心纽约市出发,向北30多公里就会到达新泽西州的墨里山。此处风光秀丽,景色迷人,谁能想到闻名世界的科技殿堂就座落于此,这就是著名的贝尔实验室。
贝尔实验室由AT&T(美国电话电报公司)创建,其初衷是为了解决建设全国电话系统时遇到的科技问题。随着时间的推进,以及科技的不断发展,贝尔实验室在计算机科学领域做出了诸多开创性的贡献。
要说这个实验室有多牛叉,先上一组数字,这里诞生了9项诺贝尔奖和5项图灵奖。可以想象,在这里能占着一张办公桌的,那都是顶尖的人物。
那么,为什么贝尔实验室能吸引到如此之多的大神,而且还能引领计算机科学的创新呢?
答案就是宽松的研究环境、开放自由的学术氛围,以及由技术专家担任的管理团队。当然,充足的资金和优渥的待遇也是重要条件,反正AT&T公司是不差钱的主。
在贝尔实验室,管理层不会下达明确的目标和指令,研究者完全可以按照自己的意愿去工作。这看起来似乎有些不可思议,连要做什么都不知道,谁能保证投的钱不会打水漂,会不会有人上班就是在摸鱼呢。
这就是前沿科学的特点,它无法被设计,研究成果大多是在顶级的智慧群体之中交流、碰撞出来。所以在贝尔实验室想要站住脚,光靠脑子好使还不行。必须要充分融入这个集体之中,能提出自己独到的见解,也能无私地为他人提供帮助。
因此贝尔实验室根本不担心会有人在摸鱼,拿不出成果的人在这里自然也待不下去。能留下的,也会不断成长,最终成为神殿里的一员大神。
这样看来,大神们做的就是极具难度的开创性研究,出成果确实不容易。但研究成功,则是改变世界的创新。从投资的角度看,十个项目里能成功一个,就足以在业界保持领先了,付出的成本对AT&T来说还是很划算的。
这就是贝尔实验室能够获得成就的原因所在。接下来我们要说的就是众神开发Unix的创世之旅。
计算机最基础的软件是操作系统,它可以看成是机器与人之间的一层接口。操作系统本就是计算机的一部分,没有操作系统的机器,则空有强大的计算能力却发挥不出应有的效能来。
麻省理工学院在1964年推出了CTSS(兼容分时系统),就是将CPU的算力按时间分片,可以支持多人同时操作。那时计算机是非常宝贵的资源,这一设计可以让更多人使用计算机,自然CTSS得到了许多关注。
麻省理工的研究者们决定趁热打铁,他们要在CTSS的基础上研发一套更好的操作系统,称之为Multics。目标是可以成为通用的信息处理系统。同时麻省理工也希望,其他有实力的研究机构与企业能参与到研发与生产中来。
因为贝尔实验室在很早就开始了对计算机操作系统的研究,因此获得了麻省理工学院的青睐,由贝尔实验室来负责操作系统软件的开发。而通用电气则负责计算机硬件的制造和生产。
在为Multics进行设计的时候,麻省理工的研究员们将自己诸多的美好理想都加了进去。这样其实会产生一个问题,就是新系统会被过度设计,而太复杂的设计是很难被开发出来的。
这种现象就是“第二系统效应”,第一版的成功会让人过于自信,从而在第二版上又过于超前,结果导致系统开发出来复杂难用。
果然,经过三年的辛苦开发,Multics复杂得连贝尔实验室的诸位大神都看不下去,以致于贝尔实验室宣布退出Multics的开发工作。实在是不想再把宝贵的人力搭进这样一个华而不实的系统里去了。
虽然Multics未获成功,但参与过此项目的大神们动了念头想自己搞一个操作系统出来。这个意料之外的产物就是后来对业界影响巨大的Unix操作系统。
参与过Multics项目的肯·汤普森,决心继续进行操作系统的开发。但贝尔实验室被Multics搞得精疲力尽,不愿意再支持肯的想法。
于是肯自己找了一台过时的DEC PDP-7计算机,开始捣腾起操作系统来。这里需要说明的是,在上世纪六十年代的时候,计算机的配置相比于现在是极低的,而且造价高昂。
PDP-7只有16K字节的内存,今天一个中等配置的手机内存也是它的一百万倍。要在这样的设备上实现操作系统功能,就必须要拥有高超的编程技巧与算法功底。幸好,肯·汤普森就是这样一位大神。
更为传奇的是,肯实现最初版本的这套操作系统只花了三周时间,还正好是趁他太太带着孩子去度假的空暇。从某种意义上说,全人类都要感谢肯的太太独自带娃所做出的贡献。
系统有了,接下来就是得给它取个响亮的名字了。在一次同事之间工作中的闲聊中,布莱恩·克尼汉对此发表了自己的看法。
他认为之前做的Multics取名就是野心太大,因为其含有“包罗万象”之意,结果迷失在复杂性的迷宫里。那么这套新的操作系统应该是简洁而功能聚焦的,要用“uni”代替“multi”,叫“UNICS”会比较有意义。
显然,克尼汉的见解得到了诸位大神的肯定,“UNICS”的命名得以保留,并在后来调整为更合适的“UNIX”。而布莱恩·W·克尼汉也享受了Unix命名者的殊荣。
这一命名完美地契合了Unix系统所具有的独特设计哲学,那就是简洁、专注。
肯·汤普森开发出来的原型Unix系统,深得贝尔实验室这帮大佬们的青睐。Unix的另一位热心开发参与者丹尼斯·里奇,他和肯都希望能购置一台比PDP-7更好的计算机。
但贝尔实验室的管理层被失败的Multics搞得心有余悸,说什么也不肯批这个条子。不过你以为这就让能诸位大神们轻言放弃吗?不可能的,大神们有的是暗渡陈仓的办法。
因为贝尔实验室每年要编写提交许多专利文件,因此在文字处理上有着迫切需求。乔·奥桑纳抓住了这个痛点,提出可以采购PDP-11用于编写专利材料,Unix小组可以为其提供软件。
肯·汤普森和丹尼斯·里奇如愿以偿地拿到了比PDP-7更好的PDP-11,两位大神立即在新机器上展开工作。由此,在PDP-11机器上Unix完成了从原型到初版的开发。
在此之后,Unix就一直在实验室里迭代。1975年5月,第六版Unix发布,从这一版本开始,Unix逐渐为外界所知,隐然有走红之势。
为什么这一版具有如此魅力?
因为现代操作系统的设计哲学(套路)就此形成,并稳定下来了。这一哲学包含两个方面,第一是简洁,第二是专注。
先说简洁,Unix的文件系统就是最佳示范。在Unix的世界里,一切皆文件。说到文件,我们首先想到的可能是打开一个文档,并在里面输入内容,最后保存关闭。这是一个关于普通文件的典型操作过程,只需要五个系统调用(creat, open, read, write, close)就可以全部完成。
那么,对于其他外接的设备,也可以将其视为一个特殊文件,只需要用五个系统调用组合使用,就能完成读写数据的工作。
这一理念有多么伟大,打个简单的比方就好理解了。拿开车来说,如果每个品牌的汽车驾驶方法都不一样,你想学车,就要把所有的开车方法都学一遍,你肯定会认为这是吃饱了撑的。
五个基本的系统调用就是统一的驾驶方法,不同的设备就像不同品牌的汽车。你不必关心汽车之间的差异,反正你坐进驾驶室就知道应该挂档、踩油门、上路。
再说专注,Unix系统里有许多程序,这些程序各司其责,只将一件事做好。例如echo就是回显文本;cat就是显示文件内容;ls就是显示磁盘目录内容。
那么,要实现复杂的功能怎么办?答案是借助于shell、管道与重定向机制,将独立的小程序组合起来,实现想要的功能。
这就是一种典型的分工合作思想。还是以汽车来说,现在的汽车厂商不可能自己生产所有的零部件,都是从零配件厂商采购之后,组装成车。
这里面shell是供程序所运行的环境,管道是程序间数据流通的通道。管道机制是真正的神来之笔。道格·麦基尔罗伊最初有这个想法,但总是被实现问题所困扰,直到有一天启发了肯·汤普森的思考。
如同被上帝亲吻了脑门,肯猛然省悟了管道的机理。他只用了一个小时就在系统调用中实现了管道。这就是将程序的孤岛给连接起来的竖线符:“|”。
举例来说,ls可以显示目录下的文件名。但如果你想知道目录下有多少个文件,你显然不愿意在ls里加一段代码再重新编译一遍。那么正好还有一个wc程序,它可以统计空格或换行分隔开的单词数。
你可能想到,要是能把这两个程序组合起来使用,那不就解决问题了吗?是的,一行命令就可以搞定:ls | wc
这就是Unix的迷人之处。
现在要说一下开发操作系统所使用的编程语言了。如果说操作系统是一座金碧辉煌的大厦,那么编程语言就是用来建造它的工具。
在上世纪七十年代初期,贝尔实验室的大神们是为此困扰不已的,因为他们没有称手好用的工具。其实IBM早在1964年就创建了PL/I,作为系统级的编程语言。但因为它也是中了“第二系统效应”的毒,包括了太多特性,以至于复杂难用。
后来剑桥大学教授马丁·理查兹设计开发了一款名为BCPL(Basic Combined Programming Language)的系统编程语言。它比PL/I要简单得多,因此Unix小组的成员们还能凑合着用。
但肯·汤普森这样的大神是会止步于此的,基于PDP-7的环境,他自己又重新设计并开发了一门新的语言,称之为B语言。从语言特性上来看,它和BCPL是非常接近的。
当性能更好的PDP-11计算机到货以后,好伙伴丹尼斯·里奇又对B语言进行了改造,使之能将新机器的性能发挥出来。这门语言被称为“NB”,它是“New B”的缩写。
我想作为一名中文阅读者,你此刻一定忍不住响亮地念了出来,然后一种爽快感令身心通透。很好,我的感觉也是这样。
这门叫“New B”的语言在后来经过改进,正式定名为“C”语言,人类历史从此翻开了新的篇章。这可以说就像普罗米修斯从太阳神的马车上取得火种之后,将之献给人类一样伟大。
这不是我在唬人吹牛,C语言的出现,将系统编程语言从石器时代带入了铁器时代。C语言简单易用,而且功能强大。首先就用在了开发新版本的Unix,这大大地提高了效率,还保证了稳定性。
其次,C语言使得系统移植变得轻而易举了。在早先的年代,硬件的架构是千差万别的,在不同的机器上如果要开发相同的功能,就得写出两套代码来。良好的可移植性,这也是Unix能够流行起来的重要原因。
最后,也是最重要的,C语言在贝尔实验室之外获得了广泛的使用。这让全世界的专业人士以及业余爱好者们可以共同为Unix开发软件,从而形成了一个强大的生态环境。
在上世纪九十年代初的芬兰赫尔辛基大学计算机系,一位长着大鼻子的自卑青年,就是用C语言开发出了改变世界的Linux操作系统,其实Linux本身也是遵循Unix系统调用接口规范的变种。这位青年就是Linus Torvalds。
即使直到今天,C语言也是系统编程领域的首选。尤其是当下物联网(IoT)概念火热,C语言在诸多低功耗嵌入式系统中被广泛应用,居然还把这门40年前的语言捧上了编程语言排行榜的榜首位置。
贝尔实验室在对各位技术大神的管理上,还有一点是为人所称道的,就是鼓励大家勤奋地写作,出版图书,积极传播技术价值。这对于Unix系统的发展,以及C语言的普及都产生了强大的推动作用。
一项技术被发明出来,只有被广泛使用才会有价值。贝尔实验室的管理层是深知这个道理的,所以实验室对于技术写作的支持并没有停留在口头上,而是建立了有效的机制和可靠的保障。
首先,实验室允许大神们在一段时期内专心从事写作,工资照发不误。这样一部优秀的技术图书可以尽可能快地得到出版。如果大神们白天要上班,只能在晚上或周末来写书,那就不知道会拖成什么样。
其次,图书出版后,作者是可以获得版税的。当然,版权还是属于贝尔实验室,但要是出的书爆款了,这收入也是很可观的。没有规定说计算机科学家就要安贫乐道,名利双收的好事为什么要拒绝呢。
贝尔实验室由此也形成了开放、互助、乐于分享的良好风气。一个人在写作的时候遇到问题,随时可以向他人求教,并得到有效的帮助;谁的稿子写好了,首先就是让身边的同事们审阅,并得到认真的反馈。
所以贝尔实验室所出的技术图书质量极高,作者们除了对内容精益求精,在遣词造句上也用心良苦。多少经典著作成为技术爱好者的圣经、高校的必修教材。许多都流传至今,出现在程序员们的必读书单上。
下面就列举一些最耀眼的明珠吧。
在1980年之后,AT&T因其在通信行业的垄断地位,被美国司法部给盯上。迫于压力,AT&T不得不将公司进行拆分,而这也成为了AT&T衰落的开始,贝尔实验室的命运也从此走向了没落。
拆分之后,从科研部门分离出去的一个名为Unix系统实验室(Unix System Laboratories, 简称USL)的机构。USL虽然名为实验室,但实际上是专注于运营支持,后来更是将业务扩大到销售和推广。
得益于AT&T早期将Unix免费分发给大学生们去使用,无意中培养出了一批精通Unix系统的工程师,从而形成了一定规模的市场。USL则将Unix专业商品化,意欲有一番大作为。
本来应该要好好培育这个市场,但是AT&T和USL却向加州大学伯克利分校,就Unix的版权问题发起了诉讼。此事还要从早前AT&T将Unix免费发放给大学做研究说起。
加州大学伯克利分校的计算机系统研究组的比尔·乔伊和同事们,在原有的Unix基础之上改造升级,形成了伯克利发行版(BSD)。而用户是可以免费使用BSD发行版的。
AT&T显然认为BSD版侵犯了自己的知识产权,所以就有了起诉伯克利一事。但伯克利并没有就此服输,而是持续将原有代码删除,代之以新的实现。就是说功能一样,但代码实现是完全不一样的。
这样做也无法让AT&T罢手,于是又发起新的诉讼。这一次法院判伯克利胜诉。这两家在长期的官司中消耗了太多的时间与资本,可以说最后的结果是AT&T功亏一篑。
本来还想指着卖Unix来赚钱,一看市场上有那么多免费使用的版本。于是就想通过打官司禁止发行免费版,这就是整个想法都不对了,除了把Unix市场的水搅浑,谁也没有得到好处。
Linux的横空出世,让受够了Unix争执的技术人看到了新希望。Linus在设计Linux之初,遵循的就是POSIX规范。Unix用户可以相当平滑地过渡到Linux上,在此之后就是属于Linux的时代了。
如今的贝尔实验室所在地,已是人去楼空,一片破败荒凉景象。是非成败转头空,谁能想到这里的门槛曾是地球上最难踏进来的。
而大神们也都有了各自的归宿。肯·汤普森在2000年之后退休,当了阵子飞行员,算是真的放飞自我了。后来进入谷歌公司,与贝尔实验室的老战友罗布·派克共同推出了现在炙手可热的Go语言。