UNIX程序设计艺术

1、前言

UNIX系统与其说是一操作系统,不如说是一口述史-- Neal Stephenson

 

       在学问和专门技术之间存在天壤之别。学问让你推演去做正确的事情;专门技术构成正确的事情的一种习惯性思维,几乎根本不需要有意识的去思考。

 

       这本书里面有大量的学问,但是它主要是关于专门技术的。它将会设法教你UNIX专家所知道的关于UNIX开发的事情,而不是意识到他们所知道的。因此,比起大部分UNIX书,它是较少关于技术的,并且更多的是关于共享的文化-显示和隐式的文化,有意识和无意识的传统。它不是一本“怎样去做”的书,而是一本“为什么这样做”的书。

 

       为什么这样做有重大的实际的重要性,因为太多的软件被拙劣的设计。它们中的大部分遭受了膨胀,维护起来是极度地困难,并且太困难而不能移植到新的平台上或以最初的程序员没有预料到的方式扩展。这些问题是糟糕的设计的征召。我们希望这本书的读者将会学到UNIX必须教授的关于好的设计方面的东西。

 

       这本书被划分成四个部分:背景,设计,工具集,和社区。第一部分(背景)是哲学和历史,帮助为接下来所述各种的东西提供基础和激励。第二部分(设计)展开UNIX哲学的原则进入到关于设计和实现的更细节的建议。第三部分(工具集)集中在UNIX为帮助你解决问题所提供的软件。第四部分(社区)是关于那些使UNIX文化在它所涉及的方面如此高效的人与人的交往和协定。

 

       因为这本书是关于共享文化的,我从未计划单独写它。你将会注意到这些文字包含了来自杰出的UNIX开发者,UNIX传统的塑造者的特约发表。在我邀请这些权威者来评论和讨论这些文字的期间,这本书经受了一个长期的公开的审核过程。在这本书的最终版本中,不仅覆盖了那个审核过程的结果,这些佳宾也被鼓励用他们自己的语态说话,引申和衍变,甚至和这些文字的主线不一致。

 

       在这本书中,当我使用编辑上的“我们”的时候,这不是假装无所不知,而是反映了试图链接整个社区的专门技术的事实。

 

       因为这本书的宗旨是传播文化,它比一般的技术书籍包含了更多的关于历史和民间传说和一些题外话。享受它吧;这些东西,也是作为一个UNIX程序员,你的教育的一部分。这些历史上的细节,没有哪一个单独上是至关重要的,但是它们全部的整体形态是重要的。我们认为用这种方式,它构造了一个更加有趣的故事。更重要的,明白UNIX从那里来的和是怎样走上这条路的,它会帮助你发展出对于UNIX风格的直觉的感觉。

 

       出于同样的原因,我们拒绝写那些似乎结束的历史。你会发现异乎寻常地许许多多的对于我正在写这本书的时候的参考。我们不希望假装当前的实践反映了一些注定命运永恒的和完美的逻辑结果。写作时候的参考对于读者意味着警报,二年或三年或五年以后,这些相关的事实记录也许已经过时了,并且应该被仔细的检查。

 

       这本书的其它方面既不是C语言的教程,也不是UNIX命令和API的指南。它不是为sed yacc Perl Python的参考。它不是网络编程的初级读物,也不是对于神秘的X的详尽的指南。它也不是UNIX的内核和结构的漫游。其它书籍更好的覆盖了这些细节,这本书会适时给你指出它们。

 

              超越了所有的这些技术细节,UNIX文化拥有一个发展超过数百万人年的娴熟的努力这种字面意义上的非书面的工程传统。这本书是带着理解那个传统,和加入它的设计模式到你的工具箱中这样的信仰写的,它将会帮助你成为一个更好的程序员和设计师。

 

       文化由人构成,并且学习UNIX的传统方式是通过耳濡目染,从其它人那里和通过民间传说。这本书不是取代人与人之间的文化互渗,但是它通过允许你分接其他人的经验,能帮助加速这个过程。

 

       注:【1】在19692003年之间的35年是一段很长的时间。在那期间,由于历史趋势的弯曲,大量的UNIX站点都逝去了,或许在某处,超过5千万的人年的工作量已经干劲十足地投入到了遍及全球的UNIX开发之中。

 

n       适合的读者:

如果你是一个经验丰富的UNIX程序员,经常处在要么指导初学编程的新手,要么和其他操作系统拥护者进行争论这样的场合。同时,你发现你很难把UNIX所带来的好处讲清楚。那么,这本书正在你所需要的。

 

