《UNIX传奇:历史与回忆(UNIX的诞生记与发展史,贝尔实验室的幕后故事! )》

布莱恩·W·克尼汉 54个笔记


推 荐 辞

◆ 如今我们很难想象有那么多的图灵奖获得者曾在一个实验室共同工作,Unix的历史可以说是早期软件业发展的一个缩影。那是一个辉煌的年代,大师云集,群星闪耀,工业研究与极客探索完美地结合。这本书正是亲历者对那份荣耀的记录。通过阅读它,我们不仅能够近距离感受到那些伟大工程师的睿智,也能够发现他们兴趣是如此广泛而又深远地影响了此后的各类软件设计。在这个软件工程师都在自嘲为“码农”的时代,我认为真的有必要感受一下那些理想主义工程师的视野和 生产力。

Unix传奇往事的启示

◆ Unix的创造者奠定了操作系统的标准基石,Unix的“分而治之”设计哲学——让每个程序做好一件事;要做一件新的工作,就构建新程序,而不是通过增加新“特性”使旧程序复杂化——被优秀程序员奉为圭臬。文件、目录、系统调用、shell、管道,还有一大批优秀的生产力工具,如grep(正则表达式)、diff、Lex、Yacc、Make等,都凝结着Unix创造者的智慧和心血。

计算机世界的原力觉醒

◆ 20世纪的六七十年代可以说是人类现代史上非常特殊的年代,整个西方世界散发着一种迷人的味道,掀起摇滚乐、嬉皮士、爱与和平等文化新浪潮,像披头士、皇后乐队、齐柏林飞艇等经典摇滚乐队在那时诞生……那些脍炙人口的作品到今天还在传唱。那个年代的科技也突飞猛进,NASA送人上月球,还进行全世界电视直播,离开仙童公司的工程师们创建了AMD和Intel,从此揭开了芯片的硅谷时代。AT&T创办的贝尔实验室带来的成果举世瞩目,贝尔实验室除了不断地获得诺贝尔奖和图灵奖,还不断地发明改变人类所需的新技术。什么晶体管、太阳能电池、激光器、手机、通信卫星……这段时间发生的事,对于我来说,就跟追科幻或是超级英雄的美剧一样,一季接一季,里面的超级英雄,一个接一个,让人无法不惊叹称奇。

◆ 贝尔实验室对计算机发展的贡献着实让人佩服,在他们退出Multics项目后,肯•汤普森在一台被弃置的只有24KB内存和512KB磁盘的计算机上用3周开发了一个Unix的原型。24KB内存!512KB的磁盘!这算计算机吗?!还要编写个操作系统出来?而且3周就写出来了,可以编辑和编译程序,有shell和API……一般来说,如果一部电影是这样的开场,那么这必然是一部超级精彩的电影。随后,丹尼斯•里奇把肯的B语言加上类型造就了C语言;道格•麦基尔罗伊神来一笔,提出了管道的想法,肯实现完后自己玩了一下,叹道“好震撼”;管道下的grep、sed、awk加上正则表达式,让文本处理变得无所不能;史蒂夫•伯恩编写的shell让Unix命令可以进行编程,让Unix变成无所不能; Yacc、Lex、Make等工具让你可以轻松地创建一门语言,从而导致了编程语言快速演进(如Fortran 77和C++);随着AT&T把Unix的代码授权给各大高校,加州大学伯克利分校有个叫比尔•乔伊的人为Unix添加了vi文本编辑器和C语言的shell、csh,再加上改变世界的TCP/IP协议的socket接口……这帮“超级英雄”编写的书(如“龙书”《编译原理》《C程序设计语言》《编程珠玑》)到今天都是经典中的经典。

◆ 在Unix广为流传之后,本来致力于改变世界的AT&T被美国政府拆分,变成真正的“死星”。他们开始商业化Unix,向整个世界发难,向伯克利的Unix衍生版BSD提起诉讼,并把对Unix热情高涨的“银河联盟”冲得七零八落。经过两次拆分,贝尔实验室风光不再,那些“绝地武士”们也不得不隐忍起来,直到一个叫理查德•马修•斯托尔曼的开源狂人,与一个21岁的芬兰大二学生,在两个不同方向上开始发起集结,向“银河帝国”发起挑战。林纳斯•托瓦兹把那些隐于深林的“绝地武士”再次召集起来,让Unix以Linux方式得以重生,开始了真正的“帝国反击战”……

◆ 今天,我们回头看肯•汤普森、丹尼斯•里奇、道格•麦基尔罗伊、阿尔•阿霍、彼得•温伯格、布莱恩•W.克尼汉、比尔•乔伊……这些人就像世界的开创者一样,早在三四十年前就为未来计算机世界编制了迷人的DNA,这个DNA就是Unix和C语言。今天,整个计算机世界全都有Unix和C语言的印记。不仅如此,Unix的“设计哲学”以及Unix所带来的为自由而开源的“黑客文化”也成为最纯正的计算机文化,推动着整个人类计算机文明的向前发展。只有了解这些璀璨的历史和文化,我们才知道计算机世界中真正的格局和品味是什么,也才知道真正的原力是什么。愿原力与你同在!陈皓(左耳朵耗子)2020年12月

