图灵社区按:
TEAP是什么?TEAP是Turingbook Early Access Program的简称,即早期试读,它公布的是图灵在途新书未经编辑的内容。一本书的翻译周期约为3到6个月,如果在翻译过程中,译者就能与读者进行沟通和交流,对整本书的翻译品质是有帮助的。通过TEAP,读者可以提前阅读将来才能出版的内容,译者也能收获宝贵的反馈意见,改进翻译,提高质量。
本书为《Linux/Unix编程思想》,有问题可以在这里留言,也欢迎大家与我或者编辑联系 ,本篇内容出自书中第11章。

enter image description here

“起初他们忽视你,而后嘲笑你,接着打压你,最后,就是你的胜利之日。” ——甘地

2002年10月1日,当滚石乐队发布专辑“Forty Licks”的时候,每个人都认为这张唱片应该能直接问鼎下一周唱片排行榜的冠军,但它却没能成功,只是屈居第二。滚石的这个故事证实了一个道理,你无法总是得到你想要的东西。这张集合了历史上最伟大摇滚乐队的热门曲目的精选集之所以未能问鼎,是因为广大听众情不自禁地爱上了另一张精选集,它集结的正是伟大歌手猫王Elvis Aaron Presley的热门曲目。这就是2002年9月24日发行的名为“ELV1S 30 #1 Hits”的专辑。

心存疑问的人们可能想知道为什么像猫王这样的老家伙会让滚石乐队无法得偿所愿呢?为什么他们就无法摆脱猫王的阴影呢?为什么是滚石败给了猫王,而不是猫王败给滚石?

答案很简单。滚石乐队的音乐是在“大教堂”里完成的,而猫王的歌曲却是借用了美国音乐“集市”中的种种元素。咦?在你觉得这个说法是如此怪异之前,让我来解释一下吧。也许你会明白为什么在教堂里哭泣的是滚石乐队而不是猫王。

从滚石乐手Mick Jagger和Keith Richards处于音乐生涯的早期巅峰开始,他们就在一起度过了无数个不眠之夜,创作出一首接一首让大家热血沸腾的热门单曲。他们的作品只有摇滚这一种风格,但我们还是很喜欢。Jagger和Richards似乎做不了别的。他们只做了一件事情,可他们完成得很好。

然而,对于他们所具备的创作天赋来说,他们的作品只是一种“闭源”的专有做法。我们几乎很少听到滚石与任何第三方一起创作出来的歌曲。几十匹野马也无法将他们从心中的大教堂里拉出来,去和别人一起开展任何开源的合作。他们可谓是自身NIH综合症的受害者。

然而,猫王的妙处就在于他这种大杂烩的集市化创作方式。他喜欢所有令人热血沸腾的音乐元素,他的歌曲风格包罗万象,从摇滚、蓝调、乡村、福音 、民谣到流行曲调,一切都取决于他当时热爱的是哪一种。他的魅力源自他多变的风格。不管是在大屏幕上还是工作室的麦克风前,或是去参加著名的电视节目Ed Sullivan Show,猫王都是激情四射,愿意表演任何节目。

猫王也是深谙重用之道的大师。在Mick Jagger和Keith Richards忙于创作原创音乐的同时,猫王却正忙着借鉴别人的音乐,并将它们打造成自己的热门单曲。虽然他也可以亲自创作自己表演的歌曲,但他却选择去利用其他音乐制作人的作品。这使得他对整个娱乐世界产生了更大的影响。是的,借助于他的音乐和相关商品的销售,他变得非常富有。但许多人也会从他的这些财富中分一杯羹。这就是真正开源环境中的协作所带来的积极影响,每个人都能从中受益。

猫王死了。愿他的灵魂不朽。

也许有人会说把滚石乐队、猫王与Eric Raymond的著作《大教堂与集市》放在一起来做类比有点儿牵强。毕竟,猫王最近距离接触的集市可能也就是麦克斯韦大道的孟菲斯跳蚤市场。而在大教堂,你最不可能找到的就是那位创作出“Goat’s Head Soup”专辑的人。因此,让我们来看看一个真实的大教堂,或者更确切地说,一种曾经流行于大教堂里的语言:拉丁语。

