阅读视图

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

企业开源的软件协议模型实践

我在《企业开源该选什么软件许可证?》一文当中,已经从软件许可证的角度讨论过不同协议对企业开源的意义。

不过,那篇文章主要是从许可证内容出发的,即先给定了协议,分析完协议细节,再判断是否符合企业和计划公开的软件的情形。本文从企业开源的不同诉求和风险出发,结合现存的企业组织实践,重新讨论源码公开第一步就要面临的选择软件协议问题应该如何决策。

完全开放源码

完全开放源码,即以符合开源定义的软件协议发布企业自研软件的情形。

在讨论什么样的企业针对什么样的软件会采用完全开放源码的策略之前,我们先讨论完全开放源码的策略会给企业带来什么风险。符合开源定义的软件协议既包括宽容软件协议,也包括 Copyleft 式的协议,这里不做区分,因为企业面临的是相同的问题。

当然,对于企业完全自有产权的情形,企业随时可以改变软件协议以规避下面提到的风险。所以这里提到的风险主要涉及的是将自研软件捐赠给第三方如开源基金会,或者试图坚持完全开放源码策略的企业。

风险:竞争对手的商业竞争

我在《黑客与顾客:开源软件能商业化吗?》一文里讨论过,开源软件的用户包括黑客和顾客两种类型。

对于完全开放源码的创始团队来说,黑客用户既然自己有能力把软件用起来,甚至修改软件以解决自己的需求,那么可以认为开发成本已经付出,不从这类用户身上赚钱,而是寻求合作共建,是合理的。目前绝大部分“开源商业化”企业的逻辑,也是以服务无力或不愿承担开发和维护任务的顾客为主。

这一点,从目前新兴的 Elastic License 2.0 (ELv2) 和 Business Source License 1.1 (BSLv1) 的不少实践都允许在不进行同类商业服务竞争的情形下自由使用可见一斑。而上述两个源码公开的商业软件协议,想要避免的也正是同行黑客的商业竞争。

例如,业内提供 Apache Kafka 托管服务的企业数不胜数。在聚拢了相当数量的核心开发者的 Confluent 之外,UpstashAiven 这样的 SaaS 企业都提供了 Kafka 托管服务,更不用说大大小小的平台云厂商顺手提供的 Kafka 服务,例如 AWS 的 MSK 服务、阿里云的 Kafka 服务和红帽的 OpenShift Streams for Apache Kafka 服务等等。

这样的竞争使得 Confluent 不得不在简单的提供 Kafka 服务以外寻求新的增长点,例如只在商业版本提供多租户功能,以及在流计算集成上多次失败的尝试。当然,Kafka 的创始工作和捐赠都是在 LinkedIn 公司的主导下完成的。这样 Confluent 公司虽然无法效仿 MongoDB 公司在竞争对手直接提供商业服务的时候变更协议釜底抽薪,但是心里也不至于太不平衡。

ElasticSearch 和 MongoDB 起初分别以 Apache License 2.0 (ALv2) 和 GNU Affero General Public License 3.0 (AGPLv3) 发布,但是在 AWS 等商业公司低技术成本、高平台优势的竞争下,既无法找到新的增重点缓解危机,又无法抗拒近在咫尺的釜底抽薪方案,于是变更协议直接禁止使用源码进行商业竞争。

风险:团队分裂并参与竞争

Confluent 的案例里暗含了另一种完全开放源码的风险,即在软件可以自由演绎和商用的情况下,企业当中的开发者可能分裂出去单独进行商业运作并参与竞争。

Confluent 的创始团队来自 LinkedIn 公司,LinkedIn 本身没有提供云服务的业务,这种竞争尚不明显。其他处于 LinkedIn 情境的公司,甚至可以通过提供早期投资的方式,换取新团队比此前直接雇佣更低成本的支持。

Apache Hadoop 的故事演示了多家势均力敌的企业,同时基于非自有产权的开源软件做简单封装的商业化模式的风险。

在 Hadoop 的孵化公司雅虎不下场的情况下,Cloudera 公司、Hortonworks 公司和 MapR 公司为了竞争 Hadoop 私有化部署和运维服务打得头破血流,最后的结局是 Hortonworks 和 MapR 被收购,Cloudera 私有化退市。而退市以后的 Cloudera 公司,还是面临市面上拿着 Apache Ambari 封装或者自研大数据套件的提供商的剧烈竞争。

Apache Flink 的故事演示了在一家企业主导社群发展的情形下,部分团队寻求独立带来的分裂风险。

起初,Flink 在一所德国大学里开发并捐赠到 Apache 软件基金会。随后创始成员成立了 Ververica 公司,并于 2019 年被阿里巴巴收购。完成收购的阿里巴巴基本形成了对 Flink 社群的主导,并于接下来的一段时间无需顾虑其他基于 Flink 的商业服务的竞争。然而,就在过去的一两年里,核心团队分几次出走,加入到其他基于 Flink 做商业服务的公司,或者单独成立商业公司提供 Flink 服务。其中,走后面一条路的 Immerok 公司在不久前被 Confluent 收购,一下子使得阿里巴巴的流计算业务受到 Confluent 流存储 + 流计算的强势狙击。

在这些戏剧化的商业操作背后,Flink 本身是一个完全开放源码的软件,允许任何人和组织自由演绎和使用,也包括商用和提供商业竞争,是合规层面的一个基础性的支撑。

上面提到的例子里,即使有企业完成对社群话语权主导的案例,但是都全都是企业对开源软件没有自主产权的情形。接下来的这个例子虽然也是 Apache 软件基金会的项目,但是其中使用的方法是可以套用到企业自有产权的软件的。

这个案例就是 Apache Doris 项目。

Apache Doris 由百度的研发团队开发并捐赠给 Apache 软件基金会。凭借其符合国内企业需要的数据分析能力的设计,Doris 在一开始的十年里逐渐发展出一个可观的用户群体,其中相当部分还是有购买商业服务的潜在顾客。百度自己基于 Doris 发布了 Palo 数据分析产品,但是不久以后,部分核心开发者出走,并 fork Doris 发布了后来改名为 StarRocks 的同类竞争产品。没过几年,另一个研发团队出走并成立了 SelectDB 基于 Doris 提供同类的数据分析服务。

单看这个围绕 Doris 的竞争,似乎和 Hadoop 几家公司的竞争也没有什么差别。但是 StarRocks 并不是一个典型的围绕上游的版本,而是从某个版本硬分支的全新版本,目前和 Doris 的关系算得上是“大路朝天,各走一边”。这样硬分支的手段带来的竞争,即使上游是完全自有产权的软件,也无法通过修改协议来避免。

为了表明 Doris 的案例并非孤例,我这里再举几个类似的商业相关的硬分支案例:

  • Trino 是基于 Facebook Presto 的硬分支,后续 Trino 团队成立了 Starburst 公司提出数据网格(Data Mesh)概念做为商业化方向。
  • Lightbend 公司将 Akka 切换成年收入在一千万美元以上的公司使用就需要商用协议以后,Akka 社群的中立成员随即 fork 了 Akka 并在 Apache 软件基金会的孵化器中以 Pekko 的名字继续运行。
  • AWS 在 Elastic 公司将 ElasticSearch 切换到 ELv2 后,发起了 OpenSearch 项目并基于它提供了类似的商业服务。

面对上述风险,企业可以采取以下策略来降低或规避商业竞争的挑战。这些策略不是互斥的,应该根据企业自身的情况灵活组合使用。

策略:运维和高级功能

这是最基本的一个策略,即提供一个比开源版本功能更丰富的企业版本,包含闭源高级功能或运维支持,提供售后、服务水平保证和责任承担。

通常来说,它并不能在策略层面提供明显的竞争优势,因为你的竞争对手在能够自由使用相同软件的情形下,与你在这一层面的竞争是处于同一起跑线的。唯一的区别是你可能拥有更多熟悉软件的工程师,能够提供更好的服务支持。

但是,为了保持开源软件的活力、技术迭代与用户群,不至于变成开源一个闭源专有软件的快照,你的工程师会投入到开源上游核心的开发中去,这些成本由你支出,而你的竞争对手将无偿取得。同时,因此你的企业版本很难做出合适的代差以说服客户使用,而纯粹的运维支持,营收在竞争对手不需要维护一个内核研发团队的价格战下很难支持公司增长。

总的来说,这是一个保护性策略,即你必须要提供运维支持、售后、服务水平保证和责任承担,从而让客户能够像使用一个商业产品一样使用你提供的开源软件发行版或服务。但是它很少成为一个决定性的优胜策略。

策略:独特品牌建设

完全开放源码风险的共同点,是出现了其他企业或团队,以相同的软件代码基础展开商业竞争。企业开源的情形下,软件代码的归属是明确的,不仅创始工作在企业内的研发团队完成,版权所有的也是企业。这样,企业可以通过基于软件建设公司独特的品牌,将软件与公司品牌相关联来赢得在同类产品的用户群体中的心智竞争。

例如,Hashicorp 的基础软件均以 Mozilla Public License 2.0 (MPLv2) 发布。

