小土刀

【大教堂与集市】读书笔记

时隔这么多年,在终于可以称书中的 CMU 为母校了。


多少双眼睛才能驯服复杂性、要命的最后期限,关于分支和伪分支更准确的定义,进化不利条件理论、孔雀、牡鹿和开源开发者动机的关系,开源的经济学动力,信息不对称效应,用开源做竞争武器。

“黑客”一词大约就起源于MIT的计算机文化。技术模型铁路俱乐部的黑客们,大都成为MIT人工智能(AI)实验室的核心成员,直到上世纪80年代早期,该实验室在AI领域的研究都一直处于领先地位,1969年后,他们的影响逐渐扩展开来,因为在那年,APRAnet诞生了

同样也是使用PDP-10,MIT却有些与众不同,他们完全摒弃了DEC为PDP-10写的软件,而是自己写了一个操作系统,即传说中大名鼎鼎的ITS。 ITS即“不兼容分时系统”(Incompatible Time-sharing System),这充分体现了MIT黑客们的态度,他们就是要走“自己”的路。好在MIT人的智慧配得上这种自负,虽然ITS古灵精怪,时不时出点bug,但却充满了才华横溢的技术创新,并似乎仍然保持着单个分时系统的最长连续使用时间记录。

ITS文化的一些技术产物至今仍然被人们使用,EMACS编辑器可能是其中最广为人知的。ITS的很多传说仍然活在黑客们心中,感兴趣的话,可以看一下“黑客行话”

SAIL和CMU当然不会自甘落后。在SAIL的PDP-10周围成长起来的黑客们,后来大多成为个人计算机及窗口/图标/鼠标软件交互界面的关键人物。CMU黑客们的工作则引领了专家系统和工业机器人技术的大规模实际应用。

贝尔实验室另一名黑客Dennis Ritchie为还处于雏形阶段的UNIX发明了一种新的语言:C语言。和UNIX一样,C被设计为好用、限制少和灵活方便的语言,很快,这些工具在贝尔实验室流行起来了,1971年,Thompson和Ritchie赢得了开发一个内部系统(类似我们现在所说的办公自动化系统)的投标,更大地刺激了UNIX和C的内部传播,而Thompson和Ritchie的雄心远不止于此。

除了可移植性,UNIX和C还有其他的重要优势,它们都是KISS(Keep It Simple,Stupid)哲学下的产物。程序员可以很容易地在脑海中记忆并掌握整个C语言的逻辑结构(这可不同于之前或之后的大多数语言),而不需要去频繁地查看手册。而UNIX则拥有一系列灵活方便的工具程序,每个工具都被设计为可与其他工具组合运用,以方便地实现特定目的。 UNIX和C的组合,很快被证明适用于极为广泛的计算作业,其中很多完全超出设计者的预期。虽然缺乏正式的支持和推广,它仍然在AT&T内部迅速传播开来。到1980年,它已经扩散蔓延到很多大学和研究机构,而数以千计的黑客们则开始考虑在家里使用它了。

1980年发生了很多事,三种文化在边缘互相交叠,却各自形成截然不同的技术体系,ARPAnet/PDP-10文化紧紧围绕着LISP、MACRO、TOPS-10、ITS以及SAIL [4]的发展;UNIX和C主要使用PDP-11、VAX以及慢得让人心烦的电话连接;而一群没有组织的微机爱好者则下决心让普通大众都享受到计算机的威力。 这其中,ITS文化仍占据至尊地位,但是MIT的实验室里已乌云密布,ITS所寄身的PDP-10已经开始过时,实验室随着人工智能的首次商业化尝试而四分五裂,受一些新成立公司的高薪职位吸引,实验室里最优秀的人才正纷纷出走(SAIL和CMU的实验室也一样)

随着20世纪90年代的到来,已经有十多年发展的工作站技术,受到了明显的威胁,基于Intel 386系列芯片的廉价且高性能的个人计算机出现了,历史上第一次,黑客个人有能力购买一台家用机器,而且其性能和存储能力可以媲美十年前的小型机!UNIX则有能力提供运行于其上的整个开发环境,并能连上互联网。