拉丁语曾经拥有过像今天英语一样的辉煌地位。随着罗马帝国逐步征服世界,从大约公元前250年直到6世纪,拉丁语的使用便一直在稳步地增长。在这段时间里,罗马天主教会宣称只能用拉丁语这一种语言撰写科学、哲学和宗教作品。因此从那时候起,如果想成为引人注目的牧师或学者,你就必须学会说拉丁语。然而,随着罗马帝国的逐渐衰落,外夷蛮族开始入侵,那些入侵者的好战本性使得他们并没有兴趣让自己显得智力超群,他们通常都是按自己的喜好来修改拉丁语。他们加入了自己民族关于杀戮、伤害和掠夺的词语,因为他们认为上帝也赋予了他们征服这门语言的权利。与此同时,祭司和学者却纷纷谴责这种玷污了他们心爱的拉丁语的行径,并进一步向不断缩小的宗教人群宣传捍卫这门语言的重要性,直到它最后归隐在宁静的大教堂里,只有大教堂里面的人们才知道如何使用拉丁语。

另一方面,英语逐渐成为一种国际化语言,这并不是因为它的纯粹性或神圣性,而是因为它的适应性。它兼容并包,几乎所有的外来词或概念都能纳入日常的使用。迄今为止,它比世界上任何一门其他的语言都更具备与不同文化对接的能力,而且它做的事情就是连接。在这种我们称之为“生活”的集市中,集合了各种自然多样性,其中这里采用英语的国家是最多的,这主要归功于它连接万物的能力。

这也正是OSS(开源软件)能够得以蓬勃发展的原因。任何人都能以任意的方式将它们与各种事物连接在一起。这源自它的开放性:开放的标准、开放的协议、开放的文件格式和开放的一切。OSS世界里,没有什么事物能够隐藏。这种开放性使得软件开发人员能看到他们的前任是如何处理事情的。如果喜欢之前的做法,他们大可沿用,这很棒。他们因此也能找到有用的工具并节省宝贵时间。如果不喜欢,他们也大可以挥洒自如地查看过去的错误并将它们改进。

同时,那些在“大教堂”里面忙着开发“高级”软件的开发人员最终却只能眼睁睁地看着他们的市场被开源世界的开发人员占据。为什么呢?因为这种教堂式的软件开发人员只会为同在“大教堂”里的人们开发软件。不管这个“大教堂”是一个公司、社区还是国家,可迟早这些软件必须要与大教堂之外的软件进行交互,否则就只有死路一条。

Unix哲学的拥护者,特别是今天的Linux开发人员,敏锐地意识到这一点。例如,与Windows系统共享混合环境的Linux系统会运行Samba,也就是一种与Windows SMB网络服务兼容的文件共享应用程序。具有讽刺意味的是,根据基准测试的结果,Linux的表现实际上要优于运行Windows SMB网络服务的微软Windows 2000系统 。 大多数Linux发行版都能够访问位于其他磁盘分区上的Windows文件系统。那反过来呢?Windows能够访问位于其他分区的Linux文件系统吗?Windows却做不到这一点。作为闭源的专有系统,它就像一只常年将头埋在沙子里的鸵鸟一样,只是假装世界上根本就不存在其他的文件系统。

到现在为止,你可能感受到了OSS和遵循Unix哲学的软件之间的一些共通之处。与那些大型“企工业级”(像一些人所认为的)闭源的专用软件相比,OSS的许多作品看起来确实只是些“小儿科”。毕竟,这些作品通常都是由一些个人独自开发的,至少在它们的初期阶段是这样。因此,在早期这些作品只是一些典型的小项目,它们虽然缺乏利于市场营销的闪光点,却拥有扎扎实实的功能。不过没关系。请记住在Unix的世界里,小即是美。