实践上,MPLv2 可以被简单理解为允许包括提供同类服务的商业用途,可以和商业软件集成而不要求开放集成软件的源代码,可以基于已有接口的开发闭源的新机制实现,但是对软件接口的修改需要公开。MPLv2 许可的软件是完全开放源码的软件,一家公司直接拿走 Terraform 等软件,提供和 Hashicorp 相同接口的服务进行竞争是可能的。

然而,支撑用户采用 Terrafrom 等软件的,是 Hashicorp 对基础设施即代码的解释和实践。用户采购的不仅仅是 Terrafrom 或 Nomad 单独的一个工具,而是 Hashicorp 定义的一整套基础设施即代码的工作方式。如果下游企业仅仅是跟随这些概念,那么面对 Hashicorp 推出的新概念,自然很难第一时间跟进,更遑论超越。这样,用户就没有理由选择一个被上游带着跑的提供商,而是直接接触原创厂商。如果原创厂商的产品不能满足要求,也不太会选择追随者。

同样,商业智能数据分析服务的内核软件,例如 Cube.jsStreamlit 也是完全开放源码的。这类场景的定制化和依赖方法论的程度高,厂商基本可以将自己的技术品牌和开源软件相绑定,从而建立起竞争对手难以逾越的心智门槛。

Starburst 公司是另一个佼佼者,它拥有 Trino 即原先的 PrestoSQL 的版权,而 Trino 是联邦查询优秀的解决方案。Starburst 趁热打铁,推出了极具传播效果的 Data Mesh 概念,即不同来源和模式数据在同一个平台下进行分析,从而将数据打造成产品,而要做到这点,联邦查询引擎 Trino 自然能提供强力支持。这个概念的传播性之强,以至于 Confluent 也出书将自家的 Data in Motion 概念和 Data Mesh 捆绑营销,Trino 和 Starburst 借此水涨船高。

不过,对于标准化完成度高的赛道,这样的策略往往就难以提供竞争优势,而成为必须要做的保护型策略了。例如,MySQL AB 公司拥有 MySQL 的版权,但是在后来的发展里,业界对于数据库应该是什么样子的越来越有清晰的共识,甚至不少 MySQL 的运维专家自己都可以开设公司提供商业服务。MySQL AB 公司提供的附加价值有限,相当长时间内也不再提出具有开创性的品牌概念,终于在公有云服务登场以后,彻底被云厂商的关系数据库服务截取几乎所有利润。

策略:赛道维度升级

当完全开放源码的基础软件逐渐取得行业认可,甚至成为行业标准以后,品牌建设带来的心智门槛就会逐渐被抹平。这个时候,单纯提供简单的部署运维服务的商业模式,就会陷入到恐怖的价格战当中。在保持基础软件完全开放源码的前提下,要想另辟蹊径取得商业优势,就需要进行赛道维度升级,即基于开源软件提出新的解决方案。

要想走到这一步并不容易,如果初创企业辛苦研发后开源的核心软件,经过运营真的成为了某种标准,模仿者众,初创企业效仿 MongoDB 和 Elastic 直接切换成专有协议是目前仅有的实践。我们以一个无法切换协议的企业来模拟在这种情况下坚持完全开放源码、升级赛道维度将如何进行,它就是 Databricks 公司。

起初,Databricks 的商业模式还是 Spark 的简单包装。它和微软 Azure 达成合作,在 Azure 上捆绑销售 Apache Spark 性能优化的发行版

随后,Databricks 以 AI 为切入点,在 Spark 生态推出了 SparkR 和 PySpark 等集成支持,同时和 edX 合作推出了 Spark 系列课程,强化 Databricks 品牌在 Spark 生态中的地位。同时,在商业产品侧,针对 AI 的典型计算任务提供了标准化算力资源和一揽子解决方案,开始将 Spark 作为公司依赖的计算引擎核心而非差异化卖点。

再后来,Alluxio 和 JuiceFS 的探索让 Databricks 发现了 Spark 的计算能力加上存储以后的巨大需求市场,于是自研了 Delta Lake 软件,提出湖仓一体概念兜售新的解决方案。随着公司逐渐站稳脚跟,Databricks 也有了更多的资源投入到先前 AI 阵线上如今火起来的 AIOps 概念,以及完善整个湖仓一体故事所需的,包括 Delta Live Table 在内的一系列周边产品。

今天的 Databricks 已经不是一个简单的 Spark 提供商,而是一个 Data + AI 领域的企业级方案和云服务提供商。其他简单提供 Spark 作业调度和运维的企业,跟 Databricks 并不在同一个维度内竞争。

策略:市场占有率与开放标准

目前,能够在自有产权的情况下坚持完全开放源码,并在其他维度展开竞争的企业,其开放源码的软件都不是企业盈利的核心软件,而是打开市场和建立开放标准的敲门砖。换言之,企业对此类软件选择和坚持完全开放源码策略的一个主要原因,是企业希望完全开放源码的软件赢得广泛的市场占有率,甚至形成开放标准。

以开源的程序设计语言实现为例,在语言本身赢得用户之前,很少有企业能够直接通过售卖语言实现的编译器或解释器来盈利。瑞典电信公司 Ericsson 支持工程师 Joe Armstrong 开发 Erlang 语言之后,将整个 Erlang/OTP 平台完全开放。从当年的发布文稿中,我们可以看到开放标准的典型思路:

Erlang/OTP was invented within Ericsson and most Erlang/OTP users are still within Ericsson. In order to speed development of Erlang/OTP, ensure a good supply of Erlang/OTP fluent programmers, minimise maintenance and development costs for the language, and keep the OTP applications up to world class, we need to spread the technology outside of Ericsson.

也就是说,Ericsson 内部的电信系统高度依赖 Erlang/OTP 平台,为了保证劳动力市场上一直有人熟练掌握这一语言和开发平台,从而保证 Ericsson 内部系统不至于无人能够维护,Ericsson 希望完全开发源码,以期在公司以外的广阔生态中推广 Erlang/OTP 平台。事实证明,这一决定为 Erlang/OTP 平台起初在电信行业内的推广,以及后来在游戏行业中的广泛应用,再到近些年其底层虚拟机 BEAM 借助新语言 Elixir 的发展再次得到关注,都起到了至关重要的作用。Joe 为 Ericsson 创建高可用的服务打造了一个完整的开源软件和开发平台,但是如果没有开放源码,这将只是 Ericsson 这个如今已不那么有名的企业的一个内部系统。或许会成为一个仅存于谈话之中的传说,但是不可能有今天的生态。

同样是 Erlang 生态的一部分,José Valim 设计的 Elixir 语言及其开发的解释器和网站开发套件,代表了开放源码以赢得市场占有率的策略。

José 起初在自己参与联合创办的 Plataformatec 开发出了 Elixir 语言的解释器,以及 ecto 工具和 Phoenix 框架。后来,Elixir 的使用率日益增长,José 于是另外创办了 Dashbit 公司来提供 Elixir 应用的开发和运维支持。

从 Dashbit 公司的视角出发,其拥有部分 Elixir 核心生态软件的知识产权,但是它却没有通过限制核心软件使用,要求用户购买 LICENSE 的方式来盈利。这是因为,Elixir 毕竟还是一个小众的语言,用户使用量的增长才是做企业支持的基本盘。如果小有成就马上杀鸡取卵、竭泽而渔,那么新用户就很难有信心上车,而存量用户也会想办法跳车,最终生态凋敝,没人有理由购买 LICENSE 授权。

José 本人在 LinkedIn 上的头衔就是 Chief Adoption Officer 即首席(用户)采用官,可见 Dashbit 的开源策略当中对市场采用率的重视程度。同类的案例还有 VMWare 的 Greenplum Database、Spring Framwork 和 RabbitMQ 等项目,这些公司(在相关方向)的主要商业模式是提供支持和咨询,而不是售卖软件或提供云服务,因此其提供支持和咨询的对象的使用率越高越好。

再来看一种竞争型的开放标准策略,其中典型的当属 Google 的开源矩阵:

  1. Chromium 打下了浏览器内核的半壁江山。如今,多少网页应用都注明仅在 Chrome 上经过测试。
  2. Android 从 iOS 和 Symbian 的夹缝中取得了移动端市场的船票,并最终和 iOS 二分天下。
  3. Kubernetes 和 Istio 是 borg 技术溢出以后,Google 主动建立生态的尝试。在相当一段时间里,用上 Kuberneets 就“等于”云原生。

Google 是重度参与 C++ 标准讨论或者说竞争的,这可从 C++ 之父 Bjarne Stroustrup 的论文 Thriving in a Crowded and Changing World: C++ 2006–2020 中关于 C++ 标准委员会的讨论中窥见端倪。应该说,标准之争是激烈甚至残酷的。企业内部总有领先与行业标准所做的尝试,一旦行业后续面对相同问题时将另一种解法确定为标准,那么本公司不说此前的研发投入打了水瓢,至少也需要付出可观的额外努力来兼容新标准。Google 深知这点的厉害,而 Kuberneets 打赢容器战争,对比失败的 OpenStack、Docker Swarm 和 Apache Mesos 与重金投入它们的公司,Google 账面之外的获利不可计数。

