这个圣诞节,一些前端程序员过得并不快乐

昨天是圣诞节,虽然说这是个洋节,但是能给大家带来快乐的话,不触碰宗教和政治方面的问题,过一过笔者认为也无大碍。在这个圣诞节,阿里旗下的 Ant Design(下称「Antd」)开发团队是给全球所有的开发者送上了一份「大礼」。

全球很多使用了 Antd 开发项目的程序员今天一大早都接到了来自用户的投诉,投诉内容基本都是「为什么按钮变得像狗啃了一样?」。本还好好想过个圣诞节的程序员们,不得不火速赶到岗位上改代码。

这个圣诞节,一些前端程序员过得并不快乐

今天,所有使用了 Antd 受影响版本的网站,其按钮上面都出现了一朵诡异的「云彩」。只要是个按钮,按钮上都会出现这么一团白色的「神奇物质」,而且按钮还多了一个非常魔性的「title」属性,其值为「Ho Ho Ho」。

基本上所有看到了这个怪异现象的程序员基本上都一瞬间懵了,好好的程序偏偏在圣诞节这么一天出了问题,而且颇有被黑了的感觉。

结果,在稍稍研究之后,这些按钮被加上了一个名为「Christmas」的样式,这其实是一个 Antd 开发团队留下的圣诞彩蛋。

你可能会问了,一个框架居然能在不做任何修改的情况下修改 Primary 按钮的样式,难道说这个框架本身被预留了后门,可以被开发团队执行任何他们想执行的东西?

这个圣诞节,一些前端程序员过得并不快乐

并不是,这个彩蛋其实在今年 9 月就被埋下了,Antd 开发团队成员 @afc123 在今年 9 月 10 日提交了相关的代码,这个代码没有经过严谨的 Review 被直接合入了主分支。彩蛋被设定于圣诞节这一天触发。

这个圣诞节,一些前端程序员过得并不快乐

对于这个彩蛋,开发者本人表示「无需在 changelog 中体现」,也就是他在埋下了这个彩蛋之后,为了给所有人一个大惊喜,他只留下了这一个提交记录,而没有将这个改动写在改动日志中告知全球的开发者,直到今天这个彩蛋被触发,大家才知道 Antd 里存在这么一个东西。

结果这个彩蛋并没有给大家带来欢乐,它反而还带来了「惊恐」。

对于程序员来说,对于生产环境,大家都不希望程序在运作的过程中出现一些「意外的情况」,或者说「未知的问题」,即使程序因为某种原因在运行过程中报错了,报错一般来说也是在可控的范围内。意外情况或未知问题是非常不可控的,没有人知道后果会是什么样子,有的时候一个未知的错误可能会给整个系统带来致命的影响。更加重要的是,由于这些错误在开发过程中、在测试环境下都没有被抓出来,显然它的定位难度和修复难度是比较大的,而且它已经流入了生产环境,修复时间会变得非常紧迫。

没有人程序员希望自己写的程序出现意外,然而在今天这么一个圣诞节,Antd 给这些程序员送去了一份非常大的「意外」。对于这样一个突然出现的东西,很少人会意识到这是一个圣诞彩蛋,大家都认为这是一个非常严重的 Bug。

因为这么一个彩蛋,Antd 在今天一天中招来了不少程序员的骂声。

Antd 背后有实力的、可靠的阿里团队在做技术支持,且项目本身质量非常高,因而在 React 这一系的开发框架中,Antd 具有很高的知名度,且被广泛运用。

然而,Antd 主要被运用在了 B 端项目的开发上,对于 B 端程序来说,稳定性、安全性都是非常重要的东西,尤其是一些企业中偏核心的系统或是面向政府部门或事业单位开发的系统。由于 Antd 的这个菜单很早就被埋到了代码里,且并没有在 changelog 上体现出来,于是很多面向 B 端开发的项目在今天都清一色的遇到了「圣诞彩蛋」这个奇异的 Bug。

于是,这些项目在今天变成了这个样子:

这个圣诞节,一些前端程序员过得并不快乐

图片来自知乎用户 @mango

