开源与自由 | 商业自由:从边缘到核心贡献

文 | 肖滢

策划 | h4cd

出品 | OSC开源社区(ID:oschina2013)

当我们谈论开源时,很少谈论自由,尽管开源与自由同行。从 1998 年开源兴起时,我们就无法把开源和自由分割开来。因为它孕育于自由软件运动,自由使用、复制、修改、分发源码,其精神内核一直延续至今。“自由”,为何对开源如此重要?我们将依次用《开源,是背叛自由还是以退为进?》《开放协作:赋予开发者的自由》、《商业自由:从边缘到核心贡献》三篇文章来回答这个问题,本文为第三篇。

270367c65b55a39acee3ee348fb57928.png

不得不承认的是,个人英雄式的独立开发者时代已经落幕,随之而来的是,互联网科技企业成为开源社区的主要力量。

当企业成为开源的主体,开源一定需要商业自由。那么,开源与商业是怎样的关系?商业自由能为开源带来什么?为了保证商业自由,企业做了什么样的选择?无限制地放开商业自由,对开源会有什么影响?

不是二选一

我们提到过,1998 年 Mozilla 的开源,具有划时代意义。由它开始,掀开了企业大规模开源的序幕。在 20 世纪七八十年代,还没有开源的说法,只有“自由软件”,自由软件主要由个人或者大学等机构主导,GNU 工程就是其中典型的代表。而发布自由软件的企业屈指可数,它们处于自由软件世界的边缘位置。

自由软件在商业企业中并不受欢迎。它赋予用户分发软件源代码的自由,在很大程度上损害了企业的利益。 

微软 CEO 比尔·盖茨于1976年发布的一封公开信,可以反映出企业对分享软件这一行为的普遍态度。他在信中抱怨,未经授权使用 Altair BASIC 的情况太普遍,导致新成立的微软公司回报甚微,并指出那些分享拷贝软件的人是剽窃者。“谁能负担得起白做专业工作?哪个业余爱好者可以花 3 年时间进行编程、查找所有错误、记录他的产品并免费分发?事实是,除了我们之外,没有人在业余爱好软件上投入大量资金。你所做的就是盗窃。” 

不过,自由软件本身并不抵制商业化。自由软件基金会(FSF)就明确表示,自由软件无关价格。很多人以为,GNU 计划的精神是不应该为分发软件副本收费,或者应该尽可能少收费——刚好足以支付成本。这是一种误解。实际上,他们鼓励重新分发自由软件的人尽可能多地收费,以此来支持开发。“分发自由软件是为开发筹集资金的机会。不要浪费它!”当然,这一切都建立在保证用户有自由运行、学习、修改以及再发行原版或是修订版软件的前提下。 

“开源”的出现,更是为商业自由而来。1998 年,正是因为 ESR 等一批自由软件运动的倡导者考虑到“free software”中的“free”有免费的意思,对商业不友好,才出现了用“开源”一词替代“自由软件”,以方便对外宣传,吸引更多的企业加入到自由软件运动中来。随后,开源促进会(OSI)批准了第一批许可证,其中就包括 BSD 许可、MIT 许可两个商业友好型的许可证。OSI 维护着开源定义(OSD),判定一份许可证是否属于开源许可证,以 OSI 认证为准。 

从一开始,开源与商业不是二选一的关系,而是共生的关系。 

早在上世纪 90 年代后期,RedHat、MySQL AB 等公司就证明了,利用开源软件来赚钱是可行的。尤其是 RedHat 在1999 年以创纪录的 IPO 公开上市,更是令不少企业艳羡不已。 

而今,开源已经是一种成熟的商业模式,一头扎进去,人才、市场、名声,全都可以握在手里,足够顺利的话,甚至还能建立一个以开源项目为核心的产业生态,坐收渔翁之利。 

2007 年,为避免苹果公司的移动操作系统 iOS 垄断市场,谷歌主动开源 Android 操作系统( 该开源项目简称:AOSP)。由此,Android 系统在移动端的市场份额一路飙升,2020 年超过 70%。这也为谷歌移动服务(GMS)带来广阔的市场。要知道,GMS 每年为谷歌带来数百亿美元收入。 

用开源的手段扩张市场,在软件行业已经屡见不鲜,除了谷歌这样的科技巨头,不少初创企业也加入进来。MongoDB 公司的 CEO Dev Ittycheria 就明确表示,开源就是为了获得市场。公司成立的第三年,MongoDB 已经初步开发完成,却没有足够的资源面向整个庞大的市场进行营销,因此想利用开源的病毒性传播属性,让软件得到广泛使用。这一策略确实奏效,几年之后,MongoDB 成为了最受欢迎的 NoSQL 数据库之一。 

