大教堂与集市:一本不管你是不是键盘侠都该读的软件行业圣经

jopen 10年前

  http://www.huxiu.com/article/106397/1.html

“如果你有正确的态度,有趣的事情自然会找到你”,这是Eric在“大教堂与集市”一文中给出的一条经验。Eric S.Raymond在开源运动和黑客文化中有着很高的地位,可能是迄今为止最有名的黑客,一个更正式的头衔则是:互联网黑客的观察者/参与者人类学家。

作为黑客文化的第一理论家,他极力为“黑客”(hacker)一词正名,强调“黑客”并不是媒体报道中的计算机违法分子,而是那种着迷 于计算机技术并通过编程提供极具价值软件的人。《大教堂与集市》是他长期观察和研究行业后撰写的软件工程方法论,这本书首版于1999年,被软件从业者奉 为“圣经”。

而今天,不仅仅是程序猿,当“开源运动正积极投身于定义21世纪的计算基础设施,任何一个对计算机有所依赖的人,都很有必要去理解它。”

以下书摘节选自《大教堂与集市》,有删减

前言

你手头这本书是关于黑客行为和文化的,本书收集了一系列文章,最早是写给程序员和技术管理人员的,你可能很自然(并且再正常不过)要 问:“我为什么要关心这些?”最显而易见的答案是:计算机软件在世界经济和商业战略决策中扮演着越来越重要的角色。不管你是由于什么原因打开这本书,大概 你对那些关于信息经济、数据时代、互联世界的说法都听得太多了,我不想在这里复述那些。我只是想说,如果我们能对如何编写更优质、更稳定的软件有更深入一 点的认识,都将会产生滚雪球般的深远影响。

本书并没有给出基础理论上的创新,只是描述了这样的事实:开源软件系统性地利用开放式开发和分布式同行评审(peer review),不仅降低了成本,还提高了软件质量。开源软件并不是一个新概念(这种文化可以追溯到30年前互联网刚诞生的时候),但直到最近,才在技术 和市场的合力下,从小众的圈子中走了出来。今天,开源运动正积极投身于定义21世纪的计算基础设施,任何一个对计算机有所依赖的人,都很有必要去理解它。

我之所以提到“开源运动”,是因为它有着其他更有意思的原因值得读者关注。30多年来,互联网原生的一群充满活力的倡议者团体,一直在 追求、实现并珍爱着开源思想。这些人以自称“黑客”为荣,这里所说的“黑客”并非是记者们滥用的电脑犯罪分子的代称,而是指对某种事物的狂热爱好者、艺术 家、古怪的天才发明家、问题解决高手和技术专家。

数十年来,默默无闻的黑客团体不仅要奋力解决技术难题,还要忍受来自于社会主流的冷漠和排斥,直到最近他们才迎来了自己的春天。他们创 建了互联网、创建了UNIX、创建了WWW,他们还正在创建Linux和开源软件,经历上世纪90年代中期互联网爆炸式的发展后,人们才终于明白这个世界 原本早该好好对待黑客们。

黑客文化及其所取得的成功,对于研究人类动机、工作组织方式、专业主义的未来、公司形态等一些基础性问题,以及这些内容在21世纪信息 充裕的后稀缺经济时代中如何变化和演进,都提供了一个很好的研究范例。此外,黑客文化还颇具说服力地预示了人类在适应和重塑经济环境方面将会发生的一些深 刻变革,因此,对任何一个要在未来工作和生活的人,懂一些黑客文化都是很有意义的。

这本书是我早前发布在互联网上的一些文章的合集,“黑客圈简史”最早写于1992年,此后多次被更新和修订,其他文章写于1997年2 月至1999年5月间,在1999年10月做了一些修改和补充,并在2001年1月本书第二版修订时又做了一次更新,但并没有删掉其中比较技术化的部分或 者让文章变得更通俗易懂一些。在我看来,能让读者产生一些疑问和思索,比起让读者感觉厌烦或者被低估智商更有礼貌。如果你在文中遇到一些特定的技术话题、 历史典故或者偏僻的计算机术语缩写,尽管跳过去好了,整本书是在讲一个故事,读到后面的时候,也许你就理解了前面没弄明白的地方。

精彩书摘

第二章大教堂与集市

Linux有一套令人吃惊的软件工程理论,fetch-mail作为一个专门对这些理论进行实验的开源项目,所取得的成功让我感到惊 讶。我将在本文讨论这些理论,并对比两种完全不同的开发模式:绝大多数商业公司所采用的“大教堂”模式和Linux世界采用的“集市”模式。两种模式的根 本不同点在于他们对软件排错有着完全对立的认识。我从Linux的经验出发,证实了这样一个命题:“只要眼睛多,bug容易捉。”这和那些由利己个体组成 的自纠错系统有着异曲同工之妙。在本文的最后,我探讨了在这种观念的影响下,软件可能拥有的未来。

