阅读视图

发现新文章,点击刷新页面。

《流计算系统图解》书评

上周,我收到清华大学出版社编辑寄来的新书《流计算系统图解》。趁着周末的功夫,我快速浏览了本书的主要内容。一句话评价:值得一读,尤其是对开始开发流计算任务或系统一到两年,初步实现过一些功能或作业,但是还没有对流式系统建立起系统认识的开发者。

cover

本书作者是两位 Apache Heron (incubating) 项目的 PMC 成员,Heron 是源自 Twitter 的计划取代 Storm 的流计算系统。据称,两位原本是打算写一本 Heron 的系统介绍,但是考虑到绑定具体系统,很难公平地介绍清楚流计算的基础概念和实现方向,最终选择以图解的方式讲解流式系统的设计重点和难点。

巧合的是,Heron 项目社群后续发展不顺利,已于今年一月放弃孵化。本书不局限于特定项目的定位,反而使得它能够在今天仍然有足够的价值被翻译。

本书译者是傅宇、黄鹏程和张晨。这几位都是流计算系统的专家。如果有读者关注数据处理系统的出版,可能还会知道他们合作翻译过另一本著作《Presto 实战》。应该说,这几位译者在 Data Infra 领域的经验和外文著作翻译的经验都是值得信赖的。

回到这本《流计算系统图解》上来。

本书一大特点就是书名点出的以图解方式介绍流计算系统。流计算作业通常包括多个阶段,每个阶段可以设置并行度,不同阶段之间可以用多种方式连接。一旦流计算作业运行起来,其不同阶段的算子通常会长时间运行,从而形成一个长期在线的流计算执行拓扑图。事件如何产生,如何在不同算子之间流转,连续事件处理的顺序和跨越算子不同扇入扇出时的分发机制,不画图可能还真说不清楚。

本书的另一大特点是提供了各个章节系统讲解的在线参考代码。两位作者删繁就简,设计实现了一个简单的流计算参考系统,并在概念讲解中穿插基于这个系统的实例演示。我在浏览过程中针对一些有趣的主题测试过这份在线代码,应该说,两位作者是用心设计的,读者可以阅读代码理解流计算系统的基础结构,也可以做一些 HACKING 验证书中提出的一些发散的问题和想法。

下面介绍一下本书各个章节的关注点,并附上我写过的文章或者相关章节参考资料。

第一章和第二章是对数据处理系统和流计算系统的简介和 Hello World 示例。

第三章介绍了流计算中的数据并行和任务并行。

这个主题非常重要。因为流计算要想在大数据量下取得良好的延迟和吞吐体验,合理的并行设计是必不可少的。并行的策略会影响数据分发的形式,事件处理的顺序和算子状态的管理。

第四章讨论了流计算作业的拓扑结构。主要介绍的是 DAG 的形式,以及不同算子对应的扇入扇出及其性质。

DAG 也是流计算系统主要支持的作业拓扑结构,目前最热门的流计算系统 Flink 实现的也是 DAG 拓扑结构的作业调度。除此之外,可以补充阅读 Naiad 论文。这篇论文里介绍了用于流图上迭代计算的环结构,其开源实现是 Timely Dataflow 库,被用在流数据库 Materialize 上。不过上次看的时候,Materialize 并未利用上 Timely Dataflow 的迭代计算能力,现如今也不标榜自己是流数据库了,令人唏嘘。

第五章讨论了流计算作业的事件送达语义,即经典的至多一次(At-Most Once)、至少一次(At-Least Once)和恰好一次(Exactly Once)。

书中点出了恰好一次根本是实际一次(Effectively Once),即是通过重试和幂等实现的,而不是真的只投递一次消息并能确保下游收到。这个认识对理解恰好一次语义是至关重要的。

关于流式系统中的恰好一次语义,我也写过一篇文章 Exactly Once 做讨论。其他参考材料如下:

第六章是对前面几章的总结和开启第二部分进阶话题的序章。

第七章讨论了流式系统中的窗口计算。窗口其实可以理解成流计算中的攒批计算,跟批处理中的微批模式形成某种对偶。不过,窗口计算有着语义上的需求,而微批模式主要是性能上的需求。

关于窗口计算和水位线,我写过 WindowWatermark 两篇文章。其他参考材料如下:

其中,The Dataflow Model 是 Google 流计算的经典论文,Dataflow 模型的开山之作。这篇论文当中,主要讨论的就是如何设计和实现一个带窗口计算的流计算系统。

第八章讨论了 JOIN 操作,主要涉及到流和表的共轭关系或者说数据的流表二象性。

本书从算子扇入扇出切入,把 JOIN 作为一种特殊的扇入方式引进,还是比较自然的。现实世界中,最复杂的流计算就是涉及双流 JOIN 或维表 JOIN 的计算。书中先从表是流的物化视图引进,接着讨论不同类型的 JOIN 对应的效率和数据完整性考量。

这部分内容涉及《流式系统》整个第二部分,足以见其复杂

第九章讨论了反压。前面提到,流计算系统通常是长期在线运行的系统,因此它需要应对潜在的在线流量洪峰。

反压实际上是一个在线系统实现层面的细节,并不完全跟流计算系统相绑定。关于反压的问题,我推荐 Flink China 社群早年录制的一个教程《Flink 网络流控与反压剖析》

第十章讨论了有状态计算。实际上,在前面讨论送达语义、窗口计算和 JOIN 操作的时候,或多或少都涉及到了流式系统中的状态管理。

领我入门流计算领域的施晓罡博士说过,Flink 的创造性价值,不在于流计算,而在于实现了带状态的流计算。把状态管理内化到流计算系统的设计当中,解决了 Storm 等系统依赖外部状态存储导致的数据一致性很难保证的问题。直到今天,Flink 官网上巨大的 Slogan 仍然是:数据流上的有状态计算。

flink-homepage

关于这个主题,我写过一篇文章 State 讨论。其他参考资料如下:

第十一章终章是对前面章节的总结和展望。

关于其他流式系统的参考资料,我写过一份书单《流式系统阅读指南》

最后,我想引用《流计算系统图解》最后一节的内容,给有志于深入学习和实践流计算系统的读者分享一些参与方向:

挑选一个开源项目来学习,甚至直接参与到开源项目当中。

开源运动让我们平等地接触到业内领先的流计算系统。它们的代码实现和设计文档,甚至设计过程的讨论和用户使用的反馈都唾手可得。学习流计算从来没有一个时候像现在这样简单。

  • Apache Flink 无可争议的顶级开源流计算系统。
  • Apache Spark 无论如何,Spark Streaming 的用户基数还是很大的,并且它也确实适合一些流计算的场景。
  • Apache Beam Dataflow 的开源实现。
  • RisingWave 译者之一傅宇参与的开源项目。虽然项目还很年轻,缺乏生产案例,但是这也意味着巨大的技术实践空间。我推荐它主要是因为项目设计文档丰富详实,以及核心开发者们乐于分享和交流。
  • Materialize 这个并不是开源软件,但是源码可以自由阅读。同时代码仓库中也有非常丰富的设计讨论和文档。

开始写博客,传授你所学的知识。

上面的参考资料中包括了不少我自己写的博客。在流计算的国内传播上,云邪的博客起到了很大的作用,不少人第一次深入了解流计算就是从阅读他的博客开始的。另外,林小铂的博客也值得一读。当然,还有 Flink 的博客。主动分享和交流是开源开发者技术进步的阶梯。

参加聚会和会议。

Flink Forward 大会几乎每年都会在中国举办。此外,随着 RisingWave 和一系列 MQ 社群的崛起,流计算相关的聚会和会议只会越来越多。

永不放弃。原文写到:

要实现任何卓越的目标,都需要经历一次又一次的失败。接受失败,这将使你变得更优秀。

流式系统阅读指南

本文从软件系统、学术论文和出版书籍三个方面介绍研究学习类似 Apache Flink 的流式系统的参考材料。

软件系统

现实世界的软件系统都是以生产可用为目的的。因此,其代码、文档和讨论不局限于流式计算本身,还有许多分布式系统共通的话题。在这里,我会强调其中和流计算相关的内容。

Apache Flink

Apache Flink 大约是国内目前知名度最高的流式系统。要想了解它的流式计算设计,最好的办法是从用户编程接口切入。它提供了两套编程接口,一套参考了 Dataflow 论文的设计,另一套则是致力于兼容和扩展 SQL 标准。

具体的 API 指南目录下,涉及时间(Time)和状态(State)的章节是流式计算核心的差异点。

核心文档章节

此外,Flink 还有 Flink Imrpovement Proposal (FLIP) 页面记录和核心设计决策,这里同样介绍流式计算与众不同的一些。

Apache Spark (Structured Streaming)

Apache Spark 对标 Flink 的流计算方案,这里仅放几个相关链接。

Apache Beam

Apache Beam 是 Google Dataflow 论文的开源实现。不过这个系统仅实现了论文当中的模型概念,实际执行计算需要编译到 Flink、Spark 或者 Google Cloud Dataflow 上。下面文档介绍了 Dataflow 论文当中的领域模型是如何落实到 Beam 的代码中的。

Materialize

Materialize 是一个专有的流数据库。底下执行逻辑基于 Timely DataflowDifferential Dataflow 搭建,Materialize 上层做了一个 Postgres 模型的 SQL 层。

它是微软研究院 Naiad 系统的转世。不过目前通过 SQL 暴露出来的功能还完全没有用上 Timely Dataflow 尤其 Differential Dataflow 的核心能力,到底能不能跑起来集群,集群容错效果如何,都是未知数。

上面链接里 Timely Dataflow 和 Differential Dataflow 的页面是对应的用户文档,可以当做是一个标注详解版的论文参考手册,值得一读。

RisingWave

正在开发中的流数据库 RisingWave 也开放了 RFC 文档,其中有不少内容可以借鉴学习。我相信他们的研发人员也乐于和有一定基础的开发者做深入的探讨。

学术论文

首先放一篇调研报告,可以看它引用的论文。后面的是一些我有印象的相关论文,可以看被引用的关系。

出版书籍

流式系统

大名鼎鼎的《流式系统》其实是 Dataflow 论文的一个超级加长版,扩充了流表二象性和流式 SQL 的内容,必读。

Fundamentals of Stream Processing Application

Fundamentals of Stream Processing Application 是基于 IBM InfoSphere 系统介绍流式系统的著作,讲透了很多基础的 Streaming 概念,必读。

基于 Apache Flink 的流处理

Stream Processing with Apache Flink 一本主要介绍流式处理定义、场景和 Flink 的 DataStream API 的书籍,有中文译本。

Apache Spark 流处理

Stream Processing with Apache Spark 对标 Flink 的书,讲的是 Spark Structured Streaming 的版本。

设计数据密集型应用

《设计数据密集型应用》 介绍了通用的分布式数据密集型应用的特点,如果你想参与现实世界的流式系统开发,这本书介绍的内容也不可错过。

数据库系统内幕

《数据库系统内幕》 介绍了数据在存储系统上的组织和多年来发展出的数据库查询及事务语义。今天,一个流式系统要想走近用户群体,支持 SQL 和经典数据库语义是不可或缺的。另外,当前流式系统主要面临的问题,就包括状态和中间结果的存储问题。流数据库的物化视图及其级联,就是中间结果的存储和访问问题。

互联网企业服务架构书单

春节在家整理存书,发现了当时在拼多多做业务开发工作的时候,用来帮助理解互联网企业服务架构的若干书籍。这些书里的技术方案可能有一定的落后,但是对于帮助新入职场的互联网公司程序员,了解一个典型的互联网企业核心服务架构,以及治理服务和分化出数据团队的过程里会发生的技术服务体系变化,还是很有帮助的。这里做一个分享。

企业 IT 架构转型之道

本书副标题是“阿里巴巴中台战略思想与架构实战”。

虽然所谓“中台战略”最近多有批评,但是“中台”占据的功能,实际是每个业务在成长过程里都会需要的,不同之处不过是业务线或事业群自己做还是依赖“中台”提供。从互联网企业的发展历程来看,阿里巴巴的“中台战略”影响甚广,所以放在第一位介绍这本讲“中台战略”最言之有物的书。

本书从阿里巴巴中台的起点,共享业务事业部出发,讨论了共享服务体系包含的微服务治理,数据库拆分和业务层面的事务一致性,日志、监控和可观测性,平台稳定性或者叫网站可靠性(Site Reliability)等方面的实践。目前的电商平台生态,深受这一套体系的影响,加入任何一家大厂或者垂直厂商,都会面对类似的技术架构。

本书主要价值就是介绍上面这些实践和顶层视角下各个治理体系之间的关联的第二部分“共享服务体系搭建”。第一部分介绍背景稍微可读,第三部分输出案例基本就是营销,不读也罢。其他阿里系的图书,例如《淘宝技术这十年》、《尽在双十一》和《逆流而上》也都是侃侃而谈为主,没有什么特别的价值。

携程架构实践

接下来的两本书就是企业服务架构实践里比较扎实的。