FSF一直未能完成的HURD使得Helsinki大学一名叫Linus Torvalds的学生有了施展才能的空间,1991年,他开始为386机器开发自由UNIX内核,使用的正是FSF提供的软件套件。Linus很快获得了成功并吸引了互联网上的黑客们,他们帮助Linus一同开发Linux:一个全功能的UNIX,源代码完全免费,而且可以再发布。 Linux并不是没有竞争者,1991年,在Linus Torvalds早期尝试的同时,William和Lynne Jolitz正试着把BSD UNIX源代码往386上移植,大多数评论者在比较BSD技术和Linus早期简陋的成果之后,都认为BSD移植将会成为PC上最重要的自由UNIX。

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

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

  1. 好的软件作品,往往源自于开发者的个人需要。
  2. 优秀的程序员知道写什么,卓越的程序员知道改写(和重用)什么。以Linus Torvalds为例,他并没有尝试从零开始写Linux,而是以重用Minix(一个用于PC机的迷你型UNIX类操作系统)的代码和理念作为开始,虽然Linux中所有Minix代码最终都被移除或重写,但它在Linux成长初期确实起到了类似脚手架的作用。
  3. “计划好扔掉一个吧,迟早你会这么做的。”(Fred Brooks,《人月神话》第11章)或者可以这么说:在你第一次把问题解决的时候,你往往并不了解这个问题,第二次你才可能知道怎么把事情做好。所以,如果你想做对事情,至少要再做一次。
  4. 如果你有正确的态度,有趣的事情自然会找到你。
  5. 当你对一个程序不再感兴趣时,你最后的责任就是把它交给一个可以胜任的接棒者。UNIX另一个传统强项也被Linux发挥到美妙的极致:很多用户本身就是黑客。因为可以拿到源代码,这些黑客能极为有效地缩短排错时间,只要给他们一点点鼓励,他们就会帮你查找问题、给出建议并帮助改善代码,这些比你自己做要快得多得多。
  6. 把你的用户当成开发合作者对待,如果想让代码质量快速提升并有效排错,这是最省心的途径。尽早和尽量频繁发布是Linux开发模式中至关重要的一部分
  7. 早发布,常发布,倾听用户的反馈。Linus无疑是一个顶级黑客,想想有多少人能从零开始建造一个完整的具有产品级质量的操作系统内核?但Linux并没有展现出多少令人赞叹的概念性突破。和Richard Stallman或者James Gosling(NeWS和Java的作者)相比,Linus不是(至少现在还不是)一个富有创造性的设计天才,他更像是一个工程实施上的天才,他具备一种避免bug和防范开发走入死胡同的第六感,而且有一种能发现从A点到B点最省力路径的真本事,事实上,Linux的整个设计,都透露着这种特质,并反映了Linus那种本质上保守而简洁的设计取向。
  8. 如果有足够多的beta测试者和合作开发者,几乎所有问题都会很快显现,然后自然有人会把它解决。或者说得更通俗一些:“只要眼睛多,bug容易捉。”我把它称为“Linus定律”。Linus定律道出了大教堂模式和集市模式最关键的区别:在大教堂建筑者看来,bug是棘手的、难以发现的、隐藏在深处的,要经过几个人数月的全心投入和仔细检查,才能有点信心说已经剔除了所有错误。而发布间隔越长,倘若等待已久的发布版本并不完美,人们的失望就越发不可避免。
    • 对集市模式而言则完全不同,在上千名合作开发者热切钻研每个新发布版本的情况下,你可以假定bug是浅显易找的,或者至少可以很快变得浅显易找。所以你会频繁发布以获取更多的修正,其副作用是良性的:即便发布中有些小问题,你也不会损失太多。
    • 社会学家早在多年前就发现,一群专家(或一群无知的家伙)的平均观点要比一个随机选择的人的观点更有预见性,这就是“德尔菲效应”(Delphi effect)。看来Linus的做法表明这个理论甚至也适用于操作系统排错——“德尔菲效应”可以驯服软件开发的复杂性,甚至是操作系统内核开发这样的复杂性。 3
    • Linus定律也可被表述为“排错可以并行”,尽管调试人员在排错时需要协调开发人员并与之交流,但调试人员之间并不怎么需要协调,也就是说,增加调试人员并不会带来增加开发人员那样的二次方复杂性和管理成本
  9. 聪明的数据结构配上愚笨的代码,远比反过来要好得多。
  10. 如果你把beta测试者当做最珍贵的资源对待,他们就会成为你最珍贵的资源。
  11. 仅次于拥有好主意的是,识别来自用户的好主意,有时后者会更好。
  12. 通常,那些最有突破性和最有创新力的解决方案来自于你认识到你对问题的基本观念是错的。
  13. “设计上的完美不是没有东西可以再加,而是没有东西可以再减。”
  14. 任何工具都应具备预期内的功能,但一个伟大的工具能给你带来预期外的功能。
  15. 写网关类软件时,尽可能不要干扰数据流,而且绝不要扔掉信息,除非接收方强迫你这么做。
  16. 当你的语言还远不是图灵完备(Turing-complete)的时候,语法糖[4]会让你受益良多。
  17. 系统的安全性只取决于它所拥有的秘密。谨防虚假的秘密。
    • 开始建设社区的时候,你需要拿出一个像样的承诺。程序此时并不需要特别好,它可以简陋、有错、不完整,文档可以少得可怜。但它至少要做到:(a)能运行,(b)让潜在的合作开发者相信,这个软件在可预见的未来,能演变成一个非常棒的东西。Linux和fetchmail在首次露面时,都有着很强和很吸引人的设计。很多人都已正确意识到这点非常重要,并进而得出结论:项目领导人必须要有高度的设计直觉和聪明才智。
    • 一个协调者是否拥有卓越的原创设计能力,并不是项目成败的决定性因素,但他是否能识别出别人的优秀创意,则一定是最关键的。
    • Linus是个好人,人们都喜欢他并愿意帮助他,这(和他的项目成功)不是巧合。我精力充沛、性格外向、乐于社交、有一些脱口秀演员般的说话风格和临场反应,这也不是巧合。为了让集市模式运转,哪怕有一点点的人格魅力,都会对你大有裨益。
  18. 想要解决一个有趣的问题,先去找一个让你感兴趣的问题。Linux黑客们致力于最大化的“效用函数”,其目的并不是经典意义上的经济价值,而是自我满足和黑客声望这些无形的东西。(有人把这种动机称为“利他”,但他们忽视了一个事实,即“利他”本身是“利他者”自我满足的外在表现。)按这种方式运转的志愿者文化其实很常见,除了黑客圈,我还长期参与在科幻迷圈子中,不像黑客,科幻迷们早就清楚认识到“egoboo”(个人在团体中声望的提升)是志愿者活动背后的基本驱动力。
  19. 如果开发协调者有一个至少像Internet这样好的沟通媒介,并且知道如何不靠强制来领导,那么多人合作必然强于单兵作战。
    • 传统软件项目中的60%到70%,要么是从未被完成,要么被他们的用户拒绝。如果这个比例还算靠谱的话(我还没见过任何一个有经验的项目管理者对此提出过异议),那么大多数项目把目标设定得要么太不现实,要么完全错误。任何人只要去观察一下Internet中繁忙和多产的开源软件世界,一定都会注意到一个很有意思的矛盾:他们实际做的和他们所声称的并不一致,也就是说,开源文化的“官方”意识形态和他们的实践并不一致。 文化是有适应能力的机器,开源文化会对一系列可识别的动力和压力做出反应。通常,文化对其所处环境的适应,既反映了其自觉的意识形态,也反映了其隐藏的、无意识或潜意识的认识。而无意识调适和其意识形态的不一致,是很常见的现象。

