开源作者去世后,代码谁来继承?

文 | 肖滢

出品 | OSC开源社区(ID:oschina2013)

2008 年初,澳大利亚一对兄弟 Simon Zerner 和 Toby Zerner 开始了 esoTalk 的开发。不幸的是, esoTalk 尚处于 Alpha 阶段,主力开发人员哥哥 Simon 就在 2009 年年中去世。 

接替 Simon 维护和更新 esoTalk 的,是他弟弟 Toby。在 README.md 文件,写着这么一句话:“esoTalk 是 Toby Zerner 为纪念他的兄弟 Simon 而开发的。”最终,两兄弟留下了一个采用 PHP+MySQL 开发的,具有非常简单、快速、现代特性的开源论坛系统。 

esoTalk 的延续是那么地顺其自然。 

这就引出了一个话题,如果开源项目的作者去世了,代码由谁来继承?这实际上是两个问题。一是,版权由谁来继承;二是,代码由谁来维护? 

通常来说,继承版权和维护代码的不会是同一个人。毕竟,不是每个开源大佬都像 Simon一样,有个会写代码的弟弟。 

版权问题其实并不那么棘手。如果开源软件只有一个作者,那么版权完全归他所有。如果有多个作者,那么每个代码部分的作者,都拥有该部分的版权。 

有遗嘱就按遗嘱执行,没有遗嘱还有著作权法、继承法这样的法律来管。不管由谁继承,都不会过多影响用户使用开源软件。因为开源本身就具有特殊性,项目作者已经通过开源许可证,许可他人任意使用、复制、修改、分发代码,这已经包含了大部分版权所涉及到的权利。 

一般来说,作者在贡献之前会已经与项目维护的法律实体,比如基金会、企业,签订贡献者许可协议,将版权分配出去。签了这类协议,别说作者去世了,就是还活着,对交出去的代码,想做些什么也做不了。(详情可查看:贡献者许可协议(CLA),是开源开发者的保护伞还是枷锁?) 

所以问题就集中在,项目维护。其实很早就有人想要答案。 

未雨绸缪的假设 

“如果 Guido 被公交车撞了?”1994 年 6 月,有人在新闻组提出了一个假设。Guido van Rossum 是 Python 语言的发明者,同时也是 Python 社区的领导者。而这里的“公交车”,是许多可能的意外场景之一。 

06b8014fd4793525fd813502829513f4.png 

之所以会有这么一个问题,是因为 Python 对 Guido 过于依赖。对于想要使用 Python 的企业来说,就不得不考虑这样一个风险:如果 Guido 消失了,Python 还能活下来吗?商业产品有供应商基于利益继续支持,因此风险较低,但像 Python 这样的学术研究项目,如果开发人员的兴趣发生变化,或者开始了新工作,不久之后该项目可能会消失。 

这个问题不仅让企业用户担心,同时也在 Python 社区引起了讨论和重视。之后,虽然 Guido 仍然扮演核心角色,但社区一步步地通过成立基金会、指导委员会等方式来监督 Python 的未来。 

这一讨论影响范围甚广。几年后,有人在 Ruby 社区提出了一样的问题,“如果创始人 Matz 被公交车撞了该怎么办”。 

Matz 表示:“因为 Ruby 是我的快乐之源(至少在计算机领域是这样),只要我活着,我就不会放弃对 Ruby 的控制。” 并且他还进行了“提名” :“如果我发生了什么事,欢迎开源。所有的源代码都在那里,我希望 Shugo Maeda、Guy Decoux 和其他人会继续开发这个解释器。我相信,Dave Thomas 会告诉社区该走向何方。他和我一样理解 Ruby 哲学。” 

Debian 社区在 2005 年就认识到,在任何关键职位上,至少应该有两个活跃的人。“多少人被公交车撞到才会导致项目停止,我称之为公交车指数。指数≤1 是非常糟糕的。”开发人员 Petter Reinholdtsen 表示,对 Debian 来说,确保特权职位有良好的冗余非常重要。 

b285cd5d60ef4206d8e8d0c4eb224edd.png

