对于开源项目来说,一个细微的改动就会影响到无数使用该项目的产品、公司、生产环境。阿里是中国开源的先锋公司,对于事故的处理也一直都很有担当,阿里云“敬畏每一行代码,敬畏每一份托付”曾是公关文的典范,但Antd项目彩蛋变炸弹这件事儿,我们却只能表示遗憾和可惜。开源项目的责任如何看待?怎样避免类似事件再次发生?

12月25日,正当人们沉浸在节日的气氛中时,部分开发者突然发现他们开发的Web网页的界面发生了变化,按钮上方出现“积雪”,经过探索发现这是前端UI组件库Ant Design(简称antd)提前埋入一个未经声明的“彩蛋”,事件迅速发酵,引起了巨大争议。

事件背景

现在让我们再来回顾一下整个事件的发展过程:

12月25日上午,Antd的用户发现网站上一个正常的按钮上方出现了“积雪”的logo,如下图所示:

经过查看,Antd的用户在工作后台上发现按钮的class多出一个chrismas,title变成Ho Ho Ho,然后再去查看antd源码,发现:

最开始,开发者以为是被黑客代码植入了,在反复检查之后才确定是代码中埋入了定时的“圣诞节彩蛋”。

不久,此事就开始在知乎和Antd issue上引起讨论,很多开发者表示愤怒与不满。

很多开发者认为,Antd是一个通用库,不应该在里面加彩蛋,尤其Antd大都是2B的,它的用户对安全、稳定、可控性的要求更高,发生一些细微的错误都可能影响一个公司的业务,再者,如果今天被随意加入一个彩蛋,那么明天就可能被人引入病毒,这让开发者很是恐慌。最后,这个彩蛋没有下线机制,让开发者无所适从。

有开发者半开玩笑说,如果不是圣诞节而是中国的传统节日也许就不会引起那么大的争议了,因为有些单位有明令禁止过洋节的规定,试想一些,如果这些禁止过洋节的网站(如个别政府网站)的按钮都是圣诞节的logo,后果可想而知。

更有传言,个别程序员因为此事被用来祭天。

当事人的回应

由于事态持续发酵,昨天下午,在Antd开源库中加入这些彩蛋代码的工程师偏右在知乎上对此事做出了回应:

Ant Design 圣诞彩蛋起源自 2018 年 9 月 10 日我的一次提交:https://github.com/ant-design/ant-design/commit/00aebeb9756afecc884ad48486084836b9a2707a

代码实现会在 12 月 25 日当天给所有按钮添加积雪效果,并增加 Ho Ho Ho! 的浏览器默认提示信息。这完全是我个人的一意孤行且愚蠢的决定,是我的错误给大家造成了不良影响,非常抱歉。

同时,他还给出了修复这个问题的方案:

目前圣诞节彩蛋影响的Antd版本包括:3.9.3、3.10.0~3.10.9、3.11.0~3.11.5

为此,Antd团队发布了修订版本:3.9.4、3.10.10、3.11.6,相关用户只需更新至相应的版本即可,使用了语义化版本的直接重新安装 node_modules 并重新下载即可。

蚂蚁前端负责人玉伯也在知乎回应(摘录):

这件事确认是由我们在代码中预埋的彩蛋导致,现在明确认定这一举动是错误的。

这个彩蛋有多么欠妥我们不再赘述,对大家造成的各种影响,antd 开发团队致以诚挚的歉意。感谢所有热心用户提出的批评指正,感谢你们的中肯建议。

开源得益于大家的信任,我们会立刻开展复盘并深刻吸取这次教训,并重新 review 代码更新评审机制。后续 antd 代码库里不会再加入与功能无关的代码,请大家持续监督。

不过,关于后续处理等,InfoQ联系了蚂蚁金服相关人士,他们不愿公开。

如何看待开源项目的责任

