不可否认,Apache 项目已经改变了世界。它产生的一些影响包括以下几点:

  • 他们的 HTTPD 应用程序是第一个强大且可用于生产的网络服务器;
  • 他们还在法律上产生了令人印象深刻的影响,因为 Apache 2.0 是开源世界中最流行的许可协议;
  • 随着 Apache 软件基金会扩展到其他计算项目,该基金会成为了当今许多最受欢迎的软件的孵化地:如 Hadoop、Spark 和 Kafka 等项目 —— 基金会俨然成为了一个包含了由官方或孵化器中诞生的 60 个项目所组成的聚宝盆。

除了这些成就,Apache 项目对文化和在线社区的贡献同样重要。本文回顾了该项目早期的发展历程,如今该项目已经有 25 年的历史了(Apache 软件基金会是在该项目准备站稳脚跟时成立的,今年 3 月 26 日正式庆祝成立 22 周年)。

大多数关于 Apache 早期的描述都集中在他们的技术工作上,所以我希望这篇文章能够帮助人们更好地理解 Apache 是如何帮助建立开源运动的。

Apache 起源于 1995 年初,一群程序员通过电子邮件聚集在一起,拯救国家超级计算应用中心(NCSA)开发的一台网络服务器,而 NCSA 对该项目的支持力度正在下降。在那个历史阶段,通过互联网进行合作还是比较新鲜的。通常的模式是由一个单独的项目负责人或一个小团队来维持控制,并以此为一个中心,其他人可以向其提交修改。这些改动被称为补丁(patches,这也是 Apache 名称的由来)。

Linux 和其他项目正在组建社区,这些社区不仅仅是提交补丁,而是允许通过电子邮件参与决策。但是这些社区缺乏参与的基本规则,而且可能会表现出粗糙的人际关系,让许多贡献者望而却步。Debian 可能是最早将领导权分布在地理距离上的自由软件项目之一,但它的沟通风格也是对抗性的(有些观察家会用更强烈的语言来描述),以至于大多数现代开源项目都不能容忍。总之,自由软件和开源软件运动不得不做一些成长的工作。

到了 1992 年,万维网被网民公认为是一股重要力量。但支持它的软件却处于脆弱的状态。Tim Berners-Lee 曾为欧洲核研究组织(CERN,以法文名字命名)开发了一个网络服务器,但它是为该组织的需求而设计的,其中涉及共享大型数据集。该服务器并不适合大众在 20 世纪 90 年代初开始进行的各种活动。

NCSA 也是一个科学组织,但它的服务器有更广泛的吸引力。在当时典型的开发模式中,它的开发依赖于一个程序员 Rob McCool,其他程序员将他们的补丁发送给他。

在 Marc Andreessen 离开 NCSA 成立网景公司(著名的网络浏览器开发商)后,这种情况发生了改变。虽然网景已经倒闭,但你很可能正在使用他的作品的衍生品 —— Firefox 网络浏览器来阅读这篇文章。当时 NCSA 的很多员工都跟着他去了网景,其中也包括 Rob McCool。因为网景公司只关心浏览器,突然间 NCSA 根本没有人在从事任何网络服务器的相关工作了。

所以在 1995 年初,程序员们开始注意到,当他们通过电子邮件向 NCSA 发送补丁时,没有人回应,也没有后续更新推出。当他们弄明白发生了什么事后,他们通过电子邮件找到了对方,并决定自己来接这个项目。

这个以奇特方式形成的社区的关键特征是自愿性。没有人会被告知要做什么工作。如果他们有兴趣,他们就写代码,如果不感兴趣,他们就去做其他事情。人们可以开玩笑地称这个团队为无政府主义公社。

这个项目的基本特征导致了对尊重、开放交流以及其他后来被称为 The Apache Way 的元素的关注。

Dirk-Willem van Gulik 在为本文所做的采访中解释说,他们必须"将规则偏向于行动而不是不行动"。 换句话说,他们不敢为提案设置高门槛,因为这会让人根本不愿意工作。他说,早期的程序员们并没有过多地讨论社区,但他们确实向互联网工程任务组(IETF)寻找灵感,IETF 以依赖"粗略的共识和运行代码"而闻名。

那群体的凝聚力呢?在这里,van Gulik 表示,开发者们发现他们有足够的价值观和目标,因此可以很好地合作。从今天的角度来看,这个团队看起来是同质的(都是男性、都受过教育、而且大部分是白人),但他们来自许多不同的国家、有着不同的文化,甚至有些人的英语并不流利。此外,根据 van Gulik 的说法,这些开发人员来自各种迥异的项目:主要是 OpenBSD、Linux、Perl 和 Python。因此,能够在漫长的地理距离上形成一个有凝聚力的团队是一项成就。他们中的大多数人直到 1998 年第一届 ApacheCon 才见面。

公开讨论的一个关键影响是,它教育了小组的初级成员,帮助他们在忠于项目目标和文化的同时,站出来承担更大的责任。正如 Thomas Østerlie 所说:"通过协作和讨论,隐性知识被转化为显性知识。"