Eric Raymond称这些作品为“挠到程序员痒处”的软件。这似乎是许多OSS开发人员的共同目标,他们只是希望编写出他们喜欢的程序。因为日常工作的压力,他们往往是“背水一战”,所以没有太多时间去完成那些花里胡哨的功能。因此,他们通常都会忽略掉那些营销人员最爱的、华而不实的“闪光点”,他们注重的是只做好一件事情,这便意味着他们的作品是精干实用的应用程序,并确实能够解决个人的需求。在那些成功的案例中,这些最基本、最行之有效的解决方案可以激发人们的想象力。这正是热门OSS应用程序诞生的典型过程。

一旦点燃了想象力的火花,OSS开发社区的其他成员就会开始行动,来为这个方案贡献自己的力量。起初,这个程序会吸引为数不多却很忠实的追随者。然后,该软件最终焕发蓬勃的生机,开始超越它最初的设想。在此期间,数十名程序员会把这个“第一个系统”演变成为一个更大更具包容性的“第二个系统”。在撰写本文时,Linux本身就处于“第二个系统”的阶段。它正在享受自己的快乐时光。

显然,如果有人想将这种个人独自开发的OSS项目发扬光大,成为风靡一时的软件热潮,那他就必须尽早建立一个原型。仅仅对软件的伟大想法夸夸其谈是远远不够的。在开源的世界里,最受人们尊敬的是那些编写软件最初版本的原创者,以及在后来作出重大贡献的人士 。

如果想要吸引尽可能多的用户,OSS项目就必须提供适用于多平台的解决方案。因此好的OSS开发人员就会舍高效率而取可移植性。利用特定计算机上特定硬件功能优势的软件走不了太远,追随者充其量也不过是那些使用着相同硬件平台的人们。通过从封闭式专有架构走向开放的架构,程序就可以尽可能地出现在更多的平台上,从而最大限度地拓展自己的市场潜力。

让我们来看一下微软的IE浏览器和它在开源世界的竞争对手Mozilla。在撰写本文时,IE占据的市场份额要高于Mozilla,最主要的原因在于它是微软Windows平台上的主导浏览器,并且Windows目前占据着台式机市场的最大份额。另一方面,Mozilla能够运行在Windows和几乎所有的Linux和Unix平台上。随着用户开始冷静地对待IE的市场炒作,他们慢慢会发现Mozilla是一个非常好用的浏览器,越来越多的人开始选用Mozilla。与此同时,在除Windows之外的平台上,IE浏览器的安装用户群并没有什么大的增长,因为它缺乏可移植性,人们很难轻松地将它移植到其他的系统。如果Mozilla能够成功地吸引到一半安装Windows的用户群的一半,那么它就能赢得这场比赛。任何能够获得一半Windows用户群青睐的可移植浏览器,都会吸引到Linux用户群中的大多数人。

为了使OSS和接口能够方便地移植到其他的平台,采用纯文本文件来存储数据将大有裨益。这种开放性使得全世界的人可以查看这些文件格式,鼓励人们就其中内容展开有益的辩论。这场辩论最终会形成一种能够为数据传输和存储所用的开放标准,人们使用它们的广泛程度要远超闭源的专有标准。

OpenOffice.org团队的做法是很能体现这种思路的绝佳例子。他们的文件格式采用了XML,这是一个很好的选择。XML是HTML格式的扩展集,它是一种Web浏览器使用的语言,用来显示文字、表格等内容。XML文件可以算作是一种纯文本文件,因为人们可以用如Vi或Windows记事本的一般文字编辑器(而不是文字处理软件)来编辑它。作为一个行业标准,它也许是结构化交互式操作数据的最佳选择,不单能作为纯文本文件来使用,也能为纯网络消息所用。毫无疑问,这个格式会随着时间的推移而进化。随着越来越多的人关注这些数据文件,格式中的错误和遗漏将无处可藏。这会使得该文件格式得到加强和改进,比起任何现有的闭源文件存储格式,它的表现将会更好。