前 言

◆ “回忆往往披着玫瑰色的光晕,令人欢欣。回忆常驻于美好而持久的事物上,也常驻于因努力改善人类生活而获得的愉悦之中。”——丹尼斯·里奇,

第1章 贝尔实验室

◆ “因为有着令人惊异的乡村风格,乍看之下,贝尔电话实验室新泽西总部就像是一个巨大的现代化工厂。从某种意义上讲,它的确是工厂,是生产创意的工厂。所以,它的生产线也不可见。”——阿瑟•克拉克(Arthur Clarke)《越洋之声》 (Voice Across the Sea)(1974年)

1.2 通信与计算机科学

◆ 有时,对实践领域的广泛关注会带来基础科学的进步。例如,1964年,阿尔诺·彭齐亚斯(Arno Penzias)和罗伯特·威尔逊(Robert Wilson)着手解决“回声号”(Echo)“气球”卫星地面天线的噪声问题。最后,他们发现,噪声来自宇宙太初大爆炸(Big Bang)遗留的背景辐射。彭齐亚斯和威尔逊因这项发现获得了1978年的诺贝尔物理学奖。

1.3 结缘贝尔实验室

◆ 度过略有挫败感的暑假之后,我回到学校继续完成学业。我对编程的兴趣依然强烈。学校没正式开设计算机科学课程,但我高年级时的论文都与人工智能有关。人工智能在当时是热门主题。定理证明器、下国际象棋和跳棋的程序、自然语言的机器翻译似乎触手可及,看似只需要一点点程序设计就可以实现。1964年毕业后,我不知何去何从,所以就像很多其他学生一样,打算直接读研究生。我申请了十来所美国大学(那时加拿大人不怎么申请美国学校),并有幸被其中几所录取,其中就有麻省理工学院和普林斯顿大学。普林斯顿大学说,完成博士学业通常需要3年时间,麻省理工学院说大概需要7年;普林斯顿大学提供全额奖学金,麻省理工学院说我得每周做30小时的研究助理工作——结论显而易见。而且,我的好友,高我一届的多伦多校友阿尔·阿霍,已就读于普林斯顿大学,于是我就去了普林斯顿大学。事实证明,这是一个超级幸运的选择。

◆ 1967年夏天,终极好运从天而降:墨里山的贝尔实验室计算科学研究中心让我去实习,老板是道格·麦基尔罗伊(图1-4)。道格建议我研究内存分配评估问题,这也是他长期关注的方向。遵循最佳实习传统,我最终做出了与老板要求风马牛不相及的东西。我写了一套函数库,以方便在Fortran程序中做列表处理。整个夏天我都在墨里山的大型计算机GE 635上编写严密的汇编语言。GE 635实际上是重整过后更有条理的IBM 7094,同时也是Multics专用机GE 645的简化版。那差不多是我最后一次写汇编语言。尽管我所做的事从根上就走错了方向,但代码写得十分过瘾,让我与编程结下了不解之缘。

1.4 办公空间

◆ 1967年实习时,我的办公室位于2号楼5层8号梯旁。上班第一天,我坐在办公室里(那些连实习生都有自己办公室的好日子啊),琢磨着该做些什么。上午11点,有个年纪略长的家伙出现在门口,说:“嗨,我是Dick。走,吃午饭去。”我没听清楚他姓什么。不过我想,行,为什么不呢?那顿午饭怎么吃的我完全不记得了,只记得饭后那位迪克某某就去了其他地方。我沿着走廊找到他办公室门上的名牌,上面写着“Richard[4] Hamming”!这位和善的邻居原来是一位名人。他是纠错码的发明者,也是我选修过的一门数值分析课所用教材的作者。我和迪克(图1-5)成了好朋友。他观点鲜明,不惧表达,我觉得这会让一些人不爽,但我乐意与他为伍,而且多年以来他的建议令我获益良多。[插图]

◆ 他挂了个部门负责人的头衔,但他的部门却没有员工,这看起来有点儿古怪。他告诉我,他花了很大力气才弄来这个不用负具体责任的职衔。很久以后,当我当上管理十几号员工的部门主管时,我才明白拥有一个不用负具体责任的职衔有多么令人羡慕。

◆ 算以获识,非算以得数

◆ 1967年夏天,维克·维索斯基(Vic Vyssotsky)(图1-6)坐我对面办公室。他也是极聪明和有天分的程序员。维克和科尔比搭档,负责管理贝尔实验室的Multics研发工作。他会尽量抽空每天与我这个基层实习生谈话。维克逼着我给需要学编程的物理学家和化学家上Fortran课。给非程序员上编程课,原来也颇为有趣。这让我克服了对公众讲话的恐惧,也让我后来能轻松应对各种教学工作。

