《大教堂与集市》读书笔记

这是一本关于黑客行为与文化的书籍。本书并没有给出基础理论上的创新,只是描述了这样的事实:开源软件系统性地利用开放式开发和分布式同行评审(peerreview),不仅降低了成本,还提高了软件质量。

作者EricS.Raymond作为黑客文化的第一理论家,他通过观察和参与,对黑客这个群体的习俗、信念及关系有着深入而广泛的研究。他极力为“黑客”(hacker)一词正名,强调“黑客”并不是媒体报道中的计算机违法分子,而是那种着迷于计算机技术并通过编程提供极具价值软件的人。

黑客(hacker)一词,原指喜欢通过智力和创造性方法挑战难题的人,尤指那些热衷于计算机技术的编程高手。由于媒体报道中出现的黑客事件往往和计算机犯罪相连,导致人们常常误认为黑客是利用网络入侵他人系统的破坏者。事实上,这些破坏者应该被称为cracker,即“骇客”。

Eric在本书中向大家展示了两种最为经典且截然不同的模式:大教堂模式 和 集市模式。传统大型软件公司的开发模式就像是艰难而缓慢的大教堂建造工程,它有着严密的管理和封闭的集中式结构,但在创新上、生产力上和Bug控制上却落后于集市模式。集市模式是一种并行的、对等的扁平化开发结构,其参与者大多来自于互联网上的志愿者,结构松散,来去自由,就像是一个乱糟糟的集市,但就是这样的组织形式,却取得了像Linux这样令人惊叹的成功。

我们可以看到,互联网和移动智能终端已经日益影响着每个人的日常生活,而你每天访问的互联网网站,绝大部分基于开源的操作系统、Web服务器和数据库,你所使用的智能手机多采用 Andriod 或 iOS 系统,Andriod 源于 Linux,iOS 源于开源的 Darwin(Darwin 则基于开源的 Mach 和 FreeBSD 开发),可以说,只要你上网或使用智能手机,你就在不知不觉中使用了开源软件。开源对软件业和互联网带来了巨大影响,并正在和将会对人们的工作和生活产生更显著的影响,正如Eric在前言中所说的,对于任何一个对计算机有所依赖的人,对于任何一个要在未来工作和生活的人,了解一些开源文化,都是很有意义的。

黑客圈简史

真程序员(Real Programmer)

通常具备工程学和物理学背景,并常常是业余无线电爱好者。使用机器语言、汇编语言、FORTRAN或者其他一些已经被人们遗忘了的古老的编程语言。

早期的黑客

20世纪60年代到70年代期间,第一个横贯美国大陆的高速计算机网络开始出现,使得位于各地的研究者能够以前所未有的速度和灵活性交换信息,这些电子高速公路把散落全美各地的黑客聚集到一起,构成了产生黑客文化的关键力量。

Unix的兴起

最开始的操作系统都是用汇编语言精心编写的,目的是充分利用机器的效能。但因为机器的更新换代,用户往往要为那些新机器重新编写软件,也就造成了每次都去做类似发明轮子和钻木取火的事。
黑客Ken Thompson,参与了分时操作系统Multics的开发工作,因为其显示出庞大而又无用之物的迹象后,贝尔实验室从这个项目中退出了。
出于对Multics的执念,KenThompson开始尝试将Multics的一些理念和自己的一些想法融合起来,准备开发一种新的系统:Unix。
与此此时,黑客Dennis Ritchie为还处于雏形阶段的UNIX发明了一种新的语言:C语言。因其设计为好用、限制少和灵活方便的语言,很快在贝尔实验室流行了起来。
Thompson和Ritchie是最早意识到当时硬件和编译技术都已经好到能让整个操作系统用C语言编写的那批人之一。于是,Unix和C组合在了一起,并很快因其可移植性、极为广泛的计算作业,很快被数以千计的黑客们接受。

远古时代的终结

一群没有组织的微机爱好者决心让普通大众都享受到计算机的威力。
很多实验室随着人工智能的首次商业化尝试而四分五裂,受一些新成立公司的高薪职位吸引,实验室里室里最优秀的人才正纷纷出走。
RichardM.Stallman(人们更熟悉他的名字缩写RMS,这也是他常用的登录名)离开实验室,创建了自由软件基金会(Free Software Foundation),献身于生产高质量的自由软件。并在1982年用C语言重新构建了整个Unix的克隆,并免费发布,这就是后来广为人知的GNU(Gnu’sNotUNIX,这是一种递归式的缩写)操作系统,GNU迅速成为黑客活动的焦点。

“专有UNIX”时代