OpenOffice.org采用纯文本文件当然不是什么新鲜事。在现实世界中,办公环境里一直在使用纯文本。商业信函通常是由那些20磅的10号白色信封来传递的。这些档案具有以下特点。

  • 便携性:信封可在办公大楼里或世界各地发送。可扩展机制能够将它们从一个地方转移到另一个地方,并在个体和群体之间传递。

  • 易于获取:任何人都可以打开这个信封。你并不需要从专门的供应商那里花高价去购买特殊的专有工具来浏览里面的内容。

  • 可供搜索:文件可以加上索引,收件人可以根据自己的需要将文件按照不同机制归类在不同的档案柜里。人们还能够采用随机存取或连续存取的方式得到这些文件。人们可以搜索整个文本内容,尽管速度会有些慢。

  • 强大的适应性:在今天或是未来,文件被存储和检索的次数能够达到数千次。人们完全不需要去升级自己的办公处理方式来阅读最新的文件,或是安装旧版本以查看十年前的旧文档。

是的,我们并没有建议你放弃电脑,重新去使用纸张。纸张仍然是一份为数据开具的死亡证书,其中的理由我在本书的其他地方提到过。然而,数据还面临另外一种死亡威胁:闭源的专有文件格式。当存储的数据采用的是由单一供应商所拥有的,而且是一种人类不可读的文件格式,那么这些数据就存在着巨大的风险,正如秘鲁国会议员Edgar David Villanueva Nuñez博士在一封发送给微软的信件中指出的那样。

专有系统和格式的使用都会使得整个国家更为依赖某那些特定的供应商。一旦国家确立了一个使用自由软件的政策(当然,使用自由软件还是需要付一些费用的),从一个系统迁移到另一个系统反而会变得更加简单,因为所有的数据都是采用开放格式来存储的。

开源软件需要开放的数据格式。

在OSS开发人员发布那些供公众使用的软件时,他们利用了软件的杠杆效应。这种杠杆效应是双向的。首先,开发人员可以在自己的作品中使用其他OSS项目的代码。这样可以节省整体的开发时间,并有助于降低开发成本。其次,发布给全世界的优质OSS通常也会吸引到其他的开发人员,他们可以利用这个软件来完成自己的工作,其中的一些作品最终可能会找到一种回归到原始作品的方式。所谓“赠人玫瑰,手有余香”。

有一种做法能够增加OSS项目成功的几率:使用脚本来提高杠杆效应和可移植性。虽然软件世界里有很多核心的底层编码人员,可越来越多的人没有时间或无法尽情地为底层工作。通过为给一两个流行的脚本语言提供接口,这会显著地增强软件的可用性。

如果这些接口能够拥有足够的流行程度的话,它们就会成为OSS社区里的重要子社区。这些子社区致力于让人们体验并拓展这些接口。他们会定期召开用户组会议和研讨会,并且在网上邮件列表里发布文章,通常它会成为社区中心,基本上大多数围绕着这个流行接口而展开的活动都是由这个中心来召集。

开源社区里有两个这样的例子,Perl社区和CVS(Concurrent Versions System,一种版本控制系统)社区。在OSS社区内, CVS吸引了不少人。因为几乎所有的CVS命令都可以在脚本中使用,于是就出现了众多工具和插件,它们通过新颖的、有趣的方式与CVS命令相结合。CVS的原作者肯定没有预料到人们能够开发出这些奇妙的用途。

CVS特意避免了CUI的使用。只要传递的参数正确,每一条CVS命令都可以在命令行中运行。这催生出了更多的CVS插件。以基本的CVS命令如checkout、update和commit为基础,构建那些为提高CVS性能而开发的集成性工具。众多使用这些命令的插件通常都拥有CUI,但基本的CVS命令却没有。这正是CVS得以蓬勃发展的主要原因之一。