无独有偶,Facebook 的 React 前端应用开发框架已经成为无可置疑的标准,对应 Google 推出的 Angular 势弱,多少投资 Angular 的企业和开发者损失惨重。

国内也不乏出于这个动机完全开放软件源码的企业。例如,Apache InLong 是腾讯大数据平台里数据集成能力的开放,Apache DubboNacos 是阿里巴巴微服务架设和治理经验的开源表现,CloudWeGo 是字节跳动中间件能力的系列开源行动,Go Kratos 是 Bilibili 开源的微服务框架。当然,这些软件集中在所谓的“中间件”领域,是另一个值得探讨分析的话题。

最后,上面提到的都是体量巨大或至少相对较大的公司,对于初创公司来说,有没有实践市场采用率和开放标准这一策略的空间呢?

肯定还是有的。例如,近期已被 Apache 孵化器接受的 OpenDAL 数据访问库,就是由 2021 年初创的企业 DatafuseLabs 捐赠的。又例如,CockroachDB 的存储引擎 Pebble 以 BSD-3-Clause 协议开源,连 PingCAP 的数据导入工具 Lightning 都在使用。

一般来说,初创公司更容易在细分领域或者新兴领域,通过开放源码软件来赢得大量声誉和共同维护生态成员都有需要的基础软件。

源码公开但禁止商业竞争

完全开发源码的策略会面临其他企业直接拿走软件代码,提供同类接口展开商业竞争的风险。即使是 Copyleft 式的协议,也很难逃过这样的竞争。

例如,红帽公司的 Red Hat Enterprise Linux (RHEL) 以 GPLv2 发布,这就使得 CentOS 可以利用相同的代码提供自己的发行版和服务。国内运维应该都了解,CentOS 在相当一段时间内是国内企业环境部署量最大的 Linux 发行版。这对红帽的商业模式造成了很大的冲击,最终红帽在 2014 年收购了 CentOS 公司。而 2021 年 CentOS 的作者再次复刻代码开发 Rocky Linux 进行商业竞争,或多或少再次冲击了 RHEL 的市场。

当然,今天的红帽已经不是单纯 RHEL 发行版的订阅提供商了,这样的冲击未必造成多大影响。然而,红帽面临这些问题毕竟是因为它是上游 Linux 的一个追随者,没有代码版权。对于新兴的初创公司来说,一旦通过开放源码的方式赢得了第一批客户,其他公司复刻代码直接竞争,一个行之有效的手段就是切换到禁止商业竞争的软件协议,杜绝此类事情发生。

然而,这毕竟是诱导转向的手段:切换软件协议后,企业与产品的品牌会收到打击,社群反噬和衰退引起用户客户逃离,生态集成出现问题不再繁荣。这些都是可能出现的问题。对于一开始就采取禁止商业竞争策略的企业,不会受到切换协议带来的打击,但是社群规模和生态集成的问题和进行切换的企业最终面临的状况是类似的。

接下来,我们讨论采用禁止商业竞争的源码公开协议的企业,如何构建其软件协议模型,面临哪些挑战并将如何应对。

核心禁止商业竞争

这一门派的著名选手是 MongoDB 公司和 Elastic 公司,分别创造了 Server Side Public License (SSPL) 和 Elastic License 2.0 (ELv2) 两个协议。

其中 SSPL 并不直接禁止商业竞争,而是要求在向企业之外提供同类服务时,必须将服务所有相关软件的源代码都以 SSPL 公开提供。由于这个条件对于服务所有相关软件的定义非常模糊,在没有判例的情况下没有公司想要测试到底它能不能“传染”到企业所有核心代码。目前,遵循 SSPL 开放服务软件栈的案例应该完全没有。

虽然所有软件源码公开、自由使用和修改是自由软件的追求,但是 SSPL 主要的目的是针对云厂商,限制它们的提供同类服务。因此自由软件阵营的 Fedora 社群明确否认 SSPL 是自由软件协议。同时,SSPL 的文本明确违反了开源定义第九条“不得限制其他软件”,因此也不被开放源码阵营所认可。实际上,它期望起到的作用就是禁止同类服务的商业竞争,虽然实际上由于协议条文的潜在风险,企业在不购买 MongoDB 的商业协议授权时,往往选择完全不使用 MongoDB 软件。

ELv2 对禁止商业竞争的意图和范围描述是清晰的,其文本量也相对较少:在允许用户使用、复制、修改和分发的前提下,不允许用户改变软件协议,不允许破解密钥保护的功能,禁止提供与软件功能相似的商业服务。因此,企业内部使用,以及把 Elastic Search 作为支撑业务逻辑的倒排索引系统是可以的,只要不直接提供跟 Elastic Search 相同或相似接口的服务即可。

另外一个常用的协议,Business Source License 1.1 (BSLv1) 则是由失败过一次的 MySQL 团队的部分成员重新创业的 MariaDB 公司创造的。它被用在 MariaDB 的企业级解决方案核心软件 MaxScale 上,其协议内容禁止用户使用 MaxScale 集成超过三个节点的集群,实际上就限制了有效的商业竞争,同时迫使大规模使用该软件的企业购买商业协议。

最后,介绍 Redis Labs 曾经为了禁止商业竞争,而在 BSD 3-Cluase License 上添加的 Common Clause 条款,它禁止取得软件源码的接收者“售卖”该软件。

Redis Labs 后来在社群大规模反弹下切换回了纯粹的 BSD 3-Cluase License 模型,而 Common Clause 也因为对“售卖”的定义及其模糊而几乎没有其他采用案例。自由软件基金会在对软件协议的评论里更是专门抨击了 Common Cluase 对 “Common” 和 “Sell” 两个词词义的污染,并强烈建议不要使用这个附加条款。

总的来说,使用范围较广的禁止商业竞争的源码公开协议只有 ELv2 和 BSLv1 这两者。我们看看其他公司的采用情况。

Airbyte 是 ELv2 + MIT 最典型的玩家。虽然它起初完全是用 MIT 许可发布的,但是很快就出现了模仿者打价格战。Airbyte 的主要研发投入仍然在其数据集成核心上,而这个需求相对来说是有行业共识的,在数据传输协议公开的前提下,打的就是集成多寡的体力仗。这种情况下,Airbyte 优化核心的投入会被下游无偿获取,其细分领域内建设独特品牌的策略提供不了公司想要的壁垒,而公司的人力又不足以完成升级赛道维度的开发。因此,Airbyte 选择切换核心软件协议,釜底抽薪。

由于 Airbyte 切换协议的时候,大型云厂商尚未关注到它,用户要么是自己部署,要么是使用 Airbyte 的服务,使用竞品服务的用户只是初现趋势,而 ELv2 本身并不禁止用户自己部署使用的情形,因此没有引起巨大的反弹。同时,Airbyte 的命令行工具、连接器代码和开发套件,以及数据传输协议实现仍然是 MIT 许可的,这就不影响社群开发的 Airbyte 集成继续以开源协议发布,对社群生态也没有造成明显的影响。当然,有人不喜欢这类变化,选择其他自由软件的情况是有的。核心模块的开发者规模虽然此前也主要是 Airbyte 员工响应,没有受到太大影响,但是也不会再有想象空间了。

BSLv1 在限制条款上留白,因此应该算是一个协议框架,实际使用 BSLv1 的企业分成两类。

第一类是 CockroachDBOutline 式的禁止提供同类服务,这在模式上和使用 ELv2 大体相同。

第二类会有各种更加严格的限制,不同于第一类只是禁止商业竞争,更像是确定了免费增值的策略,一旦超出“试用额度”,就需要付费。

祖师爷 MariaDB 的做法是限制以其 BSLv1 版本使用 MaxScale 的用户不得链接超过三个节点的集群。

Materialize 在禁止提供同类服务之上还要求只能部署单集群单并发。一般而言,有后面这个限制已经无法进行有效的商业竞争,不知道是不是担心注册多家公司进行公司级 sharding 钻空子。这样彻底抹杀可能性,可以说尽显商业专业协议的特色。

Lightbend 为 Akka 挑选的 BSLv1 版本,要求用户只能将 Akka 用于和 Play Framwork 下的应用进程通信。实际上,Play Framework 以 ALv2 许可发布,且强依赖 Akka 作为基础软件,这个条款更多是对 Play Framework 社群的妥协,保障 Play Framework 的用户不受 Akka 切换协议的影响,但是也不能从中暴露 Akka 接口脱离 Play Framework 使用。

BSLv1 相比 ELv2 还有一个特色,那就是它明确约定许可发布的软件在不超过四年的一个给定期限内,将自动视为以一个版权人挑选的 GPLv2 or later 兼容的协议许可发布。实践中,除了 MaxScale 选择在四年后以 GPLv2 or later 重新发布,其他企业均选择在四年后以 ALv2 重新发布。

