大教堂与集市

Posted on 2021年12月23日周四 技术

思考:最近了解到了两本书APUE (《UNIX 环境高级编程》)和《The Linux Programming Interface》,是对UNIX 和Linux 很权威+详尽的参考书籍。加上自己最近在看《大教堂与集市》 ,了解到了Linux 其实是一个很“混乱”的开源项目,项目本身其实不是在设计好的设计,而是让贡献者的想法被自然筛选,最终去演化好的设计。虽然我没有读过开头说的那两本书,但我想这两本书会着重于说为什么这些设计是好的,但其实这些为什么无关Linux,Linux 只不过是一个不断演进的生态系统而已。

我的启发就是,不是去追求一个完美的设计,而是追求一个可以不断演变的设计,并不断吸纳新的想法去迭代设计,反复尝试多次命中目标的概率,还是要比准备完备却只尝试一次命中目标的概率大吧。

开源的动机

礼物文化

文章说了3 种在不同情况下产生的人类组织体系:

在黑客圈中,智力和时间是接近充裕的,除非你的领域足够深,那么你可以对内形成命令体系,对外形成自由市场,在此之前,还是要接受大家的资源差不多的事实。

礼物文化并不是对物质稀缺的适应,而是对物质充裕的适应。充裕性会使命令关系难以维持,会使交换关系变成无意义的游戏。在礼物文化中,社会地位并不取决于你控制了什么,而是你给予了什么。

P.S. 什么是好的礼物

  1. 如果它不能像我所预期的那样工作,那就不是好的——不管它多么聪明和有原创性。
  2. 在心智层的拓展性工作要比在某功能域内(对现有作品)的重复性工作好。
  3. 能进入主要发行版的作品比不能进入的好。在所有主要发行版中都包含的作品最令人尊敬。
  4. “使用”是最真实的赞美,类别杀手比同类竞争者好。类别杀手指作品好到没人再想使用其他备选。
  5. 相比那些只挑有趣和简单工作的人,长期致力于艰苦和乏味工作(如调试、写文档)的人更令人倾佩。
  6. 重要的功能扩展比低层次的修补好。这也说明社区会动态分配bug 的优先级,没人关心的bug 自然不会有人修复,修复得到的回报也少。

自谦的领导者

通常开源项目会有一个自谦领导者在不断推动,当然也存在由委员会管理项目的情况。

自谦的好处:

如果一个人慷慨、智慧、公平交易,有领导能力,或者有其他优秀品质,就更容易让人相信和他合作能获得好处。