第一本是携程的架构实践。携程虽然不是典型的电商企业,但也是一家平台型企业,同样要支持用户、提供商以及关联两者的订单这些经典系统。

本书介绍了一系列携程内部用于提供共享服务能力的自研软件,以及它们如何在业务流程当中发挥作用。除去经典的服务治理、数据库和监控问题以外,本书比较独特的是介绍了网关、负载均衡和内容分发的技术,详细展开了网站可靠性的实践,以及一个具体的客服服务实例。

决战 618

第二本介绍具体企业服务架构实践的书就是这本京东的《决战 618》了。

比起上面两本书以基础服务维度展开服务架构讨论,这本书以具体的一个个业务服务来展开服务架构的讨论。京东支付、京东交易、物流履约、开放平台和搜索、广告、推荐(搜广推)落地业务,对于有意在业务线上发展成为架构师的程序员来说大有裨益。

京东在一众电商企业里的特色就是自建物流,所以本书用了一整章的篇幅讨论了供应链和物流的问题。业务数据对独立服务提供商(ISV)开放和业务逻辑对搜广推的依赖,也是业务部门而非“中台”部门独有的视角。

超大流量分布式系统架构解决方案

最后介绍的一类书籍,不是特定企业的实践或者经验分享,而是 Tech Leader 或者架构师根据自身经验总结出来的大型网站会面对的通用技术挑战。

这类作者写书的特点,会聚焦在具体技术问题的挑战和解决方案上。如果说前面三本书像是高屋建瓴的制定战略和划分业务,那么最后这三本书更像是一个一线业务 Leader 维护平台服务每天都会遇到和解决的问题的工程笔记。

第一本书《超大流量分布式系统架构解决方案》主要分成五个部分:

  • 大规模服务化架构
  • 全链路压测
  • 流控方案
  • 读写优化方案
  • 分库分表方案

从内容覆盖范围来看,没有逃出前面三本书都包含的服务治理、数据库和网站可靠性这些主题。但是本书谈服务治理,不是讲它的背景和抽象价值,而是就像一个实际维护了若干个服务,不时有上线新服务需求的业务 Leader 一样,讨论这些维护工作和开发工作里会打交道的概念和常见的处理方案。对于具体开源技术的讨论,则有一个没有足够人力自研基础软件的团队做技术选型的指导意义。当然,本书的技术背景至少也是 5 年前了,其中具体的技术选型不一定还有效,但是选型的考虑方式是共通的。

大型网络系统与 Java 中间件实践

本书作者有阿里阿巴巴背景,同样是一线业务团队负责人视角,介绍了淘宝网这一大型网站架构演进过程中实实在在遇到的技术挑战和解决方案。

本书内容并未深度耦合阿里巴巴或淘宝业务的具体形态内容,这些内容更多是作为实例、案例出现在更一般的技术问题分析讨论当中。另外,本书在技术实现的讨论中都假设业务系统是以 Java 写成的,并直接引用了许多 Java 生态的框架技术。这些内容对于其他语言的开发者来说,会相对比较难迁移。

全书篇章目录如下:

  • 分布式系统介绍
  • 大型网站及其架构演进过程
  • 构建 Java 中间件
  • 服务框架
  • 数据访问层
  • 消息中间件
  • 软负载中心与集中配置管理
  • 构建大型网站的其他要素

同样是包含了服务治理、数据库和网站可靠性这些主题,多了一个对配置中心的讨论。对于配置中心的理解,还可以结合国内著名的开源软件 Apollo 分布式配置管理中心来学习。

深入浅出大型网站架构设计

本书前言就提到,这是一本为学生进入职场准备的书籍。

很多刚从学校毕业的计算机专业的学生,或者通过自学掌握编程技能的非计算机专业的人,往往会发现软件工程师在工作中所做的内容与学校中所学的知识有不小的差异,并且这种差异随着项目规模的增大而增大。一些拥有不错编程基础的从业人员往往也要在从业数年以后,才能逐渐通过积累工作经验来缩小、弥补这种差异。

造成这种差异的主要原因在于,在学校中学习的编程技能侧重于计算机科学的原理及基本的应用,而在工作中,对于一个工程项目软件,为了使其达到商用、大规模使用的条件,软件工程师会采用许多学校中不会重点教学甚至完全不会接触的方式来确保其开发、维护上的高效率和健壮性。本书在网站开发方面,通过总结笔者从业中遇到过的众多案例和项目,精练出一系列职业经验和操作规程,帮助感兴趣的初学者对职业实践有所了解,而编程能力原本就扎实的程序员更可以通过本书获得职场上的即战力。

全书篇章目录如下:

  • 网站架构概述
  • 大型网站架构设计的流程
  • 数据库的选择
  • 数据库优化:分库分表
  • 数据库优化:读写分离
  • 缓存
  • 动静分离
  • 负载均衡
  • 异步和非阻塞
  • 队列
  • 高可用
  • 异地多活
  • 服务降级
  • 限流
  • 下游错误处理
  • 测试
  • 上线准备

我把这本书作为本书单的最后一本收官,也是因为这个知识体系的结构和内容介绍是最后这类贴近实际的书籍里最优秀的。

开源书单 1.0

过去两年间,我全职参与了多个开源项目的社群建设工作,逐渐形成了自己开展社群建设工作的知识体系,并将其发布在开源小镇网站上。

这个过程里,阅读开源主题的书籍对我借鉴成功经验、警惕历史教训和形成分析问题的框架起到了至关重要的作用。这几天频繁切换工作地点,总有几本开源之书不管到哪我都要随身携带,这里做一个推荐。

People Powered

《People Powered: How Communities Can Supercharge Your Business, Brand, and Teams》中文译本非常阿里味地翻译成《用户共创:社区赋能产品实战手册》,我认为是严重影响了对本书质量的第一印象。

本书是《社群运营的艺术》的作者 Jono Bacon 总结又一个十年的社群建设和咨询经验之后的新作。它首先讨论了社群的定义和意义,再对典型的软件社群进行分类,接着从启动一个社群、打造社群体验、确定社群战略与结果衡量等方面出发,详细介绍了社群建设的起点、关键问题和如何持续发展。除此以外,本书还对社群成员如何高效沟通、活动运营与衡量,以及激励参与的方式这些重要的实践问题进行了具体而深入地讨论。

可以说,对于拥有一定软件社群工作经验的从业者来说,如果时间只允许读一本书来扩充自己的社群建设知识,那么就应该选择这本书。

社群运营的艺术

《社群运营的艺术》是《People Powered》作者 Jono Bacon 担任 Ubuntu 社群经理期间总结经验的著作,不同于《People Powered》在积累了多年咨询经验以后的高屋建瓴,本书总体是围绕着 Ubuntu 社群发展建设过程中遇到的实际问题,偶尔宕开一笔联系其他社群的实践经验,讨论一个具体的社群(Ubuntu)的发展历程。

本书第一第二章是高度浓缩的。即使只读了这两章,记住归属感和社交货币的概念,理解社群成员沟通的动机和价值,掌握以小组为社群规划的基本单元的分析视角,对于自己开展社群建设工作也大有裨益。

如前所述,本书没有《People Powered》那样高屋建瓴的分类方法,而是从若干个具体问题出发讨论社群建设过程当中的挑战。我将它们分成两类,一类是社群成员的沟通与社群治理的问题,另一类是社群运营和传播的问题。

讨论社群成员的沟通与社群治理的问题的章节包括第三章《清晰的沟通》、第四章《流程:简单才能长久》、第五章《使用工具和数据支持工作流》、第九章《管理和追踪工作进展》、第十章《治理》和第十一章《处理冲突和关系》。

讨论社群运营和传播的问题的章节包括第六章《社交媒体》、第七章《凝聚人气》、第八章《评估社群》和第十二章《发起和运营活动》。

值得一提的是,本书大陆译名为《社区运营的艺术》,而我常将 community 翻译成“社群”。这是因为“社区”在大陆有独特的行政含义,我于是采用台湾的译法“社群”以避免混淆。

大教堂与集市

《大教堂与集市》可算是开源世界里家喻户晓的著作。

全书由五篇文章组成,中间三篇《大教堂与集市》《开垦心智层》和《魔法锅》分别讨论了开源协同的范式,开源文化与社群治理,以及基于开源软件的商业化方式。

尽管软件行业日新月异的发展为行业带来了诸多变化,但是作者 Eric S. Raymond 的洞察是根本的,直到今天仍然能够准确地勾画出相关议题的分类方法和重要问题。

本书尤其善用各种隐喻形成模因传播。例如,“只要眼睛多,BUG 容易捉”的 Linux 定律,“大教堂与集市”对比两种开源协同方式,“管理与马奇诺防线”的戏谑,等等。本书中译本的价值很大程度上得益于译者卫剑钒的发挥。翻译是对原内容的二次创作,卫 Sir 翻译本书时严谨的态度以及他本人推崇这种模因传播进一步强化了原书的长处,都对《大教堂与集市》成为中文开源的“圣经”起到了不可或缺的作用。

我曾经写过一篇《大教堂与集市》书评对本书做详细议论,阅读本书前后不妨一读。

开放式组织

《开放式组织》是开源商业界的先驱红帽的前 CEO 的著作。本书立足于红帽开源商业化的经验,讨论如何将开源社群的治理方式和协同开发方式融入到组织管理范式当中。

为此,红帽找到的答案是为组织成员构建充满热情的工作环境,提升成员参与度,借用开源社群常见的精英领导制(Meritocracy)激发创造力,进而为组织提供源源不断的创新动力。在这个过程当中,公司的领导团队要做的是从由内而外的广泛参与中兼容并蓄地做决策,成为组织团队的催化剂。

同样,我写过一篇《开放式组织》书评对本书做详细议论,可以一读。

拥抱开源

《拥抱开源》是今年新引进的译本,由 XLab 开放实验室翻译。原书出自红帽的技术布道师 Gordon Haff 之手,2021 年写成,题为《How Open Source Ate Software》。

凭借年代较近的优势,本书着重讨论了近十年来如火如荼的开源商业化浪潮,即开源商业化的软件、产品再到商品的演化逻辑,以及商业化过程中避不开的法律问题。

当然,本书也不可避免地涉及开源开发模式即开源协同的议题,因为“开源也关乎开发”。不过受限于篇幅和侧重点,虽然本书提到了开源社群的角色识别、如何做决定、如何激励参与者,以及社群成员如何沟通的问题,但是大都浅尝辄止,不如前面推荐的两本 Jono Bacon 的书籍那么详细。

对于开源许可证和开源软件的法律问题,这里还要再推荐一本 Elastic License 2.0The Commons Clause 的主要作者 Heather Meeker 的《Open (Source) for Business》

开源文化在中国

最后要推荐一本中国学者的研究著作。《开源文化在中国》是北京大学文学博士范小青教授的著作,记录了她从 2014 年 5 月到 9 月对 28 位中国开源参与者进行深度访谈以后,对以下三个议题的研究分析:

  1. 勾勒中国开源参与者的开源实践形态和行动的面貌,试图揭示开源参与者的行动动机和逻辑,以及总结他们在开源社区中的行动特征。即,他们是谁,他们做了什么,为什么这么做,以及怎么做的。
  2. 归纳总结中国开源参与者的参与文化。本书主要从精神和价值观的角度来归纳参与者的行动与文化,侧重从技术文化、商业文化、社群文化三个角度来进行分析归纳。
  3. 总结分析中国开源参与者的行动与文化之间的关系,以及这种开源文化对我们的意义何在。

全书应当与王宇博士的《开放与共享:开源创新的经济学思考》类似,脱胎于博士论文。行文结构与论文分析方式一般无二,对于想要了解开源文化在中国的落地情况,中国开源参与者的文化视角,这些议题的人提供了一份非常有说服力的材料。

其他

信通院出版的《开源法则》是一本官方视角下的中国开源发展的小书。书中对开源范式的讨论各个方面都不如上面推荐的书籍那么深入,但是在这本书里提到的观点可以认为是目前中国最为广泛接受的关于开源的共识。此外,得益于官方牵头编撰的背景,本书对大厂参与开源的情况公开了不少一手资料。如果想在国内发展开源运动,理解国内生产力先锋队的认识阶段和实践经验,这本书不可不读。

开源之道主编适兕发起的开源之书·共读项目在最近上线了主页,我的开源书单一个重要的来源就是该小组的推荐。虽然“开源之书·共读”的选书多为旁观记录和分析的社会学类书籍,对如何建设(成功的)开源社群的实践性书籍覆盖不足,但是读书多多益善,也只有了解不同背景不同时代不同角度的人是如何思考“开源”这个议题,才能形成自己坚定的开源观。

《纳瓦尔宝典》书评

近日在《大教堂与集市》的译者卫剑钒的推荐下阅读了这本被评价为新时代《穷查理宝典》的《纳瓦尔宝典》,其中有部分观点确实很有启发。卫 Sir 给这本《纳瓦尔宝典》专门写了两篇书评,已经把书中的精华几乎都介绍完全了。我在这里出于自己的理解和感悟,做一点微小的补充。