对于行业来说,这在长时间轴上允许后来人自由使用这些代码,但是从商业竞争的角度来说,已经足够拉开和竞争对手的技术代差,劝退所有试图模仿的企业。

高级功能需要付费

另外一类包含禁止商业竞争的代码的软件协议模型,是限制高级功能的使用。

这一方案的代表企业是 GitLab 公司,其核心服务端软件代码协议模型有六个分点:

  1. 文档以 CC BY-SA 4.0 许可发布。
  2. ee 目录下的代码以商业协议发布,该协议允许测试和开发环境的自由修改和使用,但是生产环境使用必须有对应的订阅席位。
  3. jh 目录下的代码以商业协议发布,协议内容同上,除了企业主体变成极狐公司。
  4. 客户端 JavaScript 代码以 MIT Expat 许可发布。
  5. 第三方软件以其原协议发布。
  6. 其他代码以 MIT Expat 许可发布。

可以看到,代码在一起开发,但是高级功能需要付费才能商用。

这样的模式基本和完全开放核心源码,以闭源的插件或企业版代差来盈利类似,除了高级功能代码是公开可读的,而限制使用。

初创企业当中也有效仿这一模式的,例如 Bytebase 将高级功能以密钥上锁并禁止破解,Logto 将其云上部署的功能上锁。

总的来说,GitLab 能够成功应用这个模型,是因为它对企业需要什么样的代码托管平台,以及实施服务开发流程和研发效能等完整需求有一整套解决方案。当企业代码安全审计要求上去,或者实际发生过代码泄露问题,或者开发流水线严重拖慢了业务迭代,或者老板迫切想评估研发效能等等,这样的时候 GitLab 能够提供支持,并且其高级功能能打到痛点。至于国内学习这个模型的企业会如何发展,我们拭目以待。

黑客与顾客:开源软件能商业化吗?

燃烧了过去一周的空闲时间,我终于定制好了自己的 Linux Desktop 环境。

虽然 Linux 经常被拿来跟 Windows 和 Mac OS X 相比较,但是 Linux 本身只是一个操作系统内核,为了满足用户能作为日常桌面系统使用的需求,还需要添加很多额外的功能。例如,作为内核的 Linux 只提供了识别网卡与其通信的能力,具体如何建立和维护网络链接,如何在开机时自动连接,如何设置网络代理,不同于 Windows 和 Mac OS X 有成熟友好的图形管理界面,Linux 的用户是需要自己搭配定制的。同样,硬盘分区、格式化文件系统、设置引导程序、安装显卡驱动和配置输入法也是如此,需要 Linux 用户自行定制。

这种定制,还不是简单的只有一种办法实现,所有人都有一致的体验。由于 UNIX 哲学里的机制与策略分离,以及 Linux 生态中大量软件是自由软件的缘故,用户经常会发现“解决问题的办法不止一种”。甚至极端一些,“解决问题的框架”也不止一种。以输入法为例,Linux 生态的输入法框架至少包括 IBusFcitx5 两种。只有框架显然是不足以完整使用输入功能的,因此还需要有对应的输入法实现,输入法在不同的图形化界面(框架)下的集成,以及补充输入法能力的词库和其他支持。

这样的环境催生了 Linux 生态的两大特点。

其一是 Linux 生态中的软件往往是开放源码的。这不仅仅是 GNU/Linux 的出生带来的号召力,也是面对种类繁多的生态的最佳选择。例如,在其他桌面系统和手机系统上都广为人喜爱的搜狗输入法,在 Linux 生态当中只支持有信创动力加持的 Ubuntu 系列系统,且仅提供 deb 安装包和仅兼容 Fcitx 输入法框架。在 Ubuntu 上游试图把默认输入法框架从 Fcitx 改成 Fcitx5 的时候,搜狗一家公司没有人力支持,也未开源代码允许社群支持,最终一再拖延上游的更新计划。反观开放源码的 Rime 输入法,则在第一时间得到社群爱好者的支持,社群共建完成了对新框架的集成。

其二是 Linux 存在数量巨大的发行版提供商。前面提到,要想基于 Linux 内核搭建一个完整的桌面环境或服务器,需要做一系列的定制化。虽然这种定制化给予了用户极大的自由,以至于近乎每个问题都不只有一种解决方案,但是很多时候,用户只是想要一个能够满足桌面环境下个人需求,或服务器环境下生产需求的,类似 Windows 或 Mac OS X 的集成系统。Linux 发行版主要的工作,就是打包一系列应用软件和工具链,提供给用户一个开箱即用的“操作系统”。

在所有 Linux 发行版当中,占据主要份额的是 Arch Linux 系和 Ubuntu 系。

Ubuntu 发行版由 Canonical 公司提供商业支持,提供了用户友好的图形化安装界面,并且针对尝鲜用户、个人桌面用户和企业服务器用户设计了专门的开箱即用路线。由于 Ubuntu 已经定制了相当部分的应用框架和应用软件,Ubuntu 系的其他发行版更像是不同品牌商在预装 Windows 操作系统之后提供一些自己的捆绑软件。

相较之下,完全由社群维护的 Arch Linux 发行版奉行极简之道。它只提供最基础的安装程序和 AUR 中央软件库,并辅以完善的 Wiki 文档帮助用户自行定制 Linux 系统。Arch Linux 系的发行版除了都使用 AUR 软件库以外(甚至 Manjoro Linux 都选择了自建软件库),从图形界面到每个功能软件的选择,都可以是大相径庭的。

从上面的例子当中,我们可以看到,开源软件的用户群体明显的分成两类:一类是使用 Arch Linux 发行版的,追求自由使用和修改软件,也有意愿和能力做定制化的,我们可以称之为黑客(Hackers);另一类是使用 Ubuntu 发行版的,期望提供商直接交付一揽子解决方案的,或者在商用层面需要乙方兜底的,我们可以称之为顾客(Customers)。

开源软件的商业化,主要瞄准的是顾客的需求,通过满足顾客的需求收费。黑客群体往往只在生态繁荣上做贡献,并不直接参与商业化的进程。

黑客的需要

无论是自由软件运动还是开放源码运动,基本的理念都包括以下两点:允许用户出于任何目的免费自由地使用和分发;允许用户获得源码,自行改进演绎并发布修改后的版本。

对于黑客来说,第一点是能够使用自由软件或开源软件的前提,自不必谈;但第二点能够获得源码,修改后使用,也是至关重要的。

例如,@fkxxyz 在使用 @VOID001 的软件 ssf2fcitx 为 Fcitx 框架下的输入法使用搜狗拼音皮肤时,发现了一些存在 BUG 的情况,以及 ssf2fcitx 不支持 Fcitx5 新框架,于是他就自己修改实现了 ssfconv 来满足自己的需求。

值得注意的是,在 ssfconv 的 README 当中有这样的表述:

于是,我看了他的源码,发现逻辑还挺简单,然后看了下 fcitx 的自定义皮肤的各种格式,打算亲自研究研究这是怎么回事。最终打算参考这个项目,自己用 python 写个。由于 fcitx5 也支持主题,最终也实现了转换成 fcitx5 主题!

这样的动机和能够自由修改软件以解决自己需求的心情,正是黑客的典型特征。

例如,Apache Doris 起初是百度的一个研发团队基于 Apache Impala 的代码演绎的,Apache Kvrocks (Incubating) 起初是美图基础软件团队用 C++ 重写的 Redis 持久化版本。小米在使用 Apache HBase 的过程里遇到了种种实际需求,为了解决这些需求而编写的代码,大部分以厂商中立的形式进入了上游,少部分企业独有的逻辑保留内部实现。某电商企业基于 Apache Kafka 魔改出了一个支持消息队列语义的内部软件,以支持业务需要。

这些企业内部研发团队基于开源软件的二次开发活动,也符合黑客的行为动机。对于上游社群来说,企业在生产环境的使用和二次开发,对开源软件的声誉传播、缺陷修复和生态发展是大有裨益的。然而,一旦企业选择了雇佣黑客团队基于开源软件开发和维护,那么这样的企业会采购其他提供商生产的基于上游软件的服务的可能性就极大降低了。我在为某公司基于 Flink 打造的流计算平台工作的时候,就遇到过用户公司交流平台选型的经验,结果人家一个平台研发团队的人就比我们算上支持人员还要多,这样的组织结构是不可能采购提供商的服务的。

顾客的需要

不同于富有探索精神和动手能力的黑客,顾客的需要往往是简单直接的解决问题。当然,一个人或者组织完全有可能在某一方面表现出黑客的特性,而在另一个方面表现出顾客的需求。

例如,前文提到的电商企业,虽然维护了一支二次开发消息系统的团队,但是在数据库的选型上,还是直接使用了云厂商的 RDS 服务。例如,不少曾经花费大量时间鼓捣 Linux 系统定制化的黑客,为了特定的生活工作需要,或者单纯就是为了省事儿,也会为 Windows 系统或 Mac OS X 系统付费。曾经热情洋溢地写出《完全用Linux工作》的王垠,不再折腾之后以一篇《谈 Linux,Windows 和 Mac》揭露了顾客最需要的“用户友好”性。