黑客圈形成了两大阵营,一边是围绕Internet和Usenet而形成的相对有凝聚力的“网络部落”(他们中绝大多数使用运行着UNIX的小型机或工作站级别的机器),一边则是没有网络的分散在各个角落的微机爱好者。
这一阶段,一些严重的计算机破坏(cracking)事件开始被主流媒体报道,记者们误用黑客(hacker)一词来形容那些破坏者,这种不幸的误用一直延续至今。
随着20世纪90年代的到来,已经有十多年发展的工作站技术,受到了明显的威胁,基于Intel386系列芯片的廉价且高性能的个人计算机出现了,历史上第一次,黑客个人有能力购买一台家用机器,而UNIX则有能力提供运行于其上的整个开发环境,并能连上互联网。
但是,动辄数千美元的商业UNIX仍然太贵了,价格也没怎么降下来,人们清楚地看到,十多年来对专有UNIX的商业化努力显然已经失败了。

早起的自由UNIX

如果软件复杂到操作系统这样的程度,就必须要有一个精心协作的团队,团队要比较小,而且紧密互动,不管是以前还是现在,这都是很典型的开发模式。
FSF一直未能完成的HURD使得Helsinki大学一名叫Linus Torvalds的学生有了施展才能的空间,1991年,他开始为386机器开发自由UNIX内核,使用的正是FSF提供的软件套件。Linus很快获得了成功并吸引了互联网上的黑客们,他们帮助Linus一同开发Linux:一个全功能的UNIX,源代码完全免费,而且可以再发布。

Web大爆发

公众发现了互联网。20世纪90年代早期,普通大众一个月花不了多少美元就可以连上互联网,WWW发明以来,互联网本来就很快的增长速度更是加速到了不可思议的地步。
1994年,若干种不同版本的自由UNIX(Linux和386BSD的后裔)成为黑客活动的主要焦点。Linux开始被商业公司刻录在CD-ROM上发布,并且非常畅销。
互联网成为主流后,黑客文化开始受到尊敬,并有了一定政治影响力。

大教堂与集市

两种完全不同的开发模式:绝大多数商业公司所采用的“大教堂”模式和 Linux 世界采用的“集市”模式。

大教堂模式和集市模式最关键的区别

在大教堂建筑者看来,bug是棘手的、难以发现的、隐藏在深处的,要经过几个人数月的全心投入和仔细检查,才能有点信心说已经剔除了所有错误。而发布间隔越长,倘若等待已久的发布版本并不完美,人们的失望就越发不可避免。
对集市模式而言则完全不同,在上千名合作开发者热切钻研每个新发布版本的情况下,你可以假定bug是浅显易找的,或者至少可以很快变得浅显易找。所以你会频繁发布以获取更多的修正,其副作用是良性的:即便发布中有些小问题,你也不会损失太多。

开发者和测试者对程序有着不匹配的思维模式

测试者是从外往内看,程序员是从内往外看。对于不开放源码的软件开发,开发者与测试者往往局限于自己的角色,各说各话,都对对方倍感沮丧。开源开发打破了这种困境,由于大家都有真实的源码,开发者和测试者很容易发展出一个共享的表达模式并进行有效的交流。

集市模式的成功

LinusTorvalds的开发风格是:早发布、常发布、委托所有能委托的事、开放到几乎是混乱的程度,这些都令人感到惊讶不已。
在Linux社区里,没有建筑大教堂那样的安静和虔诚,倒更像是一个乱糟糟的大集市,充满了各种不同的计划和方法。而既稳定又一致的一个操作系统就这么诞生了。

1.好的软件作品,往往源自于开发者的个人需要。
2.优秀的程序员知道写什么,卓越的程序员知道改写(和重用)什么。
以LinusTorvalds为例,他并没有尝试从零开始写Linux,而是以重用Minix(一个用于PC机的迷你型UNIX类操作系统)的代码和理念作为开始,虽然Linux中所有Minix代码最终都被移除或重写,但它在Linux成长初期确实起到了类似脚手架的作用。
3.在你第一次把问题解决的时候,你往往并不了解这个问题,第二次你才可能知道怎么把事情做好。所以,如果你想做对事情,至少要再做一次。
4.如果你有正确的态度,有趣的事情自然会找到你。
5.当你对一个程序不再感兴趣时,你最后的责任就是把它交给一个可以胜任的接棒者。
6.把你的用户当成开发合作者对待,如果想让代码质量快速提升并有效排错,这是最省心的途径。
7.早发布,常发布,倾听用户的反馈。
8.如果有足够多的beta测试者和合作开发者,几乎所有问题都会很快显现,然后自然有人会把它解决。或者说得更通俗一些:“只要眼睛多,bug容易捉。”
9.聪明的数据结构配上愚笨的代码,远比反过来要好得多。
10.如果你把beta测试者当做最珍贵的资源对待,他们就会成为你最珍贵的资源。
11.仅次于拥有好主意的是,识别来自用户的好主意,有时后者会更好。
12.通常,那些最有突破性和最有创新力的解决方案来自于你认识到你对问题的基本观念是错的。
13.“设计上的完美不是没有东西可以再加,而是没有东西可以再减。”
14.任何工具都应具备预期内的功能,但一个伟大的工具能给你带来预期外的功能。
15.写网关类软件时,尽可能不要干扰数据流,而且绝不要扔掉信息,除非接收方强迫你这么做。
16.当你的语言还远不是图灵完备(Turing-complete)的时候,语法糖[4]会让你受益良多。
17.系统的安全性只取决于它所拥有的秘密。谨防虚假的秘密。
18.想要解决一个有趣的问题,先去找一个让你感兴趣的问题。在某些工作场所,开发人员不将代码看作是自己的“领土”,而是鼓励别人发现其中的bug和潜在改进点,这些场所中软件改善速度之快,与别处相比是不可同日而语的。
19.如果开发协调者有一个至少像Internet这样好的沟通媒介,并且知道如何不靠强制来领导,那么多人合作必然强于单兵作战。