◆ 我在秋天着手撰写论文,并于1969年1月通过毕业答辩(从普林斯顿大学3年毕业的乐观估计最后变成了4年半毕业)。一周后,我开始到贝尔实验室计算科学研究中心工作。没面试,实验室在上一年秋天就给我发了录用通知,但有个要求:必须先完成论文。高我两个行政级别的研究中心主任萨姆·摩根(Sam Morgan)告诉我:“我们不招博士肄业生。”完成论文绝对是好事一桩——12月,我又收到一封信,说我得到大幅加薪,而我当时都还没去报到!说句题外话,林申和我找不到既高效又总能给出最优解的图划分算法确实情有可原,不过,当时我们还不知道这一点。

◆ 1969年,我正式加入贝尔实验室时,没人告知我具体要做什么事。惯例如此:把你介绍给其他人,让你随意晃荡,去寻找自己的研究课题和协作者。回想起来,这似乎是下马威,但我不记得有什么麻烦。周边有那么多新鲜事在发生,想找点儿东西来研究,或者找个人来合作,根本不成问题。两个夏天之后,我已经认识所有人,也了解了一些项目情况。贝尔实验室向来缺乏明确的管理层指示。1127中心的项目不由管理层指派,而是自下而上,由对某个课题感兴趣的人员自主成立项目组。贝尔实验室的其他部门也是如此:如果我参与了某个开发组,也许会“利诱”科研同事也来参加,不过他们得自愿加入。无论如何,有一段时间,我继续和林申一起研究组合优化问题。林申对这类问题特别有见地。他用纸笔画一些示例,就能察觉到有前途的攻击路线。他对旅行商问题有了新的想法,大幅改进了他以前的算法(已经是当时最有名的算法),我用Fortran程序实现了他的新算法。这个算法工作得很好,此后多年间一直是最顶尖的算法。这类工作既有趣又能带来成就感,而我善于将想法转化为可工作的代码,却完全不擅长算法,所以我逐渐涉足其他阵地:文档编制软件、专用编程语言,还有一点点图书写作。

◆ 几年后,丹尼斯·里奇和我为另一本内刊,大概是Western Electric Engineer(西部电气工程师)吧,撰写关于C语言的文章。刊物出版前,编辑要我们寄几张肖像照片过去做配图,我们照办了。几星期后,他们说照片丢了。我们说,没问题,那就再寄一次好了。他们回复:“这次可以系上领带吗?”我们严词拒绝,后来他们奇迹般地找到了之前没系领带的照片,并且刊印了。

◆ 我开始以长期雇员身份工作时,办公室在2号楼5层9号梯附近,在那里我待了30年。世界变幻,我自岿然。在那些年里,走廊上的邻居有肯·汤普森、丹尼斯·里奇、鲍勃·莫里斯(Bob Morris)、乔 · 奥桑纳(Joe Ossanna),还有杰勒德·霍尔兹曼,大名鼎鼎的约翰 · 莱昂斯(John Lions)、安迪·塔嫩鲍姆(Andy Tanenbaum)和戴维·惠勒(David Wheeler)也来造访过。我在实验室的最后10年里,肯·汤普森和丹尼斯·里奇的办公室在我办公室正对面。图1-10展示的是丹尼斯的办公室,这张照片是2005年10月在我的旧办公室门口拍的。肯的办公室在丹尼斯的办公室的左边。

1.5 137→127→1127→11276

◆ 尽管大多数研究员都有博士学位,但没人称呼“博士”,因为每个人都是博士。图1-11所示的电话号码簿中,女士名字前冠以“小姐”或“夫人”,而男士则完全没有表明婚姻状况的称谓。这种称谓方式并不常见。

◆ 20世纪60年代和20世纪70年代,贝尔实验室的技术类岗位上仅有少量女性和少数族裔;技术团队成员大部分是白人男性,这种状况持续了很久。在这方面,贝尔实验室代表了历史上那个时代的大多数技术工作环境。

第2章 Unix雏形(1969)

◆ “在某一时刻,我发现离实现一个操作系统仅有3周之遥了。”——肯·汤普森,美国东部复古电脑节,2019年5月4日

2.3 Unix起源

◆ PDP-7于1964年推出,但计算机领域演进太快,到了1969年,它已经过时。这台机器本身不算很强大,只有8K(8192)个18位字长的内存(16 KB),但其图形显示非常漂亮,所以肯就为它写了个太空旅行游戏。在这个游戏里,玩家可以漫游太阳系、探访各个行星。这个游戏有点让人上瘾,我玩了好几个小时。PDP-7还有一个好玩的外设——磁盘驱动器高耸,直直架着一块磁盘。据传,万一盘片飞出来,站在它前面的人就有可能遇险。磁盘运转速度远高于计算机读写速度。为了解决这个古怪的问题,肯写了个磁盘调度算法来提升磁盘的总吞吐量。这个算法在任意磁盘上都可用,但主要是为PDP-7的这块磁盘设计的。如何测试这个算法呢?这需要往磁盘上装载数据,肯认为他需要一个批量写数据的程序。“在某一时刻,我发现离实现一个操作系统仅有3周之遥了。”他需要写三个程序,每周写一个:用来创建代码的编辑器;将代码转换为PDP-7能运行的机器语言的汇编器;再加上“内核的外层——操作系统齐活了”。正在那时,肯的太太休了3周假,带着一岁大的儿子去加利福尼亚探望公婆,这样肯就有了3周不受打扰的工作时间。正如他在2019年一次采访中所说,“一周,一周,再一周,我们就有了Unix。”无论以何种方式来度量,这都体现了真正的软件生产力。