如果你是一个在其它操作系统上有编程经验的CC++JAVA程序员,并且准备启动一个基于UNIX的项目。那么,你应该阅读此书。

 

如果你是一个UNIX操作系统下,具有初级到中级水平的用户。但是,只有比较少的开发经验。并且,想学习怎样在UNIX下有效的设计软件。那么,你应该阅读此书。

 

如果你是一个已经认识到UNIX传统也许有一些东西能让你从中受益的非UNIX程序员。那么,你应该阅读此书。我们确信你是对的,并且UNIX哲学同样适用其它操作系统。因此,比起其它的一般UNIX书籍,我们在这里更多关注非UNIX环境(特别是micorsoft操作系统)。并且,我们可以说,这里的工具和学习例子在一定程度上都是可移植的。

 

如果你是一个程序架构师,要为一个主流的通用市场或是纵向应用程序考虑平台的多样性或是各种不同的实现策略。那么,你应该阅读此书。它会让你明白UNIX作为一个开发平台的强大,和作为一种开发方式的开源的unix传统。

 

如果你正在寻找关于C语言编程细节或是怎样使用UNIX内核编程接口方面的书籍,那么这本书不是你需要的。关于这方面已经有很多优秀的书籍:在展示UNIX API的书籍中,《UNIX高级环境编程》是其中非常优秀的一部。《程序设计实践》也推荐所有的C程序员阅读(事实上是使用任何语言的程序员)。

 

n       怎样使用本书

这本书是理论实践相结合的。一部分是至理名言和通用的,另一部分是检验细节的UNIX下开发的例子学习。我们会在通用的原则和至理名言前面或是后面,用实例来描述它们:这些实例不是从玩具似的示范性程序中抽取出来的,而是每天都使用的真正的能工作的代码。

 

我们故意避免了让书里充斥大量的代码和文件清单似的例子,即使这样做可能会让书好写一些(有些地方可能会容易读一些)。很多编程书籍给出了太多的低层次的细节和例子,但是没有给读者对于说讲内容的一个更高层次上的认识。这这本书里,我们宁愿在反方向走向歧途。

 

因此,当你经常被应邀阅读代码和规范文件的时候,事实上只有少量相关内容被包含在书里。相反,我们会在web给出完整的例子。

 

 

有意思的是,这些例子能帮助巩固你所学到的原则变成近乎直觉的工作知识。理想情况下,你应该以近似于运行的UNIX系统上控制台的方式来阅读本书,手边在准备一个浏览器。任何UNIX系统都支持这样的方式,但是在LINUX系统上,为了对系统进行检查,这里用于例子学习的软件是预先安装的和立即可用的。该书中的各种指示物用来进行浏览和试验。这些指示器的介绍是按部就班的,因此,暂时的研究偏离主题不会打断那些必须连续的阐述。

 

注意:尽管我们已经尽一切力量去引用稳定可用的URL,但是我们办法来担保这一点。如果你发现引用连接已经失效了,使用你喜欢用的WEB搜索引擎,用经验常识和做短语搜索。这里我们建议你的方式和我们自己引用URL的方式差不多。

 

这本书里的大部分缩略语在第一次使用的时候都是以完整的形式出现。为了方便起见,我们在附录里提供了术语表。

 

参考资料通常按作者的名字。本应在书中正文出现的URL介绍或是我们怀疑的很容易失效的URL,还包括一些题外话、战争故事、玩笑,这些我们都用标号的脚注的方式来表示。

 

为了让这本书更容易被技术不是很强的人接受,我们邀请了一些非程序员人士进行阅读,并确定了那些有些模糊,但是对说明流程很重要的术语。我们还用脚注的方式给出了对于有经验程序员不需要的一些基本术语的定义。

 

注【2】:这些特别脚注是献给Terry Pratchett的,他的脚注的使用是相当。。。令人鼓舞的。

 

n       相关参考资料

以前,涉足这个领域的一些早期的UNIX开发者撰写了一些著名的论文和书籍。Kernighan Pike的《unix编程环境》是其中比较优秀的,也是被认为很经典的。不过,现在看来,它有点过时了。它没有覆盖internetWWW和象Perl, Tcl, and Python这样的解释语言的新潮流。

 

