开源世界的尴尬时刻

作者按:开源世界里全都是一片祥和、欣欣向荣吗?全都是热情开放、无私奉献吗?那当然不是。本文罗列几起尴尬世界,目的是让大家对开源世界有一个更全面更具体的认识,让大家对底层开源人的生活的心态有一个更切实际的了解。

很显然,开源世界里的人,不都是神仙,他们也需要生存,也需要钱,他们的老婆也要买包(后面你会看到)。他们也会愤怒,也会发脾气,也会骂人。

然而,最让老百姓最受不了的,是有极个别开源人,放着好好的项目撒手不管了,有了Bug也不修,甚至还搞破坏,这简直是太不责任了。

然而,你还没办法追究他,因为开源有一个非常保底的规矩,那就是“不负责任”,你可以看看所有的开源协议,里面都明晃晃写着“不负责任”。毕竟,人家没给你要钱嘛。

本文,是让大家看几起开源世界里的尴尬事件,让大家能更深刻认识一下什么是“just for fun”,高兴就玩,不高兴就不玩了呗。

注:本文撰写受《Working in Public》一书启发,前两个事例是该书提到的。另:此书中译本为《开放式协作》(华东师范大学出版社)。

一、Dominic转手他人放后门

2018年11月,开源项目event-stream爆出一个令人尴尬的大新闻,开源代码里面有偷窃数字货币的后门!

该项目的作者是Dominic Tarr(GitHub用户名@dominictarr)。

但不是他放的后门,是他把项目移交给别人,别人放的。

当时,event-stream每月有几千万的下载量,Vue的官方脚手架vue-cli里面依赖了它,所以影响很大。

最早发现问题的是用户@FallingSnow ,他发现event-stream居然多了一个名为 flatmap-stream的依赖项,他在event-stream仓库中发了一个 issue,标题为:“I don't know what to say.”

f0f1adeea1c1d243cb790e6fa769fa1c.png2018年11约21日@FallingSnow发的帖子

这个依赖项会试图窃取用户的加密钱包信息,包括私钥,并将其发送到copayapi.host的8080端口上。

这个恶意代码是谁写的呢?

是@right9ctrl 。

正是Dominic对此项目不感兴趣后,才把项目的npm发布权(publish right)给了他。

Dominic说:“我起初开发这个库只是因为好玩,并不是为了利他。但开发者将维护的工作全压在我的身上,而我从维护中得不到任何东西,这个库对我来说就不再是兴趣了。并且,一开始我并没有从 @right9ctrl 身上感受到恶意,以为这是一位真心想帮助我的人。”“他给我发了电子邮件,说他想维护这个模块,所以我把它给了他。”

778b49bb68fa6f2844cba17d15b499cc.png“他给我发了电子邮件,说他想维护这个模块,所以我把它给了他。”

Dominic进一步解释:“我曾经在一家餐馆当洗碗工,我犯了一个错误,由于我太能干了,我被提升为厨师。只是获得了一个 50 美分一小时的加薪 ,但却有着更多的责任。我感觉不值得。编写一个受欢迎的模块就像是那样的一百万倍,而加薪是 0 。”

7970180ef6baae25c5ab15ed607f3dc6.jpegDominic Tarr

2b9d6ce239af1b72116b8a494b0adb6c.jpegDominic Tarr

如何看待此事

从好的方面看,至少这个漏洞被人很快发现了!(闭源软件的后门可没这么容易发现。)

从坏的方面看,开源治理任重道远!(这可影响着企业的安全生产。)

讴歌开源的人常说,开源人做开源,凭的都是兴趣和热情,因为他们在雄心勃勃地创建着人类共享的知识和代码。

但是,他们肯定知道,人的兴趣总有一天会转移。

你不能指望一个人对一个小项目能倾注一生的热情。

即便是项目创始人,也总有离开项目的时候。这时,他们能做到最好的情况,就是找一个靠谱的接手人。

但未必找得到。

找不到接手者还能怎么办?《Working in Public》的作者Nadia Eghbal描述了一个很棒的做法:

一位已经创建了数百个流行库的维护者,他使用一个他故意忘记密码的“幽灵”管理员帐户,将他不想要的项目转移到该帐户,他很高兴地说,没有人会因为维护问题而打扰他,因为他也没有这个项目的改动权限了,即使他试图改动。如果有人想修改代码,他们自己fork自己维护吧。

246ad362a1fa4f1254fd548c4618163d.jpegNadia Eghbal