微软收购全球最大的软件开发平台 GitHub 进一步表明,大公司正在寻求成为开源的主要供应商,并准备在其中投入大量资金。  

商业反哺开源 

企业是商业自由的最大受益者,同时也在反哺开源。它已经从最初的开源软件使用者,转变成集创建者、使用者以及贡献者多重身份于一体的角色。开源已经离不开企业,离不开商业自由。 

最直接的证据是,企业贡献了一大批顶级的开源项目,成为开源技术的引领者,尤其是在近几年尤为活跃的人工智能、大数据、云计算等新兴技术领域。微软创建了源码编辑器 VSCode,谷歌创建了机器学习平台 TensorFlow、容器编排平台 Kubernetes,Facebook 创建了移动应用开发框架 React Native。众所周知,这些技术领域的创新都源于开源生态,企业功不可没。 

它们同样也为其他开源项目贡献代码。尤其是软件巨头,成为了最大、最活跃的贡献者。根据 Open Source Contributor Index 公布的 2020 全球开源厂商 GitHub 开源贡献排名,谷歌和微软两大互联网巨头排在榜单前二位,二者参与开源贡献的活跃贡献者人数都超过了 5000 人,参与的开源社区超过 10000 个。微软、谷歌、IBM、Oracle、Facebook 五家科技巨头企业参与的开源项目数超过 20000 个。 

在一些大型的、复杂的、生命周期长的开源项目上,企业所具有的软件工程调度能力,会比零散的个人开发者更具有优势。红帽博客编辑总监 Joe Brockmeier 认为,理想情况下,企业开源结合了两个世界的优点——开源的优势与企业软件提供的稳定性、性能、支持和生态系统。 

也正是因为开源允许商业自由,才有更多商业模式诞生,吸引更多企业加入。从最早期的“RedHat”模式,发展到 SaaS 模式、Open Core 模式、限制性许可模式、混合许可模式等,越来越多的企业在尝试构建新的开源商业模式。在过去的十年中,Open Core 模式成为了最成功和最常用的方法。Elasticsearch 和 MongoDB 就是该模式下商业化的开源项目,二者也都成为了商业开源软件公司(COSS)。对于其他跃跃欲试的企业来说,一套成功的商业模式无疑是具有鼓动性的。 

此外,企业结合开源软件实现商业转化,获得收入之后也能够更好地回馈开源社区,让项目可持续。一个现实问题是,很少有人有足够的空闲时间将其用于真正的开源贡献。因此,不少通过开源获益的企业会付钱给开发人员或运营人员,让他们为开源软件做出贡献。 

难以想象,在企业取代个人成为开源领域绝对主流的时代,没有了商业自由,开源会变成什么。 

许可证的选择 

在开源世界,什么会限制企业的商业自由?那自然是规则,也就是开源许可证。选择什么样的许可证,关系到企业的开源商业模式。 

开源许可证大体可以分为两大类:一类是 Copyleft 许可,另一类是宽松型许可。宽松型许可证对他人如何使用开源组件的限制最小,几近于无。它们允许用户在不同程度下自由使用、修改和重新分发开源代码,并允许在专有衍生作品中使用宽松型许可的开源组件,几乎不需要任何回报。 

简而言之,宽松型意味着不强制开源,条条框框少了,对商业友好,企业利用开源软件发展业务更加便利。 

一个越来越明显的趋势是,宽松型开源许可证使用量明显增长,而 Copyleft 许可证,尤其是GPL 许可证的使用量继续减少。根据 WhiteSource 发布的数据显示,2020年,76% 的开源组件拥有宽松型许可,比上一年提高了 9 个百分点。24% 的开源组件是 Copyleft 许可,比上一年减少了 9 个百分点。在 2012 年,Copyleft 许可证还牢牢占据上风,有 59% 的使用率,而宽松型许可证的使用率仅为 41%。 

宽松型许可证大行其道,开源项目创建者的意志起了决定性的作用。近年来,互联网科技企业成为了开源项目的主要创建者,而不再是个人。使用 Copyleft 许可证,就意味着失去自己的私有软件的控制权,从商业角度出发,限制较少的宽松型许可证是企业的最佳选项。对用户限制越少,对自己也就越有利,企业本身就是最大的用户。 