此外,Debian 还主张将权力分散,而不是集中于领导者一人身上。比如,Debian 负责人可在特定的领域做出决定,但是须将之交付给另外的技术负责人;民主程序可以罢免项目负责人和推翻负责人的任何决定等等。(详情可查看:开源长老 Debian 就是这么硬气!)因此当 Debian 的创始人 Ian Murdock 去世时,社区实现了平稳过渡。 

可见,对于贡献者众多,还有基金会、委员会等组织护航的开源项目来说,核心人员的离去并不会带来太大的打击。没有某个特定人物长期把持决策,也就没有人能在社区引起动荡。 

这个问题最终被延伸为,如果社区中某一个人拥有的特权过多,在他出现意外之前,应该做些什么来保证项目正常运转。 

鉴于 Linus 在 Linux 社区的独裁统治,所以大家关心的问题也就变成了:如果 Linus 被公交车撞了? 

小众项目续命难 


不是所有项目都像 Python、Ruby 一样这么幸运。对于较为小众的开源项目来说,创始人去世后,想要续命并不容易。

web.py 是一个用于 Python 的轻量级 web 框架,2013 年初,创始人 Aaron Swartz 自杀身亡。在此后的三年间,该项目几乎陷入了停滞。GitHub 上的 web.py 仓库虽然有少量的代码提交记录,但再也没有发布新版本。 

之后几年,虽有开发者相继接棒进行维护,但 web.py 的前景也难掩颓意。web.py 的命运,会迎来转机吗?或许很难。不论是 GitHub 上最新的提交记录,还是社区网站上最新的邮件讨论,都停留在 2020 年。一年多了,它们仍然静悄悄。 

像 web.py 这样由于主要开发者去世而导致项目搁浅的事情并不鲜见。就连在 Ruby 社区颇有名望的贡献者 Jim Weirich 去世后,他创建的两个最受欢迎的项目—— Rake 和 Builder,在两年之内都没有新版本发布记录。不过好在最终被人注意到了,Weirich 开发的多个开源工具都有了继任者。 

还有更多少为人知的开源项目,湮没在时间的长河之中。 

这其实跟创始人主动抛弃一个项目面临着一样的问题:代码给交给谁。但又有很大不同,主动意味着有的是时间讨论或计划给它找个好下家。 

而没有人维护,那就意味着,如果其他开发人员提交错误修复、安全补丁或其他改进,将没有人批准更改,这个项目很快就会因为代码过时,或者与新技术不兼容而被用户放弃。 

一位 web.py 用户说,将不会在新项目使用 web.py,因为它没有得到积极维护。Flask/Werkzeug、Bottle 和 Tornado 基本上填补了相同的“微框架”细分市场,它们明显更好、更现代。 

继任者是必要的 


有人认为,应该任其自生自灭,因为如果一个开源项目有价值,那么它自然有人继承。但事情并没有这么简单。 

一个项目被放弃,尤其是一些被高度使用的底层关键库被放弃,可能会导致数十万个软件应用程序受影响。像 Linux 或深度学习框架 TensorFlow 等著名的大项目,都依赖于较小的开源代码库,而这些库又依赖于其他库,从而形成了一个复杂、庞大的软件依赖网络。Libraries.io 的分析显示,用于超过 1000 个其他程序的开源库多达 2400 多个,但它们很少受到开源社区的关注。 

42ddd95d2ea95b86225295bcae1e6f94.png

Debian 10 buster 服务器软件包依赖关系 

因此,为那些因开发者突遭变故而被抛弃的开源项目找到继任者是很有必要的。在接手 Weirich 遗留的 Rspec-Given 项目之后, Justin Searls 就为自己的开源项目制定了遗嘱和继任计划。WIRED 杂志的撰稿人 Klint Finley 认为,将版权转让给开源组织,比如 Apache 基金会,也是一个明智的选择。 

即使有能力有意愿维护开源项目,但在实际操作中可能会遇到不少麻烦。Klint Finley 记录了 Searls 在这个过程中有多难。“GitHub 拒绝让 Searls 控制 Rspec-Given,因为 Weirich 没有为他提供权限。所以 Searls 不得不创建一个新的代码副本,并将其托管在其他地方。他还必须说服 Ruby Gems(一个用于分发代码的“包管理系统”)的运营商使用他的 Rspec-Given 版本,而不是 Weirich 的版本,以便所有用户都可以访问 Searls 的更改。GitHub 拒绝讨论关于转移项目控制权的政策。” 

