# 开源概念

2023年3月15日14分钟阅读

- FormalSciences/ComputerScience
- OperatingSystem/Linux

开源软件的发展始于上世纪 80 年代，起初是由一些计算机爱好者和学术研究人员开发的。随着互联网的发展，越来越多的人开始加入到开源软件开发的行列中。

开源软件是指能够公开查看、使用、复制、修改和分发源代码的软件。源代码开放的软件并不一定是开源软件，开源软件有着严格统一的的定义，封闭软件（Closed Software）、自由软件（Free software）和开源软件（Open source software）有着显著地区别。

区别 | 自由软件 | 开源软件 | 商业软件
--- | --- | --- | ---
私有化 | 反对 | 保护 | 支持
知识产权 | 反对 | 有条件保护 | 支持
使用条件 | 无限制 | 开放源代码 | 有条件
商业模式 | 可能不支持 | 支持 | 支持

自由软件与商业软件是两种截然不同的软件开发思想，前者反对脑力劳动成果私有化、反知识产权，强调软件的使用和传播应该是自由的，所有人都有权使用和修改软件。而商业软件则支持脑力劳动成果私有化，主张软件的使用应该受到一定的控制和限制，开发者有权对软件进行专利保护和商业化运营。

开源软件则是介于两者之间的一种软件开发思想，它保护脑力劳动成果私有化和支持知识产权，但同时强调开放源代码和使用条件的公开和透明，允许其他人使用、修改和分发软件，同时也允许商业化运营，但在使用和分发上有一些条件限制。

在商业模式方面，自由软件和开源软件可能不支持商业模式，或者支持不同类型的商业模式，例如服务、咨询和技术支持等。而商业软件则通常支持商业模式，并通过销售软件许可证等方式获取商业利益。

## 开源软件的定义

开源软件促进协会
OSI 对开源软件有明确的定义，OSI 对开源软件的定义一共有十个条款：

    1. 自由再发布（Free Redistribution）
    2. 源代码（Source Code）
    3. 派生作品（Derived Works）
    4. 作者源代码的完整性（Integrity of The Author's Source Code）
    5. 不能歧视任何个人和团体（No Discrimination Against Persons or Groups）
    6. 不能歧视任何领域（No Discrimination Against Fields of Endeavor）
    7. 许可证的发布（Distribution of License）
    8. 许可证不能针对某个产品（License Must Not Be Specific to a Product）
    9. 许可证不能约束其他软件（License Must Not Restrict Other Software）
    10. 许可证必须技术中立（License Must Be Technology-Neutral）

通过开源软件定义的十个条款，可以清楚的看到 OSI 所坚持的原则：

- 坚持开放，鼓励最大化地参与和协作
- 尊重作者权利，同时保证程序的完整性
- 尊重独立和中立，避免任何可能影响这种独立性的事物

有了这样一个清晰而又完整的定义，在法律层面保证了开源软件的开放性，独立性和继承性。

## 开源软件的优点

如今，开源软件已经成为了计算机行业的重要组成部分。在云计算、大数据、人工智能、区块链等领域，开源软件已经成为了主流。开源软件具有以下优点：

1. 降低成本：使用开源软件可以降低企业和个人的软件开发和使用成本，促进信息技术的普及和发展。
2. 提高软件质量：由于开源软件可以被众多开发者修改和维护，因此往往拥有更高的质量和稳定性。
3. 促进创新：开源软件允许任何人自由修改和定制，因此可以促进创新和技术进步。
4. 社区贡献：开源软件的发展离不开庞大的社区支持和贡献。开源社区的力量可以帮助开源软件更快地发展和成长。

## 开源社区的贡献和影响

开源社区是指一群志同道合的开发者和用户，他们自愿地为开源软件的发展做出贡献。开源社区的贡献和影响包括：

1. 代码贡献：开源社区的开发者可以为开源软件贡献代码和新功能，为软件的发展和改进做出贡献。
2. 社区支持：开源社区的用户可以为其他用户提供支持和帮助，帮助他们解决问题和改进软件。
3. 文档贡献：开源社区的用户可以为开源软件编写文档和教程，帮助其他用户更好地了解和使用软件。
4. 测试贡献：开源社区的用户可以为开源软件测试和反馈问题，帮助开发者发现和修复软件中的漏洞和问题。
5. 社区文化：开源社区的文化包括开放、透明、协作和互助，这种文化对软件开发和技术创新产生了重要影响。