顾客在开源软件和专有软件之间做选择的时候,是不太在意能否获得源码和有没有自由演绎并发布的权力的。顾客的需要是一款能够直接解决他的问题的软件或者一整套服务,免费最好,不能免费也可以考虑,只要付了钱以后乙方可以兜底解决问题。

例如,有次交流数据库选型的聊天,一位基层决策人就以“开源 + 省事”评价使用 TiDB 能够直接解决数据量超过单机 MySQL 并且提供基础的 AP 查询需求的优势。我顺着问他,这里提到开源,是开放源码重要,还是免费商用重要。他毫不犹豫的回答是免费商用重要。另一名参与者补充“锅是谁的重要”。

这就引出面向顾客需求的第一个商业化模式:提供咨询和订阅。

大名鼎鼎的红帽公司就是以订阅模式起家的。由于 Linux 以 GPLv2 发布,红帽基于 Linux 做的发行版,在内核修改的部分都是开放的。由于红帽公司只是 Linux 生态的参与者,Linux 的核心生产力在上游,所以大的技术方向红帽公司也只能配合上游社群前进。这种情况下,红帽选择的商业模式是提供面向企业需求的订阅服务,解决企业重视而上游社群不提供的版本稳定性、售后支持和维保承诺。

后来的 Canonical 公司有样学样,瞄准对 Linux 操作系统好奇的个人,以及对 Linux 服务器生产部署有需求的企业,量身定制了一键启动的路径和售后的支持。在 Ubuntu 的安装页面,你可以选择基于 Live USB 安装 Ubuntu 尝鲜版本,在不涉及主机的情况下开始个人体验;你也可以选择企业生产环境安装的配置,Ubuntu 为满足各个国家和地区的合规要求做了专门地定制。国内信创的部分 Linux 发行版,例如 Ubuntu Kylin、Deepin 和统信 UOS 等,都是基于 Ubuntu 发行版改的,可见 Ubuntu 为企业使用作出的努力。

再说回红帽公司,除了赖以起家的 Linux 订阅服务,近年来它还推出了可以算作 Kubernetes 发行版的 OpenShift 解决方案。同样,OpenShift 主打的也是企业用户开箱即用和全方位的售后支持。对于顾客来说,既想赶上 Kubernetes 带来的云原生技术革命,又无力承担维护一个顶级技术团队的开销,还希望能够有乙方能够对使用过程里出现的问题兜底,选择 OpenShift 或其他 Kubernetes 发行版就是一个值得考虑的选择。相同的道理还可以套用在想要搭上 Istio 快车从而选择 Tetrate 的 Istio 发行版乃至完整的云原生应用网络框架的顾客。

后面这两个案例,一半是咨询和订阅的范畴,另一半就是基于开源软件提供行业解决方案的第二条开源商业化的道路了。

基于开源软件提供行业解决方案,意味着开源软件不再是产品销售的核心,最多是一个立住声誉的招牌和深层依赖的底座。业内最成功的例子,应该算 Databricks 基于 Apache Spark 一路做起来的一系列行业解决方案。起初,Databricks 和慢人一步进入云领域的微软 Azure 达成合作,在 Azure 上捆绑销售 Apache Spark 性能优化的发行版。随后,Databricks 以 AI 为切入点,在 Spark 生态推出了 SparkR 和 PySpark 等集成,而在商业产品侧针对 AI 的典型计算任务提供了标准化算力资源和一揽子解决方案。再后来,Alluxio 和 JuiceFS 的探索让 Databricks 发现了 Spark 的计算能力加上存储以后的巨大需求市场,于是自研了 Delta Lake 软件,提出湖仓一体概念兜售新的解决方案。随着公司逐渐站稳脚跟,Databricks 也有了更多的资源投入到先前 AI 阵线上如今火起来的 AIOps 概念,以及完善整个湖仓一体故事所需的,包括 Delta Live Table 在内的一系列周边产品。

尽管 Databricks 为了应对开源的数据湖软件的冲击,挤牙膏式的开放 Delta Lake 的代码,但是从公司整体的发展轨迹来说,越是商业化驱动的产品服务,越和开源软件沾不上边。到如今,Apache Spark 只是一个隐藏在最赚钱的产品服务深层的基础构建块,一个高效的计算框架,但是用户为商业产品和解决方案付费的逻辑,早已不只是你用没用 Apache Spark 了。

开源的优势

应当说,顾客做选择的时候,不会直接因为产品基于开源软件开发而另眼相待,如果产品本身是对开源软件的简单包装,那么企业客户更有可能挑战付费的意义。毕竟,把 VS Code 打个压缩包放到 CSDN 上卖能骗到一些散户,同样的逻辑在面对企业的时候却很难奏效。

基于开源软件的商业化,其竞争对手是包括专有软件的。顾客会把所有可能的选项摆出来,权衡利弊作出判断。由于顾客一般不在乎源码可得性,出了问题期望的是乙方解决,而开源软件可以免费商用,反而经常成为销售难以回答为何付费的挑战。另一方面,确实有企业基于开源软件赚到了钱。那么开放源码的方式对商业化有什么优势呢?

开放源码的软件用户可以免费试用,这对降低用户门槛和提高长尾用户占有率有帮助,具体逻辑跟免费增值的商业模式是类似的,这里不再赘述。

开放源码特有的核心优势,是形成庞大的生态。

Cloudera 的主要商业产品 CDH 能够一键部署和维护整套基于 Hadoop 的大数据套件,为用户解决多个大数据组件之间复杂的配置和版本兼容的问题。但是为什么顾客会希望采用基于 Hadoop 的大数据解决方案呢?这就得追溯到一开始 Apache Hadoop 以开源软件的姿态出现,吸引了一大批黑客加入并逐渐构建出完整生态的故事了。这个生态的开放性,孵化了 HBase、Hive 和 Impala 这样的周边技术,就连 Spark 和 Kafka 起初也是面向存储在 Hadoop 上的数据设计的。提供和 CDH 同类服务的厂家比比皆是,除了微软和谷歌的云厂商几乎每家都会做一个。相比之下,作为 Hadoop 技术来源的 GFS 和 MapReduce 却一直和 Google 平台绑定,技术演进只能靠 Google 一家,潜在的顾客也只有铁了心上 Google 船的企业。

开放源码是生态繁荣的重要条件。自由软件运动和开放源码运动对源码的强调,根本上是对软件运行逻辑也就是蕴含在软件当中的知识的分享要求。自由软件基金会对自由软件的解释提到用户应当有理解软件运行逻辑的自由,以及理解之后作出改动且分发修改版的自由,获取源码是一个必要条件。

试想 Hadoop 如果不开放源码,那么关键的数据存储格式和网络通信协议就得靠猜,且不说专有软件通常禁止破解从而让真的去破解的开发者背负法律风险,企业随时可以秘密的变更格式,或者引入提供商绑定的加密/检验逻辑,使得第三方维护生态集成或拓展的成本急剧升高最终放弃。即使专有软件的发行企业没这么做,但是企业有这么做的权力和能力,潜在风险也足以劝退所有第三方。

生态的繁荣对顾客的选择是一个重要的考量。顾客为什么选择基于 MySQL 的 RDS 服务,就是因为熟悉 MySQL 的人才供应充足。TiDB 以对 MySQL 的兼容为立足点,逐渐在 DBA 群体中传播 TiDB 的运维经验。而开放源码使得大量的运维集成工具,在黑客的交流过程当中能够被自由地创造和共享,巩固了 TiDB 的生态,也就强化了顾客对 TiDB 作为可靠解决方案的信赖。

StreamNative 在 Apache Pulsar 的投入是另一个典型的例子。在服务顾客的过程中,StreamNative 把一些常见的功能需求都开源实现出来,包括以 Helm Chart 的方式部署 Pulsar 集群,一系列不同系统的集成,基于消息协议处理框架开发的对 AMQP、RocketMQ 和 Kafka 的客户端协议支持。这些软件源码开放以后,得到了大量用户的试用和反馈,其中的黑客型用户能够准确报告漏洞甚至自行修复后回馈上游。这样,多方参与打磨 Pulsar 生态解决各类问题的能力,作为 Pulsar 服务的提供商,至少在说服顾客选择 Pulsar 这一点上就有巨大的优势。

值得一提的是,源码开放并不总是符合企业的利益,因此在企业具备选择权的时候,开放或者不开放源码,是值得考虑的。

StreamNative 的案例里,生态繁荣以让 Pulsar 站稳脚跟是主要目的,市场占有率和客户使用 Pulsar 的信心是关键,而用户当前很少因为集成的有无付费,因此开放源码是正收益。对于必须使用相应集成的顾客来说,订阅 StreamNative 的服务也是最实惠的。

再看一个数据集成的例子,Airbyte 起初也主打完全开源营造市场声势,但是在它赢得一部分市场之后,发现其他厂商之间复刻 Airbyte 源代码提供同质服务,当即就把 Airbyte 的协议改成 Elastic License 2.0 来禁止竞争。不过,Airbyte 依然以 MIT 协议许可数据集成模块和命令行工具的代码。这意味着 Airbyte 通过禁止其他厂商复刻其服务端代码和 UI 代码来杜绝商业竞争,同时又开放集成模块来鼓励各个作为数据源和数据汇的软件来与自己集成。