无独有偶,Luacheck 的继承也因为所有权转移的问题,拉锯了两三年。Luacheck 是一个用于对 Lua 代码进行 linting 和静态分析的工具,创建者 Peter Melnichenko 去世之后,GitHub 上的仓库就一直处于悬而未决的状态。之后,尽管社区创建了分支,但在 Google 搜索“luacheck”,Peter 创建的仓库仍然是第一个结果,直到今天,人们仍在向旧的仓库发布 issue。 

89ce45cf76c4310201b47f64c6001be8.png 

几年前,Searls 曾建议 GitHub 和 Gems 等包管理器可以在他们的平台上添加类似“亡者开关”的东西,万一创建者长时间没有登录或者修改,系统可以自动将项目或帐户的所有权转移给其他人。 

“亡者开关”没有在 GitHub 实现。不过, GitHub 在 2020 年 5月新增了一项功能:添加账户的继任者。它允许仓库所有者在无法管理的情况下,邀请同平台的其他用户作为继任者。继任者虽然不能直接登录原帐户,但他们可以将公共仓库进行存档以及转移。 

GitLab 也正在讨论账户继承这一事项。GitLab 表示,这主要是为了应对账户所有者去世的情况。尽管初衷是为了解决由于账户长期不使用可能出现的身份盗用或其他与安全相关的问题,不过同时也明确了开源仓库官方继承的流程。如果能够提前指定继任者,Searls 曾经面临的问题不会再出现。 

“添加继任者”这一功能不过是扫清了些许障碍,但会让开发者或者开源社区更早地认识到,未雨绸缪是很有必要的。 

话说回来,最难的还是找到合适的继任者。倒也不必灰心,不妨把更多的视线拉回到开源这件事情上来。代码开源之后,它就有了无限续命的可能。假以时日,会出现有能力有意愿的开发者将它们捡起来并变成自己的。正如 WhiteSource 的首席执行官兼联合创始人 Rami Sass 所言:“它不属于任何人,它属于每个人。”

END

a5e01f585de0078ebb74f18a3f66fa85.png觉得不错,请点个在看呀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html 整数转换为小数,二进制如何四舍五入 十进制小数怎么转换为二进制小数?...

二进制是否有类似十进制中“四舍五入”的说法二进制转换成十进制保留小数部分是否要四舍五入,...应当采用“零舍一入”(相当于十进制数的“四舍五入”)。用38线译码器74ls138,实现3位二进制的四舍五入,38线译码器输入对应的110为十进制数6&am…

Android之popWindows底部弹出挡住了华为虚拟键盘问题

1、问题 使用popWindows的时候底部弹出遮挡华为虚拟键盘 2、解决办法 在调用下面代码之前 popupWindow.showAtLocation 加上如下的代码进行设置 popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

项目中使用CLR编程

1、创建自己的项目 2、右键“解决方案。。。”→添加→新建项目→C#→数据库→SQL Server项目,如下图所示: 3、选择操作数据库

SDN火爆!未来五年年复合增长率达98%

在如今的网络世界,软件定义网络SDN和网络功能虚拟化NFV成为了新的“宠儿”,特别是对于运营商来说,已经将它们视为面向未来转型的关键。因此已经有越来越多的运营商开始尝试引入SDN和NFV技术,尽管它们的标准还尚未完善。 最早采用S…

python桌面程序开发_程序员之路:python3+PyQt5+pycharm桌面GUI开发

先看效果:图 1 没错,学过C#的同学应该很熟悉这个界面,按钮风格和界面风格很相似,万万没想到,python也可以做出这样的界面,简直了!(图 1) 正文开始 一、安装python 为啥要…

转: MySQL 赋予用户权限(grant %-远程和localhost-本地区别)

2019独角兽企业重金招聘Python工程师标准>>> ‍‍相关参考资料:MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。 grant s…

面试技巧与注意事项

1、面试中的基本礼仪 (1)一旦和用人单位约好面试时间后,一定要提前5-10分钟到达面试地点,以表示求职者的诚意,给对方以信任 感,同时也可调整自己的心态,作一些简单的仪表准备,以免仓促上阵,手忙…