如何评判礼物价值并给予相应的尊重,在黑客文化中有着始终如一的标准。主要如下:

  1. 如果它不能像我所预期的那样工作,那就不是好的——不管它多么聪明和有原创性。
  2. 在心智层的拓展性工作要比在某功能域内(对现有作品)的重复性工作好
  3. 能进入主要发行版的作品比不能进入的好。在所有主要发行版中都包含的作品最令人尊敬。
  4. “使用”是最真实的赞美,类别杀手比同类竞争者好。
  5. 相比那些只挑有趣和简单工作的人,长期致力于艰苦和乏味工作(如调试、写文档)的人更令人钦佩。
  6. 重要的功能扩展比低层次的修补好

所有权是动物领土权的抽象,它之所以被进化出来,是为了减少物种内的暴力争斗。狼通过标记边界和尊重其他同类的边界,可以减少陷入争斗的机会,而争斗可能会使它虚弱或死亡,从而降低它成功繁殖的概率。类似的,人类社会的所有权是为了防止人类之间的冲突,通过设定边界,可以清楚地区分和平行为与侵犯行为。

动物行为学分析也促使我们更近距离观察开源文化中的冲突处理机制。它使我们有理由认为,所有权惯例除了最大化声誉激励外,还有防止和解决冲突的作用。