MIT 许可证及 Apache 2.0 许可证 ,就是典型的宽松型许可证。2020 年,使用 MIT 许可证或 Apache 2.0 许可证的开源项目超过一半,其中不乏一些备受瞩目的开源项目。例如,Ruby on Rails、jQuery 和 Angular.js 使用 MIT 许可证,Kubernetes、TensorFlow 和 Swift 首选 Apache 2.0 许可证。事实上,所有 ASF 项目——其中一些被广泛使用——都在 Apache 2.0 许可下。 

用户也选择以宽松型许可证授权的开源组件,这样可以最大限度地减少法律部门对开源许可证合规性的挑战。而针对许可证不符合企业要求的开源项目,已经有不少企业制定了黑名单,禁止开发人员引用相关代码,从而避免风险。比如,Google 就禁用了以 AGPL 授权的软件。AGPL 是 Copyleft 许可,其中一条特别规定是,即使软件被运行在向公众提供服务的服务器上,那么该软件的任何修改也必须开源。 

总之,为了保证商业自由,企业做出了使用宽松型许可的选择,无论是作为创建者的角色——将软件开源,还是作为使用者的角色——引入开源软件,更遑论作为贡献者的角色提交代码了。 

商业自由的“度” 

站在自由软件之父 RMS 的角度,将自由软件代码用于专有软件,就是在剥夺了用户使用、学习、修改软件的自由;站在 OSI 的角度,将开源软件代码用于专有软件是符合开源精神的,这是在保护用户基于任何目的使用软件的自由,哪怕是将代码用于专有软件。OSD 规定,开源许可不得歧视个人或团体,不得歧视任何领域。企业用户也是用户,商业自由也是自由。 

当开源许可证成为商业自由的保护伞,一视同仁对待所有用户时,就有人开始不满。尤其是不少开源软件创建者,从选择许可证开始,尽可能地让自己拥有更多权利,尽可能地限制他人的自由,从而保护自己的利益。 

历史上不是没有发生过这种事。网景最初开源 Mozilla 项目,就是采用了自己制定的 Netscape 公共许可证,其最显著的特点是它给予了 Mozilla 的原始开发者,也就是网景它自己,有权分发后续及衍生软件,其他贡献者却不可以,最后结果证明了这条路根本行不通。 

随着 SaaS 交付模式日益流行,使用与贡献不对等的情况变得严峻。云服务供应商依托开源软件大举盈利,却不需要贡献任何代码,在这种情况下,无限制地放开商业自由,就是对开源厂商的伤害。贝恩资本的 Salil Deshpande 曾表示:“需要明确的是,这并不违法。但我们认为这是错误的,不利于可持续的开源社区。” 

为解决这一问题而诞生的开源许可证—— AGPL 曾被寄予厚望,但由于它的限制条件有些模糊,比如“用户通过网络进行交互”可以延伸到什么程度没有具体说明,且它是强 Copyleft 许可证,最终被部分开源厂商抛弃。 

不能没有商业自由,但又不能无限制地放开商业自由,商业自由的“度”在哪里? 

面对云服务供应商的“吃白食”行为,有厂商在发布开源项目时,在许可证之外,还会添加限制条款。Nebula Graph 是一款开源的分布式图数据库,基于 Apache 2.0 许可证分发。不久前,开源厂商 Nebula Graph 为了防止云服务供应商从项目中获利而不作出回报,在项目中加入了  Common Clause 1.0 条款。不过在 ASF 的要求下,Nebula 团队最终移除了该条款。 

也有很多开源厂商直接变更许可证,以防止云服务供应商从他们的代码中构建服务。今年 1 月,Elastic 公司宣布,把根据 Apache 2.0 许可授权的 Elasticsearch 和 Kibana 源代码变更为双重授权许可模式,即 SSPL+Elastic 许可。 

SSPL 是 MongoDB 在基于 GPL v3 的基础上,面向服务器端制定的许可证。该许可证虽然允许用户使用及修改产品源代码,但有一个基本要求,就是在该协议下,如果企业将产品作为服务对外提供,则必须同时提供“服务源代码”。所谓“服务源代码”,是指程序或修改版本的相应源代码,以及用于提供此服务的软件源码,包括但不限于管理软件、用户界面、应用程序接口、自动化软件、监控软件、备份软件、存储软件和托管软件,所有这些让用户可以使用可用源码运行服务实例。而 Elastic 许可则更加严格,直接禁止将软件作为托管或托管服务提供给第三方。 

除此之外,Confluent、MongoDB、Cockroach Labs、Redis Labs、Timescale 和 Graylog 等,也都从 OSI 批准的开源许可转向非“开源”的许可。 