从进化学角度讲,工匠所具备的努力奋进的性格特点(就像内化的道德)源自于欺骗的高成本和高风险。进化心理学家搜集的实验证据表明,人类拥有专门识别社会欺骗行为的大脑逻辑,我们也很容易明白为什么我们的祖先会因能够识别欺骗而被进化选择。因此,如果一个人希望因为好的人格特质而获得声誉并进而取得好处,但又想避免风险或代价,那么最好的策略也许就是实际拥有而非假装拥有这些特质。(“诚实是最好的策略。") 创造性工作会给创作者带来类似冥想那样的感觉,这点我们不应低估,但工匠的努力奋进至少有一部分是这种内化(其基本特质为“极其认真勒奋” 或类似的能力)的表现。

积极的参与者

有乐趣的工作既不是太容易而让人无聊,也不是太困难而无法完成。一个快乐的程序员是一个既没有被浪费也没有被压垮(由于不适当的目标或过程中充满压力与冲突)的人,乐趣预示着效率。

“与完全出于兴趣的工作相比,被委托的工作通常表现出较少的创造性”、“活动越复杂,就越容易被外部的报酬损害。”、该研究还指出,固定工资不会降低人们的积极性,但计件工资和奖金会。对任何一个任务,如果它更像是手段而不是它本身的话,往往会降低人们的积极性。

自己在工作里也经历过类似的项目,种种过多的外部报酬和复杂的项目流程,对人们的积极性造成了重大影响,最后项目流产。

开源的优势

分布式、扁平的评审机构

开源世界最擅长的就是去中心化的同行评审,所有那些致力于细节不被疏漏的传统流程在它面前都会失效。

远见源自个人,其周遭社会机器的最好做法,就是响应这些有突破性的远见—滋养、奖赏并严格测试它们,而不是压制它们。

当然,Kropotkin批判和Linus定律引发了人们对社会组织控制论的更广范思考。比如软件工程的一个通俗理论(Conway定律 )常常被表述为“如果有四个小组致力于开发一个编译器,那么你将会得到一个四步(4-pass)编译器。〞其原始陈述更具一般性:“如果一个系统由多个组织共同设计,那么其设计的系统将不得不成为这些组织间沟通结构的拷贝。”我们可以更简洁地称之为 “方法决定结果”,或者乃至“过程变成产品”值得注意的是,开源社区的组织形态和功能在很多层面上是匹配的。网络就是一切,而且无处不在,不只是互联网,还包括在其上工作的人,这些人形成了一个分布式、松耦合以及点到点的网络,它很优雅地实现了多重冗余和去等级化。这两个网络中,一个节点只有在其他节点想要和它合作时才显得重要。

更进一步,“SNAFU原则 ”(situation normal all fucked up,指事态已经混乱不堪,但从管理上看一切正常。)预测在权力组织中,决策者和现实情况会越来越脱节,因为决策者会听到越来越多好听的蔬言。在传统软件开发中很容易看到这一点,由于下级有强烈的动机去隐藏、忽略和最小化问题,当这个“过程变成产品”时,软件会成为一个灾难。

平衡功能和交付期限

Linux将实验版和稳定版分开的做法,还有一个与风险对冲相关但又截然不同的作用,那就是解决要命的最后期限问题 (the deadliness of deadlines)。程序员在需求列表不能调整和最后期限不能拖延的双重要求下,会完全顾不上质量,整个工作很可能会变成一团乱麻。哈佛商学院的Marco lansiti和Alan MacCormack证明,放宽这两个限制的任意一个,都会使进度变得可行。

稳定版

一种办法是保持最后期限不变而让需求列表灵活一些,允许某些到最后期限时仍未完成的需求被舍弃,这基本上就是 “稳定版”核心采取的策略。Alan Cox(稳定版核心的维护人)以相当规律的时间间隔将核心发布,但并不保证某个特定bug何时被修复,也不保证实验版中的某个特性何时会搬到稳定版中。

实验版

另一个办法是设定好想要的需求列表,并在其完成时发布,这基本上是“实验版”核心的策略。De Marco和Lister引1用研究结果,指出这个进度策略即是“好了告诉我”wake me up when it's done),这不仅能够保证最高质量,而且就平均而言,与“保守”或“激进”的进度安排相比,它的交付时间更短。

不成熟发布带來的负面影响,会抵消开源通常所带来的质量收益。

提高项目的“统治地位”

黑客厌恶项目分化的另一个原因是,他们惋惜那些被浪费的重复工作—分化后的两个子项目总是有着或多或少平行的演化路线。他们也会注意到分支倾向于分裂合作开发者社区,使得两个子项目的人手都比父项目的人手更少。

Henry Spencer(henry@spsystems.net)指出:通常,政治体系的稳定性与其政治过程的准入门槛高度是成反比的。他的分析值得在这里引用: 对于相对开放的民主制度而言,它的一个主要优势在于,绝大多数潜在的革命者发现通过在系统中工作比攻击该系统更容易让自己向目标前进。但如果既有政觉联合起来“提高门槛”,导致那些较小的不满意团体觉得更难实现自己目标的话,这种优势就很容易被侵蚀破坏。 准入门槛不高的开放过程鼓励参与而非分裂,因为参与者能从中获得成果,而不用付出分裂所需的高昂成本。尽管这种成果可能不像分裂所得成果那样令人印象深刻,但其成本较低,且大多数人都能接受这种折衷。

P.P.S. 如何开发一个好的开源项目

  1. 好的软件作品,往往源自于开发者的个人需要。
  2. 优秀的程序员知道写什么,卓越的程序员们知道改写(和重用)什么。
  3. “计划好扔掉一个吧,迟早你会这么做的”
  4. 如果你有正确的态度,有趣的事情自然会找到你。
  5. 当你对一个程序不再感兴趣时,你最后的责任就是把它交个一个可以胜任的接棒者。
  6. 把你的用户当成开发合作者对待,如果想让代码质量快速提升并有效排错,这是最省心的途径。
  7. 早发布,常发布,倾听用户的反馈。
  8. 如果有足够多的beta 测试者和合作开发者,几乎所有问题都会很快显现,然后自然有人会把它解决。
  9. 聪明的数据结构配上愚笨的代码,远比反过来要好得多。
  10. 如果你把beta 测试着当作最珍贵的资源对待,他们就会成为你最珍贵的资源。
  11. 仅次于拥有好主意的是,识别来自用户的好主意,有时后者会更好。
  12. 通常,那些最有突破性和最有创新力的解决方案来自于你认识到你对问题的基本观念是错的。
  13. “设计上的完美不是没有东西可以再加,而是没有东西可以再减。”
  14. 任何工具都应具备预期内的功能,但一个伟大的工具能给你带来预期外的功能。
  15. 写网关类软件时,尽可能不要干扰数据流,而且绝不要扔掉信息,除非接收方强迫你这么做。
  16. 当你的语言还远不是图灵完备(Turing-complete,在可计算性理论,如果一系列操作数据的规则可以用来模拟任何图灵机,那么它是图灵完备的。这意味着这个系统也可以识别其他数据处理规则集,图灵完备性被用作表达这种数据处理规则集的一种属性。)的时候,语法糖会让你受益良多。
  17. 系统的安全性只取决于它所拥有的秘密。谨防虚假的秘密。
  18. 想要解决一个有趣的问题,先去找一个让你感兴趣的问题。
  19. 如果开发协调者有一个至少像Internet 这样好的沟通媒介,并且知道如何不靠强制来领导,那么多人合作必然强于单兵作战。

开源的商业模型

软件的价值

软件的价值是使用价值而不是销售价值,所以以使用价值来收取软件的费用是更合理的。现在采用销售价值的软件已经越来越少了。

使用价值模型

间接的销售价值模型

何时开源?

如果满足下面这些条件,就该考虑把源码开放:

  1. 可靠性/稳定性/可扩展性非常重要。
  2. 除了独立的同行评审,没有其他便捷易行的方法验证设计和实现的正确性。
  3. 该软件对客户的业务非常关键。
  4. 该软件创建或运转一个公共计算或通信基础架构(开源后产品可以迅速成为事实标准)。TCP/IP,万维网。
  5. 关键方法(或能实现等同功能的方法)属于公共知识(开源后可以降低竞争对手出现的概率)。

开源的其他优势

吸引精明的客户以及那些还没有足够大到可以独自投资竞争性开发的潜在盟友。如Android。

开源项目可以有效防止闭源产品制约市场,能重置竞争并让新进公司从劣势领域转至优势领域里。如网景和IE 的竞争。

竞争者花在复制和理解上的时间,将会占据产品周期的很大一部分,他们本该把时间花在创新和考虑如何让产品差异化的。在一切都变得更快的互联网时代,这种效应更明显。如果你确实走在前面,他们的剽窃会正中你的下怀。

我觉得还有一点就是降低竞争者(潜在合作者)的准入门槛,这是把蛋糕做大的方法之一?如波士顿动力?

对未来趋势的判断

随着时代发展,越来越多的中间件会进入基础架构的领域(完全开源),成功的应用也会因不断的分层和解耦慢慢进入中间件的领域。可以预期,由于开源的存在,任何软件技术的最终命运不是灭亡就是成为开源基础架构的一部分。

个人点评:正因此自己觉得开发者做业务的ROI更高(相比做infra),senior 之后高门槛,可替代性小,可以获得转到manager 的选择。

作者推广开源的经验

这个人一方面和CEO 们秘密往来,一方面站在屋顶又唱又跳大喊大叫地吸引记者,不断刺激媒体直到这个机器的齿轮碾出一句:革命来了!

注意力策略

围绕“吸引人的不一致”来煽动人们对传道者的好奇心,然后充分利用这种好奇心来推广想要推广的理念。 “最高水平的挑逗”:在采访中兴致盎然地谈论起我对枪支、无政府主义以及巫术的兴趣,同时尽可能让我看起来体体面面、充满童心并且拥有典型美国式的阳光心态。诀窍在于,语出惊人但却传达出让人放心的诚实和单纯。

推广策略

  1. 忘掉自底向上,开始自顶向下。自底向上难以抵抗市场统治者的营销。
  2. Linux 是我们最好的例证。如果推广Linux 都不能成功,那推广其他开源软件也不会成功了。
  3. 抓住财富500强。财富500强不只是有钱,而且有集中和相对容易获取的钱。
  4. 赢得哪些效劳财富500强的有威望媒体。
  5. 说服黑客,游击市场。集团内部达到统一。
  6. 使用“Open Source”认证标识,保持纯净度。防止不怀好意的他人窃取革命成果。

黑客的格调

如果你是因为没有生活而被编程吸引,那也没什么—至少你不会茫然无措。然后,也许你会因此而找到生活。

要多做

这些只是作者的观察结论,至于为什么并不清楚,作者觉得这可能和左右脑技能的结合有关。(黑客不仅需要有很强的逻辑推理能力,而且要能够很快从问题的具体逻辑中跳脱出来)。

不要做

Others

互联网成为主流后,黑客文化开始受到尊敬,并有了一定政治影响力,1994年到1995年问,黑客的大规模强烈抗议,使得试图将 “强加密”算法置于美国政府控制之下的Clipper提案无疾而终。1996年,黑客动员起广泛的同盟,导致所谓的 “通信合宜法”(CDA)被废止日,阻止了政府对互联网的审查。

就在刚刚自己看了《互联网之子》纪录片,让SOPA法案破产的一个关键因素就是Wikipedia、Reddit 和其他互联网服务商用关停服务的方式表达对SOPA的不满。

黑客要“太懒以至于无所不能”。