如今的开源,早已不是自由软件时代的理想主义。很多公司都参与到开源中来,它们的动机,除了一些回馈社区和分享精神外,还掺杂着商业和利益上的考量,其中包括:

  • 通过领导关键开源项目,成为某行业事实标准,从标准中获取利益;
  • 开源核心代码,基于核心代码提供付费的咨询和外包、资源服务;
  • 通过开源项目,提升团队成员的技术能力和凝聚力,打造技术品牌,方便对外做技术招募。

不过,在遍地商业化的开源里,前端的开源又有其特殊性,因为前端的技术很难直接带来利益,上面的三种好处里,最多占第三条。

这导致前端开源有一定的随意性,之前在前端开源领域也发生过人为原因的影响非常大的恶意事件:

  • left-pad事件:作为很多项目的依赖的作者基于个人原因将项目从NPM包管理器中删除,导致很多项目和网站无法正常工作;
  • event-stream事件:一个令人尊敬的开源作者因为项目众多缺人维护,将项目权限转送他人后竟然被植入比特币钱包后门。

前端开源代码缺乏商业化元素,让一部分人认为随意修改代码并没有责任,对于一些个人的小型项目来说这么说并没有错。antd的修改本身并不会带来直接损害,但在宗教性节日在生产环境做无法下线的“彩蛋”,显然欠缺考虑,并带来一系列的间接损害。

而且,antd在宣传时自称为企业级开源项目,这样随意修改代码显然与企业级的承诺相违背。同时,antd是公司级的开源项目,这样欠缺考虑的修改也损害了背后公司在开源上负责任的形象。最后,能力越大,责任也越大,antd作为很多项目的底层依赖,在做功能修改后未告知用户,在用户发现后没有迅速解决问题而是用不当言辞继续激怒用户

这些才是我们对于antd批评的主要原因。

怎么避免类似事件再次发生?

从antd的issue区可以看到,事件在很短时间内就演变成一场狂欢,这其中固然有因为当事人在Github上的回应不当导致事件失控的原因,也不乏一些人带节奏或者借题发挥,这显然已经超出了界限。在这里,我们也呼吁读者不要参与,不要传播那些恶意段子图。

现在,我们应该思考的,是怎么避免类似事件再次发生。

经过此次事件后,想必国内公司在操作开源项目时会更加谨慎。对于底层依赖型的代码,我们要尽量保持稳定,不要随意修改代码。

其次,在修改导致任何功能变化的代码后,一定要在changelog里体现出来,这才是负责任的做法。

最后,完善开源项目的管理流程,要有人能够把关代码,不让一些欠缺考虑的代码合并到主线。如果真想做好开源,这些是必须要做到的。

对于开源项目的用户来说,要跟踪所有依赖代码的所有更改显然是不太可能做到的,这就要求在技术选型时要慎之又慎,在不同的场景选择不同的技术,在面对严肃的场景时,一定要选择成熟/稳定/可靠的技术,这也能从一定程度上避免问题。在面向年轻用户时,选择更新潮的技术,这样即使出现问题也有更高的容忍度。

InfoQ的读者们,你们认为要如何杜绝类似事件再次发生呢?