这本书大致分成四个部分:前言、关于财富、关于幸福,以及额外推荐。四个部分的内容大约是 1:3:3:1 的比例,核心内容很符合书的副标题“财富和幸福指南”。

本文会聊一聊我在阅读此书的过程中在关于财富方面的体悟。关于幸福的箴言我读下来比较笼统,大致是“活在当下”和“关爱自己”。卫 Sir 在第一篇文章当中的 17 个要点里有 5 个要点是关于幸福的,第二篇文章学到的 22 条当中几乎全是关于财富的。我想我不至于在人生感悟和什么是幸福上有超过卫 Sir 的见解,索性不谈。

发挥杠杆,不靠运气致富

纳瓦尔投资过推特,本人是重度推特用户。他最有名的系列推文是“如何不靠运气致富”,直到今天仍然是其推特置顶内容。

这系列推文的落脚点在于“把自己产品化”,也就是利用你的专长和对自己的责任心,发挥杠杆赢得财富。推文中定义“财富是指你在睡觉时仍能为你赚钱的资产”,也就是中文语境下常说的“被动收入”或者“睡后收入”。纳瓦尔认为,如果你的收入完全来自于出卖时间,那么随着年龄的增长,能够投入到这种交易当中的时间和精力都会锐减,从而你的收入不会像拥有优质资产那样随着时间的推移产生复利效应。

获得优质资产的方式就是发挥杠杆的力量。书中将可以致富的杠杆分为三类:

  1. 劳动力杠杆,也就是让别人为你打工。这是一种最古老的杠杆,也是在现代社会发展出创造财富的正和游戏之前,长期的主基调争夺地位的零和游戏所依赖的杠杆。如今,劳动力杠杆对于个人而言可能是最落后的杠杆,因为管理他人是一件非常复杂、极具挑战的工作,需要高超的领导技巧,弄不好管理者会落得个众叛亲离,被手下生吞活剥的下场。
  2. 资本杠杆,也就是用钱来扩大决策的影响力。这是工业革命和资本阶级革命以来创造的新杠杆,也是上世纪创造财富的杠杆的主要形式。管理资本比管理人要容易,但是利用资本杠杆仍然有一定的难度,赢得资本青睐也需要相应的技能。
  3. “复制边际成本为零的产品”产生的杠杆,其中包括书籍、媒体、电影、代码。这是随着信息技术跨越式发展带来的红利。即使是个人,也可以利用蓬勃发展的内容渠道来放大自己的影响力。毫无疑问,纳瓦尔本人就通过推特和本书至少数以百万倍地扩大了自己的影响力。

纳瓦尔发现,第三种杠杆最重要的特点之一就是,使用它们以获得成功无须经过他人许可。劳动力杠杆依赖于其他人的信任和追随,资本杠杆依赖于有人提供资金。然而编程、写书、录播客、发推特、发视频这些事情不需要经过他人的许可。这几乎是一个人可以没有边际成本地成倍放大自己专长的手段。纳瓦尔对自媒体的发展和互联网及其上应用创造价值的能力的洞察力有很强的预见性。

杠杆解决的是从 1 到 100 乃至 10000 的问题,也就是藉由“规模化”来实现自己的“产品化”。然而,致富之路仍然需要发掘自己的专长来实现从 0 到 1 的突破。

纳瓦尔认为,专长可以分为销售技能和构建技能。构建技能指的是每个行业当中创造核心价值的能力,例如工程师之于科技行业。销售技能指的是把概念、理念或者产品“卖”给其他人的能力,包括销售商品,也包括市场营销、媒体传播、人才招聘、资金募集、员工激励、公共关系等等。专长是自己的兴趣所在,你能够轻松地掌握,然而社会却很难通过培训让另一个人快速地掌握同样的技能来取代你。如果一个人能同时掌握构建技能和销售技能,那么他在这个领域当中将势不可挡,或者说即使一开始只有一个人,但是很快也能集结和发挥出一个团队的力量。

纳瓦尔主张通过创业或者参与到创业过程当中赢得财富,这两者的共同点是拥有企业股权。纳瓦尔认为,能够产生被动收入的优质资产几乎都来自于企业股权。当然,并非所有企业都会成功,也就是说前一句话反过来不成立,不是所有企业股权都是优质资产。纳瓦尔认为,你应该在充分了解自己专长的情况下想方设法创业或者参与到创业过程当中去,勇于承担责任以取得相应的杠杆。一个好的领导者需要承担责任并带领团队取得连续的胜利,以赢得个人的信誉和财富奖励。

然而,承担责任也意味着当事情走向失败的时候,责任人会首当其冲。纳瓦尔认为,这类风险当中,唯一要避免的就是身败名裂的风险。

避免身败名裂的意思就是不要锒铛入狱。所以,不要做任何违法违纪的事情,任何事都不值得拿自己的自由和声誉去冒险。要避免一败涂地的灾难性损失。避免身败名裂也意味着不要做那些可能会威胁自身安全或健康的事情。你必须照顾好自己的身体。不要做可能会让你全盘皆输的事情。不要孤注一掷、铤而走险。相反,要把赌注压在那些胜算较大、能带来巨大利益的事情上。

这也是创业过程当中要保持的底线思维,大部分人没有经受一次身败名裂的抗风险能力,因此在绝大多数情况下都应该谨记“狡兔三窟”的智慧,而不是眼睛一闭、孤注一掷、放手一搏、铤而走险。

对抗诱惑,利用空闲时间

现代斗争:孤独的个体召唤出非人的意志力,进行断食、冥想、锻炼……对抗大批科学家和统计学家以充足的食物、药物和电子屏幕为武器制造出的垃圾食品、标题党新闻、无限的色情内容、无穷无尽的游戏、令人上瘾的毒品。

毫无疑问,现代社会信息量大爆炸,每天产生乃至只考虑通过手机和各种媒介推送到一个人面前的信息已经远远超出一个人所有的精力。如何对抗这些时间杀手,赢得属于自己的可支配时间,是每个人都需要面对的挑战。

过去,诗歌当中也写到“劝君莫惜金缕衣,劝君惜取少年时”,或者是“莫等闲,白了少年头,空悲切”。但是那时人蹉跎时间的主要原因,是在缺乏足够的知识和信息输入的环境下,平白无故地浪费时间。如今人们面临的问题是大量信息一股脑地推送到眼前,每一个应用都迫不及待地想要打断你正在做的事情,让你把时间花在它们身上,尤其是各类存在上瘾性的图片、视频、直播。

纳瓦尔提到,你需要以非人的意志力来对抗这些内容,把时间和精力花在少数对自己有意义的事情上。大学期间,我的数学分析课程老师讲过,如果每天起来你无事可做,这是很糟糕的;但是如果每天起来你发现有太多的事情要做,以至于不知道从何下手,这也是很糟糕的。这也许是现代版的“过犹不及”。现代人不愁找不到消耗时间的娱乐,面临的难题几乎总是如何减轻自己认知和精力上的负担。

纳瓦尔还有一个有趣的观点,“只有在你感到无聊之后,才会有伟大的想法。好的想法从不会在你充满压力、忙碌、四处奔波或仓促的时候出现”。我本人可以佐证这一说法的真实性。只有在充分放松的环境下,思维才有可能不受限制地遨游,灵感才有可能自由地迸发。

知识劳动者的时间安排与运动员如出一辙,有训练和冲刺的时间,也有休息和重新评估的时间。

这一点在《卓有成效的管理者》《人件》当中都有提及。这也是我个人倾向于远程办公的重要原因之一,我在办公室几乎无法拥有彻底放松的时间,也就不会有接下来长达几小时的“心流”式的集中工作的时间。例如现在是早上八点钟,而我花在写作这篇文章上的时间已经过去了一个半小时。如果今天我需要过去办公室上班,此时我所想的唯一的事情就是再睡一会。

学习决策,锻炼判断能力

我在深度参与了企业创业和开拓新业务的过程之后,深刻理解到了构建能力是做成一件事情的必要条件,而判断和决策能力是能否充分发挥出自己和团队构建能力的决定性因素。

我们的教育主要教授的是在相对确定的条件下做出判断的能力,也就是所谓的做题家思维。然而,开拓一个崭新的业务,创造属于自己的企业和事业,绝大多数情况下要求你在极度不确定的情况下做决策,也就是所谓的灰度决策。这种情况如此新颖和重要,正是纳西姆·塔勒布的《黑天鹅》《反脆弱》系列图书流行的原因。

纳瓦尔认为,你应该锻炼自己的决策判断能力。这种能力的核心要点就在于诚实地面对客观条件。

创业过程当中,绝大多数人都会过分乐观地估计自己遇到的问题。我们的文化倾向于维持一团和气,因此即使“事情似乎有些不对”,也很少有人站出来批评。哪怕有人站出来批评了,往往秉承“和光同尘”原则的组织风气也会倾向于“各打五十大板”式的“两边都有错”或者“两边都没错”。传统文化上,我们简称之为“和稀泥”。这也是我经常遇到的情况。

我本人的交流模式是相对武断的,但是从来都欢迎别人抨击我的观点。可以说,在我发现自己认识错误的那一刻,光速土下座的流畅程度已经登峰造极。当然,很多议题并非一定要分出个对错或者一定有对错,我的做法是秉承“君子和而不同”的原则积极交流,只有坦诚地交流才能碰撞出好想法,不一定要在谈话对象之间达成一致。

另一个在不确定性的世界当中高效决策的要点,是把握委托和代理的边界。本书当中,“委托”的意思是自己成为委托人,也就是自己去做一件事情,这会带来主人翁的责任感;“代理”的意思是成为被他人委托的代理人,因为本质上是在为别人做事,那么一旦你的利益和委托人的利益产生冲突,做事的结果就可能很糟糕。

创业公司常讲 ownership 的概念,跟这里想表达的意思是一致的。往往创始人和创始团队对组织有较强的 ownership 意识,这种主动性足以让人把事情做得相当出色。开源社群的协作就是基于这样的设计,同时突出了这种 ownership 意识所需要的土壤,即充分的信任和授权。

Apache SkyWalking 的创始人吴晟在推特上提到过,机制保证,和防范措施是一个非常公司角度的看法。开源是一个基于贡献和信任的环境,传统的“人必作恶”的思路不适合。开源社群生产高质量开源软件的保证,主要是参与者的责任心。完成任务和认真艺术化的完成,绝对是天差地别。

我在 PingCAP 的某次分享会上,也提到过我们到底是以一个打工人的心态在不情愿地写代码,还是作为 TiDB 的共同作者在打造高水平的开源软件,这是我们能否冷启动开源开发者社群的重要评判标准。没有人比创业团队更在乎自己的产品,如果核心团队成员在决策模型上都把自己当做被委托的代理人角色,那么事情是办不成的。

从决策者的角度看,如何合理地决策委托自己和委托他人,决定了能否将自己有限的时间投入到优势领域上,将团队成员的时间投入到他们各自的优势领域上。如果一个决策者事必躬亲,那么哪怕他能够通过某种方式聚集到愿意追随他的人,劳动力杠杆也是不工作的。因为在他自己搞明白一件事情之前,这件事情不可能有任何进展。这种情况下,团队的上限就被这位决策者完全限制住了,而个人的上限尤其在分工日益复杂的现代社会当中是非常有限的。

最后,有一个“万能”的判断法则:

如果你难以抉择,那答案就是否定的。

注意人品,坚持核心价值

纳瓦尔在书中提到了四个核心价值观,除去最后一个“愤怒是毫无意义的”对我来说没有深刻的冲击力,其他的三点都是我自己自觉不自觉的坚持的准则。在书中看到以文字形式明确地说明这些价值观,很有共鸣。

第一个核心价值观是诚实。诚实听起来是一个简单到陈词滥调的品质,但是实际做到却不容易。对我自己而言,诚实恰恰是容易被证明的,而不需要长篇大论。我不喜欢故意隐瞒或者欺骗,因为为了圆上一个谎往往需要一千个新的谎言,这些谎言又需要再被圆谎。我在不同场合都提到过,我分享自己的观点的时候总是会检验说出来的话是否问心无愧。谎言往往是在不同人面前表达了不同的观点,也就是所谓的人前一套人后一套。为了维持这样的生活和脆弱的平衡,需要付出无限的心血,并且终有一天会迎来破灭。因此我会对自己诚实,也对他人诚实。这也是我前面提到我期望更直接的交流模式,并且做到及时认错和转弯的原因。如果一个人一贯正确或者不容挑战,那么这本身就是一个无法被圆谎的谎言,为了维持一贯正确所需要付出的努力,已经远远超出能够投入到创造价值当中的努力,岂非南辕北辙乎?