在我们写这本书的途中,我们学习了Mike Gancarz的《unix哲学》。这本书在阐述范围上十分优秀,但是依然没有尝试覆盖我们认为有必要阐述的所有领域。尽管这样,我们还是要感谢作者的暗示:非常简洁的UNIX设计模式是UNIX持久稳固和成功的非常重要的因素。

 

和本书相比,《程序员修炼之道》在有细微差别的各种不同的软件设计工艺(更多的是代码,较少关于高级别的问题划分)中,给出好的设计实践权衡方面,更像是一个幽默诙谐,并且明智的专题论文。作者的观点是UNIX下经验的产物,同时也是本书的有力补充。

 

UNIX传统里,《程序设计实践》从一种更深入的角度覆盖了和《程序员修炼之道》部分相同的立场。

 

最后(并且被认为有煽动倾向),我们推荐的是《Zen Flesh  Zen Bones》,它们是佛教原始来源的重要的收藏品。对佛教的参考散落在整个书籍里面。我们引用它是因为,佛教提供了对于表达软件设计被证明是重要的思想的词汇,而采用其它方式却很难记住。带有宗教信仰的读者会认为佛教不是信仰,而只是治疗学的一种智力训练的形式,从纯粹的无神论角度来看,佛教确实是这样的。

 

n       使用本书的约定俗成

术语UNIX是开放组织技术上和法律上的商标,并且只有那些通过了开放组织精心制作的标准化测试而被鉴定的操作系统才能正式使用。在本书中,我们使用当前程序员群体中所认为的非严格的,更广泛意义上的UNIX含义,它是指或者是从共同祖先-贝尔实验室的原始UNIX代码继承下来,或者是模仿它的后代进行编写的任何操作系统(无论是不是正式的UNIX商标)。特别的,从这个意义上来讲,LINUX就是UNIX

 

本书采用UNIX手册页的习惯,在工具名称后面用括起来的手册段进行标志,当我们想强调它是一个UNIX命令的时候,通常把它放到第一部分的介绍中。因此,例如,当读到munger(1)时候,munger作为一个程序,它的文档描述将会出现在UNIX手册页第一段中,当然如果你的系统提供它。第二段是系统调用,第三段是C库调用,段5是文件格式和协议,段8是系统管理工具。其它段随着UNIX系统的不同而不同,但是本书没有给出相关引用。进一步,你可以在SHELL提示符下敲入man 1 man 以得到更多相关内容(老的系统V版本UNIX,可能要求敲入man -s 1 man)。

 

有时候,我们提到一个UNIX程序的时候(例如,Emacs),没有手册段作为后缀,并且首字母大写。这是一个暗示,它的名字实践代表了本质上有相同功能的精心组织的UNIX程序族。并且,我们正在讨论的是它们的共性,例如,Emaces,它包含了xemacs

 

在本书后面的不同知识点中,我们参照“守旧派”和“新学派”的方式。就像RAP音乐一样,新学派大约开始于1990年。在那个时代环境中,它和脚本语言的兴起,GUIs,开源UNIXWEB联系在一起。守旧派指的是1990年以前(特别是1985年以前),昂贵的(共享的)计算机,专用的UNIXshell脚本编程,C语言几乎统制了一切的那个世界。这里的差别是值得指出的,因为廉价的和没有内存限制的机器促成了UNIX编程风格上的重大改变。

 

n       我们的学习例子

 

为了证明一个观点,大部分编程方面的书籍都依赖于特殊构造起来的玩具似的例子。这本书不是这样的。我们的学习例子将是真实的,早就存在我们每天都使用的产品中的片断。下面是一些主要的产品:

cdrtools/xcdroast

这两个分开的工程经常在一起使用。cdrtools包是刻录CD-ROMs的一套CLI工具。以“cdrtools”为关键字在WEB上搜索一下。xcdroast程序是cdrtoolsGUI前端。详见xcdroast project site.

 

fetchmail

程序fetchmail采用POP3 IMAP邮件传输协议,从远程邮件服务器上获取邮件。详见fetchmail home page(或在WEB上用“fetchmail”进行搜索)。

 

GIMP

GIMPGNU的图像处理程序)是一款具有涂、绘、图像处理全方位功能的图像处理软件,它采用独特的方式能够处理种类繁多的图形格式。在GIMP home page上能够获得源码。

 

mutt