上面提到,用户选择 CDH 的理由之一是避免被单一提供商绑定。然而,从提供商的角度来说,能把用户绑定在自己的产品服务上,才是最优的。我们逐渐能看到,像 CockroachDB 和 Akka 这样有能力改变软件许可的公司,在商业发展受到冲击的时候,几乎必然会选择修改软件协议禁止商业竞争。考虑到开源软件的发展常常是社群共同努力的成果,这样的行为其实是收割了社群的声誉。关于这方面详细的论述,可以阅读我早前的文章《诱导转向的伪开源战略

另一方面,像红帽、Confluent 和 StreamNative 这样依托于开源软件发展商业模式的公司,既没有能力去改变上游软件的开源协议,也因为创始工作并非创办企业之后完成的,自身是开放源码的受益者,也就没有太多的纠结。

未来的“开源商业化”公司,基本将会分化成基于已经存在的开源软件做商业产品服务的公司,跟完全自有知识产权,选择性开放软件源码的公司。

在公司掌握软件知识产权的情况下,经过 MongoDB 和 Elastic 等一众公司下场演示,还想直接进行商业竞争的企业应该会大幅减少。而失去了直接的竞争,企业也不会刻意将已经宣传开来的开源协议自己改换成禁止商业竞争的源码公开协议。这样,创始公司一家独大,非商业竞争的黑客用户协同开发,将会是这类企业及软件的最终生存形态。

而知识产权由中立第三方掌握,典型的是各个开源软件基金会的情况,企业将在繁荣生态和顾客对供应商绑定更少的担忧,与更加激烈的商业竞争环境下求存。一个典型的道路是:在自己对上游影响力较弱(红帽)或者技术代差没有形成(Databricks)的时候,通过提供订阅服务和制作发行版来生存;而后,如果能够基于开源软件打开自己的企业级解决方案产品线,开源软件对公司而言就成为一个优秀的技术底座和持续的声誉来源,企业级解决方案中的专有软件,或者市场唯一的专家团队,将是其他竞争对手无法跨越的壁垒;如果很难建立技术代差,则围绕生态提供更全面的咨询订阅服务(IBM)。

企业开源该选什么软件许可证?

开源软件和自由软件的概念与其许可证紧密绑定。

通常,开源软件被定义为使用 OSI 认可的,即符合开源定义的许可证来分发的软件,而自由软件被定义成使用 GPL 或说 Copyleft 式许可证分发的软件。

尽管今天人们最关心的可能是软件的生产过程即如何进行开源协同,但是为软件选择什么样的许可证,仍然是一个项目启动时必须考虑和决定的问题。某种意义上说,软件可以被如何使用和分发,反过来约束了可能实现的协同模式。

GitHub 维护了 ChooseALicense.com 网站以准确、中立地提供常用开源许可证的介绍,并指引开发者为他们的项目选择合适的许可证。不过,这个页面并没有针对企业开源的情形做出针对性的讨论。

本文从企业开源的场景出发,讨论选择不同开源许可证或源码可得的软件许可证,对企业和项目的影响,并给出主观的建议。

Permissive Software Licenses

如今,开源软件选择最多的许可证类别是宽松软件许可证

这类许可证基本上在保留著作权的基础上允许任何人将软件用于任何用途,包括自由地修改和分发,甚至修改版本可以按照任何条款发布,比如添加专有软件式的限制条款。

MIT LICENSE

以使用范围最广的 MIT LICENSE 为例,其内容非常简练:

Copyright (c)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

这段内容可以分成两部分来看。第一部分是只要保留原作者信息和 MIT LICENSE 的拷贝,就可以任意使用本软件。第二部分是全大写的免责声明,即软件按照原样(AS IS)提供,任何情况下原作者或著作权人不对使用软件导致的问题负责。

这基本符合企业开源的直觉:出于某种原因我想要以开源形式发布一个软件,或者后续围绕软件项目建立一个社群,我希望这个软件跟企业的品牌保持关联甚至绑定,同时不希望在没有额外合同的情况下,莫名其妙为使用我开源的软件带来的问题负责。

Apache License 2.0

其他宽松软件许可证基本也延续了 MIT LICENSE 的理念,大同小异,使用起来也没有本质的差别。唯一有明显区别的是 Apache License 2.0 协议。

顾名思义,Apache License 2.0 由 Apache 软件基金会出品。Apache 软件基金会的建立背景是 Apache Web Server 被越来越多商业公司使用,商业公司希望与开发 Apache Web Server 的群体进行正式合规的实体互动,包括捐赠、商标品牌使用和联合举办活动等等。

在这样的背景下,Apache License 2.0 吸引了相当的志愿者律师参与,于 2004 年推出。它与 MIT LICENSE 最大的不同在于法律用语的规范化,以及对专利和商标使用权利的明晰。

其中第三条,写明使用软件所需的所有专利都自动授权给任何人。这就保证了用户不用担心软件许可证只授权了代码的使用权利,而使用过程中涉及的专利没有明确授权带来的未知风险。同时,本条写明这种专利授权不支持用户以此提起诉讼,也就是你用了 Apache License 2.0 许可的软件创建派生作品,随后其他人使用,你不能以 Apache License 2.0 授权你使用相关专利为由,起诉其他人侵犯这些专利。

开源项目 Taichi Lang 从 MIT LICENSE 改为 Apache License 2.0 的讨论当中,就提到这一条款消除了用户的担忧。

同样,自由软件基金会也因此推荐喜欢宽松许可证理念的开发者选择 Apache License 2.0 作为其软件许可证。

其中第六条,写明 Apache License 2.0 并不授予商标使用权利。也就是要在市场营销等活动当中使用被许可软件的商标,需要额外的协议。这实际上保护了软件作者或著作权人的声誉,避免下游混淆上游软件的品牌,或者诱导用户产生上游为其背书的印象。

其中第五条,写明 Contribution 都默认遵守本协议的所有条款,因此作者可以放心地整合补丁并重新分发。

其中第四条和第九条,明确了派生作品添加专有软件式的条款,或者下游提供额外的担保和附加责任,不会影响上游及其他开发者。

此外,Apache License 2.0 的页面上,还建议开发者为每一个构成作品的文件添加协议模板,保证每个文件的内容被单独使用时,也可以依据 Apache License 2.0 的内容来明确使用条件。关于这个动作的意义,可以参考推特上关于代码与 Apache License 2.0 许可的讨论

因此,总体来说,对于朴素地希望发布一个开源软件,允许所有人任意使用,同时保证自己免收不必要的打扰的情况,选择 Apache License 2.0 就是最合适的

Source Avaiable Licenses

2018 年,一系列“开源软件公司”以不菲的价值上市或被收购,一时激起了“开源商业化”的浪潮。然而,在接下来的几年里,这其中的部分企业陆续将软件许可证从开源许可证换到某种受限的源码公开许可证。

这当中最常见的两个软件许可证,就是 Elastic 发布的 Elastic License 2.0 协议,以及 MariaDB 发布的 Business Source License 1.1 协议。

Elastic License 2.0

Elastic License 2.0 协议被 Elastic 和 Airbyte 等公司使用,主要目的是禁止商业竞争。ELv2 的主要内容在其“限制”一节,内容如下:

  1. You may not provide the software to third parties as a hosted or managed service, where the service provides users with access to any substantial set of the features or functionality of the software.
  2. You may not move, change, disable, or circumvent the license key functionality in the software, and you may not remove or obscure any functionality in the software that is protected by the license key.
  3. You may not alter, remove, or obscure any licensing, copyright, or other notices of the licensor in the software. Any use of the licensor’s trademarks is subject to applicable law.

可以看到,这主要保留软件作者的三项权利:

第一,禁止其他人对外提供同类服务。对于 ElasticStack 来说,就是同类的搜索服务或者 Kibana 的展示服务;对于 Airbyte 来说,就是数据同步服务。

这里有两个注意点。第一个是这项限制只在接收方向第三方提供服务时才会触发,也就是如果下游公司只在内部使用服务自己的业务,是不会触发这项限制的。第二个是对第三方提供服务的定义限制在同样的功能集上,也就是说 API 表现大相径庭的传递依赖不会触发这项限制。

举个例子,国内某知名电商公司大规模部署了 ELK Stack 作为倒排索引解决方案,但是直接调用 Elastic API 的服务都是内部服务,因此不会因为第一点触发限制。进一步地,其对外提供的是电商业务下的 CRUD 接口,而从不直接提供与 Elastic 同质化的 API 服务,因此不会因为第二点触发限制。

第二,禁止其他人破解密钥。这个条款是因为 Elastic 把一些高级功能的代码写在主仓库里,又希望限制用户必须付费购买密钥才能启用。由于这种密钥鉴权的逻辑基本就是个 if-else 块,如果没有这一条,前面又允许用户任意修改代码,用户可以很轻易的修改源代码直接使用上游厂商用密钥限制的功能。