第二个核心价值观是长期主义。这一点我在最近分享关于开源的话题已经讲过多次了,开源社群的建设和发展是明显的长期主义。Apache Group 早在上世纪就成立,而今天被广泛使用的 Apache License 2.0 直到 2004 年才写成。社群清楚地认识到自己存在的问题需要时间,试错、沟通并找到共识解决方案需要时间。部分创业者或上市公司老板认为,商业不同于开源社群,是能够超越规律短平快地创造价值的。这对于追求短期利益本身来说或许没错,在我们借鉴其他发达国家成熟的模式加速追赶的过程当中也有一定的适用性。然而,具有创造性的,跨越经济周期乃至长达一个人一辈子的价值,都来自长期主义和复利效应,无论是财富、人际关系、爱情、健康、活动,还是习惯。

第三个核心价值观是平级关系胜过等级关系。这从前文反对“一贯正确”并且追求坦诚沟通就能看出来,我也持有同样的观点。等级社会往往不容质疑,决策只来自于上行下效,这与每个人平等地发挥自己的主观能动性相矛盾。

我首先接触的集体合作模式就是开源社群的开源协同模式。在 2017 年的 Perl 6 网络聊天室当中,我可以和 Perl 语言的创始人 Larry Wall 直接沟通,当时他用的是 @TimToady 的昵称。我在读文档的时候看到关于面向切面编程(AOP)相关的描述,完全不明白说的是啥,就在聊天室里询问,而他正好在线,就跟我分享了对这个范式的见解。直到几个月之后,我才知道这位聊天室的 TimToday 成员,GitHub 上挂着 Perl 6 吉祥物“幺蛾子”的这个人,就是 Larry Wall 本人。

Perl 6 的吉祥物“幺蛾子”

去年底的时候我写过一篇《开放式组织》的书评《《开放式组织》书评》,以及其中提到的《企业的人性面》这本相关联的组织管理经典的观点,都是关于协同当中平级关系的支撑。

我赞同平级关系,不接受等级关系。我不想高于任何人,也不想低于任何人。如果我和别人不能像平级那样对待彼此,我就不想和他们交往了。

结语

这本书虽然有两百多页,但是在卫 Sir 书评的引导以及过往经历的印证下,读起来并不费劲。如同书中推荐序和卫 Sir 在书评和读书群当中所说,这本书常读常新。它毕竟是一名现成的“成功人士”得到广泛认同的经验之谈,在人生不同的阶段和经历不同的事情之后,再读一遍这本书,总是会有不同的体会。也许这就是经典书籍的魅力吧。

强烈推荐一读!

《开源之迷》书评

《开源之迷》“开源之道”主创适兕所著“开源之道三部曲”的第一部。本书的“迷”是着迷的“迷”,旨在向读者介绍什么是开源,以及开源令人欲罢不能的优势。适兕在《适兕是如何生存的?》提到,自己从 2015 开始运行“开源之道”,2018 年辞去全职工作,一心发展开源之道。开源之迷,一至于此。

本书发售前,我曾经应邀写了一小段推荐词,不过最后因为出版的原因没有随书印刷。这里附上原文内容,也可以对比只读样章跟读完全书以后体感的差别。

适兕老师将他多年关注、学习和参与开源世界的理解灌注在开源之道三部曲当中。这本《开源之谜》里,我最期待的内容莫过于“在所有人看见的地方工作”。这一章的名字取自适兕老师推荐的三十多本开源之书其中一本,开源运动之所以冠上这个名字,就有强调源代码及其研发协作活动的公开性的原因。如果你想知道开源协同为什么是软件开发模式的必然方向,开源协同的价值和做法,阅读这本《开源之谜》一定不会错。

在所有人看得见的地方工作

实际拿到本书以后,才发现《在所有人看得见的地方工作》一章非常单薄,前后仅十页的篇幅。除了引用 Linus 对外公开 Linux 项目的邮件以外,就是对想法公开、交流公开且归档以及流程公开几个点做了少数几句议论。姑且不说与同名开源书籍《WORKING IN PUBLIC》相比,例证详实程度和议论深度都难以望其项背,单是读完这十页的内容,留下的印象也不过是做什么都要公开,而对于为什么要这么做,具体可参考的案例和可能遇到的问题,则只字未提。

不过,后一篇《开源世界的日常》花了五十页的篇幅从源码到 DevOps 系统,从沟通渠道到市场营销,讨论了一些典型的用例,还算做了一点补救,但是还是没有讲清楚为什么要这么做,以及可能遇到的问题。

除去补充前一章的部分,《开源世界的日常》一章讨论市场营销的部分质量是不错的。开源社群的运营和发展不仅无需刻意避开市场营销,甚至应该主动思考如何让开源软件在市场形成强大的影响力。

Perl 社群当中的相当部分成员会在 IRC 或邮件列表上讨论新功能和 CPAN 上新的软件库,目标用户是谁,如何高效地推广到目标用户群体当中。Apache 社群在项目成熟衡量模型当中,明确指出市场营销是参与贡献的一类。

适兕在书中提及了网站、博客和论坛等等渠道,并介绍了运作这些渠道所需的基本知识。我想这跟他多年以来运营“开源之道”项目密不可分。除了线上渠道,适兕在书中还强调了线下活动的价值和典型线下活动的案例。我在分享《How the ASF builds communities》的时候也专门讨论了 Apache 社群当中的线下活动,就是在赛博朋克化和个人原子化的环境下,强调人与人面对面的连结的重要性。

开源的范畴非常广泛

从适兕在本章和全书的举例当中,我也发现了一件有趣的事情,那就是开源的范畴是非常广泛的。

《开源之迷》一书中,适兕举例往往选择 Linux Kernel 及其相关的项目,这是因为他开发软件的时间里大部分是在和 Linux 发行版打交道。我自己撰文举例的时候,往往也举的是 Apache 项目尤其是大数据项目的例子,还有参与过的 Perl 社群和 TiDB 社群的例子。

除此以外,开源还有非常多的类别。

  • 区块链技术最初的论文是公开的,以太坊是开源软件,HyperLedger 也是开源软件。
  • 应用监控系统 Apache SkyWalking 是开源软件。
  • 角色扮演游戏的开发框架 EasyRPG 是开源软件。
  • Linux 发行版上广泛使用的办公软件 LibreOffice 也是开源软件。
  • 绝大多数编程语言要投入实际使用所需的编译器、解释器、运行环境、标准库和实用工具,几乎也都是开源软件。

可以说,现代软件开发,基本不可能离开开源软件。

不同项目的风格是不一样的,受到目标人群、技术领域和利益多寡的影响,在一个社群当中合理的规则或惯例,照搬到另一个开源社群当中,可能会面临水土不服的情况。这是我在《开源社区的治理模型应当因地制宜》以 TiDB 社群为例讨论过的问题。

开源世界的人物

要说《开源之迷》当中我最喜欢的章节,非《开源世界的人物》莫属。在这个篇章里,适兕充分发挥了向导的定位,从参与的普罗大众,到计算机科学家、程序员,再到律师、布道师、学者和商人,一口气从自由软件运动到开源运动再到今天,横跨多个领域介绍了与开源有关的关键人物以及他们的贡献。

本书定位就在揭示开源的迷人之处,适兕作为向导带领读者领略开源的魅力。我必须承认在阅读这一章节的时候,好几次我都为开源历史上出现过这样的人,他们做了这样的事而感慨不已。

其中印象最深的是适兕放在最初提及的“不起眼的推动者:大众驱动的开源”。在关注到开源世界的明星之前,在看到一个一个成功的项目之前,首先要强调的是开源软件乃至整个开源生态,能有今天的成就,包含了每一个参与者的努力。开源软件是每一个参与者添砖加瓦堆砌而成的,Linux 的贡献者已经超过了一万人,提交数超过了一百万个,这不只是一两个明星开发者的功劳,而是开源的胜利。

其他人物介绍也很出彩,这里不做展开复述,只讲几个名字。

Tim Berners-Lee 和他发明的万维网构成了开源的平台基础,其代码本身是公共领域的,即任何人可以随意使用,其协作方式是日后有名的 RFC 模式,时至今日仍然有大量的开源项目采用。

GNU 工程的创始人 Richard Stallman 和 Linux 的作者 Linus Torvalds 还有《大教堂与集市》的作者 Eric S. Raymond 自然也在其中。其实,如果你把他们三人的传记或著作放在一起,《若为自由故》、《只是为了好玩》和《大教堂与集市》,就能发现开源的包罗万象。每个人参与开源的理由可能是各不相同的,但却不妨碍他们在一个以分享精神为核心的模糊共识下共同创造价值。

除此之外,还有 FFmpeg 和 QEMU 的作者 Fabrice Bellard 和著名技术书籍出版商 O’Reilly 的创始人 Tim O’Reilly 等等,他们的故事都很有趣。

最后,在写成这篇书评之前,我常引用本书对于“搭便车者”的论述,即如果只是作为消费者使用开源软件,缺乏上游思维,孤僻地认为可以和开源社群隔绝开来,其结果必然是“任由投喂,失去创新能力”。

总的来说,这本书对想要了解“开源”这个话题的读者来说,还是值得一读的。它可以是带领你探索开源世界的方方面面的一本介绍性书籍,适兕也是一名不错的向导。期待“开源之道”三部曲的后续两作发布,如同适兕所计划的一样,讨论清楚如何实践开源,以及为什么要做开源。

《知识社群》书评

时隔两年,以姜宁老师的分享为契机,我重读了《知识社群》一书。结合这两年在开源社群方向的经验,我从中发现了不少极具实践价值的内容。

《知识社群》一书从知识社群的社会性出发,从知识社群的历史沿革,全球知识经济的发展进程,以及知识社群在知识时代的机遇三点立论,阐述了知识社群的时代价值。进一步地,本书介绍了知识社群的三个结构要素,划分了知识社群发展的五个阶段,归纳了知识社群培养的七个原则。本书对知识社群的定义如下。

知识社群是这样一群人,他们有共同的关注点、同样的问题或者对同一个话题的热情,通过在不断发展的基础上相互影响,深化某一领域的知识和专业技术。

领域、社群和实践

本书提出的知识社群三个结构要素分别是领域、社群和实践。

领域创造共同点和共同身份的感觉。一个明确的领域能够确定社群的目的以及它对成员和其他人的价值,从而说明社群的合理性。这样的一个领域可以鼓舞成员们做出贡献、积极参与,指导他们的学习,使他们的行动具有意义。了解领域的范围和最前沿,使得成员们能够准确地决定哪些东西值得分享,怎样提出想法,追踪哪些活动,还使他们认识到试探性或不完整的想法的潜力。

规划一个新的开源社群,首要解决的就是核心开源软件的定位问题,也就是社群将关注在哪个技术领域。这个技术领域可以由一组用户需求,一个现有软件,或者一系列论文定义。

例如,Apache Kafka 一开始定位在解决日志存储和消费的业务问题上,Apache Flink 实现流式计算 API 后对标 Apache Storm 提出富有竞争力的有状态数据流计算定位,Apache Hadoop 则是对 GFS 和 MapReduce 论文的开源实现。

明确领域定位,才能降低开源社群成员交流的门槛。大部分的开源项目不是一个全新的问题,而是现有问题的解决或者现有方案的改良。因此,明确与现有概念之间的联系,才能够使得已经关注现有领域的人能够迅速理解新社群的领域定位,找到共同点和共同身份。不需要从头接触一个陌生的领域,而是对比与现有概念之间的联系和区别,就可以提出一系列的问题,也能理解什么问题是值得分享的。

例如,设计一门编程语言的时候,定位在静态类型或动态类型,就是完全不同的方向。相关领域的专家完全有可能分别拿 Haskell 和 Lisp 来比对概念上的差别,当前语言还没有实现的,尝试实现、模仿或者论证为什么不能实现。曾经对当前实现不满而因为种种原因无法落地的改进方案,抛出来与社群成员分享并争取在新项目当中实现。

领域的定位不是固定的问题,而是与社群一起演变的知识范围。领域的定位也不是抽象的兴趣,而是由社群共同经历的关键事件或问题组成的。

从现有概念延伸到新的知识社群的领域之后,社群存续下去而不是合并到现有社群的理由,就是自己的差异点。这些差异点不是一成不变的,随着不同人的加入可能发生很大的变化。例如,Apache Flink 一直在分布式计算引擎领域当中,但是在 14 年之前,它还是一个注重批处理负载的软件。直到两位开发者在 2014 年中的时候实现了 DataStream API 以后,才转向流式处理领域。例如,Perl 6 项目最初在设计上大量承袭了 Perl 的设计,并且很大程度受到那段时间的面向对象浪潮的影响。但是在 Pugs.hs 项目带来了 Haskell 社群的新鲜血液和函数式编程的思想以后,不少语言设计开始针对函数式编程的范式做出优化。而 Perl 6 的并发编程模型,则是在来自 Node.js 社群的强力开发者加入领导项目开发以后,利用 Node.js 所使用的 libuv 库搭建起来的。

可以看到,领域的问题都是非常具体的,能够围绕解决现有问题或改良现有方案分享知识和进行实践。领域的定位如果太过抽象,例如书中提到的“技术技巧”,那么社群就更像是一个兴趣小组甚至只是一组非常松散的圈子关系,因为围绕抽象议题提出的观点往往很难落到实处,也就很难激起社群成员的兴趣和创造价值。