在当前种类繁多的基于文本的UNIX电子邮件代理中,mutt邮件个人代理是其中最好的一款,它对MIME (Multipurpose Internet Mail Extensions)有非常好的支持,并且the use of privacy aids,例如PGP (Pretty Good Privacy) GPG (GNU Privacy Guard)。可以从Mutt project 站点上获得源代码和可执行程序。

 

xmlto

xmlto命令可以转换DocBook和其它XML文档为各种各样的输出格式,包括html,textPostScript,可以在xmlto project site.上获得源码和文档。

 

为了降低读者理解这些例子所需要的代码数量,我们尽力选择了那些可以一例多用,可以阐述好几个不同的设计原则和惯例的学习例子。出于同样的原因,好多例子是从我的项目里挑选出来的。这里没有任何暗示说来自于我的项目的例子可能是最好的,我仅仅是十分熟悉它们,这对于例子的多用途说明是有好处的。

 

n       感谢

特约的贡献者(Ken Arnold, Steven M. Bellovin, Stuart Feldman, Jim Gettys, Steve Johnson, Brian Kernighan, David Korn, Mike Lesk, Doug McIlroy, Marshall Kirk McKusick, Keith Packard, Henry Spencer, and Ken Thompson)为这本书加入了大量的价值。特别是Doug McIlroy,在他的评论的透彻性和他贡献的深度上,远远超过了职责所求,显示出了和他30年前带给的为管理最初的UNIX科研小组的同样优秀的关注和奉献。

 

特别感谢Rob Landley和我的妻子Catherine Raymond,他们二个人对原稿的草稿作出了深入细致的逐行的审订。Rob深刻的和专心的评论事实上比在最终稿中的一整章内容更令人鼓舞,并且他做了大量的关于它呈现的组织和范围的工作。如果他写了全部促进我去改善的文字,我将不得不称他为合著者。Cathy是我的试验读者,代表了非技术用户。为了延伸这本书,让那些还不是程序员的读者所能理解,这些主要都是他做的。

 

在我花费写这本书的超过5年的时间里,它从许多其他人的讨论那里获益。Mark M. Miller帮助我完成了关于线程的启发。John Cowan提供了一些关于接口设计模式的见识,wilyVM/CMS的研究案的草稿,并且Jef Raskin给我展示了最小诧异原则是从那里来的。UIUC系统架构组在早期的章节上贡献了有益的反馈。UNIX做错了什么和深入的伸缩性这样的节是由于他们审阅的直接灵感。Russell J. Nelson 贡献了在第七章中链系的关于Bernstein的材料。Jay Maynard贡献了第三章中在MVS学习例子中的大部分材料。Les Hatton在语言一章中提供了许多有益的评论和由此启发的第四章中关于最佳的模块大小中的部分。David A. Wheeler贡献了很多观察入微的评论和一些例子研究材料,特别是在设计部分。俄国人Cox帮助改进了9张平面图的概观。Dennis Ritchie在关于C的一些历史点上纠正了我。

 

许许多多的UNIX程序员,比这里列出的多得多,在2003年的1月到6月之间的这本书的公开审核期间,贡献了建议和评论。一如既往,我发现在WEB上的开放的同行审查过程具有热情的挑战和热情的回报。也一如既往,对工作结果的任何错误的责任归我自己。

 

这本书的说明风格和涉及的一些内容己经被设计模式运动所影响。事实上,我动摇过给这本书起名叫UNIX设计模式的想法。我没有那么做,因为我不赞同这个运动中的一些隐式的中心法则,并且没有感觉到使用它所有的正式的注解的需要或承担它文化的包袱。然而,我的方法无疑的受到了Christopher的影响。

 

Alexander的工作(尤其是永恒的建筑方式和一种模式语言),我欠“四人帮”和他们学派的其它成员的大量的人情,因为他们给我展示了怎样可能的去使用Alexander的见识站在一个高层次上,而不仅是全然含糊的和无意义的概率,去讨论软件的设计。留意的读者应该明白设计模式:可复用面向对象软件的基础,是对设计模式的入门介绍。

 

当然,这本书的标题参考了Donald Knuth的计算机编程艺术。尽管和UNIX传统没有特定的关联,Knuth己经对我们所有人到造成了影响。

 