如果一个软件限制云厂商使用,那还能算是开源软件吗?当然不算。根据 OSD 第六条,不得歧视任何领域,这就表示,不让商用,不让云服务用,这些行为都是禁止的。把云厂商排除在外的许可证,不是 OSI 所认可的开源许可证。没有采用开源许可证的软件自然也算不上开源软件。对于 SSPL,OSI 就明确表示,它不是开源许可证,因为它实际上剥夺了用户权利。 

面对开源厂商的相继出逃,开源还应该坚持无限制地放任商业自由吗?如果不限制,那么谁来为贡献者的劳动成果买单?企业的角色注定了,开源对它而言,不会是一项只求付出,不求回报的活动。 

如果能够找出让贡献者和使用者之间平衡的点在哪里,或许就会知道,开源能够允许的商业自由的“度”在哪里。从云计算上升的发展势头来看,这个问题将会成为长期争议的焦点。


参考资料: 

1、https://sourcecodecontrol.co/sspl/ 

2、Producing Open Source Software:How to Run a Successful Free Software Project 

3、https://www.whitesourcesoftware.com/resources/blog/open-source-licenses-trends-and-predictions/ 

4、https://www.peterchen.vc/kai-yuan-xiang-mu-shang-ye-hua-de-li-nian-he-lu-jing-light-view/ 

5、https://blog.timescale.com/blog/how-open-source-software-makes-money-time-series-database-f3e4be409467/ 

6、https://firstmonday.org/ojs/index.php/fm/article/view/1211/1131 

7、https://www.mongodb.com/licensing/server-side-public-license 

8、https://www.elastic.co/cn/licensing/elastic-license

往期精彩回顾

送书 | 总也学不会 Linux 命令行?

有奖问答|聊聊 Apache Doris 的性能优化实战技巧

2022 年是 Linux 桌面年吗?


02dcc33683a81a16e9030d6e427558a7.png觉得不错,请点个在看呀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表面上在帮女朋友拍照,其实镜头瞄准的是......