2.5 肯·汤普森小传

◆ 我很快乐,毫无雄心壮志,是一个没有目标的工作狂。

◆ 大学最后一年,肯选了埃尔温 · 伯利坎普(Elwyn Berlekamp)的课。伯利坎普当时在伯克利分校任教授,后来不久就去了贝尔实验室。毕业后那个夏天,肯没申请读研,因为他觉得自己还不够优秀。“到那个夏末,(伯利坎普)说:‘你去读这个研究生班吧。’原来他替我申请了读研,而且申请通过了!”1966年,肯拿到伯克利分校的硕士学位。贝尔实验室和另外几家公司都想招他,但他明确表态不想去任何一家公司上班。招聘官一试再试。如肯所言:“贝尔实验室问了6~8次,我都拒绝了——也是因为我没有雄心壮志。贝尔实验室招聘官敲我家门,我请他进屋。据他说,我还用姜饼和啤酒招待了他。”(这大概是加利福尼亚的什么古怪减肥饮食吧。)最后,肯接受邀请,由贝尔实验室支付旅费,去新泽西看看,但是他只答应去一天,而且主要是为了探访高中时代就结识的朋友。他到达贝尔实验室时,被一些名字打动了:“一到那儿,我就沿计算科学研究中心的走廊漫步,两边办公室门上写的名字如雷贯耳。太震撼了。面试官是两位妙人……其中一位是林申。“次日,我租车出行。他们不知怎么查到了我的行踪,还在东海岸我停留的第三站留下一份入职邀请书。我拿了那份邀请书,继续下一站两个小时的行程,边开车边考虑。一到达朋友家,我就打电话去实验室,说我接受邀请。”

第3章 初版(1971)

◆ 有人认为,管理层的积极作用之一就是随时保持警醒,让要求资源的人打磨申请,专注提案。相比没有资源限制,资源紧张更有机会促成好的、经过深思熟虑的结果。Unix团队退而求其次,申请购买一台DEC刚刚发布的PDP-11。按1971年美元计,PDP-11价格大约是6.5万美元,比50万美元少多了。

◆ 这里的管理原则是,雇用聪明人,帮他们融入环境,指出大致的需求方向,给他们很多自由空间。不是说他们想要多少钱就给多少钱。有所投有所不投。就算你误判了好东西,如果它够强,仍然会脱颖而出。”事后看来,在资源限制之下工作是件好事。如肯自己在1983年图灵奖颁奖仪式上所说:“随着中央主机向自主式小型机的变化席卷整个业界,Unix也突飞猛进。我猜想,如果丹尼尔·博布罗(Daniel Bobrow)当时买不起PDP-10、只能将就用PDP-11的话,恐怕今天站在这里的就是他而不是我。”

3.2 Unix房间

◆ Unix房间趣味十足,总有一些事情在发生。有些人几乎只在那里工作,很少待在自己办公室,其他人则会每天多次来这里喝咖啡聊天。就跟上同事们的工作进度,以及创造和保持社区感而言,Unix房间的重要性不言而喻。回头看来,我认为,贝尔实验室合理地安排了空间使用。独立办公室虽然比开放式区域成本更高,但也给了员工安静平和的空间,让员工可以不受旁边没完没了的噪声影响,专注于工作,还能够保存图书、文件,关上门就能沉思或私聊。如今,我已在开放式区域工作了足够长时间,起码对我而言,开放式工作区不利于集中注意力。贝尔实验室既提供独立办公室,又为群体提供共享空间,这套机制非常棒。

3.4 存储略谈

◆ 当程序出现严重错误时,操作系统会注意到,并试图通过创建一个保存主存储器状况(即磁芯中的内容)的文件来帮程序员定位错误,这就是“磁芯转储”(core dump)一词的由来。虽然磁芯早已退出舞台,这个词仍在使用。保存主存储器状态的文件仍然被称为磁芯(core)。

3.5 丹尼斯·里奇小传

◆ 丹尼斯在哈佛大学完成了物理学的本科学业和应用数学的研究生学业。他博士论文[4](1968年)的主题是函数的亚递归层次结构,这是专家才能应对的题目,远远超出我的能力范围。

◆ 本科经历告诉我,我不够聪明,成不了物理学家,那时我也认识到计算机有多厉害。研究生经历令我确信,我不够聪明,成不了算法理论专家。我也认识到,自己更喜欢过程式语言而不是函数式语言。”就像C++的创造者本贾尼·斯特劳斯特鲁普曾说过的那样,“如果丹尼斯决定把那10年的时间花在研究深奥的数学上,Unix就会‘胎死腹中’。”

