大教堂与集市

相较于自由软件中“自由”这个词,“开源”,是一种策略。开源开发模式,也是弱者对抗强者的策略。

Linus Torvalds领导的集市队伍先于Richard M.Stallman领导的教堂队伍,开发出类UNIX操作系统内核——Linux。作者(Eric Raymond)从Linux项目的成功经验中,提出了“开源开发模式”的理论,并阐述了商业化项目是否该开源。

开源运动(Open Source)肇始于1998年,网景公司将网景浏览器开源(为了防止微软扭曲开放标准的Web协议)。现如今,IE浏览器已经没落,微软也收购了GitHub,真是世事难料啊!

文摘

开源软件系统性地利用开放式开发和分布式同行评审(peer review),不仅降低了成本,还提高了软件质量。

大教堂与集市

“大教堂”模式和“集市”模式的根本不同点在于二者对软件排错有着完全对立的认识。

Brooks定律:“在一个已经延期的项目上增加人手,只会让项目更加延期。”,它的假设是:项目的沟通结构是一个完全图,即人人之间都沟通。

在“集市”模式中,开发者和测试者基于源码共享同一个表达模式,并能进行有效的交流。外围开发者(beta测试者和潜在的贡献者)实际工作在分散而并行的子任务上,他们之间几乎不交流;代码修改和bug报告都会流向核心团队,只有在那个小的核心团队里才会有Brooks开销。

开发箴言

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

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

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

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

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

  6. 把你的用户当成开发合作者对待,如果想让代码质量快速提升并有效排错,这是最省心的途径。

  7. 早发布,常发布,倾听用户的反馈。

  8. 如果有足够多的beta测试者和合作开发者,几乎所有问题都会很快显现,然后自然有人会把它解决。

  9. 聪明的数据结构配上愚笨的代码,远比反过来要好得多。

  10. 如果你把beta测试者当做最珍贵的资源对待,他们就会成为你最珍贵的资源。

  11. 仅次于拥有好主意的是,识别来自用户的好主意,有时后者会更好。

  12. 通常,那些最有突破性和最有创新力的解决方案来自于你认识到你对问题的基本观念是错的。

  13. “设计上的完美不是没有东西可以再加,而是没有东西可以再减。”

  14. 任何工具都应具备预期内的功能,但一个伟大的工具能给你带来预期外的功能。

  15. 写网关类软件时,尽可能不要干扰数据流,而且绝不要扔掉信息,除非接收方强迫你这么做。

  16. 当你的语言还远不是图灵完备(Turing-complete)的时候,语法糖会让你受益良多。

  17. 系统的安全性只取决于它所拥有的秘密。谨防虚假的秘密。

  18. 想要解决一个有趣的问题,先去找一个让你感兴趣的问题。

  19. 如果开发协调者有一个至少像Internet这样好的沟通媒介,并且知道如何不靠强制来领导,那么多人合作必然强于单兵作战。

让我看你的流程图但不让我看表,我会仍然搞不明白。给我看你的表,一般我就不再需要你的流程图了,表能让人一目了然。

—Fred Brooks《人月神话》第9章

开垦心智层

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

自称是黑客不代表你就是黑客,只有其他黑客认为你是黑客,你才是黑客。

开源文化的禁忌

  • 分化一个项目会遇到强大的社会压力,只有在极为必要的情况下才使用,而且要重新命名和做出大量的公开解释。

  • 在没有项目主持人认可的情况下发布更新是令人不悦的,除非是特殊情况(如本质上不重要的移植bug修复)。

  • 在项目历史、致谢表或维护列表中移除某个人的名字是绝对不可以的,除非当事人明确表示同意。

追求声誉的意义

  • 在同侪中拥有好名声是一种最基本的激励,我们都渴望体验它。

  • 声誉是很好的吸引他人注意和合作的途径。

  • 如果你所处的礼物经济和交换经济或命令体系互相关联交织,你的名声就可能传播到后两种环境中,使你在那里获得更高的地位。

什么才是好礼物

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

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

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

  • “使用”是最真实的赞美,类别杀手比同类竞争者好。

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

  • 重要的功能扩展比低层次的修补好。

魔法锅

满足以下条件,就该考虑开源

  • 可靠性/稳定性/可扩展性非常重要

  • 除了独立的同行评审,没有其他便捷易行的方法验证设计和实现的正确性

  • 该软件对客户的业务非常关键

  • 该软件创建或运转一个公共计算或通信基础架构

  • 关键方法(或能实现同等功能的方法)属于公共知识

有时,开源的直接目的不是为了收入增长,而是为了闯入与重塑市场:

  • 用成本分摊做竞争武器

  • 重置竞争

  • 扩大水池

  • 防止锁喉