从习惯上讲,如果项目有合作开发者,“独裁者”或项目领导人应该在关键决策上征询合作开发者的意见,尤其当决策关乎某个合作开发者所“拥有”(也即投入了时间并为之负责)的子系统时。一个有智慧的领导者,会认识到项目内部财产边界的作用,不会轻易干扰或推翻子系统所有者做出的决定。 一些非常大型的项目则完全抛弃了善意独裁者模型,其做法是将合作开发者转为投票委员(如Apache),或是在资深合作开发者内部轮流掌权,Perl开发者就是这么组织起来的。


心智层(noosphere,又译智力圈)是指人类思想的领域范围,或理解为人类智力活动的总和,在概念上与“大气层”(atmosphere)、“生命层”(biosphere)相类比。——译者注

善意独裁者(benevolent dictator)是传统“开明君主”的现代叫法,是指独裁领导者运用自己的政治权力为人们造福而不是仅仅为了他(她)自己或者一小部分人的利益。

委员会设计(design-by-committee)是一个有讽刺和贬损意味的术语,用于指一组人(尤其是缺乏优秀的领导时)共同设计产生的东西(通常是技术系统和标准)。这种方式设计出来的产物常常过于复杂、内部不一致、有逻辑缺陷、平庸陈腐、缺乏一致的愿景。经常有人拿这种民主式设计与独立设计、独裁者设计做比较。

我们首先要注意的是,计算机程序像其他所有类型的工具或生产资料一样,有着两种不同的经济价值:使用价值和销售价值。


黑客精神并不局限在软件文化中。人们会把黑客态度用在其他事情上,比如电子或音乐。事实上,对任何科学和艺术,在其最高水平的活动中都可以发现黑客精神。软件黑客若是识别出其他领域的同道中人,也会称他们为“黑客”。所以有人说黑客的天性其实是独立于他们所从事工作的。

两者最根本的区别是:黑客搞建设,骇客搞破坏。

黑客解决问题并做出东西,他们相信自由,并自愿地互相帮助。要想被别人认可是一名黑客,你的行为必须要表现出你拥有这种态度。当然,如果要做到这点,你必须要真的信奉这种态度。

  1. 这个世界充满了迷人的问题等待人们去解决。
    • 做一名黑客有很多乐趣,但这是一种需要努力才能获得的乐趣。而努力需要动力,成功运动员的动力来自于控制自己身体和超越自己过往生理极限的愉悦。类似地,成为一名黑客,你必须要对解决问题、磨砺技能和智力挑战有着基本的兴奋感。
    • 如果你不是那种天生对此就很有感觉的人,你需要把自己变成这种人,否则你会发现你做黑客的能量会被性、金钱以及社会认可这类让你分心的东西慢慢耗尽。 (你还必须要培养出一种对自己学习能力的信心——你要相信,即便你没有掌握解决某个问题所需的全部知识,如果你成功处理了其中一小部分而且从中学到东西,你将会学到足够多的知识去解决下一小部分——如此往复,最终你会解决整个问题。)
  2. 不要解决一个问题两次。
    • 创造性头脑是无比珍贵的有限资源,它们不应浪费在重新发明轮子这种事上,尤其是还有这么多迷人的新问题在那里等着的时候。 想要像一名黑客,你必须要相信:其他黑客的思考时间是很宝贵的——它是如此宝贵,以至于共享信息、解决问题并将解决办法馈赠给其他黑客几乎就是你的道德义务,这样,其他黑客就可以去解决新问题,而不是永无休止地去重复解决老问题。 (你不必觉得你有义务把所有创造性产品都贡献出来,尽管这样做的黑客能获得其他黑客最大的尊重。出售软件以换取食物、房租和计算机并不违反黑客价值观,运用你的黑客技能来养家甚至发大财也都没什么,只要你在做这些的时候,不要忘记你对理想的忠诚以及你的黑客朋友就行。)
  3. 无聊和乏味是有害的。
    • 黑客(以及有创造性的人们)应该从来不会觉得无聊,也不会去做那些乏味而愚蠢的重复性工作,如果这种事情发生,意味着他们没有做只有他们才能做的事——解决新问题。这种浪费会伤害到每个人,无聊和乏味不仅仅是不好,而且是有害的。 要当一名黑客,你必须得非常相信这点,并希望尽可能将那些无趣的事情自动化,这不仅是为自己,也是为其他人(尤其是其他黑客)。 关于这点,有一个明显的例外:黑客有时会做一些外人看上去重复或无趣的事,其实他们这样做只是为了清空大脑,或是为了获得某种技能,或是为了获取某些在其他情况下无法获取的经验。注意这是他们自愿的——任何有想法的人都不该被强迫去做那些他们觉得无聊的事。)
  4. 自由是好事。
    • 黑客天生是反权威的。如果有人能命令你,他就能让你做不成你特别想做的事——而且,如果探究权威者的思维,你会发现其理由往往愚蠢得令人发指。所以无论什么地方出现权威主义倾向,你都要与之抗争,以免他们压迫你和其他黑客。 (这并不是说要和所有权力抗争。儿童需要成人的指导,罪犯需要强制关押。黑客应该接受某种类型的权力,虽然他在服从命令上要花些时间,但换来了更多他想要的东西。这是一种有节制的、理性的谈判,而绝不是当权者所想要的那种个人顺从。) 滥用权威者靠审查和保密而强大,他们不信任自愿合作和信息共享——他们只喜欢他们控制之下的“合作”。若要做得像一名黑客,对审查、保密以及使用武力或欺骗这类行为,你必须要有一种直觉上的反感,而且你必须愿意与之抗争。
  5. 态度不能代替能力。
    • 要想成为黑客,你必须养成这些态度。但只凭态度并不会让你成为黑客,就像只凭态度不会让你成为冠军运动员或摇滚明星一样。要成为一名黑客,你需要智慧、实践、投入和努力。 所以,你必须学会持怀疑态度并尊敬每种能力。黑客不会让装腔作势者浪费他们的时间,黑客崇拜能力——特别是黑客能力,但并不限于此,在任何事情上的能力都是好的。那种只有极少数人才能驾驭的技术能力尤其好,而那种需要思维敏锐、动手能力强和全神贯注的技术能力最好。
    • 如果你崇尚能力,你会从动手开发中获得乐趣——辛苦的工作和投入将成为紧张的比赛而不是苦工。要想成长为黑客,这至关重要。

