开源的本质
开源项目是如今互联网及相关行业高速发展的基础,我们每时每刻的生活都有开源项目的影子,比如很多人手机中的安卓系统、访问的每一个App背后服务器中的Linux系统,在学校学习的Python等编程语言,编写网站服务和处理数据用到的框架等,这些项目大都是开源的。
网络上对于开源软件的解释有很多,比如维基百科的定义:
开源软件(open source software)又称开放源代码软件,是源代码可以任意获取的计算机软件,这种软件的著作权持有人在软件协议的规定下保留一部分权利并允许用户学习、修改以及以任何目的向任何人分发该软件。
AWS网站上的定义:
开源软件是任何人都可以检查、修改和改进源代码的软件。源代码是软件的一部分,计算机程序员通过操作软件来更改应用程序的功能或添加新功能。任何有权访问软件源代码的人都可以通过向应用程序添加功能,或解决现有错误来改进或自定义应用程序。
开源软件的一个重要特点就是软件的源代码是公开的。每个人都可以下载、修改、编译出自己的源代码,这样做的好处有很多:
- 可以根据自己的需求来修改源代码,加入新功能
- 及时解决代码中的bug
- 代码透明,避免被植入后门 而且,大多数情况下,开源软件是免费的!这里涉及到开源软件的许可证问题,开源软件的许可证规定了开源软件的使用范围,包括是否可以用于商用和基于开源软件修改的代码是否需要保持开源的主要问题,有一张图可以简单的了解几种场景的开源许可证的规定范围:
开源的最核心的本质是什么呢?
我认为开源最核心的本质在于两点,一是自由修改代码的权利,二是社区合作的生产模式。
自由修改代码的权利保证了你可以完全控制所运行的代码。
社区合作的模式更是一种开放的协作方式。
开源项目的许可证与版权
虽然开源项目的代码公开了,但是这不意味着没有版权,你在使用或依赖开源项目的时候,也得弄清楚版权协议,否则,可能会让公司遭受重大损失,关于开源项目版权纠纷,最著名的事件就是2010年开始的甲骨文公司(Oracle)诉讼谷歌侵权使用Java案。 稍微年轻一点的朋友可能没有听过这个有点八卦的事件,简单聊一下来龙去脉:
- 1995年,Sun公司开源了Java,当时的开源协议是
- 2003年,安迪·鲁宾等人开始开发安卓系统
- 2005年,谷歌收购了安卓。
- 2010年1月,甲骨文完成了74亿美金对Sun公司的收购。
- 2010年8月,甲骨文向加州法院起诉谷歌侵犯著作权和专利权,由此开始了长达10多年的诉讼过程,期间向谷歌索赔金额约90亿美金。
- 2021年4月,美国最高法院判决谷歌对Java API的使用属于合理使用。
这起诉讼最终以谷歌的胜利而告终,但显然提醒了我们:开源不等于没有版权,不同的开源许可证(License)规定了代码开源使用的范围。
如何确认开源项目规定的使用范围,包括是否可用于商业用途呢?开源项目会通过许可证(License)来告知用户该项目的版权情况。
你完全可以从头开始写一份许可证来标注清楚所有的版权情况,比如近期Meta为开源大模型Llama 3就单独写了一份开源许可证,其中主要规定了:
- 在Llama 3发布的上一个月,如果使用方的产品/服务的月活用户超过7亿,那么使用Llama 3需要得到Meata的单独授权。
- 基于Llama 3来训练/微调的模型,模型的名称前缀需要添加“Llama 3”。
单独写一份许可证可能需要律师的协助,为了避免将来解释条款的成本,大多数开源项目会选择一个许可证模板,常见的许可证模板有GPL/MIT/Apache/BSD等,其中MIT是最为宽松的许可证,下面这张图可以直观的对比一下常见许可证的大致区别:
那么,开源项目的版权归谁呢?有人会认为是项目的发起人,也有人会认为是所有贡献者共同拥有。一般来说,为了避免版权纠纷,在许可证之外,开源项目会单独的明确说明该项目知识产权的归属,比如我们看几个知名的项目:
Vue.js的版权归尤雨溪(Yuxi You)个人拥有:
而PyTorch的版权归属直接写在了许可证里,并且非常详细,这里列出一部分:
目前,Github已经成为了事实上的开源社区平台。绝大多数开源项目在github上面进行托管。你可以在github上直接查看项目的许可证,一般是名为LICENSE的文件。
GitHub是一个开发者平台,允许开发者创建、存储、管理和分享他们的代码。提供基于Git的分布式版本控制以及访问控制、缺陷跟踪、软件功能请求、任务管理、持续集成和每个项目的文档。
开源的商业化
在讨论的开源的商业化之前,我们要清楚,不是所有的开源项目都进行了商业化,也不是所有进行了商业化的开源项目都获得了商业上的成功。
为什么会有公司把自己辛辛苦苦开发的软件的源代码开源呢?
现如今,软件本身在绝大多数时候已经不是公司的核心机密了,软件的代码自身也不一定是公司的核心资产了,而软件背后的「用户」才是核心价值。
开源项目分为两种,第一种是个人在Github上开源一个开源项目,多数情况下会采用Apache或BSD这类比较宽松的许可证。由于满足了很多人的需求,项目会变得非常受欢迎,会有很多人下载、贡献代码,但是此时,发起人和所有的贡献人几乎不会获得任何报酬,这个时候发起人会开始考虑进行商业化。
第二种情况是,开源项目的背后是一个公司或研究机构,如今更多的知名项目都是这种类型,有大公司做背书能够让用户有安全感,这意味着这个项目会持续的更新和基础的质量保证。
开源项目的商业化实际上是一种商业模式的创新,有两个主要的优点,一是吸引用户,形成社区。二是获得用户反馈。
吸引用户,形成开发者社区
不同的项目有不同的使用习惯和设计风格,只要你的开源项目吸引到了开发者,那么开发者就会适应你的项目,当他想要迁移到另一个类似功能的开源项目时,就会产生很高迁移成本,包括熟悉新的项目使用方式、使用时有哪些需要特别注意的点、系统的切换和数据的迁移以及稳定性的保障,这往往需要很大的工作量,除非有足够的理由和收益,否则很少会出现从一个开源项目迁移到一个类似功能的开源项目上。
获得用户反馈
获得反馈比获得用户更重要,获得反馈包括提出bug、提出新功能的建议、提交代码等。 获得反馈能够让你知道你的用户真正需要的是什么,听到用户的声音,这对项目的迭代非常重要。
相比提出bug和新功能的需求,得到普通用户提交代码并不是这些有公司支持的开源项目所迫切需要的,特别是很多大型开源项目,普通用户提交代码已经变得不容易,大部分情况下需要核心维护者的一些指导,而且很多情况下代码评审(code review)会花费超过开发代码的时间,特别是需要多次修改的情况下,一个提交整体的时间线会超过数周。
比如我们来看看一个流行的开源项目PyTorch,在2023年一整年总计有74名用户提交了代码,贡献代码量靠前的大多是Meta的员工。
开发者社区的重要性
开源项目最主要也是最直接的用户就是开发者(Developer)。开发者体验也被称为DX(Developer Experience),良好的开发者体验一个成功的开源项目必不可少的。开发者社区的规模是开源项目价值的一个衡量指标,在相同类型的开源项目中,拥有更庞大的开发者社区的项目往往会走的更远。
当然,要建立一个活跃的开发者社区是非常困难的,这不单是技术问题,而是结合了市场营销和社区运营的复杂问题,此时开源项目就是公司的产品,如何能够让开发者成功使用你的开源项目和产品是建立一个活跃的开发者社区的关键。
当你拥有了庞大的开发者社区之后,这就形成了一个增长飞轮,熟悉你的开源项目的开发者在去一家新公司后也会倾向于使用自己熟悉的开源项目,这就形成了一种基于开发者的传播,此外,如果一个开源项目有很多的开发者,那么一个公司在做技术选型时,往往会考虑开发者社区更大的那个,因为这会设计到后续的开源社区支持以及公司在招聘人才时的难度。
几种商业模式
开源项目的商业模式不尽相同,大体上分为以下几种类型:
- 开源+(技术支持/企业服务),以红帽(RedHat)公司为代表,也被称为RedHat模式。
- 开源核心+(SaaS/插件/工具),比如MongoDB,Elasticsearch等。
- 开源+商业授权,如需要进行商业化,需要单独授权,收取授权费用,入MySQL,也被称为双授权模式。
- 开源+生态,这类开源项目的商业模式比较复杂,最有代表性的是安卓(Android)系统。
没有完美的商业模式,不同类型公司和开源项目适合的商业模式也不相同,同时,很多项目也在摸索不同的商业模式。
就像本文的标题前缀:「开源的逻辑」,后续我会持续更新这个系列,如果你对这些内容感兴趣,别忘了关注我!