◆ 丹尼斯是超一流的技术作家,文风清雅,用词灵巧,字里行间闪烁着干练的智慧,准确地反映了他的个性。我和他合著了《C程序设计语言》(The C Programming Language),该书于1978年出版,1988年出第2版,此后被翻译成20多种语言。丹尼斯原著的C语言参考手册是1988年首次推出的ANSI/ISO(美国国家标准学会American National Standards Institute/国际标准化组织International Organization for Standardization)的C标准的基础,也是该标准的主要构成部分。毋庸置疑,C语言和Unix的部分成功可以归功于丹尼斯的写作。因他和肯·汤普森一起为C语言和Unix所做的工作,丹尼斯获得了许多荣誉和奖项,包括ACM图灵奖(1983年)、美国国家技术奖章(National Medal of Technology)(1999年)、日本信息通信奖(Japan Prize for Information and Communications[5])(2011年)并入选美国国家发明家名人堂(National Inventors Hall of Fame)(2019年追授)。

◆ 丹尼斯为人谦虚大方,总是轻描淡写自己的贡献,把功劳归于他人。例如,在1996年关于Unix演进的回忆录的致谢部分,他写道:“看到文中出现指向不明的‘我们’二字时,读者大可理解为‘汤普森,加上我的一点点协助’。”丹尼斯于2011年10月辞世。以下内容来自贝尔实验室网站丹尼斯主页上他兄弟姐妹的谢词:我们是丹尼斯的兄弟姐妹,林恩(Lynn)、约翰(John)和比尔·里奇(Bill Ritchie)。谨代表整个里奇家族,为我们读到的对丹尼斯的衷心赞美,表达我们的感动、惊讶和感激。我们可以确认,以下这些一再听到的评价完全属实:丹尼斯绝对是善良、体贴、朴实和慷慨的兄弟,当然,也是个百分百的极客。他有一种滑稽洗练的幽默感,对生活中的荒谬之处有着敏锐的洞察力,但他的世界观里全然没有愤世嫉俗或刻薄之心。

4.7 C语言

◆ “C语言既古怪又有缺点,却获得了巨大的成功。虽然历史上的意外事件肯定有帮助,但C语言显然满足了人们对一种系统实现语言的需求,这种语言需要足够高效,足以取代汇编语言,但又足够抽象和流畅,足以描述各种环境下的算法和交互。”当然,编程语言为数甚多,各有各的支持者与抨击者。C语言也会受到批评。然而,它仍然是计算领域的核心语言。在流行度、影响力和重要性的榜单上,它几乎总是名列前两、三位。在我看来,没有任何一种其他语言能在优雅度、表现力、效率和简洁之间做到同样程度的平衡。

4.9 道格·麦基尔罗伊小传

◆ 不管孰对孰错,没有道格的好品味和他对技术问题与人的准确判断,Unix可能根本不会存在,当然也不会如此成功。道格1954年在康奈尔大学获得物理学本科学位,1959年在麻省理工学院获得应用数学博士学位。他曾在贝尔实验室工作过一个夏天,后于1958年全职加入,并于1965年成为计算技术研究部门的负责人——比我第一次见到他早两年。如前所述,1967年夏天我在道格的部门做实习生,名义上是研究他提出的存储分配器问题,实际上是做自己的事情。作为管理者,他有许多好品质,其中之一就是他根本不为这类情况烦心。

◆ “他从只言片语中就能了解我所做的一切。基本上也是他教会我写作。我认为他是我所知道的最优秀的技术作家之一。他富有语言天赋,善于简洁表达,很了不起。”道格是我博士学位论文的外审,他帮助我改进了论文的结构和论述。他还阅读了我与实验室其他人合著的所有书籍的多份草稿,而且总能把它们改得更好。他完善和打磨了Unix命令手册,整理和组织了Unix第8版到第10版的手册内容。他不惜耽误自己的研究,热情又细心地做了这一切。道格于1986年辞去管理职务,1997年从实验室退休,前往达特茅斯任教。图4-6所示为2011年庆祝肯和丹尼斯获得日本奖时在墨里山贝尔实验室拍摄的照片。[插图]图4-6 道格·麦基尔罗伊和丹尼斯·里奇, 2011年

5.3 文档编制

◆ 计算科学研究中心的成员在20世纪70年代和80年代写出了特别多有影响力的图书,远超人们对一个工业研究实验室的预期。因此,经过一段时间后,贝尔实验室成为著名的计算和计算机科学权威书籍的来源。阿尔·阿霍写了几本广泛使用的课本,包括1977年与杰夫·厄尔曼合写的名作“龙书”《编译原理》(Principles of Compiler Design)(图5-12),还有与杰夫及约翰·霍普克罗夫特(John Hopcroft)合写的《计算机算法的设计与分析》(Design and Analysis of Computer Algorithms)。本贾尼·斯特劳斯特鲁普(图5-13)在20世纪80年代创造了C++,几年后写了几本C++书。乔恩·本特利在《ACM通讯》上的专栏文章结集成《编程珠玑》(Programming Pearls)一书。数学中心的迈克·加里(Mike Garey)和戴维·约翰逊(David Johnson)用Troff和Eqn为他们的大作《计算机和难解性:NP完全性理论导引》 (Computers and Intractability: A Guide to the Theory of NP Completeness)排版。我们也以图书形式出版了Unix 和Plan 9的用户手册,诸如此类。这些出版物成为好几代程序员和计算机科学专业学生的标准教材和参考书。