社群创造学习的社会结构。一个强大的社群能培养互动精神,培养基于相互尊重与信任的关系。他鼓励人们分享想法,暴露自己的无知,提出困难的问题,并且仔细倾听,这是一种混合的气氛:人与人有着亲密的关系,同时又相互坦诚开放地提出和探讨问题。

社群对有效的知识结构非常关键。知识社群不仅仅是一个网站、一个知识库或者最佳实践集合,重要的是相互影响和共同学习,并在彼此之间建立联系的人。参与社群活动使社群成员形成归属感和相互的承诺。每个人分享对于某个领域共同的整体看法,而又在特定问题上带来个人的观点,这就创造了一种总和大于组成部分的社会学习结构。

虽然一个开源共同体可能为了推动软件的开发会建立相应的组织结构,但是在所有知识社群当中,知识的交换都是自由的,或者说去中心化的。Apache 软件基金会在 The Apache Way 当中强调了它所构建的开源共同体是由平等的个体所构成的。

Community of Peers: individuals participate at the ASF, not organizations. The ASF’s flat structure dictates that roles are equal irrespective of title, votes hold equal weight, and contributions are made on a volunteer basis (even if paid to work on Apache code). The Apache community is expected to treat each other with respect in adherence to our Code of Conduct. Domain expertise is appreciated; Benevolent Dictators For Life are disallowed.

书中提到,知识存在于人类认识事物的实践当中。它不是一种物质,不能像游戏当中双击使用书籍即可获得经验和智慧。只有通过社群的形式将关注到同一个领域上的个体聚拢起来,经过运营和管理有意识地促进知识的流动,才能促进知识的动态演进,并将知识带来的价值传达给每一个社群成员,最终使得社群成员所在的组织以及社群本身受益。

实践是社群成员分享的一套架构、想法、工具、信息、风格、语言、故事和文件。领域指出社群关注的主题,而实践是社群开发、分享和保持的特定知识。社群建立一段时间以后,成员们认为彼此应该已经掌握了社群的基本知识。大家分享共同的知识和资源,使得社群能够高效地处理领域内的问题。

知识社群不是魔法,它不能够直接将一个对领域一无所知的人转换成一个能够直接为社群创造核心价值的人。但是,社群可以通过实践的分享,将最佳实践总结成文档,在社群成员当中建立如何基于情景判断的共识,来提高知识社群交换知识、创造知识的效率。通过分享实践,知识社群扩大了自己的影响力,并且建立了一个隐形的参与要求。在正式成员之间,最佳实践是众所周知的,因此沟通的效率也将显著地提高。

知识社群的发展阶段

本书在介绍知识社群的发展阶段之前,首先讨论了培养知识社群的七个原则,这些原则将会贯穿不同发展阶段的关注点。

  1. 精心设计社群的演化历程
  2. 在内部和外部的不同观点之间建立对话
  3. 鼓励不同程度的参与
  4. 既发展社群的公共空间,也发展社群的私人空间
  5. 以价值为关注点
  6. 组合熟悉和兴奋的感觉
  7. 构建社群节奏

知识社群的潜在期

知识无处不在。当围绕着同一个领域的一群人开始交换知识和实践的时候,一个非正式的知识社群就形成了。从非正式的知识社群转变成为正式的知识社群,意味着它开始强化社群的三个关键要素。

  • 关键的领域问题是定义领域的范围。
  • 关键的社群问题是找到那些已经就这个主题形成网络的人,帮助他们想象网络的扩张和知识分享活动的增加会发挥怎样的价值。
  • 关键的实践问题是识别共同的知识需要。

这三个问题的目的都是找到潜在的社群成员之间足够多的共同点,从而使得即将构建的知识社群能够创造足够凝聚成员的价值。共同创造价值是知识社群的最终目的。社群依靠它提供给成员的价值来推动,社群成员需要看到他们的热情怎样转变成有用的东西。

另一方面,启动社群不是从头开始。如果社群能够为其他人创造价值,那么一定已经存在围绕社群关注的领域形成网络的人。告诉他们你的社群能够就他们关注的领域提供足够多的价值,他们的知识和见解也能够在其中转变为实践。以开源共同体的潜在参与者来说,很少有人能够拒绝这样的诱惑。前提是你的社群真的对他们关注的领域有足够优质的实践。

我在一份规划开源社群的草案当中列出的一个关键问题,就是明确社群期望某种形式的参与,并思考可能的参与者现在在哪。书中写到,启动一个知识社群,需要同时发现你可以在什么基础上组建,并想象这个基础的潜力能够把你带到哪里。如果忽视了目前已经形成的网络,那么社群将很难吸引到最有可能成为早期参与者的人。但是如果只是考虑目前的网络,就不能超越个人的限制而为社群引入新的看法。

对于一个新的开源社群来说,一个常见的问题就是对参与者有过于苛刻的预期,并且在预期被屡次打破以后反转成一种彻底的不信任。实际上,哪怕是最有热情的参与者,也需要在持续的价值创造中找到和社群发展的共同利益。尤其是对于一个公司内部的软件团队,考虑突破组织边界以开源社群的方式运作的时候,不同背景带来的信息差是不可避免的。

这一方面需要建立起对话的渠道,就像我在 Open Discussion 当中介绍的一样。另一方面,也需要认识到社群当中存在不同程度和不同类型的参与。

本书当中也采用了同心圆形式的社群引力模型,核心人员往往只占有 10% 左右,积极参与者也不过 20% 上下,剩下的七成左右的参与者,不会对社群的发展产生明显的促进。当然,这些比例和每个个体的行为是会动态流动的。社群的核心组对这样的情形应该有足够的预见性,避免对每个社群成员都予以核心成员的期望,或者按照市场营销的漏斗模型强迫每个成员选择向核心成员的“转化”或者离开。

这一阶段最重要的就是广泛的接触潜在成员和联系社群成员,通过人与人的联系和知识的交换以及实践的交流,定义出领域的范围、社群的主要意图和富有吸引力的切入点。如果社群能够度过这个阶段,往往能够发现潜在的社群协调员和思想领袖。

社群协调员会关注到社群新人的招募,会见潜在的成员,并联络核心成员以对齐社群对关键问题的认识和增强人际连接。思想领袖是社群关注的领域的专家,他们能够定义前沿问题,或者本身是具备丰富经验、德高望重的从业者。思想领袖的加入为社群提供了强有力的凝结核,试想 Ruby on Rails 的作者为 Ruby 社群带来了多少 web 开发者的参与。

书中分点罗列了这一阶段的典型工作计划,作为书评无法面面俱到的议论,但是仍然值得引用以作推荐。

  • 决定社群的主要意图
  • 定义领域,识别有吸引力的问题
  • 证明行动的理由
  • 识别潜在的协调员和思想领袖
  • 会见潜在成员
  • 联系社群成员
  • 发展社群的初步设计

知识社群的接合期

如果一个社群能够把对现状的良好理解和对未来发展方向的构想结合起来,它就已经具备条件,可以向接合期转变了。

社群启动的时候,正如一家创业公司最初的商业计划,看起来往往是脆弱甚至站不住脚的。如果一个社群的领袖能够有信心地宣传社群的目标,介绍当前的情况,并说明如何从当前的情况逐步实现最终的目标,那么社群就可以开始举办各种活动和正式启动,扩大互相信任的社群成员的范围了。

  • 关键的领域问题是建立在这个领域内分享知识的价值。
  • 关键的社群问题是充分发展关系和信任,使成员们能够讨论实践中真正复杂的问题。
  • 关键的实践问题是明确哪些知识应该分享和怎样分享。

信任在这一阶段极为重要,没有它,社群成员很难发现领域最重要的方面和社群真正的价值。虽然每个人都知道平等的交流,相互请教和寻求帮助能够提升自己和他人的知识水平,解决问题的成员也能积累自己的声誉和经验,但是缺乏信任的环境当中,大部分人会选择沉默或观望,而这种沉默和观望如果没有核心成员和积极的参与者以身作则破除不信任的印象,就会不断恶化,使得社群无法产生价值,进而失去由共同的目标的背景聚拢起来的早期成员。

建立信任,不仅仅是核心成员以身作则带来的形式上的安全感,还涉及到社群成员对社群目标的信任。前面提到,共同创造价值是所有社群的最终目的,不同社群只是在创造什么价值,以及如何创造价值上有所差异。如果不能在聚拢起早期成员之后,持续地回馈知识分享的价值和知识实践的价值,那么大部分参与者将会保持或者变成观望的状态,而不是付出足够的时间精力和热情投入到社群当中来。这也是我常说的开源参与者的思路是“谁赢他们帮谁”。

例如,《大教堂与集市》在总结 Linux 的成功经验的时候,就提到了 Linus 在早期开发的时候经常每天发布新的版本,新的版本当中包括了社群成员提交并被接受的补丁。这种直接回馈参与者,让他们看到自己的参与真的能够赢得回报,能够在社群当中建立起最朴素的信任关系。我在提及自己为什么参与 Perl 6 和 Apache Flink 这两个开源社群的时候,也强调了能够及时得到响应,解决自己的问题,并且提交的补丁能够被合并和发布,在社群当中看到我的努力帮到了更多的人,这种喜悦和认同感是联系社群成员的关键。

我和开源社群维护者交流的时候,一定会问的一个问题就是参与者为什么要进入你的社群,你能提供什么价值。尤其是作为一个知识社群,你在领域知识上的领先性体现在哪里?如果是一个自研项目开源的情况,往往项目的所有人都转过好几手,团队负责人只是接受命令开放源代码,那么他是很少考虑这个问题的。实际上,他本人可能都不太关注这个项目有什么用,为什么存在。

如果一个社群只是纯粹的复制别人做过的工作,那么顺着开源文化将会导向上游优先的结果。Apache 孵化器在接受项目的时候,就会衡量这个项目是否已经有同类已经存在,如果已经存在,那么加入这个社群,比起另起炉灶分裂是要更合理的。

We prefer “Do NOT confuse users” because we accepted projects nearly doing the same thing. We always encourage more people could join together and build a more powerful project and community, rather than building several similar projects.

同样,书中对接合期提供了一个典型的工作计划。这个计划的假设更多是在公司组织当中发起一个知识社群。

  • 向成员说明理由
  • 启动社群
  • 发起定期的社群活动
  • 赋予社群协调员合法地位
  • 在核心组成员之间建立联系
  • 发现值得分享的想法、见解和实践
  • 明智地整理文件
  • 识别提供价值的机会
  • 经理的介入

培育和维持知识社群

书中还介绍了知识社群的在启动和实现正常运转以后,走向成熟和管理的后续阶段。限于一篇书评能够关注到的重点有限,这里不做展开论述,只做重点罗列,以期能够激起各位阅读原版的兴趣。

成熟期的关键问题

  • 关键的领域问题是定义在组织中的角色以及与其他领域的关系。
  • 关键的社群问题是管理社群的边界,因为这时的社群已经不仅仅是从事同一职业的朋友网络。在定义新的、更广阔的边界时,社群必须保证不脱离自己的核心目的。
  • 关键的实践问题不再是简单地分享想法和见解,而是认真地组织和管理社群知识。随着社群形成更强的自我意识,核心成员开始认识到真正的前沿知识和知识社群的差距,感到需要更系统地定义社群的核心实践。

管理期的关键问题

  • 关键的领域问题是保持领域的合理性,在组织中发出自己的声音。
  • 关键的社群问题是保持有活力、吸引人的风格和关注点。
  • 关键的实践问题是保持前沿地位。

《知识社群》一书立论的基础跟开源共同体还是有所不同,它主要关注到企业应该如何发起、维持和培养知识社群,并从知识社群的蓬勃发展中受益。当然,相当一部分开源共同体也遵循这样的模式,由企业当中的最佳实践出发,以开放源代码和开源协同的方式跨越组织边界交流知识和实践以解决领域当中实际的问题。

本文主要的关注点还是在于社群本身的健康发展,原文关于如何将社群的价值和组织的价值结合起来,有更加详细的分点讨论。简而言之,就是社群作为一个独立的结构,如何找到它与公司组织利益的共同点,是它能够获取资源和赢得员工信任的关键。而如何找到社群发展与个人发展的共同点,则是持续吸引参与者的关键。

其中对于企业组织的价值,我在过去几天有过一段论述:

开源运营,对于企业来说有两个主要目的,一个是技术品牌的建立,一个以开源协同的方式打造成为行业标准的软件。这两个做好了,技术公司的技术知识优势,人才吸引力和留存率,还有成为标准以后的赢家通吃的价值,就非常可观了。

最大的挑战是如何协调公司的利益和社群的利益,使得两者尽量互不冲突的往前去走,相互能够合作。这个能够达成好的结果的前提是各方能够坦诚沟通,所以需要一个渠道和真正的去沟通。至于沟通下来仍有冲突的各种情况,做好预案就行了。