要知道很多 to B 的项目都是外包项目,甲方大多都对技术没什么了解,项目出现这么一个情况,甲方的第一反应基本上是「系统出 Bug 了」或者是「系统被恶意篡改了」,出现了这样的情况,他们自然会去找乙方投诉,甚至要求追责(这个彩蛋由于存在「Ho Ho Ho」这样的 title 属性,非常像是恶搞或是恶意入侵)。

对于一些政府、宗教相关的项目,圣诞节的元素非常敏感,因为圣诞节本质上是一个纪念耶稣诞辰的节日,同时是一个洋节。这个彩蛋的出现势必会给这些项目的开发者带来不小的麻烦。

确实,开发者在程序里埋下彩蛋是一个很正常的事情,但是对于 Antd 这样被很多项目当作核心的框架级程序,这样的「找趣」是非常愚蠢且不应该的事情。

最最重要的是,开发者居然完全不计后果直接将这一部分彩蛋代码放在了明显的用户可见区域(多数开发者会把彩蛋放在 Console 中),直接应用在了生产环境中。开发者没有对此先行做任何的告示,也没有给这个功能加入开关,以至于这个彩蛋被触发后,开发者是直接放了一个新版本来回滚框架内的相关代码。

这个圣诞节,一些前端程序员过得并不快乐

在 Antd Github 仓库的 Issue 区,已经有无数吐槽、调侃、抨击这个彩蛋的 Issue。开发者并没有在今天的第一时间放出修复彩蛋的方法,官方的解决方案是在中午放出的,开发者对于这个彩蛋的态度很淡漠,直到现在事情真的闹得太大了。

有网友表示自己因为这个彩蛋丢掉了自己的饭碗,虽然笔者不知道这个是不是真的,但是如果是一个对安全很敏感的系统,或是承包开发的某个政府/事业单位的系统,在甲方和自己的老板都不太懂的情况下,这个彩蛋很有可能被误认为是某个程序员的恶搞,因此被开除真的不是一个夸张的说法。

虽然 Antd 是一个开源项目,开发者可以随心所欲地去做这个项目,但是既然 Antd 是一个阿里旗下的项目,同时在 React 系开发框架中有着如此重的地位,开发者理应对这个项目以及使用了这个项目的开发者负责。


这一次事件又是一次经典的阿里系「亲爱的用户,我是你爸爸」的事件,之前类似的事件在支付宝上发生过,也引起了不少的议论。

就这一次的时间而言,阿里内部对于开源项目维护团队的管理和要求似乎是有一些过低了,开源项目的核心开发者可以为所欲为直接向主分支推送代码,没有经过严谨的、有规章制度的 Code Review,这对一个开源项目来说是非常危险的。

实际上这个彩蛋在埋下后被一些用户发现并提出了质疑,但是开发团队拒绝回滚这一部分的代码,并让用户自行 Override(重写),这种傲慢的态度真的不像是一个正规的、属于大企业的团队应该有的。

Antd 花了这么长时间积攒的口碑,在今天彻底破灭。要知道很多开发者根本没有时间去看自己用的框架到底 Commit(提交)了一些什么新的代码,他们更多地都是选择相信该项目背后的开发团队。在这么一出事件后,Antd 显然不会被一些开发者继续信赖了。

开源项目虽然说因为代码开源而拥有很高的透明度,很少开发者会选择在开源项目上作恶,但是相较于闭源项目,开源项目的用户往往权益是最难得到保护的,万一开发团队开了一个大玩笑,做了一个恶,那么项目的用户都要为其背锅。

不论做什么事情,良心与责任心是最重要的,既然项目有了这么高的地位,有这么大的用户量,开发者就理应为用户负责,而不是当用户的爸爸。既然开源了,就应该有一些开源的精神,有一些开源社区的责任感,有一些为用户服务的心,毕竟一个项目开源之后,或多或少都从开源社区得到了一些帮助,为社区负责、做一些贡献是理所当然的事情。

开源项目的意义可不只在于 KPI。说起 KPI,估计今年年终 @afc163 同学会过得很不开心了。