◆ 这群来自工业界的相对少量的研究人员何以能写出这么多有影响力的书?以我之见,有那么几个原因。首先,人们认真对待写作,殚精竭虑。对于其他人的作品来说,他们也是了不起的审读者。道格·麦基尔罗伊是这群人中的魁首。无论什么主题,道格都能发现别人发现不了的错误(有细微错误也有关键错误),别人都没有他那种如炬的眼光。我在贝尔实验室时,无论写了什么都会请道格点评,而他总是如我所请。当他撕裂我的文字时,我感到很惭愧,但这使我成为更好的写作者,同样的事情也发生在其他人身上。当然,道格并不是唯一的审读者。每个人都慷慨奉献出自己的时间,对同事写的东西不吝给出意见,这不过是文化使然。在其他地方这种情况并不常见,所以贝尔实验室才能那么伟大。其次,管理层支持图书写作。出版物,包括图书在内,对于维护贝尔实验室在科学界和学术界的声誉非常重要。在管理层的支持下,员工可以全身心地投入到图书写作中。这种全力以赴6个月足以基本完成的工作,如果只是业余或在晚上来做,可能需要数年时间。虽然贝尔实验室保留了书籍的版权,但作者可以获得版税,这就更有推动力了。我想我们中没有人是为了赚钱而写书的——实验室没人会蠢到以为写技术书有利可图,但如果图书取得了些许成功,作者就能拿到这笔钱。开明的管理方式和公司策略鼓励人们写作。从长远来看,公司和作者都获得了回报。贝尔实验室作者的出版物也有助于吸纳人才。

6.2 高校授权

◆ 加利福尼亚大学伯克利分校是最活跃的许可获得者之一,该校的一些研究生对系统做出了重大贡献,最终演化出伯克利软件发行版(Berkeley Software Distribution,BSD)。BSD是由最初的科研版Unix演变而来的两个主要分支之一。1975年和1976年,肯·汤普森在伯克利度过了一个休假年,教授操作系统课程。有个叫比尔·乔伊(Bill Joy)的研究生(图6-2)修改Unix的本地版本,添加了一些自己的程序,包括vi文本编辑器(现在仍然是最流行的Unix编辑器之一)和csh(C语言shell)。比尔后来为Unix设计了至今仍在使用的TCP/IP网络接口。有了他的socket接口,就能用与文件和设备I/O相同的读写系统调用来读写网络连接,因此很容易添加网络功能。[插图]

◆ 比尔的编辑器使用光标寻址来更新屏幕上正在编辑的文本,这是对行编辑模式的重大改变:将光标移到this一词所在位置(也许是使用正则表达式),输入cw(change word,意为“改字”)这样的命令,然后再输入that,this立即就换成了that。我忘了当时给出何等评价(尽管今天vi是我最常用的两个编辑器之一),只记得我告诉比尔,他应该停止折腾编辑器,专心完成他的博士学位。他没有理会我的建议,这对大家都是一件幸事。几年后,他从研究生院退学,与人共同创办了工作站先驱Sun微系统(Sun Microsystems)公司,公司的工作站软件基于伯克利Unix,其中就包括比尔在系统、网络和工具方面的基础研发成果(以及他的vi编辑器)。当学生向我寻求职业建议时,我经常引用这个故事——有“智”不在年高。

8.3 Minix和Linux

