第 1 小节:什么是开源

本篇内容将会从最基本的概念开始带开发者们认识开源。

开源的概念

「开源」一词对应英文 Open Source,最初起源于软件开发领域,因此也称为「开放源代码」,对应的软件则称为开源软件(Open Source Software)。除了我们熟知的开源软件以外,开源的表现形式还有开源硬件(Open Source Hardware)、开放设计(Open Design)、开放文档(Open Document)。

开源软件

那是不是公开源代码的软件就是开源软件呢?

实际上并不是。按照 OSI 组织(Open Source Initiative Association)的 OSD 定义,除了公开源代码,开源软件的发行条款还必须符合以下十个条件:

序号 条款 简单说明
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官方许可证的目录 Open Source Initiative 认可的开源许可证 ,了解常见的开源许可证。

通过了解这些条件约束,我们可以得出开源软件的定义:开源软件是一种技术和立场中立使用许可证约束开放源代码的软件。

开源软件需要保持开放的心态,对任何技术和立场都保持客观公正的态度,而且在开放源代码时,还需要遵循开源许可协议,允许任何人使用、拷贝、修改以及重新发布。开源许可协议主要分为宽松许可协议(Apache、BSD、MIT 等)和严格许可协议(GPL、GPL v3、LGPL、Mozilla 等)两大类。除此之外,一个优秀的可持续发展的开源软件,还需要公开发布项目技术文档和其他材料、二进制文件(可选)等,以及拥有一个开放性的社区,接收用户和开发者的反馈,共同探讨开源软件的发展。

开源硬件

上面我们简单介绍了一下开源软件,那么什么是开源硬件呢?

类比开源软件,你可能会误以为开源硬件是可以免费获得、自由修改并再分发的硬件。如果你这么想,你就大错特错了,毕竟硬件是有形的,是看得见摸得着的。我们先来简单看一下 开源硬件协会(Open Source Hardware Association)对开源硬件的描述:

开源硬件是可以通过公开渠道获得的硬件设计,任何人可以对已有的设计进行学习,修改,发布,制作和销售。硬件设计的源代码的特定的格式可以为其他人获得,以方便对其进行修改。理想情况下,开源硬件使用随处可得的电子元件和材料,标准的过程,开放的基础架构,无限制的内容和开源的设计工具,以最大化个人利用硬件的便利性。开源硬件提供人们在控制他们的技术自由的同时共享知识并鼓励硬件设计开放交流贸易。

这里要划重点了,OSHWA 在描述开源硬件时使用的是硬件设计而不是硬件本身。开源硬件的定义是在开源软件的基础上进行的,这里不再赘述,感兴趣的读者可以在 OSHWA 官网找到开源硬件的完整 定义

目前比较有名的开源硬件有 Arduino树莓派(Raspberry Pi)BeagleBone 等等。

开源设计

开源设计是开源项目的另一表现形式,开源设计的定义是遵循开源许可可以通过公开渠道获得设计类项目,主要指的是非源代码类型的项目,比如: icon、UI、画稿、图纸等。这些项目也需要遵守开源协议,并且享受协议规章的保护。

下面提供一个 icon 的设计,供大家参考。

开源文档

开源文档在开源项目中非常常见,开源文档的定义是遵循开源许可可以通过公开渠道获得文档类项目,开源文档存在于各种项目中,种类覆盖广泛,像博客、百科、菜谱、冷知识、项目说明文档等都可以作为开源文档进行分享。开源文档常见的开源协议也有很多,比如我们《开源指北》使用的协议:CC-BY-NC-SA 协议。

开源的历史

UNIX

提及开源的历史,不得不从 Unix 说起。

在 1965 年前后,贝尔实验室(Bell)、麻省理工学院(MIT)及通用电气公司(GE)曾共同发起了 Multics 项目,旨在开发一个全面的、通用的分时操作系统,实现让大型主机可以同时提供 300 台以上的终端机连接使用的目标。然而,到了 1969 年,由于项目进度落后、资金短缺,在认为 Multics 项目不可能成功之后,贝尔实验室退出了该项目的研究工作。虽然 Multics 项目没有取得成功,但是培养出了很多优秀的人才,其中就包括肯•汤普森(Ken Thompson)和丹尼斯•里奇(Dennis Ritchie)。

第 1 小节:什么是开源 - 图1

图 1.1 Ken Thompson(坐着)和 Dennis Ritchie 在 PDP-11 前工作

