前言 为什么写这本书? 在聚会上,当我告诉别人我写自由软件时,人们不再是一副茫然的表情。他们会说,“哦,开源软件—就像linux?”我使劲地点头:"对!我就是做那个的。"不再被凉在一边的感觉真好。要在过去,下面的一个问题通常会是这个:“你靠那个怎么挣钱?”为了回答他们,我必须概述开源软件的经济学:有一些组织对某个特定软件的存在感兴趣,但他们不需要卖拷贝,而是确保这些软件能够免费获得并且有人维护,能够作为工具而不是商品使用。 然而之后的问题不再总是同钱有关。开源软件术语“开源”和“自由软件”在此处的上下文中本质上是同义词。有关他们的更多讨论参见中的的商业案例不再是如此神秘,许多的非编程人士已经了解到—或至少不再惊奇—确实有一些人被雇佣全职做开源。于是,我越来越频繁地被问到的第二个问题是:“那么,开源软件是怎么运作的? 我手头没有现成的满意的答案,更困难之处在于当我试图给出一个时,我意识到它是一个多么复杂的题目。运行一个自由软件项目完全不同于商业运作(想像一下必须时常同大部分你从未谋面的志愿者们商讨产品的特性的情景! )。由于某些原因,也和传统的非盈利组织不同,也不同于一个政府。与上述事物有许多相似性,但我渐渐得出了一个结论,自由软件是独一无二的。有许多事情可以与之比较,但没有一个与之完全等同。实际上,即使对于自由软件项目可以“运行”的假设也是一种引申。一个自由软件项目能被开启,并且会受到对此感兴趣的团体的强烈影响,而且它的资产不属于任何一个个人或团体,会源源不断从某些地方冒出对此感兴趣的人,所以它不会被—任何人—单方面地终止。每个人都有无限的权利,每个人又都没有权利。它形成了这样一种有趣的动态平衡。 这就是我要写此书的原因。自由软件运动已经进化出了一种独特的文化,一种信奉个人能够让软件做任何事情、自由为中心信条的思想,这种自由的结果并不是让每个人对代码各行其事,而是是狂热的合作。实际上,在合作中竞争也是自由软件运动中最有价值的技巧之一。管理这样的项目就是处理一堆庞大的合作关系,在这里个人能力不仅是和他人一起工作,而且包括通过一条崭新的合作方式对软件做出实际的贡献。这本书试图描述实行这种方式所需要的技术。它不会包含全部,但却是重要的起步。 优秀的自由软件本身就是极有价值的目标,我希望那些在本书中寻找创造成功软件方法的读者能够得到满意的答案。除此之外,我想传达那种纯粹的快乐,来自同充满活力的开源软件开发团队的合作,来自通过开源软件所鼓励的直接方式与用户的交流。成为一个成功的自由软件项目的一分子是有趣的,这才是驱动整个系统运转的终极动力。 谁应该读本书? 这本书是为那些着手开始一个开源软件项目,或已经开始但想知道现在该做什么的软件开发人员和经理们准备的。对那些打算加入一个开源软件项目,但是又没有经验的人,此书也是有所裨益的。 读者不必是程序员,但应该知道软件工程的一些基本概念,比如源代码、编译器和补丁。 无论是作为用户还是开发者,都不必具备开源软件的经验。那些之前在自由软件项目中工作过的人也许会发现这本书中的某些部分太浅显了,可能会想跳过这些章节。由于读者群的背景各有不同,我特别对各章节作了清楚的标示,以便读者可以适时跳过那些他们已经熟悉的内容。 资料来源 此书中的很多原始材料都是来自Subversion项目()的五年工作。Subversion是一个从零开始的开源版本控制系统,目的在于替代CVS成为开源社区版本控制系统事实上的选择。这个项目由我的雇主CollabNet公司()在2000年初发起,感谢上帝CollaNet从一开始就正确理解如何将它作为一个分布广泛的合作性项目来运作。从一开始我们就吸收了很多的志愿者,现在这个项目有50多名开发者,其中只有少数是CollabNet的雇员。 在很多方面Subversion都是开源软件项目的一个典型例子,最终我在上面花费的精力远超出我最初的预想。另一方面也是出于便利:无论何时我需要一个现象的样本,我的脑海里便会立即浮现出Subversion中的一个实例。但这也事关验证。虽然我不同程度地参与了其他几个开源项目,并且会和很多的朋友和相关的人交谈,但我很快就发现,当写成文字时,所有的断言都需要经过事实的检验。我不想仅仅根据我读到的它们公开邮件列表上列出的文档而对事件发表意见。如果有人想用以上的方式尝试Subversion,我知道,她大约只有50%的正确率,而另外50%是错误的。因此,当需要从一个我没有直接参与的项目找寻灵感或者实例时,我会找一个我信任并且了解内情的人,让他来说明项目的真实情况。 虽然过去5年我一直在做Subversion,但我从事自由软件行业已有12个年头了。因而,其它一些项目也对本书有所影响: 自由软件基金会(Free Software Foundation)的GNU Emacs文本编辑器项目,我在其中维护了几个小的软件包。 Concurrent Versions System (CVS)版本控制系统是我在1994–1995期间与Jim Blandy全力投入的一个项目,此后,我只是断断续续地参与这个项目的工作。 Apache软件基金会(Apache Software Foundation)的开源软件项目集,尤其是Apache可移植运行库(Apache Portable Runtime (APR)和Apache HTTP服务器。 OpenOffice.org 办公软件项目,Sleepycat软件公司的Berkeley Database项目,以及MySQL数据库项目;我个人并未参与这些项目的开发,但曾经对其进行关注,并在一些案例中与其开发人员进行过交谈。 GNU Debugger(GDB)项目(同上)。 Debian项目(同上)。 当然,以上并不是一个完整的名单。正如多数的自由软件程序员一样,我不定期地追踪自由软件行业中许多不同的项目,以对行业的整体情况有全面的了解。在此,我不一一列举所有的项目,但在书中会适时提及。 致谢 写作本书所耗用的时间是我原来设想的四倍,而在写作期间,无论我身在何处,总感觉到脑袋上仿佛悬挂着一台大三角钢琴。没有以下众人的帮助,我便不可能完成本书的写作而仍然保持精神正常的状态。 本书的编辑,O'Reilly出版社的Andy Oram是一个作家梦寐以求的编辑。他不但谙熟自由软件行业(书中的许多题目是他建议的),而且具有一种非凡的才能,那就是知道对方想说什么,而且帮助对方找到最佳的表达方式。能与Andy合作是我的荣幸。在此,我也要感谢Chuck Toporek,是他将本书的写作提议及时传给了Andy。 Brian Fitzpatrick在我写作本书的时候审阅了全部的内容,这不但使本书更完善,而且在我只想从电脑屏幕前面逃走,躲到世界上任何一个其它角落时,是Brian鞭策我继续写作。Ben Collins-Sussman和Mike Pilato也经常询问写作的进程,而且总是乐于讨论那一周我正在写作的任何题目,有时候那样的讨论需要进行很长时间。在我写作稍有懈怠的时候,他们也会注意到,并善意地加以提醒。谢谢你们,伙计们。 在我撰写本书的同时,Biella Coleman正在完成她的博士论文。她了解每天坐下来写作意味着什么,她既是鼓舞我写作的榜样,又能倾听我写作的苦衷。更能以一双人类学家的慧眼观察自由软件运动,给我提供了一些想法和参考资料,用于本书的写作当中。另一位人类学家Alex Golub那时候也在完成他的博士论文,而且他本人涉足自由软件行业,他在本书刚开始写作时给我提供了大量的支持,对我有极大的帮助。 Micah Anderson似乎从未因自己写作大部头而有压迫感,这真是令人憎恨而又妒忌的鼓舞,与他的友谊和交谈给了我很大的帮助,而且(至少有一次)他为我提供了技术上的支持。多谢你,Micah! Jon Trowbridge和Sander Striker既给予了我鼓励也提供了具体的帮助—他们在自由软件行业中丰富的经验为本书提供了我不可能在别处找到的素材。 我要感谢Greg Stein,不仅因为我们之间的友谊和他适时的鼓励,更因为他向Subversion项目表明定期地代码评审对建设一个编程社区是一项多么重要的工作。我也要感谢Brian Behlendorf,他巧妙地告诫我们进行公开讨论的重要性;我希望这一原则贯穿了本书的始终。 感谢Benjamin “Mako” Hill和Seth Schoen与我进行的有关自由软件及其政治方面的若干谈话;感谢Zack Urlocker和Louis Suarez-Potts在百忙之中抽空接受我的采访;感谢Slashcode名单上的Shane允许我引用他的帖子;感谢Haggen So提供的有关制作完成的主页之比较,那极其有帮助 。 感谢Alla Dekhtyar、Polina以及Sonya给予我永不倦怠及耐心的鼓励。我真高兴我不必在我们的晚间聚会上提早告辞(或更确切地说,恋恋不舍地告辞)而回家去写“那本书”。 感谢Jack Repenning给予我的友谊、交谈、以及他固执地拒绝接受不费力气的错误分析,而不遗余力找寻正确答案的决心。我希望他在自由软件开发以及自由软件行业中长期而丰富的经验在本书中得以体现。 在本书写作期间,CollabNet极其慷慨地允许我采用一个灵活的工作日程,而当我需要的时间远远超出原先预计的时候,他们没有抱怨。我并不完全了解管理层在做这样的决定时考虑的个中细节,但我猜想Sandhya Klute,而后是Mahesh Murthy,均参与了这项决定—我在此感谢他们两位。 整个Subversion开发团队在过去的五年是我灵感的源泉,本书中描述的绝大部分内容都是我与之共事所得。由于人数众多,我在此不能一一列举他们的姓名,但是我恳请各位读者, 假如你有一天偶遇一位Subversion的开发人员,请为他买一杯他最爱喝的酒—我本人肯定要那样做。 我曾多次与Rachel Scollon胡言乱语,叙说写书的进程,而她总是乐于倾听,并且能够设法使问题大而化小。那对我有很大的帮助—多谢。 (再次)感谢Noel Taylor,他一定十分不解,为何我在上次频频抱怨之后又决定写第二本书,然而,Noel给予我的友谊,以及他领导之下的Golosá合唱团使我的生活即使在最忙碌的时节依然有音乐和好友相伴。我还要感谢Matthew Dean和Dorothea Samtleben,我的好友以及因我而饱受折磨的音乐合作伙伴,在我多次无法与之排练的时候,他们总是给予我极大的理解。Megan Jennings总是给予最大的支持,并对一个她并不十分熟悉的题目表现出真诚的兴趣—这对一个缺乏信心的作家来说无异于一剂定心丸。多谢了,我的老友们! 本书有四位学识渊博而又兢兢业业的评审者:Yoav Shapira、Andrew Stellman、Dayanum Srinivas和Ben Hyde。假如我能全部采纳他们提出的极好的建议,本书无疑将更加完善。但由于时间的限制,我不得不有选择性地加以采纳。即便如此,本书的改进仍然十分显著,任何遗留下来的错误都应由我本人承担。 我的父母Frances和Henry一如既往地给予我大力的支持,与上一本书相比,这本书没有那么多技术专业名词,因而我希望他们觉得这本书读起来容易一些。 最后,我要感谢我的两位挚爱好友,Karen Underhill和Jim Blandy。在写作本书期间以及在过去的七年里,Karen给予我的友谊和理解对我来说意味着一切。没有她的帮助,我是不可能完成本书的写作的。Jim对我来说也是一样,一个真正的朋友,一个计算机行业中的王者之王,是Jim将我带入自由软件行业,正如一只鸟给予飞机飞行的灵感。 免责声明 本书中所表达的想法和观点均属我本人。它们并不一定代表CollabNet或是Subversion项目的看法。