现在的开源处于一个相对好的时代,MongoDB 和 Elastic 当初面临的那种激烈冲突不太可能再次发生了。当然最终能够守住自己的利益,还是依赖自己强大的实力,不管是技术实力、谈判能力,还是其他。

我现在感觉到最难找的是有技术能力,且认同开源理念的团队。有技术实力,才能够在运营的时候依靠正道的方法掌握主动权。否则所谓的“运营”,就会变成为了技术不足的团队“善后”社群的技术挑战,而采取排他垄断的一个部门。这样就跟开源的理念背道而驰了。

《大教堂与集市》书评

历时五天,我总算把《大教堂与集市》这本经典的开源文化著作认真读了一遍,真是酣畅淋漓。

本书是作者 Eric S. Raymond 的文集,其中最著名的一篇就是《大教堂与集市》,其他几篇分别是《黑客圈简史》《开垦心智层》《魔法锅》和《黑客的反击》。最有价值的是《大教堂与集市》和《开垦心智层》两章,系统解释了开源软件是如何生产的,开源开发的优势在哪,开源软件的传承是如何做到的。《魔法锅》解答了一些常见的关于开源软件使用价值和销售价值的问题,但是受限于时代背景,对商业化的讨论局限在夸大使用价值的部分,不能很好的指导基于开源软件提供软件服务的商业模式。

在进入具体的内容讨论之前,必须着重提到译者卫剑钒对中译本创造的价值。翻译是对原内容的二次创作,软件开发领域外文著作众多,大部分译本都让原文表意有明显的损失。卫剑钒翻译的《大教堂与集市》,阮一峰翻译的《黑客与画家》,以及云风翻译的《程序员修炼之道(第二版)》是我近一年来读过的本领域最佳译作。

开源协同的优势

《大教堂与集市》一章主要讲的就是开源协同的优势。集市模式就是开源协同的模式,本章的要点在于论证这种模式能够生产出高水平的软件,以至于超过任何商业公司闭门造车的软件。原文的论述重点在同行评审的价值,辅以拥有用户的重要性,落点在如何以集市模式领导开源项目。出于讨论流畅性的考虑,我把前两点的顺序调换然后展开。

拥有用户

对于任何软件来说,获取用户都是一个艰难的生存挑战,持续的用户反馈能够帮助软件不断修正前进方向,没有用户也即意味着软件的死亡。开源软件能够在早期发展阶段吸引到足够的注意力和用户。

一种形式是如原文作者继承 popclient 项目,从而直接继承其用户群。这在商业公司开发的软件当中是不容易做到的,因为涉及到专有软件的所有权转移,总是非常的繁琐且挫败的。大部分商业公司开发的软件,一旦因为种种原因不再维护,往往无法为人所继承而是彻底死亡。

因此,如今的用户对全新的专有软件往往抱有很强的怀疑态度。例如,最近一段时间迸发出来的新兴数据库软件,如果我无法获得它的源码,那么我如何能够自由地探索它呢?成熟的闭源商业软件辅以用户手册或许没有这个烦恼,但是软件的更替是不可避免的,新兴软件刚出世时,往往欠缺文档,功能不全,只有阅读源码甚至加以修改才堪堪能用。这种情况下,开源软件不是比闭源软件更好的问题,而是只有开源软件才能生存下来的问题。

此外,围绕开源软件或软件群形成的开源共同体有内部共通的价值观。如果你制作了一个新的开源软件,在潜在的用户群组里发帖介绍自己是不会被排斥的,如果软件质量不错,还会得到用户的自发传播。例如,我在 GitHub DCO App 异常期间,顺手开发了一个基于 GitHub Actions 的方案并在原 issue 下评论介绍自己的解决方案。没有回复会认为这是恶意竞争,而是出于解决问题的群策群力。又例如,Engula 项目开发过程中,向 Rust Community 和其他相关主题的资深开源开发者均寻求过意见和建议,其中认可 Engula 项目价值的人,就会自发的传播它。这对于商业软件来说是不可想象的,如果上面的行为替换成一个闭源商业软件,则参与者会认为你是一个销售人员而不是黑客同行,并且对一个完全黑盒的全新解决方案兴趣寥寥。

最后,开源软件不会将自己的用户局限在销售关系以内,这往往能保证软件开发者有更强的主导能力,按照符合软件工程的方式开发高质量软件,而不是在需求爆发的压力下将软件绑定在单一用户的需求上。

同行评审

同行评审是原文论述的重点,实际上,集市模式的核心价值就在于跨越组织边界的独立的同行评审验证设计和保证正确性。原文将其称为“Linus 定律”,即

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

不过针对这个定律有两点需要解释。

第一点是它所强调的是独立的同行评审实施的简单性和有效性,而不是单纯的“人多力量大”。

开源开发的价值之一就是源代码公开使得任何人都可以分析代码逻辑以定位问题。时至今日,传统的研发组织仍然把开发人员和测试人员区分成两个竖井,测试人员几乎只能完成黑盒测试。可想而知,缺乏分析的现象型 bug 报告往往需要耗费开发人员相当多的时间重新验证、复现和定位。如果让对源代码一无所知的测试人员为 bug 定级,则两类人员之间的冲突会更加尖锐。

开源开发打破了这种困境。由于大家都有真实的源码,开发者和测试者很容易发展出一个共享的表达模式并进行有效的交流。一个现象型 bug 报告和一个直接关联到源码的分析型bug报告,对开发者解决问题的帮助简直是天壤之别。Linus 定律建立在开源开发的基础上,强调的是拥有源码以后加入新的眼睛的成本不在包含商业公司管控带来的限制和摩擦,从而能够从基数足够大的同行评审当中获取高价值的报告。

原文引用《人月神话》的 Brook 定律,提到随着开发人员数目的增长,项目复杂度和沟通成本按人数的平方增加,而工作成果只会呈线性增长。对于这个论点,原文作者是认同的。但是,开源项目所采用的沟通方式,区分成少部分核心开发人员与由 beta 测试者和潜在的贡献者组成的外围人员。外围开发者实际工作在分散而并行的子任务上,他们之间几乎不交流;代码修改和bug报告都会流向核心团队,只有在那个小的核心团队里才会有 Brooks 开销。

这揭示了开源开发的精英领导制内核,也解释了 Linus 定律虽然常被简化成“只要眼睛多,bug 容易捉”,但是却不是简单的“人多力量大”。

第二点是开源软件当中出现 bug 是正常的。这一点过于天经地义以至于当我发现我需要强调它的时候有些震惊。近年来出现的“心脏滴血”和前几天的 Log4Shell 漏洞,导致部分声音认为开源项目的使用是有风险的。

对此,我只能说,这当然啊!软件有 bug 不是正常的事儿么?开源开发不是银弹,任何复杂的软件都会有 bug 存在。Linus 定律成立的案例 Linux 是在高速发展的过程中保持了相对稳定的质量,而不是从来没有 bug 出现。如果你认为开源软件有不可承受的风险,最佳做法是参与其中对它做出改良。

此外,开源软件的许可证往往附带了免责声明,也即这个软件的源代码就这样(AS IS)给你了,没有任何保证(WITHOUT WARRANTIES)。在应用当中整合开源软件之后,保证应用的正确运行与安全性是应用开发者的责任。开源软件会因为安全问题损失声誉,因此作者会尽力提高安全性和正确性,并辅以相应的测试验证,但是这些都是尽力而为,没有保证。

集市模式

《大教堂与集市》一章的落点在如何以集市模式领导开源项目,这种模式相较传统的管理架构有何不同。

其中很多原则和技巧不是开源特有的,并通过敏捷等理念渗透到商业公司的软件开发当中。例如,“好的软件作品,往往源自开发者的个人需要”,“早发布,常发布,倾听用户的反馈”,以及“想出好主意是好事,从你的用户那里发现好主意也是好事”等等。

其中最重要的一点是关于发布的。开发者在需求列表不能调整和最后期限不能拖延的双重要求下,会完全顾不上质量,整个工作很可能会变成一团乱麻。Linux 通过发布两种不同类型的版本,各自宽松其中一个要求来保证软件质量和进度的协调。

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

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

对于与传统的管理架构比较的部分,其理论基础可以参考《开放式组织》《企业的人性面》相关的论述。概括地说,开源的方式给予开发者足够的自由,以吸引高水平的黑客自发地创造价值。这种超越了对安全需要乃至生理需要的追求的模式,激发的是参与者对社会需要和自我实现需要的热忱。

在这里,没有预设的团队和资源,不需要在办公室环境下吞并其他团队的资源或者对其他团队的进攻做出防守。开源开发者是志愿者,是因为兴趣和能力自主选择的,他们会把自己的资源带到工作中,而不需要关心团队之间的领土争端和倾轧。

在这里,参与者凭借其创造的价值赢得权威。也就是说,最有才华的人能够对项目的发展做出最合适的决定。这不同于雇佣关系下被强制调配的人与项目之间的关系,而是对于特定的人,自由选择适合自己的项目,对于特定的项目,自然筛选出最合适的人。

原文还提到一种观点,即传统开发管理能保证艰苦和乏味的工作总能落实。我想这点毫无疑问是错误的。Linux 和 Kubernetes 的文档充足到令人难以置信,反过来只为了领工资才上班的人往往消极对抗撰写文档和测试或调试问题等工作。

开源共同体的目的是制造高质量的软件,在这个共同目标的引领下,不同方面的人才聚拢起来发挥自己的价值,反而是能够找到对传统开发管理认为艰苦和乏味的工作甘之如饴的人才。对于项目维护者来说,认识到这些所谓“无聊”部分的价值,协同参与者完成它们,是项目能够脱颖而出的必要条件。经过二十年来的经验积累,这逐渐成为最有才华的黑客当中的共识。

最后,对于想要实行集市模式的人,这里转述原文提到的“集市模式的必要条件”。

集市从成立伊始,就需要一个可以运行和测试的东西。当开始建设开源共同体的时候,你需要拿出一个像样的承诺。程序此时并不需要特别好,它可以简陋、有错、不完整,文档可以少得可怜。但它至少要做到能运行,且让潜在的合作开发者相信,这个软件在可预见的未来,能演变成一个非常棒的东西。

项目领导人需要能识别出别人的优秀创意,掌握一定水准的设计和编码能力,并且必须具备很好的人际交往和沟通能力。最后一点应该是显而易见的,为了建立一个开源开发共同体,你需要吸引人们,让他们对你做的事感兴趣,让他们乐于看到自己的贡献。一些技巧可能有助于实现这些,但远远不是全部,你的人格特征也很重要。

开源软件的传承

《开垦心智层》一章讨论开源共同体的发展,以及发展过程中开源软件的所有权及转让的问题。

所有权

原文提到,开源软件的所有权获取有三种形式。

第一种也是最显然的,就是去创建这个项目,当这个项目在开始时就只有一个维护者而且这个维护者仍然起作用的时候,所有权问题是连提都不该提的。

第二种方式是获取前任对所有权的移交(有点像“接力棒传递”)。这在社区中很容易理解,当项目“所有者”不愿意或者不能在开发和维护中投入必要的时间时,他(她)有义务将项目移交给一个有能力的继任者。

第三种方式是一个项目需要维护但项目所有者已经消失或失去兴趣了。如果你想维护该项目,你的责任是努力找到这个“所有者”,如果找不到,你可以在相关场所(比如 Usenet上专注于该应用领域的新闻组)声明该项目似乎是一个“孤儿”,而你想为之负责。

我在协助处理 TiDB 里两个合并子项目的工作的时候,实质上就遵循了这里的原则。原来的项目由多名 contributor 参与完成,在当时的 CLA 设置下,要求每位 contributor 都必须和 TiDB 项目签 CLA 才能合并。比起强硬的改变 commit author 绕过 CLA 检查,我建议尝试联系未签署 CLA 的参与者补上。这些参与者被 at 以后很快响应并且解决了问题。

其实参与开源开发的人不是坏人,在项目没有发展出多样性之前,不要擅自以“内部”“外部”这种二元视角界定参与者的属性,也不要假设“外部”是邪恶的。

分化

原文将分化行为列为开源文化当中的禁忌。分化指的是派生出一个随后不能交换代码的竞争项目,并导致开发者群体的分裂。

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

近年来雨后春笋般冒出来的开源项目,在分支和合作问题上起码有两点值得关注。

第一点是对合作的漠视。相当部分项目,号称开源,实则核心成员还是都来自同一个公司团队,规模往往超不出十几人。他们有很强的领地意识,拒绝其他人的参与,或者将其他人的贡献打包进项目整体说成都是该公司的贡献。这样做,使得不同组织的参与者失去动力甚至有种被驱逐出去的意味,实质上只是源码可得的传统项目开发模式。

当然,也有好的案例,且大多来自公司背景不强的项目。例如 SeaTunnel 还叫 WaterDrop 的时候,就吸引了不同组织成员的关注和参与,现在又被 Apache 成员关注到,合作进入 Apache 孵化器孵化。