kafka控制台模拟消费_Kafka 详解

kafka简介Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需…

Android之运行PopupWindow提示Unable to add window -- token null is not valid; is your activity running?

1、问题 在使用PopupWindow的时候,我们构建好了直接放在Activity的onCreate函数里面直接运行,提示这个错误 Unable to add window -- token null is not valid; is your activity running? 2、原因分析 popupWindow显示依赖activity,并且要等activity所有的生命周期方法…

android开发板出错,为开发板编译时出错是什么原因

我也是怎么办Arduino:1.8.4 (Windows 7), 开发板:"Arduino/Genuino Uno"C:\Program Files\Arduino\arduino-builder -dump-prefs -loggermachine -hardware C:\Program Files\Arduino\hardware -hardware C:\Users\Administrator\AppData\Local\Arduino15…

python在web可以开发吗_Python Web开发

参考原文 WSGI接口 WSGI(Web Server Gateway Interface)是一个接口,用来屏蔽底部的细节(如TCP的建立连接,HTTP原始请求和响应格式等)。WSGI接口定义非常简单,只需要Web开发者实现一个函数&#…

更新丨.NET 7 预览版2 中的 ASP.NET Core

点击上方蓝字 关注我们(本文阅读时间:6分钟).NET 7 预览版2 现已推出,其中包括对 ASP.NET Core 的许多重大改进。以下是此预览版中新增内容的摘要:• 推断来自服务的 API 控制器操作参数;• SignalR 集线器方法的依赖注…

LoadRunner+Android模所器实现抓包并调试本地服务端

为了测试Android软件的服务端的功能,需要重现某些客户端操作,便于发现功能问题,性能问题。也方便客户端与本机服务端特别是服务端代码进行断点调试。这个时候需要对网络操作进行重现。loadRunner是hp公司开发的压力测试工具。功能比较强大&am…

Linux shell命令 cp 加上-f还是提示是否覆盖

这是由于环境变量中有 allias cpcp -i 为了去掉这个系统自带的别名,能够使用grep -r --include"*" "alias cp" /查找设置这个环境变量的脚本文件: 我的ubuntu机器上是: ./.bash_aliases:alias cpcp -i 于是我将./.bash_…

Android之让代码跑在主线程(无context上下文)的封装

1、问题 有一段代码需要跑在主线程里面,但是没有context上下文,一开始直接想到runOnUiThread,好像不行 runOnUiThread(new Runnable(){public void run(){//执行更新ui的操作} }); 2、解决办法 封装一个handler的单例类 import android.o…

Sub-process /usr/bin/dpkg returned an error code (1)

1.$ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old //现将info文件夹更名 2.$ sudo mkdir /var/lib/dpkg/info //再新建一个新的info文件夹 3.$ sudo apt-get update,$ apt-get -f install //不用解释了吧 4.$ sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old //执…

架构师

系统架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的人。具体来说是一个确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节、扫清主要难点的技术人员。主要着眼于系统的“技术实现”…

统信uos系统考试题_148款!富士通及旗下晟拓品牌系列打印机适配统信UOS

近日,南京富士通电子信息科技股份有限公司(简称:富士通)及其旗下晟拓子品牌148款主流打印机产品与统信桌面操作系统UOS的适配工作即将完成,这次适配涵盖了富士通及晟拓的常用主流机型。富士通正式成为统信软件产品生态合作伙伴。本次适配&…

手机浏览器html5游戏,移动浏览器都爱 HTML5 ?

目前中国第三方手机浏览器市场竞争正在愈演愈烈,但由于各应用开发商对手机浏览器的内容和资源的整合能力、技术研发能力、战略布局目的等方面均各不相同,浏览器产品也出现了同质化严重、内容匮乏等问题,亮点突出、吸引用户的产品较缺乏&#…

使用 C# 实现 URL 安全的 Base62 转码

Base62 编码与 Base64 编码类似,都用于数据内容编码。Base64 和 Base62 的目的在都在于将需要传输的内容进行编码,尤其是一些特殊字符(如不可见字符、传输时与协议头冲突的字符)。与 Base64 不同的是,Base62 编码是由1…