早期的 Open Core 的开发模式实际上是通过把高级功能所需的接口写在开放的部分,实现独立发布来解决高级功能收费的问题。ELv2 这一条主要是工程上偷懒,把高级功能代码直接写进主仓库,以一个很容易破解的密钥保护,又在许可里禁止破解密钥完事。

Elastic 的代码相对比较复杂,国内的开放核心软件 Bytebase 使用了相似的模式以密钥限制部分高级功能的使用,代码相对简单易懂,可以阅读相关源码来了解这个模式的使用情况。

第三,禁止未经允许使用商标,或者修改任何版权信息。这个和 Apache License 2.0 的要求其实是一致的。

总的来说,ELv2 对应的商业模式相对自信。它允许用户将软件用于内部服务,无论多大规模。只是当用户无力自己维护内部服务时,通过限制市场上只有自己一家可以提供托管服务,来获得提供服务的垄断地位。

Business Source License 1.1

Business Source License 1.1 被 Cockroach Labs 和 Lightbend 等公司使用,其主要特点有两个:

  • 其一是必须约定一个不长于四年的时间,以 BSL 1.1 发布的代码版本在过了这段时间以后,自动以符合开源定义的协议重新许可,通常是 Apache License 2.0 协议。
  • 其二是上游企业可以约定任意的生产环境使用限制,由于这个约定是任意的,所以采用 BSL 1.1 对应的商业类型也不是单一的。

例如,CockroachDB 的 LICENSE 写法如下:

You may make use of the Licensed Work, provided that you may not use the Licensed Work for a Database Service.

A “Database Service” is a commercial offering that allows third parties (other than your employees and contractors) to access the functionality of the Licensed Work by creating tables whose schemas are controlled by such third parties.

可以看到,这个写法和 ELv2 的第一项限制是一致的,除了对同类服务做了更详细的说明。因此,Cockroach Labs 的商业模型和上面对 ELv2 的总结也大致相同。

同样以这种方式使用 BSL 1.1 的还有 Outline 公司,其知识库软件 Outline 的 LICENSE 表述如下:

You may make use of the Licensed Work, provided that you may not use the Licensed Work for a Document Service.

A “Document Service” is a commercial offering that allows third parties (other than your employees and contractors) to access the functionality of the Licensed Work by creating teams and documents controlled by such third parties.

反观 Lightbend 和 Materialize Inc. 等公司,对使用限制的表述则有很大的出入。

Akka 的 LICENSE 表述如下:

If you develop an application using a version of Play Framework that utilizes binary versions of akka-streams and its dependencies, you may use such binary versions of akka-streams and its dependencies in the development of your application only as they are incorporated into Play Framework and solely to implement the functionality provided by Play Framework; provided that, they are only used in the following way: Connecting to a Play Framework websocket and/or Play Framework request/response bodies for server and play-ws client.

同时,在 Akka 的 License FAQ 页面上,有这样的一段话:

The BSL is a source available license that freely allows usage of the code for development and other non-production work such as testing. Production use of the software requires a commercial license. The commercial license will be available for early stage companies (less than US $25m in annual revenue) at no charge.

基本上,Lightbend 允许初创公司向它索要一份免费使用的商业协议,而通过非常复杂的生产环境使用条件实质上限制了任何有意义的用途。

Materialize 的 LICENSE 表述如下:

Within a single installation of Materialize, you may create one compute cluster with one single-process replica for any purpose and you may concurrently use multiple such installations, subject to each of the following conditions: (a) you may not create installations with multiple clusters, nor compute clusters with multiple replicas, nor compute cluster replicas with multiple processes; and (b) you may not use the Licensed Work for a Database Service. A “Database Service” is a commercial offering that allows third parties (other than your employees and contractors) to access the functionality of the Licensed Work by creating views whose definitions are controlled by such third parties.

除了与 CockroachDB 相同的禁止同类服务以外,Materialize 还通过限制集群的用法实质上将免费的生产用例限制在很低的数据量或者说玩具级别。

这和 MariaDB 公司最早用于其 MaxScale 项目的用法是一致的:

You may use the Licensed Work when your application uses the Licensed Work with a total of less than three server instances for any purpose.

总的来说,BSL 1.1 至少约定了代码一定时间后以开源协议重新许可的条款,而 ELv2 对此只字不提,永远是受限的。然而,这种“当下收费,未来免费”的模式,Eric S. Raymond 在文章《魔法锅》里直指它的缺点:在软件早期,封闭条款往往限制了同行评审和参与,而那时是最需要这些的时候。

从商业模式的角度来看,由于附加条款的灵活性,BSL 1.1 许可的软件可以实现与 ELv2 许可的软件相近的商业模型,也可以更加严苛地限制生产使用,使得任何大规模使用都必须付费。

诱导转向的伪开源战略》当中提到,如果企业初心就是“写个软件好卖钱”,那么选择这类限制性的源码可得软件许可证,是比较合适的

Copyleft Licenses

另一类不容忽略的软件许可证是 Copyleft 式协议,主要代表为 GPLv2/GPLv3/AGPLv3 等。

从历史沿革来看,最早使用 Copyleft Licenses 许可软件产品的知名公司是 MySQL AB 和诸如 Red Hat 的 Linux 发行版提供商。不过,它们使用 GPLv2 的内在逻辑是截然不同的。

Red Hat 和 Canonical Ltd. 这样的公司选择 GPLv2 很大程度上是被动的:因为上游 Linux 选择了 GPLv2 协议,它们提供的发行版作为无可争议的派生软件,在 GPLv2 的约束下,必须以相同的条款分发,没得选择。在这样的背景下,这两家公司分别摸索出了各自开源协同的最佳实践,正如《开放式组织》《社群运营的艺术》所介绍的。

MySQL AB 的逻辑与之不同,它是 MySQL 数据库的第一作者,没有一个上游约束它不得不选择 Copyleft 式协议。MySQL AB 选择 GPLv2 的原因,其实与选择 Source Avaiable Licenses 的企业没有什么区别:用户要么在默认许可下受限地使用软件,要么向上游企业付钱购买没有相应限制的商业许可。

通过 GPLv2 来发布 MySQL 数据库,MySQL AB 公司达到了三个目的:

  1. 除了企业出于保护内部业务源代码的少量受限场景外,MySQL 可以被自由使用。这极大扩展了 MySQL 的使用场景和行业占有率,从而使得用户很难找到同等质量和社群支持水平的替代品。今天,MySQL 在 DB-Engines 排行上仅次于 Oracle 数据库。
  2. GPLv2 对商用的限制,主要在于它的 Copyleft 属性要求派生作品在分发时必须提供源码。这就导致其他公司想要复刻 MySQL 二次开发并再次分发的时候,也必须提供源码,从而很难和上游拉开明显的技术代差,进而保证了 MySQL AB 一家独大的实质垄断地位。
  3. 同时,MySQL AB 采用双重许可的商业模式,允许用户付钱购买无需提供派生作品源代码,但是限制商业竞争的商业许可,利用下游企业担心 Copyleft License “传染性”的心理盈利。

关于 MySQL Dual Licensing 的模型,可以阅读官方的 Commercial License for OEMs, ISVs and VARs 文档。

GPLv3 和 GPLv2 在关键的“派生作品分发时必须提供源码”上没有区别,主要区别是:

  1. 增加了有关专利授权和终止的表述,内容和 Apache License 2.0 如出一辙。
  2. 增加了免责条款和保护版权人权益的例外条款,表述也和 Apache License 2.0 的相关条款大同小异。
  3. 增加了禁止硬件加密的条款,即如果硬件使用了 GPLv3 程序,必须提供让 GPLv3 程序完整运行的密钥,而不能在硬件层面加密限制用户。

Linus 对第三条表示明确的反对。他认为,软件开发人员没有权利规定硬件厂商的行为,如果感到一家硬件厂商的专有行为是讨厌的,你可以购买其它厂商的产品。所以,Linux 现在使用的还是 GPLv2 协议。同时,GPLv2 的第六条写到:“不能添加任何额外的限制”。仅从这一点看,GPLv2 和 GPLv3 是不兼容的,因为两者的第六条是冲突的,不能合并 GPLv2 的代码和 GPLv3 的代码在一起。

关于 GPLv3 的详细解读,可以阅读《大教堂与集市》译者卫剑钒的《人话解读 GPLv3》

AGPLv3 在关键的“派生作品分发时必须提供源码”与 GPLv2 和 GPLv3 有所区别,其第十三条第一段写到:

Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph.

简单来说,GPLv2 和 GPLv3 对“分发”的定义是分发源代码或目标代码,类似云服务这样,用户通过网络访问运行被许可软件的进程,是不属于分发的。AGPLv3 则明确提出用户如果可以通过网络访问运行 AGPLv3 许可的软件的进程,那么用户有权免费取得软件的源代码。

