snakeguang 发表于 2006-02-24 15:01

unix 编程艺术 样章放送之第1/2/3

1
哲学
Philosopy: Philosophy Matters
Those who do not understand Unix are condemned to reinvent it, poorly.
不懂Unix的人注定最终还要重复发明一个蹩脚的Unix。
Usenet 签名, 1987年11月
——Henry Spencer
1.1文化?什么文化
这是一本讲Unix编程的书,然而在这本书里,我们将反复提到“文化”、“艺术”以及“哲学”这些字眼。如果你不是程序员,或者对Unix涉水未深,这可能让你感觉很奇怪。但是Unix确实有它自己的文化;有独特的编程艺术;有一套影响深远的设计哲学。理解这些传统,会使你写出更好的软件,即使你是在非Unix平台上开发。
工程和设计的每个分支都有自己的技术文化。在大多数工程领域中,就一个专业人员的素养组成来说,有些不成文的行业素养具有与标准手册及教科书同等重要的地位(并且随着专业人员经验的日积月累,这些经验常常会比书本更重要)。资深工程师们在工作中会积累大量的隐性知识,他们用类似禅宗“教外别传”[译注 ]的方式,通过言传身

教传授给后辈。
软件工程算是此规则的一个例外:技术变革如此之快,软件环境日新月异,软件技术文化暂如朝露。然而,例外之中也有例外。确有极少数软件技术被证明经久耐用,足以演进为强势的技术文化、有鲜明特色的艺术和世代相传的设计哲学。
Unix文化便是其一。互联网文化又是其一——或者,这两者在21世纪无可争议地合二为一。其实,从1980年代早期开始,Unix和互联网便越来越难以分割,本书也无意强求区分。
1.2Unix的生命力
Unix诞生于1969年,此后便一直应用于生产领域。按照计算机工业的标准,那已经是好几个地质纪年前的事了——比PC机、工作站、微处理器甚至视频显示终端都要早,与第一块半导体存储器是同一时代的古物。在现今所有分时系统中,也只有IBM的VM/CMS敢说它比Unix资格更老,但是Unix机器的服务时间却是VM/CMS的几十万倍;事实上,在Unix平台上完成的计算量可能比所有其它分时系统加起来的总和还要多。
Unix比其它任何操作系统都更广泛地应用在各种机型上。从超级计算机到手持计算机到嵌入式网络设备,从工作站到服务器到PC机到微型计算机。Unix所能支持的机器架构和奇特硬件可能比你随便抓取任何其它三种操作系统所能支持的总和还要多。
Unix应用范围之广简直令人难以置信。没有哪一种操作系统能像Unix那样,能同时在作为研究工具、定制技术应用的友好宿主机、商用成品软件平台和互联网技术的重要部分等各个领域都大放异彩。
从Unix诞生之日起,各种信誓旦旦的预言就伴随着它,说Unix必将衰败,或者被其它操作系统挤出市场。可是在今天,化身为Linux、BSD、Solaris、MacOS X以及好几个其它变种的Unix,却显得前所未有的强大。
Robert Metcalf[以太网络的发明者]曾说过:如果将来有什么技术来取代以太网,那么这个取代物的名字还会叫“以太网”。因此以太网是永远不会消亡的(注 )。Unix也多次经历了类似的转变。
—Ken Thompson