开源社区的贡献和影响不仅限于软件本身，还可以促进技术创新和知识共享。例如，一些开源社区的成员通过协作和分享知识，共同解决了一些重大技术难题，为社会的进步做出了贡献。同时，开源社区的文化也对软件行业和互联网文化产生了重要影响，激发了人们对于开放、自由和协作的追求。

### 著名的开源社区

1. Linux 开源社区
   ：Linux 是一个开源操作系统，由一群志愿者开发和维护，Linux 开源社区是 Linux 开发和用户社区的总称，包括 Linux 内核开发者、Linux 发行版开发者和 Linux 用户等。
2. Apache Software Foundation
   ：Apache Software Foundation 是一个非营利组织，致力于支持开源软件项目的开发和维护，旗下拥有众多著名的开源软件项目，如 Apache HTTP Server、Hadoop、Tomcat 等。
3. GitHub 开源社区
   ：GitHub 是一个代码托管和开源社区平台，用户可以在 GitHub 上创建和维护开源项目，并与其他开发者协作开发和维护项目。
4. Eclipse 开源社区
   ：Eclipse 开源社区是一个致力于开发和维护 Eclipse 开源软件的社区，Eclipse 是一个跨平台的集成开发环境（IDE），被广泛用于 Java 开发和其他编程语言的开发。
5. Mozilla 开源社区
   ：Mozilla 开源社区是一个致力于推广开放网络和开源软件的组织，旗下拥有著名的开源软件项目，如 Firefox 浏览器、Thunderbird 邮件客户端等。

这些开源社区不仅在技术上做出了巨大贡献，还形成了独特的开源文化和价值观，成为了全球开源社区的重要组成部分。

## 开源软件的风险

开源软件主要风险在于 `管理维护` 和 `技术支持` 以及 `许可证法律纠纷`，由于开源软件采用的协作方式，你可能无法追究某一处代码的作者（部分协议要求作者著名）。以及如果出现问题，你可能无法寻找官方的技术支持，更多的支持可能来自于社区，可这种支持不是每次都有好人跳出来帮忙。还有如果你不了解许可证可能会带来的法律风险（部分国家法律不同，如果源代码无许可证，默认著作权属于作者）。

## 开源许可证简介

开源许可证并不只是保护作者的权利，更多是赋予用户各项权利，许可证规定了使用主体，方式，用途。明确说明了用户可以是个人或者公司等，怎么修改和运行以及是否可以用来进行其他合法用途。

在使用开源软件要做的第一步就是找出开源软件中所涉及的所有许可证。每个开源软件的不同版本可能会使用不同的许可证，同时还有注意许可证的版本，以及有些开源软件会采用双重或多重许可（dual-license）的模式。

在 OSI 的网站上列出的 流行并广泛使用且拥有广泛社区的许可证
，分别是：

- Apache 许可证 2.0
- BSD 许可证 3-Clause
- BSD 许可证 2-Clause
- GNU 通用公共许可证（简称 GPL）
- GNU 宽通用公共许可证（简称 LGPL）
- MIT 许可证
- Mozilla 公共许可证 2.0（简称 MPL）
- 通用开发和发布许可证 1.0（简称 CDDL）
- Eclipse 公共许可证 2.0（简称 EPL）

开源软件许可证规定了软件代码的使用、修改和分发等方面的条款和条件，不同的许可证可能有不同的限制和要求。在使用开源软件时，需要仔细阅读和理解相应的许可证，确保自己的使用行为符合许可证的要求。

## 许可证的兼容性

目前经过 ISO 认证的许可证多达 70 多种，被自由软件基金会认可的自由软件许可证也有数十种，而它们的条款又各不相同，有些甚至互相矛盾。这种兼容性问题被称为 `许可证增值问题（License proliferation）`。

怎么样才算兼容呢？如果使用许可证 A 的代码和使用许可证 B 的代码能在一个广域作品中结合在一起，那么 A 和 B 就是兼容的，否则就是不兼容的。更近一步，如果结合后的广义作品可以用许可证 A 发布，那么许可证 B 就是许可证 A 兼容的（A-compatible）。反之亦然，但需要注意的是兼容性并不可逆。

### 如何选择许可证

- 开源许可证选择工具

如今开源软件早已经成为了软件领域不可或缺的重要组成部分，要以辨证的观点看待开源软件。它自由，平等，协作的精神实践了信息和知识共享的理念，并且实现了知识产权保护和分享之间的微妙平衡。同时开源带来的自由，免费有可能也是最贵的。

> 参考： 《开源软件之道》 开源社——开源许可证选择器
> Open Source Initiative
> 阮一峰《如何选择开源许可证》