2.1 集市模式的成功

Linux是颠覆性的,就在5年前(1991年),谁能想到,几千名散布在全球各地的开发者们,利用业余时间,仅仅是通过 Internet这种脆弱的合作,就鬼斧神工般地造就了一个世界级的操作系统?我肯定想不到。在1993年初Linux进入我视野的时候,我已经在 UNIX和开源领域有10年开发经验了。我是20世纪80年代中期GNU最早的贡献者之一,当时我已经在网上发布了一些开源软件,而且还正在开发或者与人 合作开发一些程序(如nethack、Emacs的VC和GUD模式、xlife等),这些程序直到现在仍然被广泛使用着,我想我懂这个。

Linux推翻了很多我以为我懂的东西,多年以来,我一直在宣扬“小工 具”、“快速原型法”以及“演化式编程”等UNIX信条。但我也相信, 如果超过了一定的复杂度,更集中式的管理和更严格的流程是有必要的。 我相信大多数重要软件(操作系统和真正大型工具如Emacs编辑器)需要 像建造大教堂那样,在与世隔绝的环境下,由天才式专家或几个行家里手 精心打造,不成熟时绝不发布beta测试版。

Linus Torvalds的开发风格是:早发布、常发布、委托所有能委托的事、开 放到几乎是混乱的程度,这些都令人感到惊讶不已。在Linux社区里,没 有建筑大教堂那样的安静和虔诚,倒更像是一个乱糟糟的大集市,充满了 各种不同的计划和方法(Linux的文件服务器就是个很好的例子,这里可 以接受任何人的代码和文档提交),而既稳定又一致的一个操作系统就这 么诞生了,这真是奇迹中的奇迹。

而事实上,集市模式真的管用,而且非常管用,这让所有人震惊。我开始 以自己的方式去了解这种模式,除了在我的个人项目中努力探索外,我也 试着去理解为什么Linux世界没有在混乱中四分五裂,反而以大教堂建筑 者们难以想象的速度变得越来越强大。

1996年年中,我慢慢开始理解了,而且有幸拥有了一个可以测试我的理论 的机会,这个机会使我可以有意识地在集市模式下尝试一个开源项目,我 这么做了,更有意义的是,它成功了。

我要讲述的就是这个项目的故事,通过这个故事,我将引出一些在开源开 发中很有用的格言警句。虽然对我来说,这些不都是从Linux中学到的, 但我们可以看看Linux是怎样淋漓尽致地运用这些理论。如果我是对的, 这些格言警句会帮助你准确地理解到底是什么让Linux社区能够源源不断 地产生这么多好软件,而且,也许这些格言还能帮助你成为一个富有成效 的人。

2.2 邮件必达

“切斯特互联”(Chester County InterLink,CCIL)位于美国宾夕法尼亚州 (Pennsylvania)的西切斯特郡(West Chester),是一家小型的免费互 联网服务提供商。1993年以来,作为联合创始人,我曾一直负责CCIL的 技术部分,并编写了我们独创的多用户论坛程序——你可以通过telnet连 到locke.ccil.org来试试看。时至今日,这个程序通过三十多条线路支持近 三千名用户访问。这份工作使我能够使用CCIL的56K线路保持每天24小时 连在网络上,当然,这是工作需要!

我已经习惯了使用电子邮件,但每过一会儿就telnet到locke上查一下邮 件,是一件比较烦人的事。我很希望邮件能够自动地递送到snark(我家 里的机器)上,这样,邮件来的时候就会通知我,然后我就能用本地工具 来处理它。

互联网原生的邮件转发协议SMTP(Simple Mail Transfer Protocol,简单邮 件传输协议)并不适用,因为它最适用于机器一直在线的情况,而我家 里的机器并不总是在线,而且也没有一个静态IP地址。我需要这样一个程 序,它可以在我时断时续的拨号上网期间,把我的邮件取到本地。我知道 有这种软件,它们大多使用了应用层协议POP(Post Office Protocol,邮局 协议)。现在绝大多数常见邮件客户端都支持POP,但在那个年代,我所 用的邮件阅读器并不支持。

看来我需要一个POP3客户端。于是我便到网上找了一个(事实上我找到 了三四个),使用了一段时间后,我发现它有个明显的缺陷:它不能正确 地解析取回邮件的邮箱地址,导致我不能正确回复。

问题是这样的:比如locke上有个叫joe的人给我写信,我把信取到snark上 并试图回复时,邮件程序会傻乎乎地想把它发给snark上并不存在的joe。 所以我不得不每次把回复邮件地址修改为@ccil.org的样子,这实在有点痛 苦。

很明显这种事应该由计算机搞定,但没有任何一个现成的POP客户端能做 到这点!这给我们上了第一课:

  1. 好的软件作品,往往源自于开发者的个人需要。

