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

好习惯成就一生,坏习惯毁人前程

By Liu Xiaowan

真程序员

通常具备工程学和物理学背景,并常常是业余无线电爱好者

墨菲定律

是一种心理学效应,由Edward A. Murphy提出
主要内容是:如果事情有变坏的可能,不管这种可能性有多小,它总会发生。

Blinkenlights

这是黑客的新词,意为诊断大型机、小型机、更多早起的微型计算机以及现代网络硬件前面板的灯。

1、黑客圈简史

起源

MIT的计算机文化

ARPANET

美国高级研究计划署The Advanced Research Projects Agency Network

它是早期的分组交换网络,并且是第一个实现TCP/IP协议套件的网络。
这两种技术成为互联网的技术基础。
它最初是由美国国防部的高级研究计划署资助。

ITS

Incompatible Time-sharing System
不兼容分时系统

LISP语言

LISP是一种通用高级计算机程序语言,长期以来垄断人工智能领域的应用。LISP作为因应人工智能而设计的语言,是第一个声明式系内函数式程序设计语言,有别于命令式系内过程式的C、Fortran和面向对象的Java、C#等结构化程序设计语言。

也是黑客圈最喜爱的编程语言之一

KISS原则

Keep It Simple,Stupid
原则:在设计中应注重简约的原则。
应用在商业书信、设计电脑软件、动画、工程上。

UUCP

Unix至Unix的拷贝Unix-to-Unix Copy

Unix系统的一项功能,允许计算机之间以存储-转发方式交换email和消息
它是Internet兴起之前Unix系统之间联网的主要方式

Usenet或NewsGroup

新闻组

就是一个基于网络的计算机组合,这些计算机被称为新闻服务器,不同的用户通过一些软件可连接到新闻服务器上,阅读其他人的消息并可以参与讨论。

它是一个完全交互式的超级电子论坛, 是任何一个网络用户都能进行相互交流的工具。

AT&T

美国电话电报公司American Telephone&Telegraph

HURD(GNU/Hurd内核)

GNU Hurd 是一组运行在GNU Mach或L4上的守护进程,用来实现UNIX 实现了的文件系统、网络协议、及文件访问控制等其他功能。

2、大教堂与集市

fetchmail

它是一个下载邮件的应用程序,支持POP2,POP3,APOP,IMAP以及ETRN-capable server.他与其他收件程序(Pine,popclient等等)最大的不同是在从邮件服务器获得邮件后不是直接存入本地信箱,而是将邮件送入本地邮件系统进行再次投递.

两种不同的开发模式:

  • ‘大教堂’模式
  • Linux世界采用的‘集市’模式

两种模式的不同点在于他们对软件排错有着完全对立的认识。

集市模式的成功

nethack

是一款最初在1987年发布的单人冒险探索游戏(Roguelike)。

Emacs

著名的集成开发环境和文本编辑器。Emacs被公认为是最受专业程序员喜爱的代码编辑器之一,另外一个vim。

到底是什么让Linux社区能够源源不断的产生这么多好软件?

- 好的软件作品,往往源自于开发者的个人需要
- 优秀的程序员知道写什么,卓越的程序员知道改写(和重用)什么。
- 计划扔掉一个吧,迟早你会这么做的。
- 如果你有正确的态度,有趣的事情自然会找到你。
- 当你对一个程序不再感兴趣时,你最后的责任就是把它交给一个可以胜任的接棒者。
- 把你的用户当成开发合作者对待,如果想让代码质量快速提升并有效排错,这是最省心的途径。
- 早发布,常发布,倾听用户的反馈。
- 如果有足够多的beta测试者和合作开发者,几乎所有问题都会很快显现,然后自然有人会把它解决。
- 聪明的数据结构配上愚笨的代码,远比反过来要好得多。
- 如果你把bate测试者当做最珍贵的资源对待,他们就会成为你最珍贵的资源。
- 仅次于拥有好主意的是,识别来自用户的好主意,有时后者会更好。
- 设计上的完美不是没有东西可以再加,而是没有东西可以再减。
- 任何工具都应具备预期内的功能,但一个伟大的工具能给你带来预期外的功能。
- 写网关类软件时,尽可能不要干扰数据流,而且绝不要扔掉信息,除非接收方强迫你这么做。
- 想要解决一个有趣的问题,先去找一个让你感兴趣的问题。
- 如果开发协调者有一个至少像Internet这样好的沟通媒介,并且知道如何不靠强制来领导,那么多人合作必然强于单兵作战。

一个部分可行的方案开始,明显要比从零开始容易得多。

在你第一次把问题解决的时候,你往往并不了解这个问题, 第二次你才可能知道怎么把事情做好。所以,如果你想做对事情,至少要再做一次