回到贝尔实验室后,以肯•汤普森为首的研究人员吸取了 Multics 项目失败的经验教训,将 Multics 庞大而复杂的系统进行简化,实现了一种分时操作系统的雏形,并将其取名为 UNIX。此后十年,UNIX 在学术机构和大型企业中得到了广泛的应用,当时的 UNIX 拥有者 AT&T 公司以低廉甚至免费的许可将 UNIX 源码授权给学术机构做研究或教学之用,许多机构在此源码基础上加以扩充和改进。

由于早期 AT&T 为避免美国司法部起诉它违反《反垄断法》而签订了和解协议,同意不进入计算机行业,不销售任何与计算机有关的产品。因此从 UNIX 诞生起的前十五年, 学术机构和黑客们自由地共享源码,以分散的方式共同合作开发 UNIX 系统。为后来的自由和开源软件的意识形态和社区诞生过程中起到了奠基性的作用。

转折发生在 1984 年,由于对 AT&T 的限制法令被解除,AT&T 开始以能获利的价格销售 UNIX。UNIX 的源码依然可用,但 AT&T 将 UNIX 从研究性质的项目转变为一个商业项目,这在 UNIX 黑客社区里产生了危机,他们开始寻找一个可替代的类 UNIX 系统。

GNU

实际上,在 UNIX 变成一个商业项目之前,由于硬件价格的不断下跌,制造商已经开始期望软件能够带来额外的收入。于是,开始出现种种保护软件、对其收费的措施,越来越多的厂商开始单独销售软件,也不再提供软件的源代码,软件工业开始独立出来了。1976 年,比尔·盖茨就曾发表《致计算机爱好者的公开信》,明确提出了软件版权(CopyRight)的理念。

输入图片说明

图 1.2 Richard Stallman

1983 年,由于私有软件的增长和对不再能自由使用计算机程序的担忧,MIT 的理查德•斯托曼(Richard Stallman)开始倡导自由软件运动,并发起了 GNU 计划。GNU 是「GNU is NOT UNIX」的无穷递归缩写,其目标是构建一整套完全由自由软件构成的 UNIX OS 体系。GNU 起初进展很顺利,开发出 GLibc、GCC、GDB 等一系列操作系统必备软件。

随着推动自由软件发展和成熟的愿景日益强烈,理查德·斯托曼意识到仅通过编写和分享 GNU 代码是远远不够的。于是,在 1985 年创建了自由软件基金会(Free Software Foundation,简称 FSF),其主要工作是运行 GNU 计划,开发更多的自由软件。同时,FSF 还创建了保护 GNU 和其他自由软件项目的法律和制度框架,提出了与 CopyRight 理念针锋相对的 CopyLeft(许可复制权)理念,其表现形式为 GPL,即公共许可证(General Pubic License)。

Linux

1991 年,林纳斯·托瓦兹(Linus Torvalds)公开发布了一个类 UNIX 操作系统内核 —— Linux,并接受 CopyLeft 理念。从 Linux 0.12 版本起,Linux 内核开始采用 GPL 许可证的新版权声明。虽然 Linux 内核并不是 GNU 计划的一部分,但由于 HURD 内核进展缓慢,使得 Linux 得到广泛关注并得以快速发展。GNU 与 Linux 的发展,可以说是相辅相成,因此 我们通常把使用 Linux 内核并且大量使用 GNU 组件的操作系统发行版称为 GNU/Linux。

输入图片说明

图 1.3 Linus Torvalds

正是 Linux 的出现,使得自由软件运动有了自己可以与 Microsoft 的 Windows 相抗衡的操作系统。自由软件运动初战告捷。但是,自由软件运动关于自由的追求,毕竟和现实的商业氛围格格不入,带有着过于理想化的色彩。这种反商业的信条,让一些本来也反对私有软件的人士对自由软件敬而远之。正是在这种背景下,一部分原有自由软件运动人士,开始尝试将理想的自由软件与现实的商业氛围进行某种衔接。

自由软件和开源软件

1998 年,埃里克·雷蒙德(Eric Raymond)等人成立了一个名为开源促进会(Open Source Initiative,简称 OSI)的组织。为了减少意识形态上的沟壑,以及「自由(Free)」一词造成免费软件的误解。OSI 组织决定从「自由软件」中去掉了「自由」一词,使用「开源软件」(Open Source Software)作为共通名称,并创建了自己的开放源码的定义,以及自己的一套许可证。