1 哈哈哈哈哈(素材来源网络,侵删)▼2 永远喝不完的牛奶(素材来源网络,侵删)▼3 我的电动车不见了(素材来源网络,侵删)▼4 这次的事就拜托了(素材来源网络&…

用递归实现字符数组的反转

用递归实现字符数组的反转 比如 char a[10] {a, b, c}; 用递归实现后打印为 ‘c’, b, a 代码实现&#xff1a; #include<stdio.h> #include<string.h>void reverse(int length, char a[]);int main(){char a[10] {a, b, c, d, e};int length strlen(a);reve…

pandas添加一行数据_恨晚,Python探索性数据分析神器pandas-profiling,一行代码搞定...

我们使用Pandas进行数据分析时&#xff0c;首先要先对数据集进行探索性数据分析(Exploratory data analysis)&#xff0c;以便有一个大体的了解&#xff0c;明确后续数据处理、分析方向&#xff0c;数据EDA大致包含如下内容&#xff1a;感知数据的直观表现 挖掘潜在的结构 提取…

建立简单的套接字

最近发现学计算机的真的要好好做笔记啊。。。前两天有个学长的聊天工具我是知道没有初始化套接字&#xff0c;可是一时竟然忘记了加载版本库的那几行代码&#xff0c;真是汗。。。硬是回来看自己的程序才知道。。。 今晚复习了一下套接字的建立 有服务端和客服端两个部分 服务端…

对KVC和KVO的理解

对KVC和KVO的理解 对KVC和KVO的理解 kvc kvo KVC KVC是KeyValueCoding的简称&#xff0c;它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。 KVC实例 一个对象拥有某些属性。比如说&#xff0c;一个Person对象有一个name和一个…

Natasha 4.0 探索之路系列(一) 概况

简介Natasha 是一个基于 Roslyn 的动态编译类库&#xff0c;它以极简的 API 完成了动态编译的大部分功能&#xff0c;使用它可以在程序运行时编译出新的程序集。Natasha 允许开发人员直接使用 C# 代码即可编写运行时的功能&#xff0c;避免了 Emit 的学习、开发、维护的成本。N…

相信应该有百分九十的男生看见这个东西是这个状态吧?

1 8400亿人民币是什么概念&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 神奇的翻译&#xff08;素材来源豆瓣&#xff0c;侵删&#xff09;▼3 医生为什么喜欢把手背在后面呢&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 …

postman安装_Postman插件的应用与实战(二)

在postman插件的应用与实战(一)中&#xff0c;介绍了postman插件的安装&#xff0c;使用&#xff0c;collestion的创建以及应用&#xff0c;本小节中&#xff0c;我们来介绍postman结合newman和jenkins持续构建工具&#xff0c;来对postman中的接口测试进行统一的管理。关于new…

struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式

本文演示了JSP中获取HTTP参数的几种方式&#xff0c;还有action中获取HTTP参数的几种方式。 1. 创建JSP页面&#xff08;testParam.jsp&#xff09; <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% page isELIg…

HTTP—缓存

1. ETag HTTP 1.1中引入了ETag来解决缓存的问题。ETag全称是Entity Tag&#xff0c;由服务端生成&#xff0c;服务端可以决定它的生成规则。如果根据文件内容生成散列值。那么条件请求将不会受到时间戳的改动造成带宽浪费。下面是根据内容生成散列值的方法&#xff1a; 1 var g…

python3随记——字符编码

1.1什么是字节 字节&#xff08;Byte&#xff09;是计算机信息技术用于计量存储容量的一种计量单位&#xff0c;也表示一些计算机编程语言中的数据类型和语言字符。 比特&#xff08;bit&#xff09;在计算机中最小的单位&#xff0c;在二进制位的电脑的系统中&#xff0c;每一…

数据结构之线性查找和折半查找

1、线性查找 比如字符串 char s[] = "chenyu"; 如果我们是线性查找的话,就是从字符‘c’依次到字符串结尾‘u’查找 2、折半查找 注意查找之前必须是有序的 比如整形数组 int a[10] = {1, 2, 7, 9, 10}; 查找数字2 我们可以定义 首和尾巴,拿需要查找的数据和…

盖茨被逐出微软董事会真相曝光:长期跟员工搞地下情,27年婚姻中出轨不断,人设已崩...

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;量子位作者&#xff1a;梦晨 鱼羊2020年3月&#xff0c;在比尔盖茨辞去微软董事会职务的时候&#xff0c;人们都在感慨一代互联网大拿&#xff0c;纷纷都到了交接班的时候。万万没想到&#xff0c;一年多之后&#xff0c…

Natasha 4.0 探索之路系列(二) 「域」与插件

域与ALC在 Natasha 发布之后有不少小伙伴跑过来问域相关的问题&#xff0c;能不能兼容 AppDomain、如何使用 AppDomain、为什么 CoreAPI 阉割了 AppDomain 等一系列的问题。今天答复一下&#xff1a;首先 AppDomain 作为程序集隔离容器的存在&#xff0c;是风靡了 .NET Framewo…

cake fork什么意思_Java7任务并行执行神器:Forkamp;Join框架

Fork/Join是什么&#xff1f;Fork/Join框架是Java7提供的并行执行任务框架&#xff0c;思想是将大任务分解成小任务&#xff0c;然后小任务又可以继续分解&#xff0c;然后每个小任务分别计算出结果再合并起来&#xff0c;最后将汇总的结果作为大任务结果。其思想和MapReduce的…

php xml常用函数的集合及四种方法

1、DOM 函数 a、DOMDocument->load()作用&#xff1a;加载xml文件用法&#xff1a;DOMDocument->load( string filename )参数&#xff1a;filename&#xff0c;xml文件&#xff1b;返回&#xff1a;如果成功则返回 TRUE&#xff0c;失败则返回 FALSE。 b、DOMDocument-&…

linux C语言之called object ‘maze’ is not a function or function pointer printf(“%d\t“, maze(i, j))

今天写广度优先搜索的时候出现了这个问题&#xff0c; 解决办法&#xff1a; 特么我傻逼了&#xff0c;明显是数组&#xff0c;我写成了mate(i, j),然后我改了写成了mate[i, j]; 特么我又傻逼了 改成mate[i][j] 就可以了

drozer

安装drozer 1. 准备环境 1&#xff09;JRE / JDK 2) Android SDK 3) Python 2.7 Path, abd和java的环境变量 2. windows 下 安装drozer drozer-installer-2.3.3.zip adb install agent.apk //drozer agent 启动服务端口 adb forward tcp:31415 tcp:31415drozer.bat co…

Greenplum 数据库架构分析

Greenplum 数据库是最先进的分布式开源数据库技术&#xff0c;主要用来处理大规模的数据分析任务&#xff0c;包括数据仓库、商务智能&#xff08;OLAP&#xff09;和数据挖掘等。自2015年10月正式开源以来&#xff0c;受到国内外业内人士的广泛关注。本文就社区关心的Greenplu…