拥有用户的重要性

用户越多就越能有效对抗系统的复杂性。

早发布,常发布

德尔菲效应(Delphi effect)

一群专家(或一群无知的家伙)的平均观点要比一个随机选择的人的观点更有预见性

也称专家调查法,是一种采用通讯方式分别将所需解决的问题单独发送到各个专家手中,征询意见,然后回收汇总全部专家的意见,并整理出综合意见。随后将该综合意见和预测问题再分别反馈给专家,再次征询意见,各专家依据综合意见修改自己原有的意见,然后再汇总。这样多次反复,逐步取得比较一致的预测结果的决策方法。

Brooks(<人月神话>的作者):对于一个被广泛使用的软件,其维护成本通常是开发成本的40%或者更多

令人惊奇的是,这个成本受到用户数的严重影响,用户越多,发现的bug就越多。

多少只眼睛才能驯服复杂性

  • 宏观上观察到集市模式能极大加速代码拍错和演化
  • 只要有一个对出错条件在源码级别上的提示性描述(即便不完整),大多数bug在大多数时间里很容易被发现
  • Brooks定律:在一个已经延期的项目上增加人手,只会让项目更加延期。随着开发人员数数目的增长,项目复杂度和沟通成本按照人数的平方增加,而工作成果只会呈线性增长

集市模式成功的前提

  1. 可以用集市模式测试、排错和完善项目。

  2. 可以简陋、有错、不完整,文档可以少的可怜。但至少要做到

    • 能运行
    • 让潜在的合作开发者相信,这个软件在可预见的未来,能演变成一个非常棒的东西。
  3. 项目领导人必须要有高度的设计直觉和聪明才智

  4. 一个协调者是否拥有卓越的原创设计能力,并不是项目成败的决定性因素,但他能否能识别出别人的优秀创意,则一定是最关键的。

  5. 在软件设计上表现的聪明而有原创性,容易养成一个不好的习惯:在应该保持软件健壮性和简单性的时候,往往下意识把它弄得既华丽又复杂。

  6. 一个和设计才能有一样重要地位的是:集市项目的协调人或领导人必须要有很好的人际交往和沟通能力。

管理与马其诺防线

  • 未来软件产业的经济关键是服务价值
  • 软件管理的五个功能:
    • 明确目标并让大家朝同一个方向努力。
    • 监督并确保关键细节不被遗漏;
    • 激励人们去做那些乏味但必要的“体力活”。
    • 组织人员部署并获得最佳生产力。
    • 调配项目所需的资源。

软件工程中最广为人知的一条大众定理是:传统软件项目中的60%到70%,要么是从未被完成,要么被他们的用户拒绝。

一个快乐的程序员是一个既没有被浪费也没有被压垮(由于不适当的目标或过程中充满压力与冲突)的人,乐趣预示着效率。

3、开垦心智层

所谓“开垦心智层”,就是每个开源项目创始人所从事的活动。

黑客的礼物文化

即通过付出时间、精力和创意,参与者在竞争中获取声望的文化。

开源世界的矛盾

实际做的和他们所声称的并不一致,也即开源文化的“官方”意识形态和他们的实践并不一致

黑客意识形态的多样性

FSF
自由软件基金会(Free Software Foundation)
是一个致力于推广自由软件的美国民间非盈利性组织。致力于消除对计算机程序在复制、分发、理解和修改方面的限制。

理论宽松,实践严格

Debian自由软件准则
形成了开放源码定义(OSD)
定义指出:开源许可证必须保护任何个人或团体无条件修改开源软件的权利

隐含的规则是:任何人能干任何事,没有任何事情可以阻止人们获得任意开源产品、复制其源码、推进其向不同方向演进,并都可声称是该产品

这种演进上的分化称为“分支”
最重要的特点是它派生出一个随后不能交换代码的竞争项目,并导致开发社区潜在的分裂。

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

开源社区背后隐藏的社会动力学及激励结构

所有权和开放源码

所有权问题

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

  • 官方补丁:由公众认可的维护者发布,人们会接受它并将它合并到软件中;
  • 流氓补丁:由第三方发布,它很少见,且常不被信任。

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

  • 去创建这个项目
  • 获取前任对所有权的移交
  • 一个项目需要维护单项目所有者已经消失或失去兴趣了,如果你想维护该项目,则需要努力找到这个“所有者”,如果找不到,可以在相关场所声明该项目似乎是个“孤儿”,你想为它负责。

Locke及土地所有权

所有者权利和声誉激励

黑客厌恶项目分化的原因