那么,对于这件事,Dominic有没有责任? 

  • 有人说,完全没有责任,这个项目的许可证是MIT协议。

  • 有人则说,人总应该为自己的项目负责,要保证项目的良好运转。

可能我们在商业世界里生活已经太久了,总觉得任何事情都要有人负责。

偏偏在开源世界里,天生就是无需负责,你以为开源许可证仅仅是给你授权吗,它们更多是给作者免责。

所以,Dominic完全没有责任,这官司就是打到天王老子那里,也没有责任。

那么谁该负责?

我的答案是:谁用谁负责。

比如,开发商如果用它,开发商负责;项目组如果用它,项目组负责;npm如果提供它,npm负责。

毕竟npm是一个商业公司嘛。

npm于2020年3月被Github收购,Github于2018年6月被 Microsoft 收购。

二、Azer匹夫之怒撼全网

2016年3月22日,Azer Koçulu一怒之下,把自己的273个js模块,在npm上全给删了(用unpublish命令)。

原因是Azer对npm的做法非常生气,他本来有一个叫kik的项目,有一天,他收到了来自Kik公司专利代理人的电子邮件,要求Azer不能再用kik这个名字了,因为Kik公司自己要在npm上发布一个叫kik的项目。Azer当然不同意,毫不客气地拒绝了Kik的请求。但Kik公司又向npm团队提出申请,声称Azer滥用了公司的商标并会导致潜在的混乱。npm CEO Isaac Schlueter最终站在Kik公司一边,他们决定从Azer手中夺走kik,将这个库的权限给Kik公司。

Azer大怒,愤而删库,并写了一篇博客,题为“我刚刚解放了我的模块”(I’ve Just Liberated My Modules),他说“我才意识到,npm是某人的私人土地,在那里企业比人民更强大,而我开源是为了人民的力量(Power To The People)。 

这273个被删掉的模块中,别的似乎不要紧,要紧的是一个叫left-pad的模块,这库功能很简单,就是用于右对齐文本,但有好几个大型 npm 软件包使用了它 ——包括 Babel,一个 JavaScript 转译器,每周下载 1100 万次——这就导致突然之间,世界各地成千上万的开发人员开始出错。

媒体把这个突发情况描述为“破坏互联网”(“break the internet”)时刻。

2ec06c182bee6cf16dc208a483bf86e5.png人们看到大概这样的报错

这时,一个名为 Cameron Westland 的开发者冲了出来,并在 10 分钟内发布了功能完全相同的left-pad。因为npm当时允许任何人使用被遗弃的软件包名称,只要他们不使用相同的版本号就行,所以,kik的新的所有人是Westland。

Westland 发布的left-pad版本为 1.0.0,这解决了一部分人的问题,但是很多软件明确要求使用left-pad的0.0.3版,所以,和Westland商量后,npm“迈出了前所未有的一步”,使用备份恢复了Azer已经删除的0.0.3版。从“破坏互联网”到恢复正常运行,只用了两个半小时。

3c81fa8a6dd61d66d22fafeadd8aa31a.pngnpm“迈出了前所未有的一步”

Westland十分钟就能修复,是因为left-pad很简单,它只有 11 行长。

16848fed8045749ad2912c54c2a15dd6.jpegleft-pad就上面这11行

Azer有没有责任?

如前所述,kik是开源的,Azer没有任何责任。npm允许作者unpublish,那当然就可以unpublish咯。

Azer会愧疚吗?当然不会,用kik的人,有给过Azer一分钱吗?

Azer对npm有责任吗?当然没有,Azer给npm提供了273个模块,而npm也没有给过Azer一分钱啊。

npm夺走了Azer的kiki,Azer正一肚子气没处撒呢,“夺我的kik,让你看看我的厉害!”

npm对Azer有责任吗?当然也没有,npm可是一个公司,相关协议早都安排得明明白白的。

npm对用户有没有责任?

也没有什么责任,只不过npm自己的名誉受损。

但是他活该,谁让他管理不善呢?

npm拜此教训所赐,宣布今后将严格限制unpublish命令。并且,严格限制自由认领已经废弃的模块。

fc6911a45f98979e02d53c5c75783aa3.png2016年3月23日,npm在官网宣布1整改举措

这才对嘛,搞管理是放羊吗?

哪能让人说删库就删库呢。

尤其对于开源项目,必须要有“强有力的管理”。(这句话是反话吗?)

7d2476e826ad76b57a20797e4e2ce1a6.jpegAzer Koçulu