按说这是显而易见的(正如老话说“需要是发明之母”),但太多的软件 开发人员并不需要也不热爱他们正在开发的软件,他们把编程当差事,为 的只是拿薪酬。Linux世界里可不是这样——也许这可以解释为什么Linux 社区里原创软件的平均质量是如此之高。

那么,我是不是应该立即投入到疯狂的编程中,做出一个全新的POP3客 户端和其他程序一较高下?千万不要!我把手头的POP程序看来看去,认 真思索“哪个最接近我想要的”,因为:

2. 优秀的程序员知道写什么,卓越的程序员知道改写(和重用)什么。

我不敢说自己是卓越的程序员,我只是模仿他们。卓越程序员们有个很重 要的特征是“建设性懒惰”,他们知道人们要的是结果而不是勤奋,而从 一个部分可行的方案开始,明显要比从零开始容易得多。

以Linus Torvalds为例,他并没有尝试从零开始写Linux,而是以重用Minix (一个用于PC机的迷你型UNIX类操作系统)的代码和理念作为开始,虽 然Linux中所有Minix代码最终都被移除或重写,但它在Linux成长初期确实 起到了类似脚手架的作用。

基于同样的理念,我试图找到一些代码写得还不错的POP程序,作为我开发的基础。

UNIX世界共享源代码的传统使得代码重用变得很便利(这正是GNU选择 UNIX作为基础OS的原因,且不论它对UNIX本身的保留意见),Linux世 界则把这个传统发挥到了技术上的极限。相比其他地方,从Linux世界多 达数T字节的开放源码中,找到一些他人写的“足够好”的代码要可行得多。

不出意外,连同上次找到的,我一共找到九个备选程序:fetchpop、 PopTart、 get-mail、gwpop、pimp、pop-perl、popc、popmail和upop。 我首先选择了Seung-Hong Oh写的fetchpop。我给程序加上了“邮件头重 写”功能,并做了一些其他改进,这些改进被作者接受并在1.9版本中发布。

几周以后,我偶然发现了Carl Harris写的popclient代码,同时带来的是一 个难题:尽管fetchpop有一些很好的创意(比如使用后台进程模式),但 只能处理POP3协议,代码也略显业余(Seung-Hong Oh在那时是个聪明但 缺乏经验的程序员,这两点都看得出来)。Carl Harris的代码要好一些, 专业而稳健,但缺乏fetchpop中一些重要而精巧的特性(包括我写的那部 分)。

继续完善fecthpop还是转换到popclient?如果转换,我写的那些代码就可 惜了,但同时能换来一个更好的开发基础。

一个更实际的转换动机是popclient对多协议的支持。POP3是最常用的邮 件服务器协议,但并不是唯一的。fetchpop以及其他备选程序并不支持 诸如POP2、RPOP或AROP这些协议,而我还有点想加上对IMAP(Internet Message Access Protocol,互联网消息访问协议,这是最新设计的、功能最强大的邮局协议的支持,仅仅是为了好玩。

另外,还有一个理论上的原因让我决定转换,这可是早在Linux之前我就 学到的:

3.“计划好扔掉一个吧,迟早你会这么做的。”(Fred Brooks,《人月神话》第11章)

或者可以这么说:在你第一次把问题解决的时候,你往往并不了解这个问 题,第二次你才可能知道怎么把事情做好。所以,如果你想做对事情,至 少要再做一次。好吧,我对自己说,改写fetchpop是我的第一次尝试,现在我可以换了。

1996年6月25日,我把自己对popclient所做的第一批补丁发给Carl Harris, 发现他基本已经失去了对popclient的兴趣。由于popclient代码有点陈旧, 还有些小bug没有解决,很多地方都值得改进,我和Carl Harris很快达成一 致:由我来接手这个程序。项目在不经意间升级了,我不再是对现有POP客户端做一些小打小闹的补 丁工作,而是开始维护整个程序。新的想法不时冒出来,我意识到自己也 许可以对程序做些大改动了。在一个鼓励代码共享的软件文化中,这是一种很自然的项目演化方式。我见证了下面这条:

4. 如果你有正确的态度,有趣的事情自然会找到你。 

当然,Carl Harris的态度更重要,因为他明白:

5. 当你对一个程序不再感兴趣时,你最后的责任就是把它交给一个可 以胜任的接棒者。

尽管并没有明确提及,但Carl Harris和我都知道,我们的共同目标是做出 最好的解决方案。唯一的问题是我能否证明自己是可靠的,一旦我做到这 点,Carl Harris就优雅而利落地把程序交接给我。如果有一天轮到我时, 希望我也能交接得这么棒。

……

小编注:若您爱读书爱读点,我们欢迎您关注虎嗅网旗下的微信公众号“书入法”(Roobook)。你的一部分是你读过的书决定的,书入法精心挑选好书和美文,愿你在此每日遇新知予你欢喜。