作为开源的脚本工具,Perl曾因晦涩难用而恶评如潮。它的功能比普通的Unix脚本如Bourne和Korn Shell还要强大,非常善于与其他软件交互。几乎所有的Perl程序都能充当过滤器。事实上,它的全称Practical Extraction and Report Language(实用性摘录与报告语言)就恰恰说明了Perl的设计开发宗旨。当一个程序从某个地方提取、修改并报告信息(即它的“输出结果”)的时候,它充当的正是过滤器的角色。 因为它的可扩展性,所以Perl的接受程度也在与日俱增。在这门极其不好用的语言中,黑客们(指的是这个词的褒义方面)仿佛找到了一片名副其实的乐土,他们尽情地添加代码库文件,以让它适应各种各样的情况。今天,你可以找到能够处理各种事物的Perl模块,从复杂的数学内容、数据库开发到为万维网所用的CGI脚本。

这一点儿都不奇怪,可以说Perl是关于Unix哲学中那条次要准则“更坏就是更好”的绝佳例子——它完美地诠释了为什么一个不够好的应用(如Perl)反而比那些足够好的应用(如Smalltalk)有着更高的生存几率。几乎没人会否认Perl是一门古怪的有着可怕语法的编程语言,而且谁也都没有想到Perl会大获成功。 读到这里,你应该不难发现,OSS往往遵循着Unix哲学。OSS很适合这种早期Unix开发人员悉心呵护的“集市”式开发模式,而今天的Linux开发人员也都早已全面接受这一风格。不过有别于Unix哲学更加侧重设计方法的特点,开源社区中很多令人信服的作品却表明他们更注重软件的开发过程。用一句老话来形容,Unix哲学与开源开发模式的结合有如天作之合,互相促进,相得益彰。

开源社区已取得过的另外一个重大进展的领域便是市场营销。在当今竞争激烈的计算世界中,推出拥有良好设计原则的高质量软件是不够的。开发者必须大声地向全世界宣告自己的成就。“酒香不怕巷子深”是行不通的,如果无人知晓,就算产品再好也没有什么用。它会逐渐消失或默默无闻地湮灭,就像是一件多年不见天日的珍宝那样。

由于缺乏扎实的营销策略,许多优秀的Unix程序已经消失得无影无踪。如果我记忆超群的话,我说不定能说出几个程序的名字。明白我的言外之意了吧?

微软也许比任何其他公司都更理解营销策略的价值所在。这也正是为什么这家公司一直都很成功的主要原因。微软已经推出了很多个热门应用,但它最强的地方在于有能力说服大家相信它的软件是这个星球上最好的产品,而不管实际的质量究竟如何。

对于微软的软件,我最不喜欢的一点就是,那是在一个封闭的大教堂式的开发环境中产生的。微软拥有一些非常有才华的人,他们编写了一些很优秀的软件。但在全球的技术创新方面,微软并不是一枝独秀。这个世界上还有很多优秀的人才,他们不是为微软工作,也同样编写了一些非常好的软件。因为它的大教堂开发风格,所以微软的开发人员基本都“与世隔绝”将自己与其他人分隔开来。他们无法充分利用软件的杠杆效应,因为没有任何可以和其他人分享的东西,反过来别人也无法改善他们的软件来作为分享的回报。因此,大多数Windows操作系统的创新工作都是由微软内部的开发人员来完成的,于是这也就被他们的开发视野所限制了。另一方面,开源社区的开发人员则可以从更大规模的开源社区去吸取好的想法。纯粹论规模的话,开源社区完胜微软这种单一的内部开发社区。尽管微软有着高超的营销技巧,可这改变不了它的衰败命运。

在我撰写本书时,Linux开发社区(据说它已经拥有了超过一百万的开发人员)已开始进军桌面环境领域,长期以来这被视作是微软的大本营,并且大家都认为任何外部人员都难以逾越微软在这个方面的成就。可就在短短的18个月里,Gnome的开发人员(Linux上流行的一个类似于Windows的应用环境)却将Linux从一个只具有Unix命令行的用户界面平台转变成了与Window 95功能相当的环境。要知道微软可是花了五年多才完成了这种从MS-DOS到Windows 3.1再到Windows 95的转变。

我们无法想像微软如何才能跟上这种创新的速度,这样的表现简直无人能敌。KDE社区的规模甚至可能比Gnome社区的规模还要大,它早已证明自己相当有能力去创造出具备商业品质的桌面环境软件。除非微软能够重新改变自己的开发模式,否则它的Windows操作系统早晚会成为下一个OpenVMS。(OpenVMS是典型的优秀小团队开发优秀大型软件的例子。)