第二点是对分支的痴迷。也就是公司喜欢 fork 出来搞个魔改版本,从不考虑 contributing back 还以为自己占了便宜。且不说这种行为禁锢了原本可以参与共同体的成员,代码分化带来的兼容性问题魔改版本从来不能解决。回过头来把魔改版本抛头换面又煞有介事的“开源”,应该被整个黑客社会所唾弃。

如果说还有一点,那就是那些所谓的“开源技术公司”,如果试图对开源共同体实施某种形式的管控,让商业公司凌驾于志愿者之上,那么这样的项目实际上更容易分化。Elastic 和 OpenSearch 就是一个典型的例子。

对于相对开放的民主制度而言,它的一个主要优势在于,绝大多数潜在的革命者发现通过在系统中工作比攻击该系统更容易让自己向目标前进。但如果既有政党联合起来“提高门槛”,导致那些较小的不满意团体觉得更难实现自己目标的话,这种优势就很容易被侵蚀破坏。

准入门槛不高的开放过程鼓励参与而非分裂,因为参与者能从中获得成果,而不用付出分裂所需的高昂成本。尽管这种成果可能不像分裂所得成果那样令人印象深刻,但其成本较低,且大多数人都能接受这种折衷。

冲突与解决

原文提到,项目当中的冲突与解决主要围绕三个问题展开

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

第一个问题由上述所有权问题回答。关于分支的问题在上一节已经讨论过了。现在看第二个问题。

无论采用独裁者模型还是委员会模型,黑客的荣誉都跟他创造的价值相关。也就是说,黑客的声誉在礼物文化的大背景下,由他的贡献即赠与开源共同体的礼物的价值所决定。对于独裁者模型来说,独裁者本人需要能够践行这样的规则,否则高水平的参与者就会选择离开。对于委员会模型来说,还有一个额外的问题是委员会自身应该避免冲突。原文质疑委员会模型难以避免冲突

在这种形式中,我们很难看到内部边界,并因此很难避免冲突,除非委员会内部享有极高水平的和谐与信任。

但是,今天的软件复杂度越来越不支持独裁者模式。如果独裁者本人已经把部分决策权交给参与者,那么他在运行上就类似于委员会的模式。即使独裁者名义上拥有最终决定权,他与维护某一模块的核心成员仍然需要保持高水平的信任以减少项目当中的摩擦。

结合如今一部分商业公司创建或大规模参与开源项目的背景,如果项目建立的是同侪共同体(community of peers),也就是说成员的角色与个体相关,而不是与他在某个组织的职位相关,在这种情况下依然把委员会的人员增加与企业员工入离职挂钩,这种组织形式就是非常危险的。

具体地说,部分项目照猫画虎地搬来了 Apache 软件基金会式的同侪共同体设计,在决定项目 PMC 成员和 committer 人选时,却变成了公司同事入职,“理应”有 commit 权限,就稀里糊涂的成了什么 committer 或 PMC 成员。一旦离职,则完全不理会项目的发展,甚至出于不愉快恶意捣乱项目的日常事务。这就是没有基于项目的需要和个体对项目的认可和贡献选择委员会成员的弊病。

这是说缺乏多样性的项目中,单一公司的员工需要避嫌吗?当然不是。实际上,成为大力投资该项目的公司的雇员,能够尽可能多的时间投入到项目发展上,公司的员工确实有更大的可能性成为核心成员。但是必须注意的是他的推举应该是客观的,基于项目的需要和个体对项目的认可和贡献来选择。只有这样,才能努力做到委员会内部有极高水平的和谐与信任,这才是这种组织形式下项目长久发展的根基。

开源与商业模式

《魔法锅》一章的主题是开源与商业模式,着重讨论了反公地模型,软件的使用价值和销售价值,以及当时存在的开源相关的商业模式。

反公地模型

我曾多次听到有人拿“公地悲剧”来类比开源协同的开发模式,认为后者也会如前者一样失败。

所谓的公地悲剧,指的是假设一个村庄里的所有人都可以不受限制地在一片公共的草地上放牧,如果没有一个共识来抑制过度放牧,出于自身利益的考虑,每个人都会尽可能多的放牧,以期在公地资源耗尽之前从中获取最大价值。

但是,Linux 项目持续三十年,长寿的开源项目比比皆是,这种类比显然是有谬误的。原文从公地悲剧两个必要条件来反驳,一是过度使用,二是供应不足。

公地悲剧的一个必要条件是所有人都放牧会使得草地退化,但是开源软件一旦制造出来,不会因为被过度使用而损失价值。反过来,广泛的使用会提升开源软件带来的价值。这一点很好理解。

公地悲剧的另一个必要条件是没有人会修缮草地,因为公地奖励“搭便车”行为,即你修缮了草地别人就可以无偿分享你的成果,而你的付出别人并不承担,结果是付出比不上被分摊后的收益,于是所有人都不付出。

在开源开发中不会遇到这种情况。这是因为参与者不仅需要解决方案,他们还需要问题被及时解决。因此解决这个问题本身带来的收益就足够偿还成本,而等待别人解决问题则完全无法预期它会在何时被解决。

这部分解释了解决方案必然会被生产出来的问题,但是其创造者为何会无偿发布这个补丁,还需要进一步的讨论。

一方面,很多情况下开发者无法为其确定一个公允的市场价格。另一方面,坐等在补丁上不会有任何收益,反而会带来额外的成本,因为你现在要在上游发布新版本时重复合并这个补丁。由于上游对该补丁的存在并不知晓,这种重复合并甚至有可能是多次重做。毫无疑问,这是非常挫败的。由此看来,只要你需要上游的更新,无偿发布补丁就是最优策略。

但是,这里还有一个问题,如果补丁有足够的差异性,补丁作者为什么不将其闭源以获取其销售价值?对于 GPL 许可的项目来说,项目本身的演化需要与其他各方分享,这不是个问题。但是软件结合的形式有很多,GPL 对软件即服务等方式难以产生约束,还有以其他宽容开源协议如 APL 等许可的项目,这些情形正是当下开源与商业的讨论焦点。

软件的使用价值和销售价值

在讨论这个焦点之前,我们先看看软件的使用价值和销售价值。

软件的使用价值是它作为一个工具的经济价值,软件的销售价值是它作为一个可买卖商品的价值。大部分软件是作为内部系统被生产出来的,原文认为,这个比例达到九成以上。开发者的薪资实际是出于维护软件的使用价值的目的支付的。

如果你创造的软件主要用于内部系统,而你的薪资也来自于维护它的使用价值,那么通过闭源来保护销售价值是没有意义的,因为你不会将它用于销售。这种情况下,通过开源协同来提高软件本身的开发效率和质量,就是有收益的。

值得注意的是,只要软件的开发在隶属于不同组织的参与者之间共享工作流,采用开源协同的开发方式就没有额外的成本,因为公司为了用上这个软件,总是要付出开发成本的。这个共享工作流的前提条件也是《魔法锅》一文成书时未曾想到的,居然还有人为了形式开源而给同一套代码区分出两套工作流。

原文提到两个常见的反论意见。一个是通过闭源代码保护商业机密。这是无稽之谈,主要是代码设计糟糕。通常来说,你应该将机制开源,编写通用的逻辑,而将商业知识相关的策略单独实现。当然,后者并没有什么开源的必要。

另一个是说闭源能够保护软件安全。这也是谬论。除了上面商业机密泄露的场景,对于纯粹的骇客攻击行为,二进制照样能被破解,开放源码只是多了一种破解的手段。

类似近几天的 Log4Shell 漏洞,难道黑客不读代码就找不到这个问题了吗?如果公司内重新实现日志框架,且不说要达到 log4j2 的水平要付出多大成本,以及生态兼容性的种种问题,难道重新实现的软件就没有其他安全问题吗?

即使不说分析源码的破解手段并不比破解二进制的手段轻松多少,可靠的安全性也依赖于算法及其事先经过彻底的同行评审。这么看来,开源软件反而更容易修复安全问题。Log4Shell 通过同行评审发现后通过必要的 private 邮件列表上报,在上游修复后进行披露,正是这种安全同盟的一般做法。

直接收费的问题

当然,上面这些讨论仍然没有覆盖当前这波开源浪潮下新出现的商业公司群体,这些公司创造开源软件,并希望基于它们创造的开源软件获利。

原文对直接收费类型的许可证做出了批驳,指出希望在源代码可得的前提下添加某种收费或变相收费的条款,会遭到黑客的反感,从而失去开源共同体的支持。这是因为这类许可证违背了三个开源共同体的共识。

第一个与对等性有关。大多数开源开发者并不反对别人利用他们的礼物获利,只是不能要求有任何人站在一个特权地位上牟利。MongoDB 的 SSPL 在理念上或许沿袭了 GPL 的一些理念,只是它对形成派生作品的描述“形成服务”太过笼统,得不到广泛的支持。但是 MongoDB Inc. 自己并没有按照 SSPL 的要求开放它的整个服务栈的源代码,这种对等性的破坏遭到了黑客的唾弃。实际上,MongoDB 的核心代码几乎只由其公司雇佣的员工开发和评审。

第二个与非有意后果有关。原文提到,对商业使用或销售进行限制并收费的许可证有着令人扫兴的效果。特别是这条规定给某些分发行为笼上了一层法律阴影,而这些活动正是黑客非常愿意鼓励的事。还是 SSPL 的例子,由于“形成服务”太过笼统,几乎所有黑客都倾向于不分发该软件以避免潜在的法律风险。原文认为,黑客很少在这一点上让步。实际上,这也是 OSI 拒绝承认 SSPL 是开源许可证的主要原因。

第三个与保持礼物文化相关,这也是最关键的一个原因。如果许可证在法律上就禁止产生分支,那么黑客们绝对不会认同这样的条款。原文解释到,虽然黑客们不赞成分支,但是分支是“最后一招”。如果维护者不能胜任或者背叛开源文化,可以通过分支来保护礼物的传递。Elastic 与 OpenSearch 就是活生生的例子,以 AWS 的工程师为首的开发者在 Elastic 转向更加封闭的时候基于开源版本分支并独立发展,保持新分支的开源属性。

开源的商业未来

《魔法锅》随后介绍了当时作者所看到的的若干种基于开源软件的商业模式。这里不需要展开,因为它们都统一在同一个模型下。这个模型就是基础架构和中间件开放,应用和服务收费的模型。

开源基础架构,并利用同行评审的价值,协同跨越组织的参与者创造出类别杀手,做到这点的收益实在太大了。类别杀手指的是即好到没人再想使用其他备选的高质量开源原创项目,例如 Linux 和 Kubernetes 等。

Google 愿意开放 Kubernetes 的源代码,很大一部分原因就是为了联合其他商业公司以及整个开源共同体形成事实标准的垄断,而要做到这一点,开源协同的方式是最高效的。Kubernetes 形成垄断后,越是早期参与项目的组织,越是投入资源大的组织,越能够获得某种程度上的原厂品牌效应,并积累足以应付软件在使用上的种种问题的开发者团队。这些组织通过提供应用级别的定制和维护服务收取报酬。

原文认为应用非常倾向于继续封闭,这种封闭尤其可能出现在自成一体的垂直市场当中,其网络效应也较弱。这其实就是针对特定场景开发的插件或者是针对具体业务接入基础架构的实施。时过境迁,如今的软件复杂度已经不是当年一个全栈工程师从购买服务器到整个网站都能负责开发的年代,雇佣业务实施团队将越来越常见。

这些插件某种意义上也可以算作中间件。实际上,应用和中间件之间的差别会随着时代的发展而变化。原文认为数据库是中间件,但是如今却更被认为是某种基础软件。中间件走向闭源还是开源,取决于软件失效的代价,代价越高,走向开放的市场的压力就越大。

举个例子,AWS 的不少服务是闭源的,但是它们的客户端是开源的。这些客户端就是中间件,如果它们的维护更封闭,那么失效的可能性就会越高。广泛的用户会倾向于使用开源的替代品。一个案例是 AWS S3 的 Rust 客户端 rusoto 和官方后来提供开源版本。

Confluent 依靠提供 Apache Kafka 的服务盈利,整个商业模型包括三个部分。

第一部分是实施,也就是帮助客户业务与 Apache Kafka 对接,乃至于设计整个业务消息平台。这是传统上所说的“外包”工作,由于软件复杂度日益升高,这类工作所需的软件开发技能也越来越丰富,相应的雇佣薪资也就水涨船高。这种模式也被称为订阅,在一个订阅周期内,客户能够获得实施工程师的支持,商业公司在提供工单响应的保障。实施包括支持私有化部署,也包括帮助客户对接云服务。

第二部分是提供基于开源软件的云服务,也就是云上的 Apache Kafka 资源,客户按照使用的节点数或访问量交费,这种模式实际上是商业公司通过出租商业地产盈利。一方面,CPU 和内存等资源本身是成本,用户无论如何也要为这些成本付费。另一方面,商业公司在资源之上提供了消息平台的抽象,屏蔽了部署和运维软件的复杂度,并以此来赚取差价。对于无力自行维护的企业来说,购买云服务就是最优选择。

