作者按:开源世界里全都是一片祥和、欣欣向荣吗?全都是热情开放、无私奉献吗?那当然不是。本文罗列几起尴尬世界,目的是让大家对开源世界有一个更全面更具体的认识,让大家对底层开源人的生活的心态有一个更切实际的了解。
很显然,开源世界里的人,不都是神仙,他们也需要生存,也需要钱,他们的老婆也要买包(后面你会看到)
。他们也会愤怒,也会发脾气,也会骂人。
然而,最让老百姓最受不了的,是有极个别开源人,放着好好的项目撒手不管了,有了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.”
2018年11约21日@FallingSnow发的帖子
这个依赖项会试图窃取用户的加密钱包信息,包括私钥,并将其发送到copayapi.host的8080端口上。
这个恶意代码是谁写的呢?
是@right9ctrl 。
正是Dominic对此项目不感兴趣后,才把项目的npm发布权(publish right)给了他。
Dominic说:“我起初开发这个库只是因为好玩,并不是为了利他。但开发者将维护的工作全压在我的身上,而我从维护中得不到任何东西,这个库对我来说就不再是兴趣了。并且,一开始我并没有从 @right9ctrl 身上感受到恶意,以为这是一位真心想帮助我的人。”“他给我发了电子邮件,说他想维护这个模块,所以我把它给了他。”
“他给我发了电子邮件,说他想维护这个模块,所以我把它给了他。”
Dominic进一步解释:“我曾经在一家餐馆当洗碗工,我犯了一个错误,由于我太能干了,我被提升为厨师。只是获得了一个 50 美分一小时的加薪 ,但却有着更多的责任。我感觉不值得。编写一个受欢迎的模块就像是那样的一百万倍,而加薪是 0 。”
Dominic Tarr
Dominic Tarr
如何看待此事
从好的方面看,至少这个漏洞被人很快发现了!(闭源软件的后门可没这么容易发现。)
从坏的方面看,开源治理任重道远!(这可影响着企业的安全生产。)
讴歌开源的人常说,开源人做开源,凭的都是兴趣和热情,因为他们在雄心勃勃地创建着人类共享的知识和代码。
但是,他们肯定知道,人的兴趣总有一天会转移。
你不能指望一个人对一个小项目能倾注一生的热情。
即便是项目创始人,也总有离开项目的时候。这时,他们能做到最好的情况,就是找一个靠谱的接手人。
但未必找得到。
找不到接手者还能怎么办?《Working in Public》的作者Nadia Eghbal描述了一个很棒的做法:
一位已经创建了数百个流行库的维护者,他使用一个他故意忘记密码的“幽灵”管理员帐户,将他不想要的项目转移到该帐户,他很高兴地说,没有人会因为维护问题而打扰他,因为他也没有这个项目的改动权限了,即使他试图改动。如果有人想修改代码,他们自己fork自己维护吧。
Nadia 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”)时刻。
人们看到大概这样的报错
这时,一个名为 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版。从“破坏互联网”到恢复正常运行,只用了两个半小时。
npm“迈出了前所未有的一步”
Westland十分钟就能修复,是因为left-pad很简单,它只有 11 行长。
left-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命令。并且,严格限制自由认领已经废弃的模块。
2016年3月23日,npm在官网宣布1整改举措
这才对嘛,搞管理是放羊吗?
哪能让人说删库就删库呢。
尤其对于开源项目,必须要有“强有力的管理”。(这句话是反话吗?)
Azer Koçulu
Azer Koçulu
用户有没有责任?
有人借此事发表了一篇文章,流传很广,叫做“我们是不是早已忘记该如何好好地编程?”2
大意就是,现在的程序员,这点东西都不写吗,还要依赖一个库。
我看大概他还很年轻,还不知道“重复发明轮子”的真义。
Left-pad虽然小了点,但谁说小轮子不是轮子呢?
虽然,小轮子可能突然会消失。
三、Marak 大发脾气改乱码
npm不让删库,不代表程序员就没法发脾气。
2022年1月上旬,faker.js和colors.js模块,运行时输出乱码,原因是作者Marak Squires生气了。
faker.js 是一个生成测试用数据的软件,包括随机的姓名、地址,公司,日期,财务,图像,数字等。
colors.js是一个进行颜色计算的软件,可实现控制台上带颜色文本的输出。
Marak早就生过一次气,2020年11月,他在Github上发言:“不好意思,我不会再免费支持使用我代码的财富500强(以及其他小型公司)了,没有更多可说的,你们要么给我一份年薪六位数的劳动合同,要么找其他人在分支上干吧!”
Marak早就说过不想干了
Marak Squires
问题似乎始于 2020 年 9 月 Marak Squires 遭遇的一场火灾。当时,Marak Squires 租借的房子突发大火,所有财产几乎被全部烧毁,无奈之下 Marak Squires 在推特上发布求助:
“我在一场公寓火灾中失去了所有东西,几乎无家可归,也无法访问我的大部分帐户,所有的贵金属都不见了。如果有人能给 paypal@marak.com 一点钱,那将帮助我免于在街上冻僵,哈哈。”
估计他并没有收到多少钱,他才发了那篇帖子。
又过了2个月,Marak还是气不过,终于在2022年1月5日,让自己的代码在运行时输出乱码。
这使得大量程序员在控制台上看到这一幕:
程序员们看到的乱码
想必Marak当时会很解气。
不过,npm现在成熟了,直接将他的项目回滚至先前版本。
如果前面没有Azer,npm估计又要头疼一阵了。
Marak遭受到什么样的谴责呢?
网友对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万个仓库依赖。
Denis Pushkarev
Denis以前有全职工作,后来(大约是2018年前后),为了全身心开发core-js,他辞了职,并且回到故乡俄罗斯,原因是:“在那里可以用相对较少的钱获得体面的生活水准。”但后来他发现,“钱其实很重要。”
什么事让他开始重视钱了呢,2020 年末,他因骑摩托车与两名行人相撞,并导致其中一人死亡。
他说,如果他当时有8万美元,他就不用入狱了
一个四月的晚上,凌晨3点,我开车回家。两个穿着深色衣服的醉酒的18岁女孩决定以爬的方式穿过一条光线很差的高速公路——其中一个躺在路上,另一个坐着并拽着第一个,她们并不在人行道上——而是直接在我的车轮下。目击者就是这么说的。我绝对没有机会看到他们。还有一名目击者说,在事故发生之前,她们只是在路上开玩笑地打闹。这并没什么不寻常,这是俄罗斯。其中一个女孩死了,另一个女孩进了医院。然而,即使在这种情况下,根据俄罗斯的仲裁惯例,如果司机不是议员或类似什么人的儿子,他几乎总是被判有罪——他必须要看到并预测一切,行人不负任何责任。我可能会在监狱里呆很长时间,如果我没有记错,检察官要求判我7年。
不入狱的唯一方法是与“受害者”和解——这是此类事故后的标准做法——并且还要有一名好律师。在事故发生后的几周内,我收到了“受害者”亲属当时以汇率计算的总额约为8万美元的资金索赔。律师也需要一大笔钱。
对于一个好的软件工程师来说,也许这不是一笔不可思议的钱,但是,正如我上面所写的,我长期全职在core-js@3版本上工作。没有人为这项工作付钱给我,我之前就已经花尽了所有的财务储备,所以,我没有那么多钱,也没有办法找到所需的钱。我的时间不多了。
当时,面临窘境的Denis曾试着向core-js用户求助,不过他可能用错了方法。
他在core-js安装后输出了文本,请求捐款和帮找工作。
这下可好,Denis每天都会收到数百条的谩骂,让他和core-js滚蛋。
这就是在core-js安装后显示的捐款求助
程序员怒骂:“让这个白痴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维护中获得的钱来正常地支持一个家庭,我的财政状况走到头了。
不管怎样,钱很重要。我已经受够了以牺牲我和家人的福祉为代价来赞助公司。我应该有能力确保我的家人、我的儿子有一个光明的未来。
Denis和儿子在一起
文中,Denis给出最后通牒,如果后续能收到足够的捐款,那么他将继续干下去,如果资金不足,他将会把core-js变成一个商业项目,要么就是放任这个项目缓慢的死去。
他在文首和文末给出了几种捐款渠道:OpenCollective、Patreon、Boosty、Bitcoin、支付宝。
让我们看看Denis哭诉效果如何?
先看看OpenCollective上的成果。
https://opencollective.com/core-js
到2023年5月1日,有312人每月给core-js捐赠5美元,有6人每月捐赠200美元,还有1225人是其他金额的一次性捐赠或每月捐赠。
这么算下来,至少每月有2760美元,事实上,我估计每月有4000美元之多。(还有一些每月10美元、20美元、50美元、100美元的捐助没有明确显示出来。)
再看看Patreon上的成果。
https://www.patreon.com/zloirock
Patreon上每月有2786美元的收入。
Boosty.to看样子是一个俄罗斯的捐赠类网站,但做得奇差,能看到有35个订阅捐赠者,但不知道他们给Denis捐了多少钱。
Denis还给出了支付宝收款二维码,他大概知道中国的js程序员很多。
扫描支付宝二维码后可以捐款
扫出来的支付宝用户是katya_kirichuk,不知道是谁,也许是Denis的妻子?
最后,我们看看Denis收到多少BTC。
在他发文的当天和第二天,他就收到的3个。
2023年5月1日的余额情况
现在,我一点都不用为他担心了。
他的心情也应该好了很多。
希望core-js能够继续发挥作用。
五、从尴尬事件看开源心态
玩开源,心态很重要,不管是做开源的人,还是用开源的人。
开源开发者大致四种心态
我就是玩玩,开心就好。
我想弄出点名声来,至少便于我求职。
我想造福人类,我是心怀“国之大者”。
我想通过开源创业,我想赚钱。
对于前两者,希望你们尽情享受;对于第3种,希望你没有收入的困扰;对于第4种,希望你放松心态。
个人使用开源的心态
太棒了,有人做了这个,省我多少事。
最好这个项目能不断改进,最好能有人一直维护。
感谢那些做开源的人,如果他们遇到难处,也许我会捐款。
企业使用开源的动机
初创企业:我们把开源的东西完善一下,卖它,用低价打开市场。
IT企业:我们用开源的东西搭建我们的系统,降低成本。
承包商:我们在给甲方开发的系统中,可以大量使用开源组件,降低成本,降低投标价。
企业对待开源的心态
我们要合规,研究好许可证,别让人给告了。
对于最重要的东西,我们要买企业版的,买订阅,这是值得的。
我们要防范失控,防范开源个人开发者删库、跑路带来的影响。
什么,给我们要钱?哈哈,不给。
在我们心情好的时候,我们可以捐助一点,我们可是有良心的企业。
对于前三种,很正常,理性的企业都会这么做。
第四种情况:不给钱,非常普遍。Denis描绘过这个场景:
公司:“我们想使用SQL Server 企业版”
MS:“这需要25万美元+2万美元/月”
公司:“好的!”
...
公司:“我们想使用core-js”
core-js:“简单,执行npm i core-js 就可以了"
公司:“酷!”
core-js:“你想在经济上做出贡献吗?”
公司:“哈哈,不”
不得不说,第五种情况:企业捐助开源,很罕见。
锤子干过这事,让人怀念到如今。
2016年12月,锤子捐款21万美元给OpenSSL基金会
六、后记
说了这么多尴尬事件,其实也没尴尬到哪里去,我们已经看到,一旦有了问题,很快都会修复。
真正让人尴尬的是,开源这么多年,仍然没有发明出来让开源人不再愤怒和悲伤的方法。
我们的世界,仍然没有完美做到:“为众人抱薪者,不可使其冻毙于风雪。”
文|卫剑钒
参考链接:
https://blog.npmjs.org/post/141577284765/kik-left-pad-and-npm
https://www.davidhaney.io/npm-left-pad-have-we-forgotten-how-to-program/