246a5a878dbd77f419d1802c4cdda6b3.jpegAzer Koçulu

用户有没有责任?

有人借此事发表了一篇文章,流传很广,叫做“我们是不是早已忘记该如何好好地编程?”2

大意就是,现在的程序员,这点东西都不写吗,还要依赖一个库。

我看大概他还很年轻,还不知道“重复发明轮子”的真义。

Left-pad虽然小了点,但谁说小轮子不是轮子呢?

虽然,小轮子可能突然会消失。

三、Marak 大发脾气改乱码

npm不让删库,不代表程序员就没法发脾气。

2022年1月上旬,faker.js和colors.js模块,运行时输出乱码,原因是作者Marak Squires生气了。

faker.js 是一个生成测试用数据的软件,包括随机的姓名、地址,公司,日期,财务,图像,数字等。

colors.js是一个进行颜色计算的软件,可实现控制台上带颜色文本的输出。

Marak早就生过一次气,2020年11月,他在Github上发言:“不好意思,我不会再免费支持使用我代码的财富500强(以及其他小型公司)了,没有更多可说的,你们要么给我一份年薪六位数的劳动合同,要么找其他人在分支上干吧!”

f3024e9d016d02dff95108a58065045a.jpegMarak早就说过不想干了

e8190db9e9a378f9ddddd5599d2ee41e.pngMarak Squires

问题似乎始于 2020 年 9 月 Marak Squires 遭遇的一场火灾。当时,Marak Squires 租借的房子突发大火,所有财产几乎被全部烧毁,无奈之下 Marak Squires 在推特上发布求助:

“我在一场公寓火灾中失去了所有东西,几乎无家可归,也无法访问我的大部分帐户,所有的贵金属都不见了。如果有人能给 [email protected] 一点钱,那将帮助我免于在街上冻僵,哈哈。”

估计他并没有收到多少钱,他才发了那篇帖子。

又过了2个月,Marak还是气不过,终于在2022年1月5日,让自己的代码在运行时输出乱码。

这使得大量程序员在控制台上看到这一幕:

039535dd7e89f5ee5f4accfa1938ad63.jpeg程序员们看到的乱码

想必Marak当时会很解气。

不过,npm现在成熟了,直接将他的项目回滚至先前版本。

如果前面没有Azer,npm估计又要头疼一阵了。

Marak遭受到什么样的谴责呢?

9fe1475b38331323a21471652c54a3f0.jpeg网友对Marak的评价

有网友评价说:“真够孩子气的!”,我觉得还算贴切。

算一种鱼死网破吧,Marak后来也不在开源圈玩了。

对此事的解读

看我写的《开源程序员绝望毁库跑路的背后》就会知道,Marak原本是想通过开源赚钱的,但这谈何容易?