◆ 致Minix用户:我正在做一个386(486)AT克隆机的(免费)操作系统(只是爱好,不会像gnu那样大而专业)。从4月开始酝酿,现在开始准备了。我想知道大家对Minix里面喜欢/不喜欢的东西有什么反馈,因为我的操作系统和它有些相似(同样的文件系统物理布局(基于务实原因))。目前我已经移植了bash(1.08)和gcc(1.40),看来一切正常。这意味着我将在几个月内得到一些实用的东西,我想知道大多数人想要什么功能。欢迎任何建议,但我不会保证我会实现它们。:-)林纳斯(torv…@kruuna.helsinki.fi)又及:是的,它没有用任何Minix代码。有多线程的fs。它不可移植(使用386任务切换等),而且它可能永远只支持AT硬盘,因为我只有这东西:-(。图8-3 林纳斯·托瓦兹的Linux宣告,1991年8月

8.5 流散

◆ 贝尔实验室在合并和收购的浪潮中载浮载沉,大部分曾参与Unix研发和在1127中心工作的人逐渐流散了。在2005年的一次重组中,1127这个数字本身也不复存在。杰拉德·霍兹曼维护着一份1127中心老同事的在线名单。太多的人已经离世,活着的人里面许多去了谷歌公司;其他人则在别的公司工作,也有人教书或退休。只有极少数人留在贝尔实验室。

第9章 遗产

◆ Unix取得了巨大的成功。Unix或Linux或macOS或其他变种运行在数十亿台计算机上,持续为数十亿人服务,当然也为在它之上构建业务的人赚取了数十亿美元(尽管其创造者并未从中获利)。后来的操作系统受它影响极深。贝尔实验室为Unix开发的语言和工具随处可见。在这些编程语言中,有C语言和C++,它们至今仍是系统编程的中流砥柱,还有如awk和AMPL等更专门的语言。核心工具有shell、diff、grep、Make和Yacc等。GNU(“GNU’s not Unix”的递归缩写[1])是一个大型软件集合,大部分基于Unix模式,以源代码的形式免费提供给所有人使用:有了它,Unix上几乎所有东西都可以使用,甚至包括更多工具。GNU加上Linux操作系统,相当于免费版的Unix。Unix命令的GNU实现是开源的,可以被使用和扩展。唯一的限制是,如果发布了改进,成果必须免费提供给每个人,不可以私有。当今大量的软件开发都基于开源项目,在很多情况下就是基于GNU的实现。

9.1 技术方面

◆ 专用语言,今天常被称为小语言(little language)、领域特定语言(domain-specific language)或应用特定语言(application-specific language)。我们通过语言告诉计算机应该做什么。对于大多数程序员来说,这意味着使用像C这样的通用语言,但另外还有许多更专业的语言,它们专注于更狭窄的领域。

◆ Unix哲学是关于如何处理计算任务的编程风格。这是道格·麦基尔罗伊在《贝尔实验室技术杂志》(Bell Labs Technical Journal)Unix特刊的前言中总结出来的。(i)让每个程序做好一件事。要做一件新的工作,就构建新程序,而不是通过增加新“特性”使旧程序复杂化。(ii)预期每个程序的输出都能成为另一个未知程序的输入。不要用无关的信息来干扰输出。避免使用严格的分栏对齐或二进制输入格式。不要执着于交互式输入。(iii)设计和构建软件,甚至是操作系统,要尽早试用,最好是在几周内就用起来。大刀阔斧砍掉笨拙的部件,重建它们。(iv)宁可绕道构建用后即弃的工具来减轻编程负担,也别依赖经验欠奉的帮助。

9.2 组织

◆ 稳定的环境至关重要:资金、资源、任务、组织结构、管理、文化都应持续和可预测。如第1章所述,贝尔实验室的科研工作是大公司内部大型开发组织的大规模行动,具有悠久历史和明确使命:普遍服务。贝尔实验室的长期目标是不断改进电话服务,这意味着研究人员可以长期甚至年复一年地探索他们认为重要的想法,而不必每隔几个月就向人证明自己在努力。当然也有监督,任何人在一个项目上工作了几年而没有任何成果,都会被要求做出改进。偶尔会有人被调离研究岗位或干脆被赶出公司,但在我15年的管理生涯中,这种情形屈指可数。

◆ 经费有保障,研究人员不用考虑钱的问题。我在部门负责人任上时,也没担心过钱的问题。当然,确实会有人去操办这些事,但研究员们不必费心。当时没有研究计划书,没有季度进度报告,也不需要在工作前寻求管理层的允准。在我担任部门主管的某段时间里,的确开始需要编写部门活动的半年期报告,为此我让每位部门成员都写了一段。然而,收集资料只是为了提供信息,而不是为了评估业绩。偶尔也会有一些时候对出差进行更仔细的核准——可能每年只让参加一两次会议——但在大多数情况下,如果我们需要购买设备或旅行,都可以报销,不会被寻根问底。

◆ 技术管理。管理者必须了解他们所管理的工作。贝尔实验室研究中心的各级管理层都有技术背景,他们对自己组织内部和其他组织的工作都有翔实的了解。部门主管应当知晓手下工作的细节,不是为了争论它有多了不起,而是为了能够解释给其他人听,帮助建立联系。起码,1127中心不存在“争地盘”问题。合而不争。管理层支持自己人,但互相之间经常合作,从不竞争。我不确定这是不是一种普遍经验,但确实值得追求。这该是管理者激励机制的一部分。

◆ 协作环境。贝尔实验室规模庞大、规格高级,几乎在每个技术领域都有多名专家,而且往往是各自领域的世界顶尖人物。此外,贝尔实验室的文化强烈鼓励合作和帮助。走进别人的办公室寻求帮助绝对是标准做法,大多数情况下,被请求者都会放下手头的一切来协助。实验室还有一流的技术图书馆,每天24小时开放,订阅大量期刊,并可远程访问其他图书馆;它相当于高校的图书馆,但重点放在科学和技术方面。

◆ 对于1127中心的许多人来说,距离最近的相关领域专家在1121数学研究中心,那里有非凡的数学家,包括罗恩·格雷厄姆(Ron Graham)、迈克·加里、大卫·约翰逊、尼尔·斯洛恩(Neil Sloane)、彼得·肖尔(Peter Shor)、安德鲁·奥德里兹科(Andrew Odlyzko)……名单还可以一直列下去。约翰·图基(John Tukey)可以说是当时世界上最重要的统计学家(顺便说一下,他是“比特”一词的发明者),就在对面办公室。数学和通信的几乎所有方面都有强悍的专家。例如,我现在的普林斯顿大学的同事罗伯特·塔扬(Robert Tarjan),1986年图灵奖得主之一,当时就在数学中心。他们总是随时准备提供帮助,而且并不只在技术问题上提供帮助。例如,罗恩·格雷厄姆是杰出的数学家,也是一位杂耍专家,曾任国际杂耍家协会(International Jugglers’ Association)主席。他甚至在办公室放了张网,可以接住快落地的杂耍球。罗恩曾经说过,他能在20分钟内教会任何人玩杂耍。这对我来说恐怕不太现实,但一个小时的手把手指导(在他的办公室里!)确实让我初窥门径。

◆ 贝尔实验室不提供免费食物(这是现代福利,当年如果有的话我会很感激),但不知何故,我们有免费咖啡喝,管理层会悄悄付钱。人们把食品留在Unix房间里,供大家享用。有人曾经留下一大袋10千克的优质巧克力,让大家分着吃。但不总有这么高规格的食物:“有人带了一袋贴着中文标签的物品来。大家都咬了一口,然后就放弃了。后来,我们发现它越变越少:一定是哪个家伙在偷吃。袋子快见底时,有位懂中文的人告诉我们,袋子上的说明写着,在开水中浸泡一小时后食用。”可是,如今人们对这种常见的团队建设活动的热情很低,很多人认为,这些活动矫揉造作、毫无意义,纯属浪费时间。要建立和维持一个组织,使其成员相互喜欢和尊重,并享受彼此的陪伴,这需要付出努力。不能靠管理部门的命令,也不能靠外部顾问来创造。它是在一起工作的乐趣中有机地成长起来的,也是在一起玩耍的乐趣和互相欣赏中成长起来的。

9.4 历史能重演吗

◆ 不过,我还是很乐观,理由是伟大的创意总来自个体。例如,早期为Unix做出贡献的人很少,可以说核心就是肯·汤普森一人而已。他无疑是我见过的最棒的程序员,也是无人可以比肩的原创思考者。丹尼斯·里奇与肯共同创造了Unix,他是重要的贡献者。丹尼斯的C语言是早期Unix发展的核心,至今仍是计算机的通用语言。考察一下程序员们每天使用的语言,这些语言最初往往出自一两个人之手,这很有启发意义。几乎所有主要的编程语言都是如此,包括Java(詹姆斯·高斯林,James Gosling)、C++(本贾尼·斯特劳斯特鲁普)、Perl(拉里·沃尔,Larry Wall)、Python(吉多·范·罗苏姆,Guido van Rossum)和JavaScript(布伦丹·艾奇,Brendan Eich)。似乎可以预见,将会继续有新的语言出现,让编程变得更简单、更安全。同样可以预测,不会只有一种语言,然而每种语言都有得有失,无法满足所有目的。

◆ 贝尔实验室的管理层技术能力很强,在1127中心尤其如此。管理层可以鉴别出优秀工作,而且从不干涉,所以它不会强求特定的项目或方法。在实验室工作的30多年里,我从来没有被告知要做什么工作。接任比尔·贝克研究副总裁一职的布鲁斯·汉内(Bruce Hannay)1981年在《贝尔系统的工程与科学史》一书中说:“自由选择对研究科学家来说至为重要,因为研究是对未知的探索,没有路线图可以告诉你该怎么走。每一个发现都会影响未来的研究方向,没有人能够预测或规划发现。因此,贝尔实验室的研究管理人员在符合机构宗旨的前提下,为研究人员提供了尽可能大的自由度。研究人员都因其创造力而被选拔出来,公司鼓励他们充分地发挥这些能力。”我所见过的这种近乎绝对自由的最好的例子之一就是肯·汤普森和乔·康登的国际象棋计算机研发工作。有一天,贝尔实验室总裁比尔·贝克带着位重要访客来到Unix房间。肯展示了Belle。访客问,贝尔实验室为什么会支持国际象棋计算机研发工作,这似乎与电话没有任何关系。比尔·贝克回答说,Belle是特殊用途计算机的实验,它推动了新的电路设计和实现工具的发展,还给贝尔实验室在其他领域带来知名度。贝克言之有理,肯也点头称是。

◆ “我们想维护的不仅是良好的编程环境,而且是能促进团队形成的系统。经验告诉我们,公用计算的本质……不仅是用键盘而非穿孔卡在终端机上输入程序,而且是鼓励密切的交流。”——丹尼斯·里奇,“The Evolution of the Unix Time-sharing System”(Unix分时系统的演进),1984年10月