编辑具有的先见之明和想象力不是象他们看起来一样普通。Mark Taub就是这样的一个。他在一个停顿的项目上开凿出价值,并且巧妙的把我推入完成它。文案编辑对于散文风格很会赏析,并且有足够的能力改善那些不像他们自己的风格,甚至是很少有共同点作品,但是Mary Lou Nohr 就达到了那个水平。Jerry Votta 抓住了我对于封面的观点,并且使它看起来比我想象的更好。在Addison-Wesley出版社里的全体人员为使编辑的和生产的过程尽可能无痛苦达到了很高的水平,并且不仅仅在文字上愉快的接纳了我任性的控制倾向,而是深入到了这本书的视觉设计,艺术,和市场的这些细节上。

 

注【3】:Alexander的工作的正确评价,带有重要的部分的在线版本的链接,可以在《Some Notes on Christopher Alexander》上发现。

2、第一部分:背景

21、哲学

n       文化?什么的文化?

这是一本关于UNIX编程方面的书籍,但是在这本书里,我们将会大量使用文化、艺术、哲学这样的用词。如果你不是程序员,或者是和UNIX接触比较少的程序员,这些对于你来说,可能有点奇怪。但是,UNIX有一种文化;它有独具特色的编程艺术;并且伴随着它有一种很强大的设计哲学。理解这些传统会帮助你构建好的软件,即使你正在非UNIX平台上开发。

 

工程学和设计学的每一个分枝都有技术文化。在很多形形色色工程学中,对于从业者的教育,该领域的非成文的传统和正式的手册、教科书具有同等的重要性(并且,随着经验的增长,经常是比其更重要)。高级的工程师把这些只通过(如同佛教徒所做的)“特殊的传播,而非手稿”方式传递给他们后辈的隐性知识显彰在大量的有形体上。

 

软件工程是这些规则中一个普遍例外。技术变化的太快,软件环境日新月异,技术文化脆弱且短暂。当然,也不全是这样。较少数的软件技术被证明是有足够的生命力来发展出强大的技术文化、特色的艺术,和在工程师中代代相传的关联的设计哲学。

 

UNIX文化就是其中的一个。或者说,在21世纪的INTERNET文化是可被论证的另一个。自从80年代早期,随着这两者的成长,两者变得愈加难以分开,并且在本书中,我们也不会试着做这样的特殊努力。

 

n       UNIX的生命力

UNIX诞生于1969年,从那时到现在它以被流水线式的生产使用。整个时间跨越了计算机工业标准的好几个地质时期-比PC或工作站或微处理器,乃至视频显示终端,和具有同一时代的第一个半导体存储器的历史都要悠久。今天,在所有的分时系统中,只有IBMVM/CMS可以声称能有较长时间存在下去,并且UNIX机器已经提供了几十万倍还多的运行时数。事实上,UNIX可能提供了比所有的分时系统加在一起所提供的计算还要多。

 

UNIX已经被认为可以在各种各样的机器上使用,比起其它任何操作系统所声称的都多。从超级计算机到手持和嵌入式网络设备,从工作站到服务器和过程控制系统和微机,UNIX大概预料到了的更多体系结构和更多零散的硬件,比任何3个其它操作系统加起来还要多。

 

UNIX已经支持压倒性的宽广使用领域。科研用工具、作为技术上的定制应用程序的友好主机,商业上畅销的商务软件的支撑平台,INTERNET的关键构成技术,没有任何其它系统能够同时在这些领域取得辉煌。

 

自从UNIX初期开始,每年都有这样自信的预言,UNIX会消亡或是被其它操作系统所排挤。然而UNIX,以它当今化身为Linux BSD Solaris MacOS X和半打其它形式的变体,在今天看起来,比以往任何时候都强大。

 

Robert MetcalfEthernet的发明者)说,如果有什么东西进步取代了Ethernet,那么它将是所谓的“Ethernet”,出于这个原因,Ethernet不会消亡。UNIX已经经历了好几次这样的转变

 

至少UNIX核心技术之一-C语言-已经广泛的移植到了其它地方。事实上,C作为系统编程中普遍使用的通用语言,很难想象在做软件工程过程中而不被用到。为了连接应用程序,UNIX也引入了现在以被广泛使用的带有目录节点的树型文件域名空间和为连接程序的管道。

 

UNIX的生命力和适应性简直是令人吃惊的。其它的技术象蜉蝣一样来来往往。机器在处理能力上增加了上千倍,语言在变异,工业惯例经历了数次的革命。然而,UNIX依然身处其中,依然在产出,依然在付帐,依然衷心的服务于这个行星上很多最优秀和聪明的的软件技术人员。

 