集市模式的必要条件

不可能从零开始实施集市模式。
需要拿出一个像样的承诺。程序此时并不需要特别好,它可以简陋、有错、不完整,文档可以少得可怜。但它至少要做到:(a)能运行,(b)让潜在的合作开发者相信,这个软件在可预见的未来,能演变成一个非常棒的东西。
项目领导人必须要有高度的设计直觉和聪明才智。
一定水准的设计和编码能力。
集市项目的协调人或领导人必须要有很好的人际交往和沟通能力。

开源项目如果失败了,根本不会是因为机器、网络或办公场地,它们死掉的唯一原因就是开发者们不再感兴趣了。
开源成功的一个最重要成果,就是告诉我们,“玩”是创造性活动中最具经济效能的工作模式。

开垦心智层

所谓黑客,是一个通过贡献礼物表现出他(或她)既拥有技术能力又懂得声誉竞争如何运转的人。对是否为黑客的判断是一种感知和认同,只能由那在文化中已经做得很好的人给出。

黑客意识形态的多样性

差异可以体现在热忱度上:开源仅仅是一个便利的手段(好工具、有趣的玩具、有意思的游戏),还是说其本身就是目的?
差异还体现在敌对性上:反对商业软件,以及反对那些试图支配商业软件市场的公司。

文化中的禁忌:

  • 分化一个项目会遇到强大的社会压力,只有在极为必要的情况下才使用,而且要重新命名和做出大量的公开解释。
  • 在没有项目主持人认可的情况下发布更新是令人不悦的,除非是特殊情况(如本质上不重要的移植bug修复)。
  • 在项目历史、致谢表或维护列表中移除某个人的名字是绝对不可以的,除非当事人明确表示同意。

所有权和开放源码

一个软件项目的“所有者”就是在社区中众所周知的对软件版本改动有唯一发布权的那个人。

通常有三种方式获得开源项目的所有权:

  • 第一种也是最显然的,就是去创建这个项目,当这个项目在开始时就只有一个维护者而且这个维护者仍然起作用的时候,所有权问题是连提都不该提的。
  • 第二种方式是获取前任对所有权的移交(有点像“接力棒传递”)。这在社区中很容易理解,当项目“所有者”不愿意或者不能在开发和维护中投入必要的时间时,他(她)有义务将项目移交给一个有能力的继任者。
  • 第三种方式是一个项目需要维护但项目所有者已经消失或失去兴趣了。如果你想维护该项目,你的责任是努力找到这个“所有者”,如果找不到,你可以在相关场所(比如Usenet上专注于该应用领域的新闻组)声明该项目似乎是一个“孤儿”,而你想为之负责。

声誉的多面性

追求同侪中声誉(声望)的意义何在?

  • 首先,也是最明显的一点,在同侪中拥有好名声是一种最基本的激励,出于前面提到的进化上的原因,我们都渴望体验它。
    (一些人试着将这种对声誉的内驱力做各种升华,使其看起来和同侪没有那么明显的关联性,
  • 第二,声誉是很好的吸引他人注意和合作的途径(在纯礼物经济中,这是唯一的途径)。如果一个人慷慨、智慧、公平交易、有领导能力,或者有其他优秀品质,就更容易让人相信和他合作能获得好处。
  • 第三,如果你所处的礼物经济和交换经济或命令体系互相关联交织,你的名声就可能传播到后两种环境中,使你在那里获得更高的地位。

冲突的起因

把开源软件中的冲突辨识为以下主要四类:

  • 谁来做有约束力的决定?
  • 谁该得到荣誉或责备,因为什么?
  • 如何防范劳动成果被复制?如何防范流氓版本使bug跟踪变得更复杂?·从技术上讲,什么是正确的事?
  • 从技术上讲,什么是正确的事情?

任何一种项目冲突解决理论,必须要解决三个问题:

  • 谁来负责做设计决策?
  • 如何决定哪个贡献者应该被授予荣誉,如何授予?
  • 如何保持项目团队和产品不被分裂为多个分支?

本书这几篇文章仅仅是个开端而非定论,开源软件还有太多的问题没有解决。开源现象引发了其他创造性工作领域以及知识产权相关的许多问题,但未能真正给出较好的答案。