值得一提的是,这种部署的附加值是工程师水平和硬件成本的函数,云厂商往往能够获取更廉价的硬件成本,因此独立服务提供商最好追求部署和运维本身的开销下降,这种运维和部署的策略是商业机密和盈利的基础。另一方面,可以通过维持云中立,避免供应商锁定等优势,利用云厂商之间的竞争激发用户的优先选择意愿。

第三部分是专有软件,例如 ksqlDB 等。只不过 ksqlDB 的位置更像是接近基础架构的中间件,被 Apache Flink 和 Materialize 等项目挤压了不少生存空间。反观 Apache Pulsar 和 Apache RocketMQ 就没有将类似功能做成专有软件以期销售,避免被其他项目分化用户。

对于哪些软件不适合通过闭源获取商业价值,《魔法锅》一文介绍了应该考虑开放源码的软件,时至今日仍然是正确的

  1. 可靠性、稳定性、可扩展性非常重要。
  2. 除了独立的同行评审,没有其他便捷易行的方法验证设计和实现的正确性。
  3. 该软件对客户的业务非常关键,因此客户期望避免供应商锁定。
  4. 该类软件受网络效应主导,即你无法实现压倒性的市场控制力。
  5. 关键方法属于公共知识。

开源与闭源在几乎所有层面上都是并存的,并且呈现出一种动态发展的趋势。

起初,Windows 垄断了操作系统的市场。当 Linux 出现以后,服务端操作系统的份额开始逆转,并且出现 RedHat 等商业公司。原文称为中间件的数据库,起初被 Oracle 主宰,如今它也承受着 PostgreSQL 的冲击,海量提供 PostgreSQL 服务的商业公司也能生存下来。今天,云原生技术和软件即服务的概念改变了软件生产和使用的格局,越来越多的商业公司创造开源软件或参与到其开发当中,目的就是推出下一个类别杀手,并取得之后的软件服务战争的优势。

实际上,最好的商业价值获取方式仍然依赖创造性的垄断,这也是知名商业著作《从 0 到 1》的观点。只不过,软件的复杂度以及开源开发应对这种复杂度在生产力上的显著优势,使得你无法在一个很大的范围内实现垄断。但是你仍然可以找到合适的垂直领域,或者就是为客户做实施——这也许是最垂直的一种方式了。

如今,想要创造局部垄断的一种新方式,是通过开源协同的集市模式创造出一个类别杀手,在此过程中获得某种程度上的原厂品牌效应,并积累足以应付软件在使用上的种种问题的开发者团队。进一步的,将原本的市场格局改变,在不改变固有需求的情况下改变产生商业价值的位置。以操作系统为例,原本商业公司以创造出商业操作系统为竞争优势,Linux 出现后,如何基于 Linux 提供更好的服务,或者看到 RedHat 如今的上云策略,提供海量 Linux 服务器资源的运维和应用的部署服务。

改变不利于自己的商业格局,并在环境有利于自己的时候做好下一次颠覆的准备,才是开源时代的商业未来。我也相信这种形式,能够促使企业家真正成为创新的先锋,而不是被长时间垄断所麻痹,不思进取乃至阻止社会生产力的进步。

《开放式组织》书评

本文部分启发自在 ALC Beijing 录制播客时讨论的内容,仅引用我个人的观点。播客内容应该近期会在前面链接的网站上发布。

《开放式组织》这本书单看它本身,讲的是红帽公司的组织管理经验。这是一个将商业价值建立在开源项目之上的公司审视公司内部的组织形式的著作,并且主要关注在红帽这个案例上。这样,不管是在经验的普遍性上,还是在开放式组织这种形式跨越组织,尤其是建立商业公司和开源社区之间的联系这方面的讨论上,都有所欠缺。

从理论到实践,从企业审视内部到跨越组织边界,连接商业公司和开源社区,这样一个广义上的“开放式组织”阅读主题,我推荐以下几本书共读。

《企业的人性面》我认为是《开放式组织》背后的理论基础,成书于 1960 年,历久弥新。《协同》是国内学者关注“内破部门墙,外拓企业边界”的研究跨越组织边界合作的当代著作。《社区运营的艺术》和《用户共创》均出自 Ubuntu 社区经理 Jono Bacon 之手,讨论了开源社区这一开放式组织的运行方式与最佳实践。这几本书都是阅读《开放式组织》的有益补充。

为什么要理解开放式组织这种形式?

这个问题也是计划中的“开源协同”系列文章里会展开讨论的问题,这里做简略的回答。这个问题在《开放式组织》里没有直接讨论,而是作为已知假设。然而,这个问题却是想在国内推行开放式组织这种管理模式首先要回答的问题。

本书涉及这个问题的一句话

我们发现,开发开源软件的最佳方法同样也非常适用于管理整个公司。

也就是说,开放式组织就是开发开源软件时协调开发团队或者说开源社区的组织管理手段。我喜欢将开放式组织这种组织管理手段简称为“开源协同”。开源软件在开源协同的生产力加持下,在不同领域攻城略地,击溃了专有软件的统治。如果企业想要基于开源软件打造商业价值,那么它就必须了解开源软件。在这种情况下,传统的控制管理模型会导致企业和开源社区激烈的摩擦。要想获得生产力的提升,企业必须成为开放式组织。

这种摩擦来自于时代发展带来的对于组织管理的颠覆。《协同》当中提到的“强个体的价值崛起”,以及《用户共创》当中提到的“社区成员为社区工作,而不是为商业公司工作”都是这一点的佐证。如今,开源社区有能力依靠其同侪社区当中强大的个体打造高价值的软件,其力量足以支持 Linux 赢下服务端操作系统,支持 Rust 成为富有竞争力的系统级编程语言,支持 PostgreSQL 成为世界前列的数据库软件。开源社区及其成员无需依赖于企业尤其是单一企业的控制而生存。因此,他们可以坚持为社区工作,而不是为商业公司工作。

在这种情况下,如果坚持传统的控制管理模型,试图将社区成员驯化成免费劳动力,必将破坏可能的跨越组织边界的合作的信任基石,回退到商业公司雇佣一批员工实现一个本身即是产品的软件。前文说到,开源软件得益于开源协同的生产力加持,正在不同领域中击溃专有软件的统治。在这一背景下,仍然希望聚集起一批员工写出足以媲美开源软件的专有软件,是不太现实的。绝大部分情况下,你无法聚拢起比拟开源社区的专家团队。《维基经济学》当中提到,“唯一有资质做出新发现的人可能在他的组织范围之外”,这将是越来越常见的情况。

《开放式组织》并没有过多的讲这部分内容,因为红帽已经走过了这个阶段。要想跟 Linux 社区达成最好的协同,乃至形成某种意义上的“原厂”品牌,必须以开放式组织的形式运作。本书更多的是讲在已经要运行一个开放式组织的前提下,如何发挥这一组织形式最大的生产力。其实作者 Jim 已经在第一章中提到过,他一开始也试图以传统的控制管理模型来管理红帽公司,但是开放式组织的力量已经不可阻挡,正如开源社区这一开放式组织的力量也不会以商业公司的意志为转移一样。于是他开始学习、理解并运用开放式组织的形式来释放红帽公司员工的生产力。

如何点燃工作热情?

开放式组织具体的管理策略和《奈飞文化手册》所介绍的准则多有共通之处,其理论基础则都很可能来自《企业的人性面》当中提到的企业管理的 Y 理论。

点燃工作热情是这类组织要面临的第一个挑战。《奈飞文化手册》写到,“成年人最渴望的奖励,就是成功”。《开放式组织》在本章中也提到

你需要一个能让大家时刻铭记在心的目标,而不只是停留在追求利润这个层面上,这是吸引顶尖人才的唯一方法。

如果利用马斯洛的需求层次理论来分析,这是要求激发员工对尊重和自我实现的需要的追求。传统的控制管理模型压抑员工的安全需要乃至生理需要的满足,主要使用金钱和职位来激励员工,但是这种激励不能持续。不仅仅是因为员工得到满足后激励作用就会消失,更因为商业公司无法持续用金钱和职位激励每一位员工。与之相反,开放式组织不会压迫员工的生理需要和安全需要,而是激发新时代高价值的强个体的热忱和渴望,也即点燃工作热情来发掘被压抑而无法释放的生产力。

值得注意的是,本章名为“构建充满热情的工作环境”,对于如何做到上面提到的激发热忱和渴望,书中的论调也是

对于管理者而言,如今最重要的任务就是建立一个启发思考、培育积极的投入精神,并且推崇无限热情、想象力和主动性的工作环境。

也就是说,组织管理要做的是构建环境。虽然需要关注个体在环境中的发挥来校正对环境状况的认识,但也不用过分纠结某一个人的热情是否点燃。一个人没有热情,是很难点燃出热情的,根本就不可燃。管理者能做的是破除环境当中压抑了人原本的热情的限制条件,释放原本就存在的工作热情。

这一思路也出现在《企业的人性面》当中,书中对比纠结个体,试图利用一致的模式创造标准化人才的“制造”手段,提出了人才的“栽培”方法。

个人将成长为他可以成为的样子,只要为他们创造适当的成长环境。

也就是说,开放式组织基于对个人价值的认可和个人能力的信任,致力于创造出能点燃员工工作热情,积极投入工作的环境。

如何提高员工的参与度?

首先自己要参与,而不是作为一个局外人去提升其他员工的参与度。《开放式组织》当中写到,“想要得到,就先要付出”,就是对每个希望提高员工参与的成员提出的建议。

《企业的人性面》当中花了一整章的篇幅讨论何为参与以及如何参与。根本是要树立诚信,员工能够真正地参与到事务活动和决策中来,整个旅程没有破坏安全感和信任的坏例子。

假模假样的号召参与,实际并不采纳意见等仍然遵循控制管理模型的做法,并不能够瞒天过海,反而是失掉员工的信任,进而整个提高参与度的努力都会失败。

何为精英领导制?

本书的第四章、第五章和第六章都聚焦在如何做决策这个议题上,而开放式组织从开源社区当中借鉴到的决策方式,自然是精英领导制。

《开放式组织》很有价值的一点在于对比了精英制度和民主制度,并明确地指出了精英制度不同于民主制度的要点。

精英制度是指根据提出的最佳方案做决定的方式;才能是选择的唯一标准,而非地位、偏见或特权。在一个公民公司里,最优的行动方案是在公开、充分、信息量足够的辩论之后胜出的方案。精英就是每一个有思想、有知识的人,每一个在真正理解之后得出的好想法都会得到重视。毫无才华的吹牛皮之人不会得到尊重。实施了精英制度之后,参与性民主必然将权利转移至最低一级人群的说法也将不攻自破。

许多开源社区做得不好的一点,就是太强调平等乃至于变成平均主义。其实社区成员积累社会资本,应该是一个 earn authority 的过程,积极主动的 contribution 获得别人的尊重,而不是凑人头投票决策。

Linus 多次表示自己他只以技术论高低,PostgreSQL 社区和 Apache 社区推选新的 Committer 时是核心成员闭门会决议后公示,都是反对民粹的体现。开源社区的公平是基于 contribution 赢得权威的精英领导制,遵守 earn authority by contribution, not by position 的原则。近年来不少开源社区的维护者不堪民粹道德绑架的压力频频爆出“开源世界的暗面”,就是没有形成健康的精英领导制的认知。

Linus Torvalds: 我不在乎政治正确,我只在乎技术本身

荣耀还是负担?开源大神们居然这么累

开放式组织是不是未来唯一的或者最高级的组织形式?

最后,我想讨论一下这个问题。因为在我讨论开源项目和开放式组织的话题的时候,经常会有人举单一反例,以开源项目和开放式组织如果不是普适的那么就是错的这种无厘头逻辑,来搅乱讨论的氛围。

对于这个问题的答案,我只能说不是。开放式组织是一种选择。控制管理模型也有适合它的军队或教会等组织,前面已经讨论过需要理解开放式组织的原因。现在仍然有专有软件领跑某个领域,仍然有技术领先的源码可得的专有软件开放 API 或允许带有限制的修改,如果你的商业模式适用于这些形式,大可不必采用开放式组织的形式。

但是,软件复杂度将不断提高,基础软件乃至其部分再也无法仅凭一个人或一个公司的全体员工来编写。开源社区这种跨越组织边界,凝聚不同背景专家共同开发的形式,将会生产出高质量的软件,成为事实标准并击溃专有软件。这样的事情正在持续不断的发生。所以至少这个领域的企业,应当理解和采取开放式组织的形式。这种形式也是当前开源社区唯一成功的组织形式。

红帽公司的管理原则

  1. 因为想来,所以加入我们。
  2. 贡献是决定性因素,但不是交换条件。
  3. 不论由谁提出,只要是最好的想法就能胜出。
  4. 我们鼓励并且期待开放、坦诚、充满热情的辩论。
  5. 我们欢迎反馈意见,本着“早发行,勤发行”的精神做出改变。
❌