说好的敬畏每一行代码呢?Antd代码彩蛋炸翻一圈人相关推荐

  1. python撩妹小技巧 —— 30行代码实现520小彩蛋

    1 彩蛋效果展示: 网页上展示的效果可能不齐, 但是python上的输出是对齐的. 可能是不同平台的空格宽度不同的缘故 祝祝祝 脱脱脱 单单单 祝 脱 单 单 祝祝祝 脱脱脱 单 单祝 脱 单 单 祝 ...

  2. python从入门到撩妹 2 —— 30行代码实现520小彩蛋

    作者自我介绍:大爽歌, b站小UP主 ,直播编程+红警三 ,python1对1辅导老师 . 本文对应视频版本: 520小彩蛋 python32行代码实现 -- python从入门到撩妹-2 1 彩蛋效 ...

  3. 表白技巧升级,大神程序员表白代码泄露(内含彩蛋)!

    七夕快到了,表白素材赶紧先准备好... 1.委婉的表白 Python 代码: import string l = string.ascii_letters s = [] s.append(l[34]) ...

  4. 代码还原谷歌彩蛋小恐龙游戏(html+css+js)

    谷歌小恐龙游戏 原游戏彩蛋 还原 代码学习 原游戏彩蛋 谷歌的chrome浏览器有一个小彩蛋,在断网时打开chrome浏览器会出现一只小恐龙,按下空格键,就可以开始游戏了. 还原 还原过后的效果:游戏 ...

  5. 怎样给代码加密,从莉莉丝的彩蛋说起

    这个世界里,我们常常看到有两种胜利:一举成功和绝地反击.作为围观的酱油众,到底还是喜欢后者,因为够刺激.倍儿爽! 近日,莉莉丝以一个小彩蛋取得uCool起诉案的关键性证据(后者为山寨版<Hero ...

  6. 一行神奇的javascript代码

    一行神奇的javascript代码 一行神奇的JS代码,是在一个博客园里面看到的,当时我就震惊了,这不就是传说中的ZB神奇么- - 哈哈(果断转载过来). 写本篇文章的缘由是之前群里@墨尘发了一段js ...

  7. 没有几十年功力,写不出这一行“看似无用”的代码!!

    这篇文章要从一个奇怪的注释说起,就是下面这张图: 我们可以不用管具体的代码逻辑,只是单单看这个 for 循环. 在循环里面,专门有个变量 j,来记录当前循环次数. 第一次循环以及往后每 1000 次循 ...

  8. git定位追踪一行或若干行代码修改历史记录

                                                             git定位追踪一行或若干行代码修改历史记录 先使用git blame追踪溯源这些行代码 ...

  9. 低代码、无代码?深度解读硅谷新趋势

    今天我们来深入聊聊"低代码.无代码"(Low code, No code). 年初,钉钉公布自己的进化方向:"低代码.无代码工具".大洋彼岸,Low code, ...

最新文章

  1. python 自定义装饰器 来验证函数参数
  2. c++ 预处理命令 #if, #ifdef, #ifndef, #else, #elif, #endif用法
  3. 使用GetDIBts/SetDIBits高速逐点处理 from http://blog.sina.com.cn/s/blog_552ad2090100e3eu.html...
  4. Vista Dynamips模拟器安装
  5. 5g无线网络对电子竞技市场发展影响
  6. 云图说 | 华为云医疗智能体,智联大健康,AI药物研发
  7. java中setStroke_Java调用setStroke()方法设置笔画属性的语法 原创
  8. PAT (Basic Level) Practice1027 打印沙漏
  9. 如何整合Mybatis与Spring框架?
  10. CentOS7上实现Squid缓存服务器的两种模式
  11. r语言循环求和_R语言学习必备书单——由浅入深搞定编程
  12. linux搭建认证服务器,Linux上搭建FreeRadius服务器
  13. ASP.NET 省市区联级
  14. Windows 7安装超级终端连接COM口设备
  15. android 科技感动画,PPT最炫动画,3分钟学会超有科技感的扫描动画,轰动全场!...
  16. sm缩写代表什么意思_狗狗各种表情都分别代表着什么意思
  17. SparseLDA算法
  18. 树莓派 网络附加存储NAS系统和USB外接硬盘文件服务器
  19. 使用 FFmpeg 生成 ts 切片并使用 AES-128 加密
  20. 百度地图室内路线规划

热门文章

  1. 陆奇首批YC中国门徒:包鱼塘、画动漫、搞汽配…都用AI
  2. 200秒=超算1万年,谷歌实现“量子霸权”论文上架随即被撤回,引发全球热议...
  3. 最先进的NAS算法不如随机搜索,瑞士学者研究结果让人吃惊,也令人怀疑
  4. sprint计划会议总结
  5. Linux 查看当前用户id和组id
  6. MVP架构设计 初探
  7. 变量与字符串的连接 - format、格式化字符串
  8. jQUery操作checkbox
  9. 虚拟机软件之vmware workstation安装篇
  10. Apple Mach-O Linker Error