《Working in Public》里有一段话说的好:(我觉得是这本书里最好的一句话

“生产者不断地进行一场艰苦的战斗,以威胁、闭锁、乞求、指责和羞辱消费者,迫使他们付费。”

开源个人开发者如何进行这场战斗呢?

威胁、闭锁肯定是不行的,乞求、指责、羞辱也许有用。

下面这个案例可以说明一切。

四、Denis情人节绝望哭诉

2023年2月14日,数百万网站使用的 core-js 库的维护者 Denis Pushkarev 表示,他准备放弃开源开发,因为很少有人为他们所依赖的软件付费。

core-js是最受欢迎的polyfill(帮助开发者在不支持js新特性的浏览器上使用js新特性), 月均npm下载量为2.5亿次,总下载量高达90亿次,在GitHub上,有1900万个仓库依赖。

a52f345d6b16ab16998f7298d4425322.jpegDenis Pushkarev

Denis以前有全职工作,后来(大约是2018年前后),为了全身心开发core-js,他辞了职,并且回到故乡俄罗斯,原因是:“在那里可以用相对较少的钱获得体面的生活水准。”但后来他发现,“钱其实很重要。”

什么事让他开始重视钱了呢,2020 年末,他因骑摩托车与两名行人相撞,并导致其中一人死亡。

他说,如果他当时有8万美元,他就不用入狱了

一个四月的晚上,凌晨3点,我开车回家。两个穿着深色衣服的醉酒的18岁女孩决定以的方式穿过一条光线很差的高速公路——其中一个躺在路上,另一个坐着并拽着第一个,她们并不在人行道上——而是直接在我的车轮下。目击者就是这么说的。我绝对没有机会看到他们。还有一名目击者说,在事故发生之前,她们只是在路上开玩笑地打闹。这并没什么不寻常,这是俄罗斯。其中一个女孩死了,另一个女孩进了医院。然而,即使在这种情况下,根据俄罗斯的仲裁惯例,如果司机不是议员或类似什么人的儿子,他几乎总是被判有罪——他必须要看到并预测一切,行人不负任何责任。我可能会在监狱里呆很长时间,如果我没有记错,检察官要求判我7年。

不入狱的唯一方法是与“受害者”和解——这是此类事故后的标准做法——并且还要有一名好律师。在事故发生后的几周内,我收到了“受害者”亲属当时以汇率计算的总额约为8万美元的资金索赔。律师也需要一大笔钱。

对于一个好的软件工程师来说,也许这不是一笔不可思议的钱,但是,正如我上面所写的,我长期全职在core-js@3版本上工作。没有人为这项工作付钱给我,我之前就已经花尽了所有的财务储备,所以,我没有那么多钱,也没有办法找到所需的钱。我的时间不多了。

当时,面临窘境的Denis曾试着向core-js用户求助,不过他可能用错了方法。

他在core-js安装后输出了文本,请求捐款和帮找工作。

这下可好,Denis每天都会收到数百条的谩骂,让他和core-js滚蛋。

304718d67bf44c930363a31de0f380a9.jpeg这就是在core-js安装后显示的捐款求助

ba5be33b7b01e7a884102f0cadd00e2a.jpeg程序员怒骂:“让这个白痴zloirock和他的core-js库去死吧”

一开始我是很不理解为什么程序员们会如此反感,后来我想明白了,如果我是一名程序员,我正开心或烦恼地处理着工作或代码上的逻辑,突然冒出来一条消息让我捐款,还让我帮他找工作,这简直就像正看电影时蹦出来广告,确实有点招人烦。

Denis后来也认识到这点,他说:“开发人员喜欢使用免费的开源软件,他们对背后的真人不感兴趣。他们认为任何提及钱的东西都是对他们的冒犯。对他们来说,不应该有这些噪音参与。”

Denis当时是收到了一点钱,但离8万美元还差很多,没有办法,他还是入狱了,判刑18个月(实际关了10个月),另处以罚金138万卢布。

2020年1月,我进了监狱。里面的事我不想说太多,我也不想记住那些。那是在一家化工厂的奴隶般劳动,在那里,我的健康严重受损,我24/7和毒贩、小偷和杀手们在一起,共渡了难忘的时光,而且,还无法访问互联网和计算机。

出狱后,他又像以前一样回到了core-js维护。

“我不考虑事故遗留下来的数万美元的诉讼,我也不考虑我的未来,我只是想让Web有更美好的未来。当然,我希望一些公司能给我提供一个职位,让我有机会从事Web标准工作,并赞助我在polyfill和FOSS方面的工作。”

但是他的收入在持续下降,刚开始全职从事开源的时候,他每月能收到2500美元(比他以前公司上班的收入少4~5倍),很快,每月收入下降到约1700美元(通过Tidelift网站是1000美元,通过OpenCollective网站是600美元,还有点别的),俄乌战争后,Tidelift不给他用了,他每月收入锐减1000美元,OpenCollective上的每月订阅捐赠也降到了300美元,他每月只能收到400美元。

今年2月14日,他实在受不了了,发布了长文“So,What's next”,里面说到:

我他妈的累了(I'm damn tired.)我喜欢开发开源和core-js。但我这样做是为了谁或什么?自2014年以来,我一直在确保零兼容性问题,并为大多数网络提供前沿功能。我所看到的不是任何感激之情,而是来自开发人员的巨大仇恨。在core-js使用上节省并赚取数百万美元的公司只是忽略了core-js的资金请求。即使在危急的情况下,他们中的大多数人也宁愿忽视或憎恨。我根本没有看到任何人试图为core-js添加一些重要的东西,或者至少定期做出贡献。

我有一个妻子,有时她想要一双新鞋,或一个包,或一个新的iPhone,或一个Apple Watch。我的父母已经到了需要我有力支持他们的年龄。很明显,我不可能用我从core-js维护中获得的钱来正常地支持一个家庭,我的财政状况走到头了。

不管怎样,钱很重要。我已经受够了以牺牲我和家人的福祉为代价来赞助公司。我应该有能力确保我的家人、我的儿子有一个光明的未来。

8bb63f89a2ef38e9f800f9d0d697d7a1.jpegDenis和儿子在一起

文中,Denis给出最后通牒,如果后续能收到足够的捐款,那么他将继续干下去,如果资金不足,他将会把core-js变成一个商业项目,要么就是放任这个项目缓慢的死去。

他在文首和文末给出了几种捐款渠道:OpenCollective、Patreon、Boosty、Bitcoin、支付宝。

让我们看看Denis哭诉效果如何?

先看看OpenCollective上的成果。

5d6f93912bbd0c6bf2374fb24705c20a.pnghttps://opencollective.com/core-js

到2023年5月1日,有312人每月给core-js捐赠5美元,有6人每月捐赠200美元,还有1225人是其他金额的一次性捐赠或每月捐赠。

这么算下来,至少每月有2760美元,事实上,我估计每月有4000美元之多。(还有一些每月10美元、20美元、50美元、100美元的捐助没有明确显示出来。)

再看看Patreon上的成果。

a45d55e158c04b5c1cb995b973eae40e.pnghttps://www.patreon.com/zloirock

Patreon上每月有2786美元的收入。

Boosty.to看样子是一个俄罗斯的捐赠类网站,但做得奇差,能看到有35个订阅捐赠者,但不知道他们给Denis捐了多少钱。

Denis还给出了支付宝收款二维码,他大概知道中国的js程序员很多。

511463234858f402aaf83ba217b18956.png扫描支付宝二维码后可以捐款

扫出来的支付宝用户是katya_kirichuk,不知道是谁,也许是Denis的妻子?

最后,我们看看Denis收到多少BTC。

在他发文的当天和第二天,他就收到的3个。

be7624c23882d89b4b64f1346a915884.png2023年5月1日的余额情况

现在,我一点都不用为他担心了。

他的心情也应该好了很多。

希望core-js能够继续发挥作用。

五、从尴尬事件看开源心态

玩开源,心态很重要,不管是做开源的人,还是用开源的人。

开源开发者大致四种心态

  • 我就是玩玩,开心就好。

  • 我想弄出点名声来,至少便于我求职。

  • 我想造福人类,我是心怀“国之大者”。

  • 我想通过开源创业,我想赚钱。

对于前两者,希望你们尽情享受;对于第3种,希望你没有收入的困扰;对于第4种,希望你放松心态。

个人使用开源的心态

  • 太棒了,有人做了这个,省我多少事。

  • 最好这个项目能不断改进,最好能有人一直维护。

  • 感谢那些做开源的人,如果他们遇到难处,也许我会捐款。

企业使用开源的动机

  • 初创企业:我们把开源的东西完善一下,卖它,用低价打开市场。

  • IT企业:我们用开源的东西搭建我们的系统,降低成本。

  • 承包商:我们在给甲方开发的系统中,可以大量使用开源组件,降低成本,降低投标价。

企业对待开源的心态

  • 我们要合规,研究好许可证,别让人给告了。

  • 对于最重要的东西,我们要买企业版的,买订阅,这是值得的。

  • 我们要防范失控,防范开源个人开发者删库、跑路带来的影响。

  • 什么,给我们要钱?哈哈,不给。

  • 在我们心情好的时候,我们可以捐助一点,我们可是有良心的企业。

对于前三种,很正常,理性的企业都会这么做。

第四种情况:不给钱,非常普遍。Denis描绘过这个场景:

公司:“我们想使用SQL Server 企业版”

MS:“这需要25万美元+2万美元/月”

公司:“好的!”

...

公司:“我们想使用core-js”

core-js:“简单,执行npm i core-js 就可以了"

公司:“酷!”

core-js:“你想在经济上做出贡献吗?”

公司:“哈哈,不”

不得不说,第五种情况:企业捐助开源,很罕见。

锤子干过这事,让人怀念到如今。

63c084f2fb1e1b51d8ed001982572583.png2016年12月,锤子捐款21万美元给OpenSSL基金会

六、后记

说了这么多尴尬事件,其实也没尴尬到哪里去,我们已经看到,一旦有了问题,很快都会修复。

真正让人尴尬的是,开源这么多年,仍然没有发明出来让开源人不再愤怒和悲伤的方法。

我们的世界,仍然没有完美做到:“为众人抱薪者,不可使其冻毙于风雪。”

文|卫剑钒

参考链接:


  1. https://blog.npmjs.org/post/141577284765/kik-left-pad-and-npm 

  2. https://www.davidhaney.io/npm-left-pad-have-we-forgotten-how-to-program/ 

猜你喜欢

转载自blog.csdn.net/vigor2323/article/details/130498122
今日推荐