本文最初发表于 Increment 网站,经原作者 Andrew Leonard 授权,InfoQ 中文站翻译并分享。
1993 年,Jim Kingdon 开始在 Cygnus Solutions 做程序员,这家公司是位于旧金山湾区的一家专门从事开发 GNU 自由软件操作系统组件的公司。
但是 Kingdon 并不想搬到硅谷,当时他住在弗吉尼亚州的一个社区里,他想留在那里。尽管 2020 年,大多数科技界人士能不受地点限制在任何地方工作,但是在 1993 年,跨区工作却是难上加难。那时,CVS 是 Cygnus 用来协调多个程序员工作的软件程序,使其成为一棵源代码树,其设置为只允许访问总部本地计算机的人员一起工作。Kingdon 根本没有办法远程从弗吉尼亚州登录 CVS,他无法在家里工作。
因此,Kingdon 做了一件任何有自尊心的黑客都会做的事情。他为 CVS 拼凑了一个客户端 - 服务器模式,使它能够在互联网上使用该软件。他现在可以从湾区的 CVS 仓库中取出代码,放到自己在弗吉尼亚州的计算机上,顺利地开展工作,完成后再提交回去。
Cygnus 是一家植根于黑客文化的公司,对 Kingdon 的自我修改并未提出任何疑问。就像联合创始人 Michael Tiemann 对 Increment 所说的那样,“有人说,‘我要通过修改我所需要的代码而得到我想要的生活’,这是非常正常的事。”
Jim Blandy 曾是 Kongdon 的大学时的室友,他也是一名自由软件程序员,曾参与过多个版本控制软件项目。据他说,Kingdon 并没有对自己的改动进行大肆宣传,他只是使用这些改动来完成他的工作。但 Blandy 一直在寻找一种方法,可以在软件项目中与他自己的一位同事进行远程合作,当他得知 Kingdom 的黑客行为后感到震惊。2020 年 7 月,他在为 CoRecursive 录制的播客“Software That Don't Suck”上说道:“这真是太神奇了。他完全是凭着意志力把 CVS 撕成了一个客户端和服务器。”
在 Blandy 将 Kingdon 的修改在自己的机器上运行后,他最终说服了 CVS 的官方维护者将其添加到他们的主发行版中。在他看来,这些改动的影响是革命性的。Kingdon 对 CVS 的修改开启了一个软件合作开发的新纪元。
Blandy 在播客上说:“你在本地工作,没有人会妨碍你,然后你做出承诺,噗的一声,大家都看见了。它席卷了开源世界。几年之内,CVS 就成了标准。”
“开源”一词是由 Foresight Institute 的执行董事 Christine Peterson 在 1998 年正式提出的。但是,志愿者程序员合作开发旨在自由共享和修改软件的这一概念,深深植根于新兴互联网最早的编程文化中。然而,在 Kingdon 的自发升级之前,协调远距离分开的程序员的工作非常麻烦,通常需要程序员通过电子邮件相互发送大量的压缩代码以及相关的补丁来增加新功能或修复错误。Kingdon 消除了在线协作的一大障碍,从而证明了开放源码软件的兴起与远程工作现象之间激动人心的联系。
从最早的时候起,开放源码软件项目就有赖于全球社区的贡献,这些社区中的工作人员所处的时区彼此相隔遥远。因此,开源软件开发工具的发展一直在不懈地推动着使远程工作变得更加容易的需求。开源软件的历史清楚地说明了这个故事:随着程序员对远程工作的基本限制有了更好的理解,他们改进了自己的工具来克服它们。
一般而言,一个成功的软件工程工具“从一开始就期望能够实现远程工作”,Apache Web 服务器项目的联合创始人 Brian Behlendorf 认为,即使是为同一家公司工作的程序员也不必在同一层楼或同一栋楼里。“(但是)开源是一个更大的推动作用,因为(要想成功),你必须假定人们不仅不在同一个房间,甚至不在同一个大陆。”
开源计划的前主席、现任 Perl 基金会董事会成员 Allison Randal 说:“作为一种通用模式,所有的开发都是同步进行的:开源开发人员从一开始就远程协作,因此他们对现有的工具感到痛苦,并且创建或采纳了新的工具。随着电子邮件、聊天、交互式网站、源代码管理、共享和下载等工具的改进,使得开源的协作文化变得更具可行性,从而有助于更广泛地传播。”
这类工具的示例包括直接的必需品,例如邮件列表和 IRC(Internet Relay Chat,互联网中继聊天),用于处理物理上和时间上分离的程序员之间的异步和同步通信,SSH 协议用于安全和身份认证,以及各种 Bug 和问题跟踪器。但是,对于成功的远程协作软件开发来说,没有任何一项创新比版本控制这一至关重要的工作更为关键。让多个人在同一个代码库上高效地工作是开源软件开发的首要任务。
如果仔细研究一下在 20 世纪 80 年代、90 年代和 2000 年相继出现的三个版本控制系统:CVS、Subversion 和 Git,就能完全支持这样一种论点:开源世界所接受的软件开发工具的演变是由远程工作者的需求所塑造的。每一次版本控制软件的更新迭代,都可以克服阻碍协作的障碍,使远程工作者更容易地编写出优秀的软件。大体上来说,成功是通过平衡两个看似相互对立的设计需求来实现的:确保公平地获取关于项目状态的准确信息,以及尽可能地分散对创建过程的控制。
CVS 最初是由荷兰程序员和大学讲师 Dick Grune 在 1986 年创建的。Grune 和他的两名学生一起使用一个 C 编译器工作,但是他们很少有面对面工作的时间安排。根据 Grune 在他自己的主页上的描述,CVS 的全部目的是“让我们可以独立地提交版本”。
我给 Grune 发了一封电子邮件,询问他的创建是否证明了版本控制系统在分布式环境中的一个最重要的特性,那就是它必须能够与开源环境的程序员协调各种不同的环境:位置、时区等等。
Grune 回复邮件道:“确实如此。”他补充说,他对协作这一难题的解决方案也适用于常见的情况,比如志愿者程序员发现自己被迫将精力集中在日常工作上,而不是他们的开源贡献。
“现实生活可能会被打乱,”他写道。“突然之间,你两个月都不在圈子里了。然后,当你回来的时候,你做了‘CVS 更新’,你就又回来了(几乎可以说,CVS 并不是一个奇迹创造者)。”
对于那些曾记得与它共事过的战痕累累的老兵来说,“奇迹创造者”和“CVS”这样的字眼组合在一起,很可能会让他们悲叹不已,因为尽管它提供了所有的服务,但由于它的 Bug 和独特之处而臭名昭著。20 世纪 90 年代末,当 Behlendorf 的初创公司 CollabNet 出资创建版本控制系统 Subversion 时,它的主要目标几乎没有任何革命性的意义。开源软件程序员们只是迫切地想要一个无障碍的工作环境。
正如 Subversion 的主要开发者之一、《生产开源软件》(Producing Open Source Software)的作者 Karl Fogel 在我与他交谈时开玩笑说的那样,“开源协作的方式并不是一个宏大的愿景;更像是,‘在 CVS 中,每天都有以下事情让我很烦,如果我们有一个没有这些问题的系统,我就不会那么烦了’。”
Subversion 于 2000 年首次发布,随后在开源世界中广受欢迎,正是因为它确实避免了很多与 CVS 相关的头疼问题。而 Fogel 指出,它的一些改进结果对远程工作者来说意义重大。
Fogel 分享说,CVS 的一大缺点是,在任何给定的时刻,代码库的确切状态往往不清楚。举例来说,如果一个开发者在上传一连串提交的过程中,在中途失去了网络连接,CVS 可能会搞不清楚提交是否真的完成了。如果两个开发者同时上传提交到代码树的同一部分,也会出现类似的不精确性。为了解决这一问题,Fogel 和他的合作者 Blandy(在 CVS 首次修补五年后,仍然致力于改进开源协作的版本控制软件)确保 Subversion 纳入了“原子提交”(atomic commits)的原则,这是一个计算机科学术语,Fogel 将其定义为“要么整个事情发生了,要么什么都没发生”。
“能够有一种方式来讨论代码的具体状态,”Blandy 说,“这对于协作来说无疑是很重要的,而这正是 Subversion 在 CVS 之上引入的方式。”
这一基本原理强调了一些事情,回想起来,这些事情对于构建一个由远程工作工作者组成的团队所使用的软件显然是至关重要的。如果你的团队成员分布在芬兰、台湾,比如位于弗吉尼亚的一个社区之间,他们被时区分开,相距遥远,每个人都需要确切地知道代码库的情况,才能做出富有成效的贡献。
“所有这些工具都产生了我所说的永久性的子引用(sub-referenceable)的书面记录。”Fogel 说。“子引用”是指如果多方之间正在进行信息交换,那么该交换中的任何信息或者任何接近该信息的信息都可以通过唯一的链接进行引用。
他还指出,“分布在不同时区的人们所需要的是一种方法,以确定我们在任何特定时刻所谈论的实体是什么。(所有)不同的开源工具在自动(创建)这种书面的、子引用的路径方面都非常出色,这使得远程协作成为可能。”
Behlendorf 指出,朝九晚五的办公室软件工程团队“已经习惯于物理白板、大量打印输出以及与肢体语言密切相关的交流过程。目前,问题跟踪和项目规划工具被这些团队所使用,这些工具假定大多数人都在家里工作,并且(这意味着)每个人都有平等地(获得)参与这个过程的权利。”
Subversion 在 2000 年首次发布并随后被 Apache 网络服务器项目采用之后,在随后的十年里,Subversion 在开源世界中的受欢迎程度稳步上升。但是到了 2005 年,Linux 内核开发社区与 Bitkeeper 的创始人 Larry McEvoy 之间发生了争执,而 Bitkeeper 是一种专有的版本控制系统,McEvoy 允许 Linux 黑客免费使用,这促使 Linus Torvalds 从维护内核的工作中抽身出来,开始研发新的版本控制系统,称为 Git。
根据 Torvalds 的说法,他从 2005 年 4 月 3 日开始编写 Git 代码,并在 4 月 7 日发布了自托管版本。其他 Linux 开发者也迅速加入进来,到了 7 月,Torvalds 将监督 Git 的职责转交给了 Git 最活跃的贡献者之一,Junio Hamano。
如今,从仓库的数量、Google 搜索趋势、开发者调查等方面来看,Git 是世界上最受欢迎的版本控制软件。(2018 年,StackOverflow 对开发者进行的一项调查发现,在 74000 名受访者中,近 88% 的人使用 Git。)正如 Blandy 对 Increment 所承认的那样,“Git 就是未来”。
2007 年,Torvalds 在 Google 的一次演讲中明确指出,Git 成功的关键因素之一是它对去中心化的坚定承诺。而在此两年前,Google 自己选择了 Git 作为 Android 软件开发的版本控制系统。就在今年 4 月,Hamano 还继续强调 Git 分布式架构的重要性。在接受 GitHub 博客的采访时,Hamano 说:“‘分布式’开发方式的另一个好处是,它可以让我们将提交和公开结果的行为完全分开,我认为‘分布式’的这一方面产生了最大的影响。”
在 Git 之前,大多数版本控制系统都是围绕一个中央服务器构建的,该服务器保存着主代码库。但是在 Git 的世界中,控制谁可以访问的中央服务器被认为是一个设计上的缺陷。Git 鼓励用户创建自己的代码库副本并独立地工作。
“在任何地点都可以做你想做的事情,而不必访问服务器,这一点非常重要。”Torvalds 在他的 Google 演讲中称。“当你的团队分布在不同的地点时,集中式系统就不可避免地带来一些问题。”
另外,Torvalds 在 Google 的演讲中还提到,尽管从技术上来说,开源软件会随着时间的推移逐渐改变,以满足远程工作者的后勤需求,但从文化上来讲,至少就 Linux 和 Git 而言,这种说辞并不受广大开发者社区的欢迎。Torvalds 的讲话中夹杂着对他人智商的贬损,而这正是他在十年后以严苛的管理方式最终走向公开清算的先兆。
尽管如此,Fogel 还是赞扬了 Git 的设计理念,即“尽可能消除提交的障碍”,以及它承诺的理念:任何人“都可以在没有得到许可的情况下,有效地制作和发布任何人的代码库分支,前提是许可是可以的。”
而且,Git 对去中心化的重视,Behlendorf 说,这给协作编程过程带来了新的灵活性。
“Git 让 (人们)更容易剥离,完成一堆工作,然后将他们的变化作为一个整体推回到上游核心。”Behlendorf 解释说。
在这个鼓励每个人都可以对自己的代码树无限分叉的世界里,似乎与要求每个人都能随时访问代码库的精确表示的协作环境相悖。Eric Allman 是 Sendmail 的创始人(Sendmail 是互联网早期电子邮件传输基础设施的核心部分),也是 FreeBSD 开源操作系统项目的长期贡献者,他表示,他最初认为 Git 的广泛使用会导致混乱。“我原以为这会造成混乱,”他在一封电子邮件中写道,“但这比我预期的要少得多。”
开源软件发展的轨迹表明,这个看似悖论的问题实际上揭示了远程协作成功的真正必要条件。一个蓬勃发展的开源项目必须在自由与精确之间取得平衡。每个人都需要获得关于代码和项目状态的准确信息,同时又要有做自己想做的事情和实验的自由。
建立和培养鼓励更多交流的系统,同时放弃或减少自上而下的控制并不总是那么容易的。但是,在一个远程工作似乎很可能成为许多开发者未来生活的主要组成部分的世界里,应对这一挑战尤为重要。开源世界的经验告诉我们,这种微妙的舞蹈不仅是可行的,而且事实上还是集体生产力的基础。如果我们在给人们提供工具来帮助他们交流的同时,放弃对完全控制的幻想,谁知道我们会创造什么样的奇迹呢?
作者介绍:
Andrew Leonard,从事科技记者已有 25 年。他还撰写有关川菜美食和全球化的实时通讯。
原文链接:
https://increment.com/remote/committing-to-collaboration-version-control/
评论 3 条评论