对黑客来说,态度固然重要,但技能更重要。态度并不是能力的替代品,有一些特定的基本技能是你必须要掌握的,否则没有黑客愿意称你为“黑客”。这些基本技能会随时间缓慢变化,因为技术进展会产生新技能并淘汰旧技能。例如,以前它会包括机器语言编程,而不会有现在的HTML。不过目前看来,很明显基本技能包括以下几个方面。

  1. 学习如何编程。这当然是一项基本的黑客技能。如果你不懂任何计算机语言,我建议从Python入门。它设计整洁,文档良好,对初学者很友好。最好把这五种语言(Python、Java、C/C++、Perl和LISP)都学了。它们不只是最重要的黑客语言,还代表了截然不同的编程方法,每一种都会让你受益匪浅。
  2. 找一个开源UNIX,学习使用和运行它
  3. 学习如何使用WWW和写HTML。黑客文化制造的大多数东西都是看不见的,这些东西帮助工厂、办公室和大学运转,但对非黑客人群的生活没有明显影响。Web是个很大的例外,连政治家们都承认,这个庞大而闪闪发光的黑客玩具正在改变着世界。单单是这个原因(当然还有很多其他好处)你也要学习怎么掌握Web。

再说一次,要成为一名黑客,你必须要进入黑客的精神境地。有些事即便没有计算机也能做,虽然它们不能替代编程(没有什么能替代),但很多黑客都这么做,并能感到这些事在本质上和编程相关联。

  • 学习很好地使用你的母语写作。尽管有一种陈旧的看法认为程序员写作不行,但很多黑客(包括我所知道的那些最优秀的黑客们)写得一手好文章,而且其数量多得让人吃惊。
  • 阅读科幻小说,参加科幻小说集会(这是认识黑客和潜在黑客的好方法)。
  • 研习禅修,并且/或者学习武术。(心智训练似乎在很多重要方面都是类似的。)
  • 培养起对音乐的鉴赏力。学会欣赏一些独特类型的音乐。学习很好地演奏乐器,或者学习如何唱歌。
  • 培养出你对双关语和俏皮话的欣赏能力

最后,不要做这些事:

  • 不要使用愚蠢、浮夸的用户名或昵称。
  • 不要卷入Usenet(或其他任何地方)的网络骂战。
  • 不要自称为“电脑朋克”,也不要浪费时间交往那些自称电脑朋克的人。
  • 不要让你的贴子或email充满错误的拼写和糟糕的语法。

做上面这些事只会给你带来嘲讽。黑客们的记忆力可不差——你将会花费数年时间来让他们忘记你早年误打误撞时犯下的错误。

您的支持是对我创作最大的鼓励!

热评文章