1. 分化钱的项目贡献者会面临声誉风险,若要控制该风险,他们只能在分化后的两个子项目上同时保持活跃,但这通常是不显示的。
2. 分化后的两个子项目有着或多或少平行的演化路线,分支倾向于分裂合作开发者社区,使两个子项目的人手都比父项目的人手更少。

黑客厌恶流氓补丁的原因

1. 发布“流氓”补丁,会让项目所有者陷入声誉风险,即便官方代码是完美的,所有者仍然会因补丁中的bug而被抨击。
2. “流氓”补丁会产生子版本间的兼容问题,会使bug跟踪变得异常复杂,会额外增加维护者的工作流,因为维护者捕捉自己错误的工作量就已经够多了。

谦虚的价值

zero-day warez
在正版软件上市当天就发布出来的破解版本

在学术圈,公开批评他人有缺陷的作品是赢得声誉的重要方式,而类似行为在黑客文化中会被严厉禁止。

声誉竞争模型的推论

  • 相比增量改进现有软件的‘me,too’产品,创意十足的产品会让人获得更多荣誉

    备注:’me,too’产品解释为‘仿造’

  • 开源项目发展的总体趋势的两个倾向

    • 填补空白
    • 类别杀手

GIMP
github开源项目
是跨平台的图像处理程序,是GNU图像处理程序的缩写(GNU Image Manipulation Program)
包括几乎所有处理所需的功能,号称Linux下的PhotoShop

黑客定义

所谓黑客,是一个通过贡献礼物表现出他既拥有技术能力又懂得声誉竞争如何运转的人。

好礼物的标准定义

  1. 如果它不能像我所预期的那样工作,那就不是好的—不管它多么聪明和有原创性

    预期要求:根据项目所处阶段和开发者对该阶段的说明,用户能准确的估计风险。

  2. 在心智层的拓展性工作要比在某功能域内(对现有作品)的重复性工作好。

  3. 能进入主要发行版的作品比不能进入的好,在所有主要发行版中都包含的作品最令人尊敬

  4. ‘使用’是最真实的赞美,类别杀手比同类竞争者好。

  5. 相比那些只挑有趣和简单工作的人,长期致力于艰苦和乏味工作(如调试、写文档)的人更令人钦佩

  6. 重要的功能扩展比低层次的修补好

    拥有全新‘品牌标识’的工作比为已有品牌增添功能更能吸引注意力。

项目组织结构和所有权

子系统所有者

一个合作开发者在承担起维护某个子系统的责任后,通常有机会掌控子系统及其对外接口的实现,其决策仅受项目领导人的修正。

习惯上,如果项目有合作开发者,‘独裁者’或项目领导人应该在关键决策上征询合作开发者的意见,尤其当决策关乎某个合作开发者所“拥有”(也即投入了时间并为之负责)的子系统时,一个有智慧的领导者,会认识到项目内部财产边界的作用,不会轻易干扰或推翻子系统所有者做出的决定。

一些非常大型的项目则完全抛弃了善意独裁者模型,其做法是将合作开发者转为投票委员,或是在资深合作开发者内部轮流掌权。

然而这些组织形式非常复杂,并被认为是不稳定和运行困难的。

冲突和冲突的解决

设计权的分布和所有权的分散会导致项目角色复杂性的增加。

优点:有效激励分配机制
缺点:稀释了项目领导者的权利,稀释了领导者平息潜在冲突的权利。

解决冲突的方法

  • 责任背后是权利:有关设计的技术争议很少真的引起严重冲突,可由领土规则解决,即责任背后是权利。

  • 资深者胜:如果两个或更多个贡献者有分歧,该分歧在客观上很难解决,并且谁也不拥有该分歧的领土权,那么在整个项目中投入工作最多的一方胜出。

  • 其他情况,由项目领导人来决断。

    若想让这些冲突解决机制生效,需要整个黑客社区愿意执行它们,唯一可用的执行机制是“批判”和“放逐”
    即:公开谴责那些破坏习俗的人,并拒绝和他们再次合作。

文化移入及学术界关联

黑客界多数准则都是通过事例来传承的,很多黑客习俗都是自组织的。

礼物胜过交换

基于声誉竞争的礼物文化可能是通过合作产生(和检验)高质量创造性工作的全世界范围内的最佳方法。

获取最高软件生产力的药方

如果你想获得最有效率的产品,你必须放弃促进程序员生产力。
做好他们的后勤,让他们自己做主,并忘掉最后期限。
在传统的管理者看来,这种几近疯狂的宽容注定失败----但它的确有效,使用这种方法,开源文化正势如破竹的痛击着它的对手。

结论:从习惯到习惯法

魔法锅

礼物文化:通过送出礼物而竞争社会地位