所有的志愿者组织,特别是当它们缺乏一个核心的、有凝聚力的团队时,会面临一个重大的风险:参与者会停止贡献。根据 Østerlie 的论文,在项目成立两个月后,这种情况就发生了。论文中根据邮件档案对这一时期的情况进行了描述,并进行了分析。

一点基本的计算机哲学将帮助我们更好的理解发生了什么。计算机领域已经从单体程序,即每一个小小的改变都可能拉动某个地方的隐蔽杠杆,对应用程序产生破坏性影响的程序,发展到模块化程序,即把不同的功能分开。模块化如今在微服务中表现得最为突出。

就像 1995 年的大多数软件一样,NCSA 服务器是单体的。而这是可持续的,因为 McCool 一直在负责整个事情。

但现在想想,当世界上不同地方的十几个人开始做出改变时,会发生什么?这样的多人社区是无法与单体架构共存的。此外,模块化将减少关于包含哪些功能的争论。想要某个功能的人可以为它创建一个模块,而不想要这个功能的人可以直接跳过模块的安装。

但是,将一个大型程序模块化是令人生畏的。它不能通过 "补丁"来完成。一个人(实际上是一个临时的项目负责人)必须重新架构整个程序。

在没有模块化的情况下,人们感到沮丧,停止了贡献。幸运的是,一位名叫 Robert Thau 的程序员承担了创建模块化服务器的大任,他把这个项目称为 Shambhala 项目。每个人都很喜欢这个变化,Apache 项目又有了起色。

另一个给社区带来一些压力的大转折点是 2.0 版本,它也围绕着一种模块化的形式。正如 van Gulik 向我解释的那样,一些底层库被证明对 Web 服务器以外的项目有用。许多人希望有一个不需要安装服务器就能安装的库的版本。但由于将库分离出来会是一个庞大的项目,对在服务器上工作的人没有明显的好处,所以有些人反对。尽管如此,这个版本还是完成了。

我们已经看到,该团队拒绝了项目负责人模式,不再以负责人为中心进行代码提交。但在一个人来人往的项目上,形式上的民主也行不通。这里没有演讲或选民,只有一群想来就来的人。

幸运的是,软件可以轻松满足大多数需求。正如我前面所解释的,人们可以选择他们想要的功能,所以任何人都可以添加他们认为重要的东西。另一方面,必须有一个连贯的策略来防止臃肿或考虑不周的变化。

幸运的是,团队出于纯粹实用的原因而达成的一项政策被证明是有价值的,它可以防止 van Gulik 所说的 "失控进程"。团队知道,人们处于许多不同的时区,许多人会在不同的时间请假几天去度周末或度假。所以他们制定了一个规则,即在决定任何重要的变更之前,至少要等待48小时。这样的政策在今天的许多 DevOps、敏捷编程环境中是无法接受的慢动作。但 Apache 团队很欣赏它带来的稳定性。

那么,如何创造一种情景,即如果一个功能有一定的最低支持率,就可以添加它?这就是著名的 +1 系统的出现。这几乎是一个偶然的创新。

1995 年 3 月,在团队中扮演重要角色的 Rob Hartill 发现,他在审查补丁方面落后了。为了简化审查,他自发地发明了一个三级系统(-1、0 和 +1)来评定补丁,并在邮件信息中介绍了这个系统。

现在邮件列表上的人都认识到了 +1 的约定。它在 GitHub 和 GitLab 上的形式化就表明了它的优势。任何在项目中工作的人都可以在一个问题上点击大拇指向上或大拇指向下的按钮。

但这个惯例在 Apache 变得更加复杂。根据 van Gulik 的说法,在某些场合数字还体现了具体的承诺:

  • +1 —— 我不仅支持这个提案,而且会努力维护和修正它;
  • -1 —— 我反对这个提案,但如果它被接受,我仍然会努力维护和修正它;
  • -0 —— 我反对这项提案,也不会维护它;
  • +0 —— 我支持这个提案,但不会维护它。

Apache 仍然是一个至关重要的 Web 服务器,也是该领域中最受欢迎的。对于建设开源社区来说,创建项目的经验教训仍然是整个开源世界的共鸣。建议每个项目都要尊重 Apache "社区高于代码"的价值观。

在 21世纪头十年的后期,社区领袖们聚集在一起,正式确定了自由软件开发的最佳实践。2009年,Jono Bacon 根据自己多年的开源经验,出版了《社区的艺术》。在 2009 年由他的出版商 O'Reilly Media 举办的开源大会上,Bacon 介绍了一个社区领导力峰会,这个峰会在全球很多地方持续了十年。

在我看来,这十年间,开源社区在对社区和文化的关注上有了巨大的成长。在我的记忆中,在最初的几次社区领导力峰会上,参加的都是项目成员,他们自发地承担了建设和指导社区的非正式角色。自 1995 年以来,我们都学到了很多东西。就像世界永远不会允许互联网基础设施的一个关键部分被忽视一样,开源社区将越来越优先考虑如何对待人们。而这也将引导软件更好地满足人们的需求。

04-06 21:54