--- title: UNIX传奇:历史与回忆 description: 自1969年在贝尔实验室的阁楼上诞生以来,Unix操作系统的发展远远超出其创造者们的想象。它带动了许多创新软件的开发,影响了无数程序员,改变了整个计算机技术的发展轨迹。本书不但书写Unix的历史,而且记录作者的回忆,一探Unix的起源,试图解释什么是Uni keywords: - UNIX传奇:历史与回忆 - 计算机 tags: - 阅读 author: 7Wate date: 2023-07-17 --- ## 简介 - **书名**:《UNIX传奇:历史与回忆》 - **作者**: 布莱恩·W.克尼汉 - **分类**: 计算机-计算机综合 - **ISBN**:9787115557179 - **出版社**:人民邮电出版社 ## 概述 自1969年在贝尔实验室的阁楼上诞生以来,Unix操作系统的发展远远超出其创造者们的想象。它带动了许多创新软件的开发,影响了无数程序员,改变了整个计算机技术的发展轨迹。本书不但书写Unix的历史,而且记录作者的回忆,一探Unix的起源,试图解释什么是Unix,Unix是如何产生的,以及Unix为何如此重要。除此之外,本书以轻松的口吻讲述了一群在贝尔实验室工作的发明天才的有趣往事,本书中每一个故事都是鲜为人知却又值得传播的宝贵资源。本书适合对计算机或相关历史感兴趣的人阅读。读者不需要有太多的专业技术背景,就可以欣赏Unix背后的思想,了解它的重要性。 ## 划线 > 自1969年在贝尔实验室的阁楼上诞生以来,Unix操作系统的发展远远超出其创造者们的想象。 > 你的能力不可能超越你的鉴赏力。 > 软件技术的“皇冠明珠”就是操作系统。 > Unix的创造者奠定了操作系统的标准基石,Unix的“分而治之”设计哲学——让每个程序做好一件事;要做一件新的工作,就构建新程序,而不是通过增加新“特性”使旧程序复杂化——被优秀程序员奉为圭臬。 > 一大批天才人物聚集在一起,没有生活的压力,没有KPI的烦恼,自由地探索科学的发展和应用。 > 愿原力与你同在! > 格蕾丝•霍珀(Grace Hopper,1906—1992),她在UNIVAC I大型机上开发出了一个名为A-0(Arithmetic Language version 0)的特殊软件,这个软件可以把人类书写的程序自动编译为可以在计算机上执行的程序。这样的程序很快被赋予一个专有的名称——编译器。 > 软件世界变得日益复杂之后,这个世界亟待出现一个优秀的“管理者”,它能很好地统筹宝贵的硬件资源,为不同功能的应用软件提供丰富的基础设施和安全公平的“生存”环境,为不同身份的用户提供简单易用的人机接口。 > 以我之见,程序员的追求就是让机器听话,让工作自动化,让人类生活更美好。 > 回忆往往披着玫瑰色的光晕,令人欢欣。回忆常驻于美好而持久的事物上,也常驻于因努力改善人类生活而获得的愉悦之中。” > 带动了许多创新软件的开发,影响了无数程序员,改变了整个计算机技术的发展轨迹。 > 例如,Unix软件哲学倡导合用既有软件,完成很多不同任务,而不是从头写个新软件。这个例子简明又生动,它在编程领域体现了“分而治之”的故技:将大任务切分为多个小任务,每个小任务都变得更可控,然后再以各种不可思议的方式将之整合到一起。 > 一套策略,一个系统,普遍服务 > 1961年的贝尔实验室(贝尔实验室供图) > 真不少。谁给他们发工资呢? > 持续的资金投入是研究工作的关键保障 > 我出生于多伦多,曾就读于多伦多大学,专业是工程物理(后来改名为工程科学),这是为那些自己也不知道想学什么的人准备的“大杂烩”专业。 > 我的代码充斥着没完没了的IF语句,在我想到要做什么事时,将执行流程分支到另外某处。 > 我在麻省理工学院名义上的老板是费尔南多·科巴托(Fernando Corbató)教授,人人都叫他“科尔比(Corby)”。他创建了CTSS,负责Multics,是一位了不起的绅士。1990年,科尔比因其为分时系统做的基础工作获得图灵奖。他于2019年去世,享年93岁 > “我们给他们一本词典和一套语法规则,说:‘孩子,你已经是伟大的程序员了。’” > 在编程时,“乱抖机灵”并非良策。 > 于是我得到编程风格的第一条规则:写明白,别炫技。 > 如何将员工分配到不同楼层,才能让经常交谈的人在同一个楼层? > 把你介绍给其他人,让你随意晃荡,去寻找自己的研究课题和协作者 > 后来他们奇迹般地找到了之前没系领带的照片,并且刊印了。 > 尽管大多数研究员都有博士学位,但没人称呼“博士”,因为每个人都是博士。 > 多数管理人员都是“赶鸭子上架”,因为这虽然没有终结个人研究生涯,但必然会拖慢进度,而且照料麾下部门颇具挑战性。 > 从加薪池中为每位MTS分配次年加薪幅度。 > 因为管理层在晋升过程中保持了技术能力,而且都有基层经历。整个系统看起来并不过于偏重实践或理论,起码对于我们1127中心这帮人是这样的——优秀的程序和优秀的论文都很受重视。 > 对未来工作的提议或计划一概欠奉,这是件好事。每个人都会大略预估年终成果,但不管做错多少次都没关系。对于那些年复一年做同一件事的人,管理层会保持耐心,以待长远。我想,科研部门管理层级较少也有好处,这样一来大多数人在大多数时候就不会去考虑晋升问题。如果有人立志做官,最好选择其他部门。 > 专精某一领域的人可能会得到其直接上级的高度评价,但再上一层就未必了解其工作成果。另外,跨学科的工作在更高层眼中更突出,因为更多管理人员看得到它。协作越广泛,就会有越多管理者看得到,结果就形成了一个极其偏重协作与跨学科研究的组织。 > 贝尔实验室绩效考核方式的好处在于,它基于由理解某项工作的人的共同评估做出。如道格·麦基尔罗伊所言:“合议是这套体系的极妙之处。谁都不必依赖与单个老板的关系。” > 在某一时刻,我发现离实现一个操作系统仅有3周之遥了。 > 几位贝尔实验室员工在其他操作系统和语言上积累了多年经验,这才有了Unix > 操作系统的任务是控制所有其他要运行的程序,并管理它们与计算机其他部分的交互。 > 每张卡片能保存最多80个字符,容纳一行程序的内容 > 操作系统看顾每位登录用户,在用户之间快速切换,令每位用户误以为整台计算机都为我所用。这种技术叫作“分时” > 所谓第二系统效应,意思是在首个系统(如CTSS)创建成功后,打算创建一个新系统,修正旧系统的遗留问题,还要添加每个人期望的新特性,结果常常是塞了太多不同东西进去,最终得到过于复杂的系统。 > 很多好点子滥觞于Multics,但它最持久的贡献却完全没人预料到:它影响了一个叫Unix的小操作系统,这个小系统诞生的部分原因是想摈弃Multics的复杂架构。 > 正在那时,肯的太太休了3周假,带着一岁大的儿子去加利福尼亚探望公婆,这样肯就有了3周不受打扰的工作时间。 > 1992年12月,肯和弗雷德·格兰普(Fred Grampp)到莫斯科驾驶一架米格29战机,比他们平时开的赛斯纳飞机更上一层级。图2-5和图2-6展示了肯起飞前和落地滑行的情形。 > 2006年,他加入谷歌公司,和罗布·派克及罗伯特·格里塞默(Robert Griesemer)一起发明了Go语言 > PDP-7的Unix系统实在有趣,即使它只是运行在一台小型计算机上,而且还没有很多软件,人们还是开始使用了 > 有人认为,管理层的积极作用之一就是随时保持警醒,让要求资源的人打磨申请,专注提案。相比没有资源限制,资源紧张更有机会促成好的、经过深思熟虑的结果。 > 这里的管理原则是,雇用聪明人,帮他们融入环境,指出大致的需求方向,给他们很多自由空间。不是说他们想要多少钱就给多少钱。有所投有所不投。就算你误判了好东西,如果它够强,仍然会脱颖而出。 > 除了简洁,还有几个特点在当时来说也很新颖。例如“缺陷”部分,它坦承程序会有缺陷,或谓“特性”,即使不能立即修复,至少也该记录下来。 > cat命令50年来没有变过,只添加了很少的可选(也许并不必要的)参数,修改了其操作行为,它仍然是Unix核心命令之一。 > 第6版Unix,其手册发布于1975年5月,首次拓展到贝尔实验室以外。它对世界产生了重大影响。 > Unix是一个通用、多用户、交互式操作系统,运行在数字设备公司PDP-11/40和11/45计算机上。它提供了一些即使在大型操作系统中也罕见的功能,包括:(1)包含可拆卸卷的分层文件系统;(2)可兼容的文件、设备和进程间I/O(输入/输出);(3)初始化异步进程的能力;(4)每个用户可选择不同的系统命令语言;(5)100多个子系统,包括十几种语言 > Unix目录也是文件系统中的一个文件,但其内容由系统本身维护,不由用户程序维护。目录中包含了其下文件的信息,而这些文件又可以是目录。 > 因为目录可以包含子目录,所以文件系统可以深入至任意层。这种嵌套目录和文件的组织方式被称为“分层”文件系统 > shell的另一主要服务是I/O重定向。 > shell脚本(shell script)是存储在文件中的一系列命令。用该文件作为输入源,运行shell实例,如同直接输入命令一样运行脚本中的命令: > 我现在还在用一些三四十年前写的脚本,这在Unix的长期用户中一点也不稀奇。 > “像花园水管那样”把程序接在一起。图4-1的第一幅图来自我在贝尔实验室的办公室墙上挂了30年的陈旧纸页。 > 他只花了一小时就在操作系统中添加了管道系统调用。他形容管道是“超级小菜”,因为I/O重定向的机制早已存在了。 > 同样一些命令,以简单方式持续使用,构成了Unix管道,这恰恰是管道的天才之处。实在需要脑洞大开,才能看到这种可能性并创造出这个概念。 > 它能实现图形界面无法实现的自动化功能:命令序列可以从脚本中运行,输入单个指令就能作用于大量文件。 > 再加上另外十几个其他类别的工具,你就有了20个或30个命令,可以轻松完成各种基本任务 > 正则表达式就是一种描述文本模式的小型语言 > 正则表达式还可以通过赋予某些字符特殊含义来指定更复杂的模式,这些字符称为元字符(metacharacter) > 第6版内核有大约9 000行C语言代码和大约700行汇编语言代码。汇编代码用于设置寄存器、设备和内存映射等与特定机型相关的操作 > 邀请丹尼斯一起写这本书是我在技术生涯中做过的最聪明或者说最幸运的事情——因为丹尼斯是合著者的缘故,该书尤显权威,而且我也就能在书里引用他的参考手册了。 > C语言很重要,但它对标准库的使用也很重要 > C语言既古怪又有缺点,却获得了巨大的成功。虽然历史上的意外事件肯定有帮助,但C语言显然满足了人们对一种系统实现语言的需求,这种语言需要足够高效,足以取代汇编语言,但又足够抽象和流畅,足以描述各种环境下的算法和交互。 > 可以说,实验室里有很多优秀人士,常有人认为自己不过是“暴得大名”。想要力争上游,就得紧追不舍。 > 在之后的多年里,更多的功能被添加进来,Bash(Bourne Again Shell的简写,意为“伯恩再来shell”)已经成为大多数Linux和macOS用户事实上的标准shell。 > 优秀的编程语言能降低人类与计算机沟通的成本。计算机领域的大量研究都关乎如何创造富有表达能力的语言。 > 计算机语言的特点主要有两个方面,语法和语义。语法规定了语言是怎样的,什么符合语法,什么不符合语法。语法还定义了语句和函数如何写,算术和逻辑运算符是什么,它们如何组合成表达式,什么名称是合规的,哪些词是保留字,文本字符串和数字如何表达,程序如何格式化等规则。 > “埃里克·施密特(Eric Schmidt)在暑期实习时几乎重写了Lex。 > 程序帮你写的代码会比你自己手写的更正确、更可靠。 > makefile文件有点像shell脚本,但它采用声明式语言:说明依赖关系和如何更新组件,但不会明确检查文件创建时间。 > 我们都是自己软件的用户,这给了我们改进软件的真正动力。 > 每个人都慷慨奉献出自己的时间,对同事写的东西不吝给出意见,这不过是文化使然。在其他地方这种情况并不常见,所以贝尔实验室才能那么伟大。 > 也许,今天不会有很多人记得,当机器容量以千字节而不是千兆字节为单位时,时间和空间的利用效率乃是重中之重。每个字节都得斟酌使用,所以在某种程度上,每条指令也得再三推敲,因此,一种能在这两方面都节约的语言不仅优秀,而且是实际需要。 > 万勿相信不是完全由你自己创建的代码(尤其是来自雇我这种人的公司的代码)。再多的源码级验证或审查也无法保护你免遭不受信任的代码之害。 > 当时大多数终端只能显示24行80个固定宽度和高度的ASCII字符。 > PWB用户拿shell当编程语言来用,已经能够免除大部分苦差。许多手动操作被快速、廉价、方便地自动化了。 > 从SCCS到RCS、CVS和Subversion,再到今天默认的标准版本控制系统Git,有一条清晰的演化路径。 > 比尔后来为Unix设计了至今仍在使用的TCP/IP网络接口。有了他的socket接口,就能用与文件和设备I/O相同的读写系统调用来读写网络连接,因此很容易添加网络功能。 > ,肯一直完全赞同这样的观点:好代码不需要过多注释。以此类推,伟大的代码根本不需要注释。 > Unix和C语言是终极计算机病毒。 > 经理:“你们必须修复C++编译器的所有错误,但你不能以任何方式改变编译器行为。”我:“这不可能。修复缺陷必然导致行为变化,天经地义。”经理:“布莱恩,你没明白。必须修复错误,但编译器的行为不能改变。” > 1990年12月11日,我在贝尔实验室观看乔布斯演示NeXT。机器非常漂亮。记忆中,那是我唯一一次对科技小玩意儿产生“想要一台”的想法。我显然是被著名的“乔布斯现实扭曲场”所魅惑。 > 今天,Minix依然“健在”,用于操作系统的教学和实验。 > Unix取得了巨大的成功。Unix或Linux或macOS或其他变种运行在数十亿台计算机上,持续为数十亿人服务,当然也为在它之上构建业务的人赚取了数十亿美元(尽管其创造者并未从中获利)。后来的操作系统受它影响极深。 > 肯·汤普森和丹尼斯·里奇的部分天才之处在于,他们善于挑选既有的好点子,而且能够洞察普遍概念或统一主题,将软件系统加以简化。人们有时会用代码行数来评价软件的生产力。在Unix的世界里,生产力却往往以删除了多少特殊情况或代码行数来衡量。 > Unix的高明之处在于选择了足够普适的抽象概念,既能发挥巨大的作用,又不至于在性能上付出太大代价。 > 管道是典型的Unix发明,是临时连接程序的一种优雅而高效的方式。 > iii)设计和构建软件,甚至是操作系统,要尽早试用,最好是在几周内就用起来。大刀阔斧砍掉笨拙的部件,重建它们。 > Unix哲学当然不能解决所有编程问题,但它确实为系统设计和实现提供了有益的指导。 > 稳定的环境至关重要:资金、资源、任务、组织结构、管理、文化都应持续和可预测。 > 这意味着研究人员可以长期甚至年复一年地探索他们认为重要的想法,而不必每隔几个月就向人证明自己在努力。 > 贝尔实验室的文化强烈鼓励合作和帮助。走进别人的办公室寻求帮助绝对是标准做法,大多数情况下,被请求者都会放下手头的一切来协助。实验室还有一流的技术图书馆,每天24小时开放,订阅大量期刊,并可远程访问其他图书馆;它相当于高校的图书馆,但重点放在科学和技术方面。 > 乐趣。享受你的工作以及与你的同事一起工作的时光,这很重要。1127中心几乎总是个有趣的地方。人们在这里不仅仅是为了工作,更是因为希望留在卓越团队里。 > “Unix系统的成功源于其高品位的关键概念选择及优雅的实现。Unix系统模式引领了一代软件设计者对编程的新思考。Unix系统的天才之处在于其框架,它使程序员能够相互倚重。” > 会不会有另一个Unix?会不会有新操作系统横空出世,在几十年内占领世界?当我谈到Unix时,经常会被问到这样的问题。我的回答是不会,至少目前不会。不会有革命发生。更有可能的是,操作系统将继续发展,同时携带大量的Unix DNA。 > 理由是伟大的创意总来自个体。 > 做好研究的最大秘诀是雇用优才,确保让他们做有趣的事情,着眼长久,而且不横加干涉。 > Unix可能是一个奇点,它是改变计算机世界的各种因素的独特组合结果。 ## 笔记 > 道格•麦基尔罗伊神来一笔,提出了管道的想法,肯实现完后自己玩了一下,叹道“好震撼”; 💭 管道流水线,真正的低耦合高内聚。 > Unix操作系统诞生于1969年,但它不是从石头缝里蹦出来的。 💭 厚积薄发 > 每个制造商生产的硬件全无共通之处,有时甚至来自同一厂商的硬件都会有很大不同,所以操作系统也各自不同。 💭 分久必合合久必分呀 > 管道是一种机制,由操作系统提供,并通过shell轻松访问。它将程序的输出与另一程序的输入连接起来。 💭 流水线设计 > 任何你必须重复做的事都有待自动化。 💭 自动化解放生产力 > 1968年秋天开始写毕业论文时,我真的很需要Runoff这样的工具,否则就得自己用手动打字机打出论文(每改一次都要重打),或者付钱请人帮我打。我打字速度快但常打错,所以前者不切实际;由于我又穷又不怎么能挣钱,后者也不切实际。 💭 创新往往发生于资源受限的条件下 > 在20世纪70年代中期,迈克尔·莱斯克编写了UUCP,即Unix到Unix的拷贝程序(Unix to Unix copy program)。它用于在Unix系统之间(一般通过普通电话线)传送文件。虽然电话线传数据速度很慢,有时还很昂贵,但电话线无处不在,而且当时大多数Unix系统都具备某种拨号访问功能。不过具有外拨能力的较少,因为这需要支付话费。 💭 Unix 最初是为了文件的处理,互联网最初是为了文件的传输。就如同活字印刷术一样,信息传递效率的提升促进人类文化大爆炸式发展。 > 杰勒德·霍尔兹曼维护着一份1127中心老同事的在线名单。太多的人已经离世,活着的人里面许多去了谷歌公司;其他人则在别的公司工作,也有人教书或退休。只有极少数人留在贝尔实验室。 💭 http://www.spinroot.com/gerard/1127_alumni.html > 将程序当作工具并组合使用是Unix的特色。编写各自做好一件事的小程序,而不是功能繁多的单个大程序,有很多好处。 💭 做好一件事 ## 书评 ## 点评