至少,Unix的一个核心技术——C语言——已经在其它系统中植根。事实上,如果没有无处不在的C语言这个通用语言,还如何奢谈系统级软件工程。Unix还引入了如今广泛采用的带目录节点的树形文件名字空间以及用于程序间通信的管道机制。
Unix的生命力和适应力委实令人称奇。尽管其它技术如蜉蝣般生生灭灭,计算机性能成千倍增长,语言历经嬗变,业界规范多次变革——然而Unix依然巍然屹立,仍在运行,仍在创造价值,仍然能赢得这个星球上无数最优秀、最聪明的软件技术人员的忠诚。
性能—时间的指数曲线对软件开发过程所引发的结果,就是每过18个月,就有一半的知识会过时。Unix并不承诺让你免遭此劫,只是让你的知识投资更趋稳定。因为不变的东西有很多:语言、系统调用、工具用法——它们积年不变,甚至可以用上数十载。而在其它操作系统中则无法预判什么东西会持久不变,有时候甚至整个操作系统都会被淘汰。在Unix中,持久性知识和短期性知识有着明显的区别,人们在一开始学习的时候,就能提前判断(命中率约有九成)要学的知识属于哪一类。这些便是Unix有众多忠实拥趸的原因。
Unix的稳定和成功在很大程度上归功于它与生俱来的内在优势,归功于Ken Thompson, Dennis Ritchie, Brian Kernighan, Doug McIroy, Rob Pike和其他早期Unix开发者一开始就作出的设计决策。这些决策,连同设计哲学、编程艺术、技术文化一起,从Unix的婴儿期到今天的成长路程中,已经被反复证明是健康可靠的,而Unix才得以有今天的成功。
1.3反对学习Unix文化的理由
Unix的耐用性及其技术文化对于喜爱Unix的人们、以及技术史家来说肯定颇为有趣。但是,Unix的本源用途——作为大中型计算机的通用分时系统,由于受到个人工作站的围剿,正迅速地退出舞台,隐入历史的迷雾之中。因而Unix究竟能否在目前被Microsoft主宰的主流商务桌面市场上取得成功,人们自然也存在着一定的疑问。
外行常常把Unix当作是教学用的玩具或者是黑客的沙盒而不屑一顾。有一本著名的抨击Unix的书——《Unix反对者手册》(Unix Hater's Handbook)[Garfinkel),几乎从Unix诞生时就一直奉行反对路线,将Unix的追随者描写成一群信奉邪教的怪人

和失败者。AT&T、Sun、Novell,以及其他一些大型商业销售商和标准联盟在Unix定位和市场推广方面不断铸下的大错也已经成为经典笑柄。
即使在Unix世界里,Unix的通用性也一直受到怀疑,摇摆在危崖边。在持怀疑态度的外行人眼中,Unix很有用,不会消亡,只是登不了大雅之堂;注定只能是个小众的操作系统。
挫败这些怀疑者的不是别的,正是Linux和其它开源Unix(如现代BSD各个变种)的崛起。Unix文化是如此的有生命力,即使十几年的管理不善也丝毫未箝制它的勃勃生机。现在Unix社区自身已经重新控制了技术和市场,正快速而有效地解决着Unix的问题(第20章将有详述)。
1.4Unix之失
对于一个始于1969年的设计来说,在Unix设计中居然很难找到硬伤,这着实令人称奇。其它的选择不是没有,但是每一个这样的选择同样面临争论,无论是Unix爱好者,还是操作系统设计社群的人们。
Unix文件在字节层次以上再无结构可言。文件删除了就没法恢复。Unix的安全模型公认地太过原始。作业控制有欠精致。命名方式非常混乱。或许拥有文件系统本身就是一个错误。我们将在第20章讨论这些技术问题。
但是,也许Unix最持久的异议恰恰来自Unix哲学的一个特性,这一条特性是X window设计者首先明确提出的。X致力于提供 一套“机制,而不是策略”,以支持一套极端通用的图形操作,从而把使用工具箱和界面的“观感”(策略)推后到应用层。Unix其它系统级的服务也有类似的倾向:行为的最终逻辑被尽可能推后到使用端。Unix用户可以在多种shell中进行选择。而Unix应用程序通常会提供很多的行为选项和令人眼花缭乱的定制功能。
这种倾向也反映出Unix的遗风:原本是为技术人员设计的操作系统;同时也表明设计的信念:最终用户永远比操作系统设计人员更清楚他们究竟需要什么。

贝尔实验室的Dick Hamming 在1950年代便树立了此信条:尽管计算机稀缺昂贵,但是开放式的计算模式,即客户可以为系统写出自己的应用程序,这一点势在必行,因为“用错误的方式解决正确的问题总比用正确的方法解决错误的问题好”。
—Doug McIlroy
然而这种选择机制而不是策略的代价是:当用户“可以”自己设置策略时,他们其实是“必须”自己设置策略。非技术型的终端用户常常会被Unix丰富的选项和接口风格搞得晕头转向,于是转而选择那些伪称能够给他们提供简洁性的操作系统。
只看眼前的话,Unix的这种自由放纵主义风格会让它失去很多非技术型用户。但从长远考虑,最终你会发觉这个“错误”换来至关重要的优势:策略相对短寿,而机制才会长存。现今流行的界面观感常常会变成明日进化的死胡同(去问问那些使用已经过时的X工具包的用户,他们会有一肚子苦水倒给你!)。说来说去,只提供机制不提供方针的哲学能使Unix长久保鲜;而那些被束缚在一套方针或界面风格内的操作系统,也许早就从人们的视线中消失了。
1.5Unix之得
最近Linux爆炸式的发展和Internet技术重要性的渐增,都给我们充足的理由来否定怀疑者的论断。其实,退一步说,就算怀疑者的断言正确,Unix文化也同样值得研习,因为在有些方面,Unix及其外围文化明显比任何竞争对手都出色。
1.5.1开源软件
尽管“开源”这个术语和开源定义(the Open Source Definition)直到1998年才出现,但是自由共享源码的同僚严格复审的开发方式打从Unix诞生起就是其文化最具特色的部分。

最初十年中的AT&T原始Unix,及其后来的主要变种Berkeley Unix,通常都随源代码一起发布。下文要提到的Unix的优势,大多数也由此而来。
1.5.2跨平台可移植性和开放标准
Unix仍是唯一一个在不同种类的计算机、众多厂商、各种专用硬件上提供了一个一致的、文档齐全的应用程序接口(API)的操作系统。Unix也是唯一一个从嵌入式芯片、手持设备到桌面机,从服务器到专门用于数值计算的怪兽级计算机以及数据库后端都腾挪有余的操作系统。
Unix API几乎就可以作为编写真正可移植软件的硬件无关标准。难怪最初IEEE称之为 “可移植操作系统标准”(Portable Operating System Standard)的POS很快就被大家加了后缀变成了“POSIX”[译注:缩写为 POSIX是为了读音更像Unix]。 确实,只有称之为Unix API的等价物才能算是这种标准比较可信的模型。
其它操作系统只提供二进制代码的应用程序,并随其诞生环境的消亡而消亡,而Unix源码却是永生的。至少,永生在数十年不断维护翻修它们的Unix技术文化之中。
1.5.3Internet和万维网
美国国防部将第一版TCP/IP协议栈的开发合同交给一个Unix研发组就是因为考虑到Unix大部分是开放源码。除了TCP/IP之外, Unix也已成为互联网服务提供商 (Internet Service Provider)行业不可或缺的核心技术之一。甚至在1980年代中期 TOPS系列操作系统消亡之际, 大部分互联网服务器(实际上PC以上所有级别的机器)都依赖于Unix。
在Internet市场上,Unix甚至面对Microsoft可怕的行销大锤也毫发无伤。 虽然成型于TOPS-10的TCP/IP标准(互联网的基础) 在理论上可以与Unix分开, 但当应用在其它操作系统上时, 一直都饱受兼容性差、不稳定、bug太多等问题的困扰。实际上,理论和规格说明人人都可以获取, 但是只有Unix世界中你才见得到这些稳固可靠的现实成果。

互联网技术文化和Unix文化在1980年代早期开始汇合,现在已经共生共存,难以分割。万维网的设计——也就是互联网的现代面孔,从其祖先ARPANET所得到的,不比从Unix得到的更多。实际上,统一资源定位符URL(Uniform Resource Locator)作为Web的核心概念,也是Unix中无处不在的统一文件名字空间概念的泛化。要作为一个有效的网络专家,对Unix及其文化的理解绝对是必不可少的。
1.5.4开源社区
伴随早期Unix源码发布而形成的社群从未消亡——在1990年代早期互联网技术的爆炸式发展之后,这个社群新造就了整整一代的使用家用机的狂热黑客。
今天,Unix社区是各种软件开发的强大支持组。 高质量的开源开发工具在Unix世界极为丰富(在本书中我们会讲到很多)。开源的Unix应用程序已经达到、或者超越它们专属同侪的高度。整个Unix操作系统连同完整的工具包、基本的应用套件,都可以在互联网上免费获取。既然能够改编、重用、再造,节省自己90%的工作量,为什么还要从零开始编码呢?
通过协作开发与代码复用路上艰辛的探索,才耕耘出代码共享的传统。不是在理论上,而是通过大量工程实践,才有了这些并非显而易见的设计规则:程序得以形成严丝合缝的工具套装,而不是应景的解决对策。本书的一个主要目的就是阐明这些原则。
今天, 方兴未艾的开源运动给Unix传统注入了新的血液、新的技术方法,同时也带来了新一代年轻而有才华的程序员。包括Linux操作系统以及共生的应用程序如Apache、Mozilla等开源项目已经使Unix传统在主流世界空前亮眼与成功。如今,在争相对未来计算基础设施进行定义的这场竞争中,开源运动似乎已经站在了胜利的边缘——新架构的核心正是运行在互联网上的Unix机器。
1.5.5从头到脚的灵活性
许多操作系统自诩比起Unix来有多么的“现代”,用户界面又是多么的“友好”。它们漂亮外表的背后,却是以貌似精巧实则脆弱狭隘难用的编程接口,把用户和开发者禁锢在单一的界面方针下。在这样的操作系统中,完成设计者(指操作系统)预见的任务

很容易,但如果要完成设计者没有预料到的任务,用户不是无计可施就是痛苦不堪。
相反,Unix具有非常彻底的灵活性。Unix提供众多的程序粘合手段,这意味着Unix基本工具箱的各种组件连纵开合后,将收到单个工具设计者无法想象的功效。
Unix支持多种风格的程序界面(通常也因为给终端用户增加了明显的系统复杂度而被视为Unix的一个缺点),从而增加了它的灵活性;只管简单数据处理的程序而无需背上精巧图形界面的担子。
Unix传统将重点放在尽力使各个程序接口相对小巧、简洁和正交——这也是另一个提高灵活性的方面。整个Unix系统,容易的事还是那么容易,困难的事呢,至少是有可能做到的。
1.5.6Unix Hack之趣
那些夸夸其谈Unix技术优越性的家伙一般不会提到Unix的终极法宝、它赖以成功的原因:Unix Hack的趣味。
一些Unix的玩家有时羞于认同这一点,似乎这会破坏他们的正统形象。但是,确实如此,同Unix打交道,搞开发就是好玩;现在是,且一向如是。
并没有多少操作系统会被人们用“好玩”来描述。实际上,在其它操作系统下搞开发的摩擦和艰辛,就像是有人比喻的“把一头搁浅的死鲸推下海” 一样费力不讨好;或者,最客气的也就是“尚可容忍”、“不是太痛苦”之类形容词。与之成鲜明对比的是,在Unix世界里,操作系统以成就感而不是挫折感来回报人们的努力。Unix下的程序员通常会把Unix当作一个积极有效的帮手,而不是把操作系统当作一个对手还非得用蛮力逼迫它干活。
这一点有着实实在在的重要经济意义。趣味性在Unix早期的历史中开启了一个良性循环。正是因为人们喜爱Unix, 所以编制了更多的程序让它用起来更好, 而如今,连编制一个完整商用产品级的开源Unix操作系统都成了一项爱好。如果想知道这是多么惊人的伟绩,想想看你什么时候听说过谁为了好玩来临摹OS/360或者VAX VMS或者Microsoft Windows就行了。
从设计角度来说,趣味性也绝非无足轻重。对于程序员和开发人员来说,如果完成某项任务所需要付出的努力对他们是个挑战却又恰好还在力所能及的范围内,他们就会觉得很有乐趣。因此,趣味性是一个峰值效率的标志。充满痛苦的开发环境只会浪费劳动力和创造力;这样的环境会在无形之中耗费大量时间、资金,还有机会。
就算Unix在其它各个方面都一无是处,Unix的工程文化仍然值得学习,它使得开发过程充满乐趣。乐趣是一个符号,意味着效能、效率和高产。
1.5.7Unix的经验别处也可适用
在探索开发那些我们如今已经觉得理所当然的操作系统特性的过程中,Unix程序员已经积累了几十年的经验。哪怕是非Unix的程序员也能够从这些经验中获益。好的设计原则和开发方法在Unix上实施相对容易,所以Unix是一个学习这些原则和方法的良好平台。
在其它操作系统下,要做到良好实践通常要相对困难一些,但是尽管如此,Unix文化中的有益经验仍然可以借鉴。多数Unix代码(包括所有的过滤器、主要脚本语言和大多数代码生成器)都可以直接移植到任何只要支持ANSI C的操作系统中(原因在于C语言本身就是Unix的一项发明,而ANSI C程序库表述了相当大一部分的Unix服务)。

[ 本帖最后由 snakeguang 于 2006-2-24 15:11 编辑 ]

snakeguang 发表于 2006-02-24 15:03

第一章完

1.7Unix哲学之一言以蔽之
所有的Unix哲学浓缩为一条铁律,那就是各地编程大师们奉为圭臬的“KISS”原则:

Unix提供了一个应用KISS原则的良好环境。本书的剩余部分将帮助你学习如何应用这个原则。
1.8应用Unix哲学
这些富有哲理的原则决不是模糊笼统的泛泛之谈。在Unix世界中,这些原则都直接来自于实践,并形成了具体的规定,我们已经在上文中阐述了一些。以下列举的只是部分内容:
        只要可行,一切都应该做成与来源和目标无关的过滤器。
        数据流应尽可能文本化(这样可以使用标准工具来查看和过滤)。
        数据库部署和应用协议应尽可能文本化(让人可以阅读和编辑)。
        复杂的前端(用户界面)和后端应该泾渭分明。
        如果可能,用C编写前,先用解释性语言搭建原型。
        当且仅当只用一门语言编程会提高程序复杂度时,混用语言编程才比单一语言编程来得好。
        宽收严发(对接收的东西要包容,对输出的东西要严格)。
        过滤时,不需要丢弃的信息决不丢。
        小就是美。在确保完成任务的基础上,程序功能尽可能少。
在本书的余下部分,我们会看到这些Unix的设计原则及其衍生的设计规则被反复运用于实践。毫不奇怪,这些往往与其它传统中最优秀的软件工程实践思想不谋而合。
1.9态度也要紧
看到该做的就去做——短期来看似乎是多做了,但从长期来看,这才是最佳捷径。如果不能确定什么是对的,那么就只做最少量的工作,确保任务完成就行,至少直到明白什么是对的。

要良好的运用Unix哲学,你就应该不断追求卓越。你必须相信,软件设计是一门技艺,值得你付出所有的智慧、创造力和激情。否则,你的视线就不会超越那些简单、老套的设计和实现;你就会在应该思考的时候急急忙忙跑去编程。你就会在该无情删繁就简的时候反而把问题复杂化——然后你还会反过来奇怪你的代码怎么会那么臃肿、那么难以调试。
要良好地运用Unix哲学,你应该珍惜你的时间决不浪费。一旦某人已经解决了某个问题,就直接拿来利用,不要让骄傲或偏见拽住你又去重做一遍。永远不要蛮干;要多用巧劲,省下力气到需要的时候再用,好钢用在刀刃上。善用工具,尽可能将一切都自动化。
软件设计和实现应该是一门充满快乐的艺术,一种高水平的游戏。如果这种态度对你来说听起来有些荒谬,或者令你隐约感到有些困窘,那么请停下来,想一想,问问自己是不是已经把什么给遗忘了。如果只是为了赚钱或是打发时间,你为什么要搞软件设计而不是别的什么呢?你肯定曾经也认为软件设计值得你付出激情……
要良好地运用Unix哲学,你需要具备(或者找回)这种态度。你需要用心。你需要去游戏。你需要乐于探索。
我们希望你能带着这种态度来阅读本书的其它部分。或者,至少,我们希望本书能帮助你重拾这种态度。

snakeguang 发表于 2006-02-24 15:13

第二章

2
历史——双流记
History: A Tale of Two Cultures
Those who cannot remember the past are condemned to repeat it.
忘记过去的人,注定要重蹈覆辙。
(The Life of Reason) (1905)《理性生活》(1905年)
—George Santayana

前事不忘,后事之师。Unix的历史悠久且丰富多彩,许多内容仍然以坊间传说、猜想,以及(更常见的是)Unix程序员集体记忆中的战争创伤等形式鲜活地留存着。本章我们将通过回顾Unix的历史来阐明如今的Unix文化为什么会呈现当前这种状态。
2.1Unix的起源及历史,1969-1995
小型实验原型系统的后继产品往往备受令人讨厌的“第二版效应”折磨。由于迫切希望把所有首次开发时遗漏的功能都添加进去,往往导致设计十分庞大、过于复杂。其实,还有一个因不常遇到而鲜为人知的“第三版效应”:有时候,在第二系统不堪自身重负而崩溃之后,有可能返璞归真,走上正道。
最初的Unix就是一个第三系统。Unix的祖辈是小而简单的兼容分时系统(CTSS, Compatible Time-Sharing System),也算曾经实施过的分时系统的第一代或者第二代了(取决于不同的定义,具体我们在此不作讨论)。Unix的父辈是颇具开拓性的Multics项目,该项目试图建立一个具备众多功能的“信息功用体/应用工具(information utility)”,能够很漂亮地支持大群用户对大型计算机的交互式分时使用。唉,Multics最后因不堪自身重负而崩溃了。但Unix却正是从它的废墟中破壳而出的。
2.1.1创世纪:1969—1971
Unix于1969年诞生于贝尔实验室的计算机科学家Ken Thompson的头脑中。Thompson曾经是Multics项目的研究人员,饱受当时几乎作为铁律而到处应用的原始批量计算的困扰。然而在六十年代晚期,分时系统还是个新鲜玩意儿。计算机科学家John McCarthy(Lisp语言的发明者 )几乎是在十年前才首次发表了分时系统的构想,而直到Unix诞生前七年的1962年才第一次真正部署使用,因此当时的分时系统尚处实验阶段,像喜怒无常的野兽,性能极不稳定。
那个时代计算机硬件的原始程度,恐怕亲历者现在也很难以记清。那时最强大的机器所拥有的计算能力和内存还不如现在一个普通的手机。 视频显示终端才刚刚起步,六年以后才得到广泛应用。最早分时系统的标准交互设备就是ASR-33电传打字机——一个又慢又响的设备,只能在大卷的黄色纸张上打印大写字母。Unix命令简洁、少说多作的传统正是从ASR-33开始的。
当贝尔实验室(Bell Labs)从Multics研究联盟中退出时,Ken Thompson带着从Multics激发的灵感——如何创建一个文件系统——留了下来。他甚至没能留下一台机器来玩自己编写的“星际旅行”,这是个科幻游戏——模拟驾驶一艘火箭在太阳系中遨游。Unix就在一台废弃的PDP-7小型机 (图2.1)上问世了。这台PDP-7成为了“星际旅行”的游戏平台和Thompson关于操作系统设计思路的试验场。
Unix的完整起源故事可参见,这是从Thompson第一个合作者Dennis Ritchie的角度讲述的。Dennis Ritchie后来以Unix的合作发明者和C语言的发明者而闻名于世。Dennis Ritchie、Doug McIlroy和其他一些同事,已经习惯了Multics环境下的交互计算方式,不愿意放弃这一能力。Thompson的PDP-7操作系统给了他们一条救生绳。

图2.1PDP-7
Ritchie评述道:“我们希望保留的不仅仅是一个良好的编程环境,还包括一种能够形成伙伴关系的系统。经验告诉我们,远程访问(remote-access)和分时系统支持的公用计算,其本质不是用终端机代替打孔机来输入程序,而是鼓励频繁的交流。”计算机不应仅被视为一种逻辑设备而更应视为社群的立足点,这种观念深入人心。ARPANET(现今Internet的直系祖先)也发明于1969年。“伙伴关系”这一旋律将一直鸣奏在Unix的后继历史中。
Thompson 和Ritchie“星际旅行”的实现引起了关注。起先,PDP-7的软件不得不在通用电气公司(GE)的大型机上交叉编译。Thompson和Ritchie为支持游戏开发而在PDP-7上编制的实用程序成了Unix的核心——虽然直到1970年才产生Unix这个名字。最初的缩写是“UNICS”(单路信息与计算服务,Uniplexed Information and Computing Service),Ritchie后来称之为“一个有点反叛Multics味道的双关语”,因为Multics是多路信息与计算服务(MULTiplexed Information and Computing Service)的英文缩写。
即使在最早期,PDP-7 Unix已经拥有现今Unix的诸多共性,提供的编程环境也比当

时读卡式批处理大型机的环境要舒服得多。Unix几乎可以称得上第一个能让程序员直接坐在机器旁,飞快捕获稍纵即逝的灵感,并能一边编写一边测试的系统。Unix的整个发展进程中都能吸引那些不堪忍受其它操作系统局限性的程序员自愿为它进行开发,这也一直是Unix不断拓展其能力的模式。这种模式早在贝尔实验室时就已确立了。
Unix的轻装开发和方法上不拘一格的传统与生俱来。Multics是项庞大的工程,硬件开发出来前必须编写几千页的技术说明书,而第一份跑起来的Unix代码只是在三个人头脑风暴了一把,然后由Ken Thompson花了两天时间来实现罢了——还是在一台破烂机器上完成的,而那个机器本来只作为一台“真正”计算机的图形终端!
Unix的第一功,是1971年为贝尔实验室的专利部门进行“文字处理”的支持工作。首个Unix应用程序是nroff(1)文本格式化程序的前身。这个项目也让他们名正言顺地购买了一台功能强大得多的PDP-11小型机。万幸的是,当时管理层还未意识到Thompson和其同事所编写的字处理系统就快孵化出一个操作系统。贝尔实验室并没有开发操作系统的计划——AT&T加入Multics联盟正是为了避免自行开发一个操作系统。不管怎样,整个系统还是取得了令人振奋的成功。Unix在贝尔实验室计算群落中的重要而永久地位由此确立,并且开创了Unix历史的下一个主旋律——与文档格式化、排版和通讯工具的紧密结合。1972年版的手册宣称装机量达10台。
Doug McIlroy后来这样描述这个时代:“外界的压力和纯粹出于对技艺的荣誉感,促使人们在有了更好更多的初步思路后,去重写或抛开已有的大量代码。从来没听说什么职业竞争和势力范围保护:好东西太多了,没有人需要把这些创新占为己有。”但是直到四分之一世纪后,人们才真正体会到他的话的含义。
2.1.2出埃及记:1971-1980
最初的Unix用汇编语言写成,应用程序用汇编语言和解释型语言B混和编写。B语言的优点在于小巧,能在PDP-7上运行,但是作为系统编程语言还不够强大,所以Dennis Ritchie给它增加了数据类型和结构。C语言从1971年起自B语言进化而来;1973年,Thompson和Ritchie成功地用新语言重写了整个Unix系统。这是一个大胆的举动——那时为了最大程度地利用硬件性能,系统编程都通过汇编器来完成。与此同时,可移植操作系统的概念几乎鲜为人知。1979年,Ritchie终于可以这么写了:“很肯定,Unix的成

功很大程度上源自其以高级语言作为表述方式所带来的可读性、可改性和可移植性”,虽然理想与现实此时尚有一线距离。
1974年在《美国计算机通信》(Communications of the ACM)上发表的一篇论文中第一次公开展示了Unix。文中作者描述了Unix前所未有的简洁设计,并报告了600多例Unix应用——这些都是安装在即便按照那个年代的标准,性能都算很低的机器上,但是(正如Ritchie和Thompson所写)“性能的局限不仅成就了经济性,而且鼓励了设计的简约”。
CACM论文发表后,全球各个研究实验室和大学都嚷着要亲身体验Unix。根据1958年为解决反托拉斯案例达成的和解协议,AT&T(贝尔实验室的母公司)被禁止进入计算机相关的商业领域。所以,Unix不能够成为一种商品。实际上,根据和解协议的规定,贝尔实验室必须将非电话业务的技术许可给任何提出要求的人。Ken Thompson开始默默回应那些请求,将磁带和磁盘一包包地寄送出去——据传说,每包里都有一张字条,写着“love,ken”(爱你的,ken)。
这离个人机出现还有些年。那时候,不仅运行Unix所必须的硬件设备价格超出个人的承受范围,而且也没人敢奢望这种情况会在可预见的未来改变。因此,只有预算充足的大机构才用得起Unix机器:公司、高校、政府机构等。但是,对这些小型机的使用管制要比那些大型机少得多,因此,Unix的发展迅速笼罩了一层反传统文化的氛围。在上世纪70年代早期,最早搞Unix编程的通常都是头发蓬乱的嬉皮士和准嬉皮士们。摆弄操作系统的乐趣对他们来说不仅意味着可以在计算机科学的前沿上纵情挥洒,而且在于可以去推翻伴随“大计算”的所有技术假定和商业实践:卡式打孔机、COBOL、商务套装、IBM批处理大型机都成了看不上眼的过时事物;Unix黑客们沉浸在同时编织未来和编写系统的狂欢中。
那些日子的兴奋从Douglas Comer的话语中可见一斑:“许多大学都对Unix作出过贡献。多伦多大学计算机系发明了200dpi的打印机/绘图仪,并且开发了用打印机模拟照相排版机的软件;耶鲁大学的计算机专家和学生们改进了Unix的shell;普渡大学的电子工程系对Unix的性能作了重要改进,推出了支持大量用户的Unix版本;普渡大学还开发出了最早的Unix计算机网络之一;加州大学伯克利分校的学生开发了新shell和许多小型实用工具。1970年代后期贝尔实验室发布Unix V7版本时,很显然,该系统解决了许多部门的运算问题,也综合了许多高校的创意。最终诞生了一个更强大的系统。思

想潮流开始了新一轮循环,从学术界流向工业实验室,然后又回到学术界,最后流向了不断增加的商业用户。”

1972年在PDP-11旁的Ken(坐)和Dennis(站)
现代Unix程序员公认的第一个完全意义上的Unix是1979年发布的V7版本 。第一代Unix用户群一年前就已形成。此时,Unix用于支撑贝尔系统(Bell System)的所有操作,并且传播到高校中,甚至远至澳大利亚——在那里,John Lions对V6版源码的注释成了Unix内核的第一个正式文档。许多资深的Unix黑客仍然珍藏着一份拷贝。
Lions的书是地下出版界轰动一时的大事。由于侵犯版权等诸如此类的问题,该书不能在美国出版,所以大家就你拷给我、我拷给你。我也有一份拷贝,至少是第六手了。在那个时代,若没有Lions的书,你就当不成内核黑客。
—Ken Arnold

Unix产业也初露端倪。1978年,第一个Unix公司(the Santa Cruz Operation,SCO)成立,同年售出第一个商用C编译器(Whitesmiths)。1980年,西雅图一家还不起眼的软件公司——微软也加入到Unix游戏中,他们把AT&T版本移植到微机上,取名为XENIX来销售。但是微软把Unix作为一个产品的热情并没有持续多久(尽管直到1990年左右,微软的大部分内部开发工作都用的是Unix)。

snakeguang 发表于 2006-02-24 15:18

第二章

2.1.3TCP/IP 和Unix内战:1980-1990
在Unix的发展过程中,加州大学伯克利分校很早就成为唯一最重要的学术热点。伯克利分校早在1974年就开始了对Unix的研究,而Ken Thompson利用1975—1976的年休在此教学,更对Unix的研究注入了强劲活力。1977年,当时还默默无闻的伯克利毕业生Bill Joy管理的实验室发布了第一版BSD。到1980年,伯克利分校成了为这个Unix变种积极作贡献的高校子网的核心。有关伯克利 Unix(包括vi(1)编辑器)的创意和代码不断从伯克利反馈到贝尔实验室。
1980年,国防部高级研究计划局(DARPA,Defense Advanced Research Projects Agency)需要请人在Unix环境下的VAX机上实现全新的TCP/IP协议栈。那时,运行ARPANET的PDP-10已处耆耆之年,而数据设备公司(DEC)可能被迫放弃PDP-10以支持VAX的种种迹象也空穴来风。DARPA曾考虑和DEC公司签订实现TCP/IP的合同,但是因为担心DEC可能不太乐意改动他们的专有VAX/VMS操作系统而打消了这个念头。最后,DARPA选择了伯克利Unix作为平台——显然因为可以毫无阻碍地拿到它的源码。
伯克利计算机科学研究组当时拥有天时地利,还有最强大的开发工具;而DARPA的合同无疑成为Unix历史上自诞生以来最关键的转折点。
在1983年TCP/IP实现随Berkeley4.2版发布之前,Unix对网络的支持一直是最薄弱的。早期的以太网实验不尽人意。贝尔实验室开发了一个难看但还能用的工具UUCP(Unix to Unix Copy Program),可在普通电话线上通过调制解调器来传送软件。 UUCP可以在分布很广的机器之间转发邮件,并且(在1981年Usenet发明后)支持Usenet——一个分布式的电子公告牌系统,允许用户把文本信息传播到任何拥有电话线和Unix系统的机器上。

尽管如此,已经意识到ARPANET光明前景的少数Unix用户感觉自己似乎陷在一潭死水中。没有FTP,没有telnet,只有限制重重的远程作业执行和慢得要死的连接。在TCP/IP诞生之前,Unix和Internet文化尚未融合。Dennis Ritchie将计算机视为“鼓励密切交流”的工具这一设想还只是围绕单机分时系统或同一计算中心的学术社群,并没有扩展到自1970年代中期开始ARPA用户群逐渐形成的一个分布全美的“网络国家”。早期ARPANET的用户对着自己蹩脚的硬件时,也只能想:凑合着用Unix吧。
有了TCP/IP,一切都变了。ARPANET和Unix文化自边缘开始融合,这种发展最终使两者都免遭灭亡。不过,首先还得经过炼狱,起因是两个毫不相干的灾难:微软的兴起和AT&T的拆分。
1981年,微软同IBM就新型IBM PC达成了历史性交易。比尔•盖茨从西雅图计算机产品公司(SCP,Seattle Computer Products)买下了QDOS(Quick and Dirty Operating System)。QDOS是SCP公司的Tim Paterson花六个星期凑出来的CP/M翻版。盖茨对Paterson和SCP公司隐瞒了同IBM的交易,以五万美元的价格买下了所有版权。后来,盖茨又说服了IBM公司允许微软将MS-DOS从硬件中剥离出来单独出售。接下来的十年中,盖茨利用这个非他所写的程序变成了超级亿万富翁,而比首笔交易更加精明的商业策略更是让微软垄断了桌面计算机市场。作为产品的XENIX很快就弃而不用了,最终卖给了SCO公司。
那时,没什么人能看出微软会多么成功(或有多大破坏性)。因为IBM PC-1硬件条件不足以来运行Unix,所以Unix人群几乎没注意这个产品(尽管,具有讽刺意味的是,DOS 2.0光芒能盖过CP/M,主要因为微软的合创者Paul Allen在DOS 2.0中融入了一些Unix的特征,包括子目录和管道等)。还有更有趣的事呢——比如说1982年SUN微系统公司的出世。
SUN微系统公司的创立者Bill Joy、Andreas Bechtolsheim和Vinod Khosla打算制造出一种内置网络功能的Unix梦幻机器。他们综合了斯坦福大学设计的硬件和伯克利分校开发的Unix,取得了辉煌的成功,开创了工作站产业。随着Sun公司越来越像传统商家而不再像一个无拘无束的新公司时,Unix大树上的这根分支源码来源的树枝逐渐枯萎,然而当时并没有人在意这一点。伯克利分校仍然随同源码一起销售BSD。一份System III源码许可证的官方价格为4万美元;贝尔实验室对非法流传贝尔Unix源码磁带的行为睁只眼闭只眼,各个高校也依然同贝尔实验室交换代码,看起来Sun公司对Unix的商业化似乎对它再好不过了。
C语言也在1982年有望被选为Unix世界外的系统编程语言。仅仅只用了五年左右

的时间,C语言就几乎让机器码汇编语言完全失去了作用。到了九十年代早期,C和C++不仅统治了系统编程领域,而且成为应用编程的主流。到九十年代晚期,其他所有传统编译语言实际上都已经过时了。
1983年,在DEC公司取消PDP-10的后继机型的“木星”(Jupiter)开发计划后,运行Unix的VAX机器开始代之成为主流的互联网机器,直到被Sun工作站取代。到1985年,尽管DEC极力抵抗,还是有25%左右的VAX用上了Unix。但是取消木星计划的长期效应并明显。更主要的是,MIT人工智能实验室以PDP-10为中心的黑客文化的消亡激发了Richard StallMan开始编制GNU——一个完全自由的Unix克隆版本。
到1983年,IBM PC可使用不下六种的Unix通用操作系统:uNETix、Venix、Coherent、QNX、Idris和运行在Sritek PC子板上的移植版本。但是System V和BSD版本仍然没有Unix移植——两个群体都悲观地认为8086微处理器不够强大,根本就没打算这么做。IBM PC上的这些Unix通用操作系统无一取得显著的商业成功,但表明了市场迫切需求运行Unix的低价硬件,而主要厂商并不供应。个人用户谁也买不起,更何况源码许可证上还挂着4万美元的价签呢。
1983年,美国司法部在针对AT&T的第二起反托拉斯诉讼中获胜,并拆分了贝尔系统。这时Sun公司(及其效仿者!)已经取得了成功。这次判决将AT&T从1958年的禁止将Unix产品化的和解协议中解脱了出来。AT&T马上忙不迭地将Unix System V商业化——这一举措差点扼杀了Unix。
确实如此。但他们的营销策略却将Unix推向了全球。
—Ken Thompson
大多数Unix支持者都认为AT&T的拆分是个好消息。我们原以为,在拆分后的AT&T、Sun公司及效仿Sun的小公司中,我们看到了一个健康的Unix产业核心——利用基于低廉的68000芯片的工作站——能够挑战并最终打破压迫在计算机行业上的垄断者——IBM。
那时,没有人意识到,Unix的产业化会破坏Unix源码的自由交流,而恰是后者滋养了Unix系统早期的活力。AT&T只知道用保密从软件中获利,只会用集中控制模式开发商业产品,对源码散发严加防护。因为唯恐官司上身,非法交易的Unix源码也越来越乏人问津。来自高校的贡献随之开始枯竭。

更糟的是:刚刚进入Unix市场的几家大公司立马犯下了重大的战略性错误,其中之一就是试图通过产品差异化来寻求有利地位——这个策略导致了各种Unix接口的分歧,它抛弃了Unix的跨平台兼容性,造成了Unix市场分割。
另一个更微妙的错误就是以为个人计算机和微软不关Unix前景的事。Sun微系统公司未能意识到,日用品化的个人机最终会无可避免地动摇其工作站市场的根基。AT&T公司为了成为计算机行业执牛耳者,针对小型机和大型机采取了不同的策略,结果两个摊子都砸了。几家小公司试图在PC机上支持Unix,但都资金不足,仅专注于将产品出售给开发者和工程师,从未关注微软所瞄准的商用和家庭市场。
事实上,AT&T拆分后的数年内,Unix社区却在忙着Unix大战的第一阶段——System V Unix和BSD Unix之间的内部争吵。争吵分成不同的层面,有些属于技术层面(socket对stream,BSD tty对System V termio),有些则属于文化层面。分歧可以大致划分为长发派和短发派。程序员和技术人员往往与伯克利和BSD站在一边,而以商业为目标的人则倾向AT&T和System V。长发派,重唱着十年前Unix早期的主题,喜欢自我标榜为企业帝国的叛逆者,比如一家小公司贴的海报那样,上面画着一个标着“BSD”的X翼星际战机快速飞离巨大的AT&T死星,后者在熊熊烈火中粉身碎骨。就这样,罗马在燃烧,而我们还在拉小提琴。
但是,AT&T拆分当年发生的另一件事对Unix产生了更深远的影响。程序员兼语言学家Larry Wall发明了patch(1)实用程序。Patch程序是一个将diff(1)生成的修改记录(changebar)写入基础文件的简单工具,这意味着Unix开发人员之间可通过传送补丁——代码的渐增变化——进行协作,而不必传送整个代码文件。这一点非常重要,不仅因为补丁要比整个文件小,更因为即使基础文件和补丁制作者拿到的版本之间变化很大,仍然可以很干净地应用补丁。运用这个工具,基于共有源码库的开发流可以分开、并行、最后合拢。patch程序比其它任何单一工具都更能促进Internet上的协作开发——这种方式在1990年后让Unix获得新生。
1985年,Intel的第一枚386芯片下线。它具有用平面地址空间寻址4G内存的能力。笨拙的8086和286的段寻址旋即废弃。这是条大新闻,因为这意味着占据主导地位的Intel家族终于有了一款无需作出痛苦妥协就能运行Unix的微处理器。对Sun公司和其它工作站厂商来说,这真是不祥之兆,可惜它们并未觉察到。

同样在1985年,Richard Stallman发表了GNU宣言(the GNU manifesto) ,并发起了自由软件基金会(Free Software Foundation)。没有谁把他和他的GNU当回事,结果证明这是个大错误。同年,在一项与此不相干的开发行动中,X window系统的创始人发布了X window的源码,而无需版税、约束和授权。这项决策的直接结果就是X window成为不同Unix厂商之间合作的安全中立区,并挫败了专属的竞争对手,成为了Unix的图形引擎。
以调解System V和Berkeley API为目标的严肃的标准化工作始于1983年,产生了/usr/group标准。随之为1985年IEEE支持的POSIX标准。这些标准描述了BSD和SVR3(System V Release 3)调用的交集,综合了伯克利出色的信号处理和作业控制,以及SVR3的终端控制。所有后续的Unix标准其核心都加入了POSIX,后续开发的各种Unix版本也严格遵循这个标准。后来的现代Unix核心API唯一主要的补充就是BSD套接字。
1986年,前面提到的发明patch(1)的Larry Wall开始开发Perl语言,后者是最先也最广泛使用的开源脚本语言。1987年年初,GNU C编译器的第一版问世,到1987年年底,GNU工具包的核心部分——编辑器、编译器、调试器以及其它基本的开发工具——都已就位。同时,X window系统也开始在相对低廉的工作站上露面了。这些因素都为20世纪90年代的Unix开源发展提供了利器。
同样是在1986年,PC技术挣脱了IBM的掌控。IBM仍然试图在产品系列上维持高价格性能比,更青睐高利润的大型机市场,所以在新的PS/2系列产品上拒用386而选择了较弱的286。PS/2系列为了杜绝仿冒而围绕一个专有总线结构进行设计,结果成了代价高昂的大败笔 。最积极进取的效仿者康柏(Compaq),发布了第一款386机器,靠这张牌打败了IBM。虽然主频只有16MHz,但是386也算能跑起来Unix了。这是第一款可以叫Unix机器的PC。
这会儿已经能够想象Stallman的GNU项目可以和386机器配合而制造出Unix工作站,它比当时任何方案都要便宜一个数量级。奇怪的是,没人想到这步棋。来自小型机和工作站世界的大多数Unix程序员,依然鄙视廉价的80x86芯片,而钟情基于68000的高雅设计。尽管许多程序员都为GNU工程做出了贡献,但在Unix人群中,这个GNU

项目仍然被视为一个唐吉诃德式的狂想,短期内还无法实用。
Unix社区从未丢弃叛逆气质。但是回头看来,我们几乎和IBM或者AT&T一样,对迫近我们的未来毫无所知。即使是数年前就开始对专有软件开展精神讨伐的Richard Stallman也未能真正理解Unix的产品化会对其所在社区有多大破坏力;他关心的是更抽象的长期论题。其余的人还一直企盼企业规则能有些精明的变化,从此市场分割、营销不利和战略漂忽不定等问题将不复存在,从而救赎回Unix拆分之前的世界。但是祸不单行。
很多人都知道Ken Olsen(DEC的CEO)在1988年将Unix描绘成“蛇油”(骗人的万灵油)。从1982年起,DEC就一直在销售其开发的用于PDP-11的Unix变种,但真正希望的却是将业务回到自己专有的VMS操作系统上来。DEC和其它小型机厂商碰到了大麻烦,陷入Sun微系统公司和其它工作站厂商功能强劲、价格低廉的机器重重包围中。这些工作站大多运行的是Unix。
但是Unix产业自身的问题却更为严峻。1988年,AT&T持有了Sun公司20%的股份。作为Unix市场领军的这两家公司,终于开始清醒地认识到PC、IBM和微软构成的威胁,也终于认识到过去五年的争斗令他们几无所获。AT&T和Sun的联盟以及以POSIX为核心的技术标准的发展,最终弥合了System V和BSD Unix之间的裂痕。但是,当二线商家(IBM、DEC、HP等)创建开放软件基金会(Open Software Foundation)并结成盟友和以“Unix 国际”为代表的“AT&T/Sun轴心”对抗时,Unix内战的第二阶段开始了。更多回合的Unix与Unix三家的战斗随而爆发。
这段时间中,微软从家庭和小型商用市场赚了数十亿美元的钱,而争战不休的Unix各方却从未决意涉足这些市场。1990年,Windows 3.0——来自微软总部Redmond发布的第一个成功的图形操作系统——巩固了微软的统治地位,为微软在九十年代荡平并最终垄断桌面应用市场创造了条件。
1989年到1993年是Unix的中世纪。当时,似乎Unix社群所有的梦想都破灭了。相互争斗的战事已使专有Unix产业衰落得像个吵闹的肉店,无力振起挑战微软的雄心。大多数Unix编程者青睐的优雅的Motorola芯片也已经输给了Intel丑陋但廉价的处理器。GNU项目没能开发出自由的Unix内核,尽管从1985年GNU就不断作出此承诺,其信用令人质疑。PC技术被无情地商业化了。1970年代的Unix 黑客先锋们人近中年,步履开始蹒跚。硬件便宜了,但Unix还是太贵。我们幡然醒悟:过去的IBM垄断让位于现

在的微软垄断,而微软设计糟糕的软件像浊流一样,围着我们越涨越高。

snakeguang 发表于 2006-02-24 15:20

第二章

2.2.3Linux 和实用主义者的应对:1991—1998
即使在HURD(GNU内核)计划停转之时,新的希望还是出现了。1990年代早期,价廉性优的PC机加上方便快捷的互联网,对寻找机会挑战自我的新生代年轻程序员是极大的诱惑。自由软件基金会编写的用户软件工具包铺平了一条摆脱高成本专有软件开发工具的前进道路。意识服从经济,而不是领导:一些新手加入了RMS的革命运动,高举GPL大旗,另一些人则更认同整体意义上的Unix传统,加入了反对GPL的阵营,但其他大部分人置身事外,一心编码。
Linus Torvalds巧妙地跨越了GPL和反GPL的派别之争。他利用GNU工具包搭起了自创的Linux内核,用GPL的传染性质保护它,但拒绝认同RMS许可协议反映的思想体系计划。Torvalds明确表示他认为自由软件通常更好,但他偶尔也用专有软件。即使在他自己的事业中,他也拒绝成为狂热分子。这一点极大地吸引了大多数黑客,他们虽然早就反感RMS的言辞,但他们的怀疑论一直缺个有影响力或者令人信服的代言人。
Torvalds令人愉快的实用主义及灵活而低调的行事风格,促使黑客文化在1993至1997年间取得了一连串令人惊奇的胜利,不仅仅在技术上的成功,还让围绕Linux操作系统的发行、服务和支持产业有了坚实的开端。结果,他的名望和影响也一飞冲天。Torvalds成为了互联网时代的英雄;到1995年为止,他只用了四年时间就在整个黑客文化界声名显赫,而RMS为此花了十五年,而且他还远远超过了Stallman向外界贩卖“自由软件”的记录。与Torvalds相比,RMS的言辞渐渐显得既刺耳又无力。
1991至1995年间,Linux从概念型的0.1版本内核原型,发展成为能够在性能和特性上均堪媲美专有Unix的操作系统,并且在连续正常工作时间等重要统计数据上打败了这些Unix中的绝大部分。1995年,Linux找到了自己的杀手级应用——开源的web服务器Apache。就像Linux,Apache出众地稳定和高效。很快,运行Apache的Linux机器成了全球ISP平台的首选。约60%的网站选用Apache, 轻松击败了另两个主要的专有型竞争对手。

Torvalds未作的一件事就是提供新的思想体系——一套关于黑客行为的新理论基础或繁衍神话,以及一套吸引黑客文化圈内圈外人士的正面论述,以消弭RMS对知识产权的不友善。1997年,当我试图探寻为什么Linux开发没有在几年前崩溃时,我偶然地填补了这个空白。我所发表论文的技术结论归纳在本书第19章。对于这段历史梗概,只要看看第一条结论核心规则的冲击就够了:“如果有足够多眼睛的关注,所有的bug都无处藏身”。
这段观察暗含了过去四分之一世纪在黑客文化中从未有人敢相信的东西:用这种方法做出的软件,不仅比我们专有竞争者的东西更优雅,而且更可靠、更好用。这个结果出乎意料地向“自由软件”的论述发起了直接挑战,而Torvalds本人从未有意于此。对于大多数黑客和几乎所有的非黑客而言,“用自由软件是因为它运行得更好”轻而易举地盖过了“用自由软件是因为所有软件都该是自由的”。
在我的论文中关于“大教堂”(集权、封闭、受控、保密)和“集市”(分权、公开、精细的同僚复审)两种开发模式的对比成为了新思潮的中心思想。从某种重要意义上来说,这仅仅是对Unix在拆分前根源的回归——McIlroy在1991年阐述了同侪压力如何对1970年代早期Unix的发展产生了积极影响、Dennis Rithchie在1979年对伙伴关系的反思,这是此两者的延续,并与早期ARPANET同侪评审的学术传统及其分布式精神社区的理想主义相得益彰。
1998年初,这种新思潮促使网景公司(Netscape Communications)公布了其Mozilla浏览器的源码。媒体对此事件的关注促成了Linux在华尔街的上市,推动了1999-2001年间科技股的繁荣。事实证明,此事无论对黑客文化的历史还是对Unix的历史都是一个转折点。
2.3开源运动:1998年及之后
到1998年Mozilla源码公布的时候,黑客社区其实算是一个众多派系或部落的松散集合,包括了Richard Stallman的自由软件运动(Free Software Movement)、Linux社区、Perl社区、Apache社区、BSD社区、X开发者、互联网工程工作组(IETF),还有至少一打以上的其它组织。这些派系相互交叠,一个开发者很可能同时隶属两个或更多组织。
一个部落的凝聚力可能来自他们维护的代码库,或是一个或多个有着超凡影响力的领导者,或是一门语言、一个开发工具,或是一个特定的软件许可,或是一种技术标准,

或是基础结构某个部分的管理组织。各派系既论资排辈,也追逐当前的市场份额及认知度。因此,资格最老的大概要算IETF,其历史可以连续追根溯源到1969年ARPANET的发源期;BSD社区尽管市场安装数量要比Linux少得多,但是因为其传统可连续追溯到1970年代末,所以还是拥有相当高的声望;可追溯到1980年代初的Stallman的自由软件运动,无论从历史贡献,还是从作为几个最常用的软件工具维护者的角度,都足以令其跻身高级部落行列。
1995年后,Linux扮演了一个特殊的角色:既是社区内多数软件的统一平台,又是黑客中最被认可的品牌。Linux社区随之显现了兼并其它亚部落的倾向——甚至包括争取并吸纳一些专有Unix相关的黑客派系。整个黑客文化开始凝聚在一个共同目标周围:尽力推动Linux和集市开发模式向前发展。
因为后1980黑客文化已经深深植根于Unix,新目标成了Unix传统争取胜利的不成文纲要。黑客社区的许多高级领导人也都是Unix的老前辈,八十年代分拆后内战的伤痕犹在,他们将Linux作为实现Unix早期叛逆梦想的最后和最大的希望,而汇聚在Linux旗下。
Mozilla源码的公布使各方意见更为集中。1998年3月,为了深入研究共同目标和策略,召开了一次空前的社团重要领导人峰会,与会者几乎代表了所有的主要部落。这次会议为所有派系的共同开发方式确立了一个新标记——开源。
六个月之内,黑客社区中几乎所有部落都接受了用“开源”的新旗帜。IETF和BSD开发组这种老团体更是把他们从过去到现在所作的东西都追加上了这一标记。实际上,到2000年,黑客文化不仅让“开源”这个辞令统一了当前实践和未来计划,而且也对自己的历史重新有了鲜活的认识。
Netscape开放源码的宣告和Linux的新近崛起产生的激励效应远远超越了Unix社区和黑客文化。从1995年开始,所有阻拦在微软Windows滚滚巨轮前的各种平台(MacOS; Amiga; OS/2; DOS; CP/M;较弱小的专有Unix;各类大型机小型机和过时的微型机操作系统)的开发者团结到了Sun微系统公司的Java语言周围。许多不满微软的Windows开发者也加入了Java阵营,希望至少能够和微软保持名义上的独立。但是Sun公司运作Java的几个层面都(我们将在第14章予以讨论)既拙劣又排斥他人。许多Java开发者喜欢

上了开源运动中的新生事物,于是就像此前跟随Netscape加入Java一样,又跟随它加入了Linux和开源运动。
开源行动的积极分子热烈欢迎来自各个领域的移民潮。老一辈Unix人也开始认同新移民的梦想:不能只是被动忍受微软的垄断,而是要从微软手中夺回关键市场。开源社区成员们合力争取主流世界的认同,开始乐于同大公司结盟——这些公司,随着微软的绳索勒得越来越紧,也越来越害怕对自己的业务失去控制。
唯一的例外是Richard Stallman和自由软件运动。“开源”明显要用一个意识形态中性的公众标签来取代Stallman钟爱的“自由软件”。新标签无论对于历史上一贯反对“自由软件”的BSD黑客之类的团体,还是对于不愿在GPL是非之争中表态的人均能接受。Stallman尝试着接受这个术语,但随后又以其未能代表其思想的核心为由而排斥它。从此,自由软件运动坚持同“开源”划清界限,这也许成了2003年黑客文化中最重大的政治分歧。
“开源”背后另一个(也是更重要的)意图是希望将黑客社区的方法以一种更亲和`市场、更少对抗性的方式介绍给外部世界(尤其是主流商用市场)。幸运的是,在这方面,它取得了绝对成功——这也重新激起了人们对其根源——Unix传统——的兴趣。
2.4Unix的历史教训
在Unix历史中,最大的规律就是:距开源越近就越繁荣。任何将Unix专有化的企图,只能陷入停滞和衰败。
回顾过去,我们早该认识到这一点。1984年至今,我们浪费了十年时间才学到这个教训。如果我们日后不思悔改,可能还得大吃苦头。
虽然我们在软件设计这个重要但狭窄的领域比其他人聪明,但这不能使我们摆脱对技术与经济相互作用影响的茫然,而这些就发生在我们的眼皮底下。即使Unix社区中最具洞察力、最具远见卓识的思想家,他们的眼光终究有限。对今后的教训就是:过度依赖任何一种技术或者商业模式都是错误的——相反,保持软件及其设计传统的的灵活性才是长存之道。

另一个教训是:别和低价而灵活的方案较劲。或者,换句话说,低档的硬件只要数量足够,就能爬上性能曲线而最终获胜。经济学家Clayton Christensen称之为“破坏性技术”,他在《创新者窘境》(The Innovator's Dilemma)一书中以磁盘驱动器、蒸汽挖土机和摩托车为例阐明了这种现象的发生。当小型机取代大型机、工作站和服务器取代小型机以及日用Intel机器又取代工作站和服务器时,我们也看到了这种现象。开源运动获得成功正是由于软件的大众化。Unix要繁荣,就必须继续采用吸纳低价而灵活的方案的诀窍,而不是去反对它们。
最后,旧学派的Unix社区因采用了传统的公司组织、财务和市场等命令机制而最终未能实现“职业化”。只有痴迷的“极客”和具有创造力的怪人结成的反叛联盟才能把我们从愚蠢中拯救出来——他们接着教导我们,真正的专业和奉献精神,正是我们在屈服于世俗观念的“合理商业做法”之前的所作所为。
如何在Unix之外的软件技术领域借鉴这些经验教训,就作为一个简单的练习留给读者吧。

L_kernel 发表于 2010-12-28 00:59

2.2.3Linux 和实用主义者的应对:1991—1998
即使在HURD(GNU内核)计划停转之时,新的希望还是出现了。 ...
snakeguang 发表于 2006-02-24 15:20 http://bbs.chinaunix.net/images/common/back.gif


    后面没有啦?看得挺爽的。

unixlinuxsys 发表于 2010-12-28 12:53

如果没有无处不在的C语言这个通用语言,还如何奢谈系统级软件工程
页: [1]
查看完整版本: unix 编程艺术 样章放送之第1/2/3