早期的 MongoDB 跟现在的 Logseq 和 ScyllaDB 等公司,因此使用 AGPLv3 作为其软件许可证,以期在云时代延续 MySQL AB 建立起来的商业模式。然而,采用 AGPLv3 仍然面临着一系列挑战。

其中最重要的就是缺乏判例支持。无论海外还是国内,针对 GPLv3 许可的软件都已经都相应判例可循。

基本上,如果你的软件很难以云服务的形式提供,例如 OBS 直播工具或者“罗盒”(Virtual App)插件化框架虚拟引擎系统,那么 GPLv2 或 GPLv3 是可以实质上保护其他竞争对手无法拉开技术差距,也无法建立起独立的品牌的。

然而,AGPLv3 想要保护网络访问情况下可以取得源码的权利,除了 Google 直接出于法律风险禁止使用 AGPLv3 许可的软件,退出同质商业竞争以外,其他云厂商可以让 AGPLv3 的侵权案取证非常困难。例如,MongoDB 的高管就曾经提到,云厂商复刻了 MongoDB 的代码仓库,托管到 GitHub 平台上,实质内部做了更多功能的二次开发并进行市场营销。当 MongoDB 公司根据 AGPLv3 起诉侵权的时候,云厂商就用 GitHub 平台上的复刻仓库搪塞,表示那就是其提供云服务的软件代码,从而让 AGPLv3 维权举步维艰。

MongoDB 随后发布了 Server Side Public License 来延续 MySQL AB 创造的商业模式。SSPL 总体延续了 AGPLv3 的表述,除了在第十三条的表述上有实质性的变动:

If you make the functionality of the Program or a modified version available to third parties as a service, you must make the Service Source Code available via network download to everyone at no charge, under the terms of this License. Making the functionality of the Program or modified version available to third parties as a service includes, without limitation, enabling third parties to interact with the functionality of the Program or modified version remotely through a computer network, offering a service the value of which entirely or primarily derives from the value of the Program or modified version, or offering a service that accomplishes for users the primary purpose of the Program or modified version.

“Service Source Code” means the Corresponding Source for the Program or the modified version, and the Corresponding Source for all programs that you use to make the Program or modified version available as a service, including, without limitation, management software, user interfaces, application program interfaces, automation software, monitoring software, backup software, storage software and hosting software, all such that a user could run an instance of the service using the Service Source Code you make available.

不同于 AGPLv3 要求的是向用户提供软件的派生版本,例如在 MongoDB 上做出的 bugfix 和新增功能,SSPL 要求服务提供方提供构成服务的所有软件的源代码。这个条款威力非常大,假如阿里云以此条款发布 MongoDB 的服务,那么整个阿里云的所有源代码都有需要向用户公开的风险。

当然,MongoDB 也辩解到,这一要求的触发条件和 ELv2 类似,只在服务提供方提供同类服务的情况下才有效。例如,同样以电商公司为例,内部使用 MongoDB 作为数据库,对外只提供电商服务,那么协议上是不受这一条款要求的。

但是 SSPL 的判例至今仍然没有,一旦企业理解有误或者使用出了差错,竞争对手以用户名义借由此条款要求企业公开整个软件栈的源代码,那么企业将陷入巨大的法律风险。因此 SSPL 一出,几乎所有使用 MongoDB 的具备一定规模的公司,都不得不找 MongoDB 公司重新商量合同,实质上让 MongoDB 公司以销售专有软件的形式与其用户签订合同。

总的来说,如果你的软件很难以云服务的形式提供价值,那么使用 GPLv2 或 GPLv3 仍然是保证行业内领袖地位可行的方法。随着 AGPLv3 的判例逐渐丰富,上述搪塞调查的行为逐渐破产,使用 AGPLv3 在一定程度上也能够促进开源社群团结在上游企业周围。

但是,Copyleft Licenses 的初衷是所有软件的自由使用、修改和分发,即使是 MySQL AB 的黄金岁月,仍然有大量的 MySQL 用户合法合规的不需要向 MySQL AB 支付任何费用,至少只是企业内部使用,不涉及向用户分发,就不会受到提供源代码条款的要求。如果企业的初心就是销售专有软件,只是某种程度上提供用户免费试用,那么选择限制性的源码可得软件许可证会更合适。

License Stack

随着“开源商业化”的发展和众多先驱的探索,现如今,“开源商业公司”已经很少用单一的软件许可证来覆盖自己的所有代码了。相反,企业往往采用多种软件协议许可不同组件,形成一个复杂的软件协议栈来满足企业面向不同对象的需求。

Airbyte 的软件协议模型

上图是 Airbyte 的软件协议模型,其核心服务部分是由 ELv2 许可的,而作为周边生态的命令行工具和连接器框架则是 MIT 许可的。这很像 GitHub 的商业模式,核心服务器的代码是专有软件,Airbyte 在 ELv2 下公开其源代码,而 GitHub 完全不公开源代码。周边生态,对于 Airbyte 来说是重要的各个不同数据源和数据汇的连接器,对于 GitHub 来说则是 REST API 和 CLI 及其衍生工具,以及 GitHub Actions 的社群实现,则是完全开放的。

这是因为,作为平台型企业,它本身无法覆盖所有用户在所有场景下的集成需求。通过开放集成接口和 SDK 工具,允许用户自行定制集成插件满足特定场景要求,不会损害上游企业的核心利益,反而能使它具备更强的粘性和更大的不可替代性:其他平台没有这样丰富的集成。

这种模式,与开源运动早期观察到的“硬件糖霜”模式相似,即销售专有硬件盈利,而其驱动软件及其他生态工具是开源许可的。今天,Intel 和 Nvidia 仍然重度使用这样的模式。对于 Airbyte 和 CockroachDB 等公司,将其服务核心软件对应到硬件,则是同样的模式。

另一种复合协议栈是从 Open Core 的模式演化而来的。例如 MariaDB 作为 MySQL 的复刻,其核心服务部分是 GPLv2 许可的。而其规模化的拳头产品 MariaDB MaxScale 则使用 BSL 1.1 许可。当用户想要使用 MaxScale 时,就要受到其生产环境使用限制的约束。

这种模式,同样使用的还有 Databricks 公司。Databricks 的创始团队是 Apache Spark 的核心作者,但是 Databricks 在十余年间并不只是直接销售 Apache Spark 的订阅或者简单的包装,而是基于其核心计算能力开发出了面向 AI 流水线和数据仓库的场景化产品,并且针对不同的业界定制了更具上下文的解决方案。

自然,这些场景化产品的代码和行业解决方案大多是专有软件闭源代码。Databricks 只在需要抢占行业心智高低的时候才会按需开源部分代码,Delta Lake 就是一个典型的例子。

Other Licenses

最后,除了上面这些常见的软件许可证和复合软件栈的用法,再介绍两个小有名气的许可证选择。

Mozilla Public License 2.0

Mozilla Public License 2.0 由 Mozilla 发布 Firefox 时创造的软件许可证发展而来,是 OSI 认可的开源协议。这一协议由于 Hashicorp 的使用重新回到人们的视线当中,一些认同 Hashicorp 理念的公司,也随之使用 MPL 来许可自己的软件。

MPL 被认为是一个弱 Copyleft 式协议:它要求任何针对上游代码文件级别的变更,仍然需要按照 MPL 的条款发布,包括在发布作品时提供源码。然而,对于新增的文件,则不需要。这主要由其 1.7 条对 Larger Work 的定义和 3.3 条对 Larger Work 分发的要求来保证:

1.7 “Larger Work” means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software.

3.3 You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s).

基本上,MPL 的理念是保持接口源代码开放,允许实现代码闭源。Mozilla 写了一个长长的 MPL 2.0 FAQ 页面讨论不同用例下的要求和合理的做法。技术上,MPL 许可的软件可以逐步替换成纯闭源的软件,但是这基本意味着完全重写,也就没有了使用开源软件最初的动机。

由于保持接口开放是下游采取 Upstream First 策略的必要条件,而技术上 MPL 没有 GPL 那样严格的“派生作品分发时必须提供源码”的要求,所以 MPL 的实际操作价值不高。总的来说,适用 MPL 的场合,使用 Apache License 2.0 也基本可以满足要求。

Mulan Licenses

木兰宽松许可证木兰公共许可证是由北京大学牵头起草、修订和发布的以中文编写软件许可证,被国内一些知名软件项目,例如 OceanBase 等所使用。

总的来说,木兰宽松许可证与 Apache License 2.0 类似,去掉了关于 NOTICE 等声明的条款,增加了专利授权在非诉讼维权等情况的终止条款;木兰公共许可证与 GPLv3 的精神类似,要求派生作品分发时必须提供源码,但是简化了很多 GPLv3 冗长的表述。

应该说,木兰系列许可证在内容上没有什么创新,但是以中文写成,加上一些符合中国司法程序的用词和例外情况说明,简化了中国使用者进行法律解释时的复杂度。同时,木兰系列许可证遵从表述简洁原则,去除冗余,条款简洁,容易理解。

对于主要在国内分发的软件来说,可以考虑效仿 SRS 项目的做法,引入木兰系列许可证作为可选软件协议。

❌