微软曾经漠视已经忽略了Linux和开源社区近十年。然后,他们却突然开始嘲笑Linux,声称这只是“一个服务器系统”,并不适合作为桌面环境来使用。现在,微软已经孤注一掷地投入到桌面领域的战争,而KDE的拥趸们却占据了上风。

甘地是对的吗?这将由市场来决定。

在结束本章之前,我想讨论一个问题,这个问题自2001年9月11日美国世贸中心和五角大楼遭受恐怖分子袭击以来一直萦绕在每个人心目中,而且也是后现代生活和计算机世界的重要方面,那就是:安全。

自那一天开始,安全问题以这样或那样的方式驻留在每个人的脑海中。这种共通的安全意识也已经“植入”进计算机科学家的头脑。也许,Unix哲学和开源以一种奇特的方式掌握着解决此问题的关键。

在信息安全和加密技术的世界里,有些人坚持认为想要提供最高级别的安全性,开发人员就必须隐藏一切,这是未雨绸缪的行为。早期Unix开发人员的做法却与此大相径庭。他们并没有隐藏用来加密的密码数据和算法,而是选择对所有人公开所有的信息。任何人都可以自由地尝试破解Unix的加密算法,而且还能够得到所有相关的工具。在共享的精神作用下,这些找到破解Unix口令文件的人会把他们的解决方案提交给最初的开发者,这些开发者就可以在未来版本中纳入这些加密算法的解决方案。多年来,人们反复地尝试去破解Unix的密码机制,其中有一些尝试颇为成功,这使得Unix逐渐成长为更安全的系统。如果没有别人的帮助,单凭最初的开发人员可无法达到这样的效果。

同时,那些试图通过封闭源代码来确保安全性的系统却一败涂地。比如像微软这样将自己的源代码看得死死的公司,就只能对Windows NT系统的安全漏洞采取亡羊补牢的方式。

从某种意义上说,安全是一种数字游戏,闭源系统的胜算非常小。这个世界每出现一个恶意黑客(坏家伙),对应也会有大概100倍甚至1 000倍之多的白客。问题是,闭源的公司只负担得起雇用其中10个白客来看管他们的专有源代码。而与此同时,在开源的世界里,比坏人多1 000倍的白客却都可以查看源代码来解决安全问题。闭源的公司,不管有多大,愿意花多少钱,能够雇用的白客数量也远远比不上开源社区里白客的数量。

开源软件与闭源专有软件的比较中蕴含着深刻的道理。有这么多人盯着OSS的安全机制,OSS最终会证明这两个系统里面哪一个才是更为安全的系统。此外,随着个人、公司和国家越来越了解信息安全工作中对软件进行审核的重要性,很明显,唯一值得信赖的安全软件就是那款你拥有源代码的软件。

在某些时候,每个人都得自行决定是否要信任那些维护信息安全的软件生产商。对软件供应商,每个人都有着自己在道德和伦理上的批判标准。我们能够完全充分信任那个供应商吗?当你的财务状况、信誉、个体或国家安全受到威胁时,唯一可以接受的解决方案就是可以逐行验证代码的软件。

我们生活的世界里同时拥有开放和封闭的社会。封闭社会的运作模式就像是“大教堂”式的开发环境,源代码被层层封装,并且只能由少数拥有特权的人来决定哪些该留下、哪些该舍弃。在这样的社会里,新观念的传播极其缓慢。有效安全机制的开发节奏跟不上层出不穷的新威胁,新机制的开发周期可能需要数年。

这个世界的开放性社会看起来就像OSS社区一样杂乱无章,但里面也充满了各种天马行空的想象。开源社区的人们非常具有创造力,关于新技术尤其是安全技术的想法层出不穷。开放性社会能够迅速提出创新想法,确保在短时间内解除各种威胁。就像Unix密码算法的开发人员一样,让系统处于易于攻击的状态反而最终会成就最高级别的安全水准。