在计算,和相应软件开发速度方面的指数摩尔曲线的推理之一就是:每过18个月,一个人已有知识的一半就会过时。UNIX没有废止这种现象,而是在容纳它这方面做了很好的工作。UNIX有基本不变的根底-语言,系统调用,工具使用,事实上,这些能保持好多年不变,甚至是几十年。在其它方面很难预言什么将是稳定的。甚至整个操作系统周期性的废弃。在UNIX下,短暂的和持久性的知识之间有着清晰明显的区别,并且一个人提早知道的(有大约90%的确定性)各类知识,当它去学的时候,这些知识很可能到期了。UNIX命令是如此的忠诚。

 

UNIX的稳定性和成就的大部分毫无疑问是归功于其固有的强壮,归功于Ken Thompson, Dennis Ritchie, Brian Kernighan, Doug McIlroy, Rob Pike和其他一些早期UNIX开发者在开始时候就为将来做打算的设计决策。归功于一遍又一遍的被证明是合理的决定。但正是同样的归功于在早期围绕UNIX发展起来的设计哲学,编程艺术和技术文化。自从那时候起,这个和UNIX共生的传统就在不断的,成功的进行自我繁殖,复制。

 

注【4】:事实上,以太网已经被具有同样名字的不同技术取代了2次。一次是当同轴电缆被双绞线取代的时候,第二次是当千兆以太网流行起来的时候。

 

n       UNIX文化反面学术例子

对于那些已经喜欢上UNIX,和或许已经喜欢上它技术历史学家,UNIX的稳定性和它的技术文化无疑是最吸引人的地方。但是,作为多用途的分时系统的最初的UNIX程序,是为那些被个人工作站击败而迅速消失在历史烟河中的中型和大型计算机所开发的。于是,在被微软统制的主流商业桌面电脑市场领域中,有一定的怀疑余地认为它将不会不断的取得成功。

 

外行者经常打发UNIX当作学术上的玩具或是黑客玩耍的沙盒。一个被众所周知的争论,《UNIX痛恨者手册》,跟随的反对路线几乎和UNIX本身被记载的一样久,它的热爱者作为一群反常信仰的信徒和失败者而脱离出来。AT&T, Sun, Novell和其它一些商业厂商和标准化组织在给UNIX定位和市场推广方面都接二连三的犯下了很多大的错误,当然,这些都已经成为传说了。

 

UNIX看起来一直在摇摇欲坠濒于普及性好久了,以至于甚至来自于UNIX世界的内部都产生了它决不会实际上达到那里的怀疑。一些生性好疑的局外评论员的结论认为:也许UNIX太有用了而不会走向消亡,但是也会因为太难以使用而无法逃出密室;一个永久的小生境的操作系统。

 

LINUX和其它开源UNIX的兴起(例如现代各种BSD变体),在挫败怀疑者方面,比其它任何方面都要重要。UNIX的文化证明是太重要了,甚至10几年厂商的管理不善也不能将其扼杀。今天,UNIX社区本身已经控制了UNIX的技术和市场,并正在迅速地、显著地解决着UNIX的各种问题(在这方面,我们将在第20章更详细的检查)。

 

n       UNIX做错了什么

1969年以来,就设计方面来说,认为UNIX中那一项设计是勿庸置疑的错误是非常困难的。到是也有一些普遍认为有问题的设计,但是它们中每一项在至今仍是倍受争议的,这些争议不仅仅是在UNIX爱好者之间,那些考虑和设计操作系统的广大社区的人们也加入其中。

 

UNIX上的文件在字节级别上没有进一步的结构。文件删除是不可以恢复的。UNIX安全模型被论证认为太原始。作业控制也很糟糕。对一些东西有太多的不同命名方式。持有的文件系统从肯本上就可能是一个错误的选择。我们将在第20章讨论这些技术问题。

 

但是,对于UNIX来说,大部分经久不衰的的争论多半是第一次被X windowing系统设计者显示提出来的哲学中最有特殊的一部分的推论。    X力争提供一种机制,而不是策略,支持图形操作系统所提供的非常通用的装置,并且推迟关于工具包和所见即所得界面的决定到应用程序级。UNIX的其它系统级别的服务显现出了类似的趋势。关于行为的最终的选择尽可能的向用户有利的方面推动。UNIX用户可以在多种SHELL中进行选择。UNIX程序通常提供许多行为选项和令人喜欢的精心制作的偏爱便利。

 

这种趋势反映了主要为技术用户所设计的操作系统的传统,并且随之而发生的信仰是:用户比操作系统设计者更了解他们自己真正需要的是什么。

 