输入图片说明

图 1.4 1998 年 Open Source Summit

正因如此,自由软件运动和开源软件运动有着密不可分的关系,两者的根本差别在于它们看待世界的方法。开源软件运动的理念更倾向于解决实际问题,既抓住了私有软件的痛点,又实现了与商业的融合。

开源、Git和代码托管平台

前面提到,开源软件是允许自由复制和重新分发的,那么分散的开发者之间是如何协作的呢?尤其是 Linux 这样依靠全世界热心的志愿者参与的项目。其实早年(1991-2002 年间)世界各地的志愿者是通过 diff 的方式把源代码补丁发给 Linus,然后由 Linus 本人通过手工方式合并代码。直到 2002 年,Linux 项目组才开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。

但好景不长,2005 年,开发 BitKeeper 的商业公司结束了与 Linux 内核开源社区的合作。于是 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)决定开发自己的版本控制系统 —— Git 。很快,Linux 内核的源码已经由 Git 全面管理了。Git 是完全分布式的,同时拥有强大的代码管理能力,支持离线操作和非线性分支管理,使用 Git 可以让散布各地的开发者更加高效地协同工作,可以说,Git 的出现极大地推动了开源的发展。

输入图片说明

图 1.5 GitHub 创始人 P.J. Hyett、Tom Preston-Werner 和 Chris Wanstrath

2008 年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数开源项目开始迁移至 GitHub。GitHub 的出现让开源的工作方式变得更简单和有趣了。如今,每天都有无数来自世界各地的开发者在 GitHub 上进行交流,Github 已经成为一个包含问题追踪和版本控制的特殊社交网络。

初学者容易混淆 Git 和代码托管平台的概念。Git 是版本控制系统,开发者可以通过 Git 在本地工作空间建立项目仓库,每一个 Git 仓库都会包含一个 .git 目录,里面存储了该项目的每一次源代码的提交日志,可以方便地回退到过去的任意一个提交的版本与过去的代码进行比对。毫不夸张地说,Git 仓库就像是一个具有魔法的文件系统,Git 则帮我们记录该仓库下所有的读写信息,并在工作空间、暂存区、本地仓库之间随意切换。

而代码托管平台,比如 GitHubGitLabBitbucketGitee 等,则是基于 Git 的代码托管平台,通过网络为用户提供 Git 仓库托管服务。得益于 Git 分布式的特性,Git 代码托管平台上的仓库通常充当远程仓库的角色,便于多个开发者之间的同步。在此基础之上,代码托管平台还提供了许多协作功能,将版本管理、Bug 跟踪、代码审查、邮件列表、IRC 等众多功能组合在一起,以实现更高效的协同开发。简单来说,代码托管平台不仅仅提供代码托管服务,还有项目管理,甚至社交等功能。

总的来说,Git 和代码托管平台有直接关联,但又有许多不同的地方。关于 Git 和代码托管平台的操作,将在后续章节展开描述。

小结

不会写代码也可以参与开源吗?相信你在读完这篇文章后,在自己心中应该有了答案。

当然,答案是肯定的。

从自由软件运动和开源文化的发展来看,我们会发现其实它是一场社会运动,是一种生产方式的革新。开源运动旨在利用开源软件的价值和分散的生产模型,为其社区和行业的问题寻找新的解决方式。之所以首先出现在软件领域,是因为软件作为一个新兴领域,所受阻力相对较小,同时软件可以依托网络进行异步协作和分发,大大减少了时间和空间的差异以及获取成本。但从涉猎范围来看,开源除了适用于软件领域以外,在开源硬件、开源设计、开源文档等领域也有足够的发挥空间。

时至今日,开源已经成为一种超越软件生产界限的运动和工作方式。「源」的含义也从「源代码」扩展到各类「资源」。像文中提到的硬件领域,随着 Arduino 和树莓派的流行,如今我们对「开源硬件」一词已经不陌生了。还有许多与软件源代码具有相同传播属性的各类设计文档,比如书籍、博客、食谱、配方、照片、音频和视频制品等资料。非营利性组织 Creative Commons 的 CC 许可协议就是专门应用于此类著作权法的保护。

开源与我们息息相关,即便你不写代码,我们也期望大家能够参与开源(强烈建议)!愿你在开源领域乘风破浪,所向无前!

参考资料

本部分内容贡献者

阿基米东雪山凌狐Nicholas Zhan我是XXXWhitePaperbrycentaotieren西狩