这个原则是被贝尔实验室的Dick Hamming稳固的建立的,当在计算机即稀有又昂贵的50年代的时候他就坚持这一点。那个年代开放式计算站是必要的,在那里顾客们自己写程序,因为:用错误的方法解决正确的问题总比用正确的方法去解决错误的问题要好。

 

但是,这种非策略机制的方法的代价是,当用户能设置策略的时候,他必须设置策略。一些非技术性的终端用户发现UNIX丰富的选项和接口风格压倒性和倒退了系统,至少提供给了他们伪简单性。

 

从段时期来看,UNIX放入主义方式也许失去了一定数量的非技术用户。然而,从长期来看,它可能化劣势为优势,因为策略趋向于短生命线,而机制则相反。今天在界面所见即所得方面的风格太常见了,以至于堵死了将来的进化之路。(就像使用过时的X工具包的人所将要告诉你的感受的那样)。在竞争对手更多的捆绑策略或界面选择淡出视线以后,于是反面的反面是:“机制,而不是策略”也许会让UNIX重新获得新生。

 

注【5】:是的,Hamming 的“Hamming  距离”和“Hamming 码”

注【6】:Jim GettysX的架构师之一(也是这本书的贡献者),在《The Two-Edged Sword 》一文中,对于X的放任政策的风格向将来执行下去会有怎样的结果有很深的冥想。这篇短文,对于它的细节上的提议和对于its expression of the Unix mindset,都是非常值得读的。

 

n       UNIX做对了什么

最近LINUX爆炸式的增长,和INTERNET渐增的重要性,给了我们很好的理由支持,那些怀疑论者的例子是错误的。但是,即使怀疑论者的估计是正确的,UNIX文化也是值得学习的,UNIX和它周围的文化中的一些东西,比起其它任何竞争对手有明显的优势。

 

开源软件:

尽管在1998年以前,术语“open source”和开源的定义没有被发明,但是,自从UNIX诞生以来,具有同等意义的自由的共享源代码的开发就是UNIX文化的关键特性。

 

对于AT&T的原始UNIX的,和主要变种的伯力克UNIX头十年中,通常是带着源码发布的。这就使大量的其它好的事情尾随而至。

 

跨平台可移植性和开放标准:

跨越不同种类的计算机、厂商和特殊用途的硬件,能提供一致的,文档支持的应用程序编程接口(API),在这方面,UNIX仍然是唯一的操作系统。它是唯一的操作系统,能够支持从嵌入式芯片和手持设备,直到桌面机器,到服务器,对于特殊目的的大型数字计算设备和数据库后端更是自始至终的支持。

 

在现存的API中,UNIXAPI是最接近写真正的可移植软件的硬件无关标准。不出意外的话,IEEE原来称作的Portable Operating System Standard,取了它们的首字母加上一个快速取得的后缀就形成了POSIX。对于这样一个标准,和UNIX具有同等价值的API是唯一的可信模型。

 

一些其它操作系统上,只有二进制的可执行程序和它们的出生环境一起消亡了,但是UNIX原始资料是永远存在的。一个给定的UNIX技术的文化至少能闪光和维持它们数十年,或是永远。

 

INTERNETWWW

美国国防部签订了TCP/IP协议栈第一份产品的合同,这有助于UNIX开发组织,因为那个时候UNIX大量的开放源码正在遭到置疑。除了TCP/IPUNIX已经成为INTERNET服务提供商不可或缺的核心技术之一。自从80年代中期,家用操作系统TOPS退出历史舞台后,大部分的INTERNET服务器都依赖于UNIX

 

微软可怕的营销策略已经动摇了UNIXINTERNET世界中的霸主地位。然后,从TOPS-10进化而来的TCP/IP规范,在理论上是和UNIX背道而驰的,尝试使这样规范在其它操作系统上工作会遭受不兼容性、不稳定性和很多bug的困扰。这些理论和规范任何人都可以获得,但是工程习惯于仅在UNIX的世界中使它们稳固和真实运作。

 

80年代早期,INTERNET技术上的文化和UNIX文化开始融合,并且现在已经是不可分割的共同体。INTERNET最现代化的外观,WWW的设计,应该象感谢它的祖先ARPANET一样感谢UNIX。特别的,对于WEB如此重要的统一资源定位的概念(URL),是UNIX各处统一的文件命名思想的范化。

 

开源组织:

最初围绕着早期UNIX开源发布而形成的组织从来没有消失-在90年代早期INTERNET爆炸性大增长以后,它新吸引入了家用机器上整个新一代热心的黑客。

 

今天,对于各种各样的软件开发来说,该组织都是强有力的支持团体。在UNIX世界里,有很多高质量的开源开发工具。开源UNIX程序通常等于,并且经常优于,他们自己拥有的具有同样意义的程序。带有完整工具包和基本应用程序套件的整个操作系统,可以在互联网上免费的获得。为什么抓来的代码,这时你能改编,重用,循环利用,并且节约你自己工作的90%呢?

 

代码共享的传统高度依赖于关于怎样协助开发和重用,这样难的的专业技术。并且不是依据抽象的理论,而是通过大量的工程实践-不明显的设计规则,允许功能程序不尽是作为孤立的一次性解决办法,而是作为一个工具包的增强部分。这本书的主要目的是阐明这些规则。

 

今天,萌芽开源运动正在带来新的活力,新的技术上的方法,和整个聪明年轻的一代程序员进入UNIX的传统。包括LINUX操作系统,和与之共生的象APACHEMozilla这样的开源工程,使得UNIX传统的主流可见性和成功达到了一个空前的程度。开源运动似乎处在赢得将来计算基础结构定义的标书的边缘,并且该基础结构的核心将是正在INTERNET上运行的UNIX机器。

 

自始至终的向下伸缩性:

大多数被吹捧为比UNIX更现代或更用户友好的操作系统通过锁定用户和开发者进入一个界面的策略,和宁愿狭隘和刚性也煞费苦心提供的应用程序编程接口,达到了它们繁华的外表。在这样的系统上,设计者有预期的任务非常简单-但是那些没有预期的任务通常是难以忍受的或是非常痛苦的。

 

另一方面,UNIX有深入的伸缩性。UNIX提供许多种方式把程序胶合在一起,这意味着它的基本工具包的组件能够合并产生单独工具包部分的设计者从未预期到的非常有用的价值。

 

UNIX的编程接口的多种风格的支持(经常被看做是弱点,因为它增加了对于终端用户来说系统感觉上的复杂度)也有利于伸缩性。没有想成为数据管道中简单一片的程序被强制承担在精心制作的GUI之上的复杂性。

 

UNIX传统把重点放在强调保持程序接口相对较小、干净和正交上-产生深入的可伸缩性的另一个特点。简单的事情是简单的和困难的事情至少尽可能简单,贯串这整个UNIX系统。

 

UNIX是黑客的娱乐:

忙于UNIX先机技术的具有教皇地位的那些人常常可能肯本不提它的非常有重要性的力量,这一类人放下了他们所有的浮名。UNIX是黑客的娱乐。

 

UNIX的拥护者看起来不时的就对黑客的贡献而没有答谢表示惭愧,尽管承认他们的娱乐可能不知何故的损害了他们的合法性。但是和UNIX打交道和为其开发是一种娱乐,是一个事实,并且,永远都会是这样。

 

没有多少任何人都永远用“乐趣”来形容的操作系统。事实上,在大部分其它环境下的开发被形象的比喻为摩擦和分娩。

 

to kicking a dead whale down the beach。经常听到的亲切的形容词是“可以忍受”或“不是非常痛苦”这样一类的。在UNIX的世界里,恰好相反,操作系统奖赏努力,而不是阻止它。在UNIX下经常编程的人达成共识,它不是作为一个用棍棒,使你通过全力的努力按照它的命令去做的敌手,而宁愿作为实践的积极的帮手。

 

这有真正的经济意义。在UNIX历史的早期,娱乐因素发起了一个道德圈。人们喜欢UNIX,因此为它编写更多的程序,使它更好用。今天,人们把构建完整的,产品级质量的开源UNIX系统当作是一个业余爱好。为了明白这是多么有价值,当你最近听说任何人科隆了OS/360 ,或是 VAX VMS 或是 Microsoft Windows仅仅是为了娱乐,请扪心自问。

 

或者,从设计的角度上来看,娱乐因素是微不足道的。作为程序员和开发者的类型的人,当他们不得不做出努力来做对于他们来说有挑战,但是刚好在他们能力之内的任务的时候,他们有“娱乐”。“娱乐”因此是高效率的象征。痛苦的开发环境浪费了努力和创造力。他们在时间,金钱,和机会上付出了巨大的隐式代价。