航通社作者 书航 12月25日发于广州
12月25日是圣诞节,在这个节日气氛浓厚的日子里,众多国内外前端开发者,却因为一个突如其来的意外而坐立不安。
一觉醒来,他们发现由自己参与设计的网站、公司内网、办事系统等网页上,有一些按钮的上面多了一团白色的“积雪”,在白背景下,看着有点像是被“咬掉”了一块似的。
“老板问我按钮为什么被狗啃了”,在代码托管站点 GitHub 上,有人这么说。
不仅如此,将鼠标指向变化了的按钮时,原本设定好的文字说明也统一变成了“Ho ho ho”,这是“圣诞老人”标志性的笑声。
这毫无疑问是一个圣诞节的应景“彩蛋”。源代码显示,只有在系统判断是12月25日当天,这个”彩蛋“才会出现。
不合时宜的”彩蛋“
在程序中植入“彩蛋”是程序员们在枯燥的编程生活中展现乐趣,同时声明版权的一个悠久传统。我们广泛使用的Windows、Android等操作系统,以及Office办公软件的多个版本都埋有“彩蛋”。
然而,“彩蛋”不属于软件功能的一部分,所以一般都是在不能直接显现的源代码等地,或者需要通过极其复杂的方式才能找到,就像打游戏一样。
早期的雅虎网站首页,在左上角”Yahoo!“标志的感叹号处,点击那个小小的点,就会有个人唱出”雅虎~“的声音。如果不是有人告诉你,你可能永远也想不到这里是可以点的。
正如张小龙在微信7.0发布当日引用的那句话:”你未看此花时,此花与汝同归于寂;你来看此花时,则此花颜色一时明白起来。“一个优秀的彩蛋,应当是只有在人们特意来看的时候,才显现出来。
就算有时你想让所有用户都看到“彩蛋”,那么它所处的位置以及呈现的效果,也需要以不影响软件功能正常实现为前提。
例如,谷歌和百度等都会在一些节日更改网站标识(logo),虽然所有用户都看得见,但这个位置的展示不会影响使用。
相比之下,在圣诞节当天出现的这个“彩蛋”,对广大前端开发者来说,就显得相当不合时宜。它不分场合地出现在一些机关、企事业单位的内网界面,甚至据说,在不过圣诞节的中东国家也出现了。
只要想象一下,有一天你打开电脑,发现操作系统自作主张的给你换了皮肤,各种按钮上也都”下雪“了,就能体会到这一事故给开发者、老板和客户带来的极大惊吓。
(微博 @sss无常)
(微博 @这种名字也有人用吗)
一个生物科学类网站受到了影响:
还有一个卖藏区产品的网站:
甚至”湖南省发改委碳排放管理系统“都中招了:
此外,还有留言说自己是”在伊朗工作的中国前端“的;
还有说自己是某某委的,没丢工作还得多亏了自己的小姨子;
……
更重要的是,在它毫无预兆地呈现出来之前,使用这种按钮的开发者们,没有得到任何通知。他们疯狂地寻找到底是哪里出了问题,莫非是有黑客入侵,修改页面做了个恶作剧?
最终,人们查明了问题:这些“中招”的开发者们,都在项目中使用了Ant Design(简称 AntD),这是由支付宝母公司蚂蚁金服设计团队制作的一套开源的前端框架。
受害者们涌入GitHub上的AntD项目主页留言控诉。随着管理员下午开始清理,你现在再过去看,恐怕已经看不到什么了。
牵一发而动全身
在当代互联网环境下,前端框架可以看作是20多年前拿光盘装的“网页素材库“的继承者。
早期网页设计中,要想做出个性化的按钮、滚动条、下拉菜单、单选框、表单等网页控件,要么需要完全自己重写一遍,要么需要先在PS里面把网页画出来,再切图,把图片插入网页。
此后,YUI、JQuery、Prototype等由大公司或者开源社区贡献出来的公用”素材库“,逐渐成为业界的主流选择。毕竟,有大公司已经做好的组件在那儿,自己就没必要”重新造轮子“。
以蚂蚁金服的AntD为例,在网页中引用它的一小段代码之后,只需要在写网页时规定一个按钮的位置、大小和颜色,你就能得到一个优雅的,稍微有一点点圆角弧度的按钮,鼠标指向和按下按钮时,还会有凸起和凹陷的视觉效果。
如此一来,使用公用的前端框架可以大大节省开发者的时间和精力,让他们把重心放在整体页面的”谋篇布局“上,甚至为机器自动生成网页创造了条件。
AntD不仅提供网页组件的快捷引用,本身还是一种成体系的设计语言。因此,它已经被大范围应用在支付宝这款软件上,以及蚂蚁金服内部的数百个中后台应用。
通俗的说,只要正确使用AntD,就会让你做出的网页产品或移动端,在细节上和支付宝网站或App相一致。这或许不会体现设计师的个性,但至少不会让你犯一些低级错误。
AntD的代码托管于被微软收购的代码托管网站GitHub上,即使是中国境内的开发者,目前也可以自由引用来自GitHub的代码,而不用担心访问不了的问题。
据蚂蚁金服设计团队今年9月的数据,Ant Design 1.0在发布之后的8个月中,就已经在 GitHub 上收获了 11686 个”星标“。这意味着至少有这些数量的程序员关注,并使用了AntD到自己的项目上。
( https://zhuanlan.zhihu.com/p/43593326 )
就是这一得到业界广泛关注和使用的基础组件,突然在毫无预警,也没有功能开关的前提下,给所有使用者的按钮控件”下了一场雪“——而且还是在”生产环境“中,也就是说,根本不给开发者后悔的机会。
这场”雪灾“也让我们有机会看到该框架的应用范围之广泛,以及破坏力之巨大。
AntD犯了什么错
就像它的前辈YUI一样,AntD也是一个典型的”大公司的小产品“,是员工利用工作之余开发出来,并在工作之外仍能产生广泛影响的产品。
YUI当年由盛极一时的雅虎前端程序员贡献出来,经过人们多年来不懈的努力,在雅虎本身几经易手之后,YUI仍然能作为一个开源项目具有长久的生命力。
在本次”彩蛋“风波之前,AntD为前端提供了模仿谷歌Material Design、JQuery等有限几套框架之外的新选择。它富有活力,又简约大气,所以确实受到业界的欢迎,也提升了蚂蚁金服在开发者中的形象。
AntD 的主要维护人员 afc163(微博 @高端工程师 )早在今年9月的一次维护中,就默默地提交了这个”彩蛋“的相关代码,可是在后来几个月当中,一直没有人发现——也许如果事先告知了,就不叫”彩蛋“了吧。
这位维护人员一开始也没有意识到问题的严重性。他先是说这么点小事,不值得在产品更新说明中体现出来;
然后又说”早就做好了被骂的准备“。
他直到今天下午才发布官方声明,道歉并撤销了这个引起巨大震荡的”彩蛋“,同时,项目组负责人也保证不会在代码库中再加入与功能无关的代码。
( https://github.com/ant-design/ant-design/issues/13848 )
只不过,由这个自作主张的”彩蛋“引发的对AntD整个项目的信任危机,也许才刚刚开始。典型的留言是:”今天你庆祝圣诞节下雪了,明天清明节,按钮上是不是还要加一个墓碑?“
不同于操作系统打补丁,官方做出的任何更改,都只能寄希望于使用它的开发者们自主更新到新版,并不能即时”推送“到每一个项目上。
有比较悲催的前端就说,他们老板看到之后大发雷霆,他建议发一个新版解决问题,然而老板说不能因为这个发布新版,所以无法补救。
afc163 承诺代码中再也没有其它任何这类”彩蛋“,尽管如此还是有人建议将官方代码复制一个子版本出来(术语叫做fork),并由热心的社区继续维护这一分叉,以免再出什么意外。
事件之后,自然有喜欢AntD的用户跑上去安慰作者,说这就是无心之失;但恐怕由此引发的用户流失,也就是不得不替换新框架(找新的”轮子“)的情况,可能会更多。
AntD开发者并不需要为受到损失的使用者承担任何责任,因为这是一个采用了 MIT 许可协议的开源项目。
大多数情况下,开源的意思是你可以任意使用我做的这个东西,不需要标注版权,不用付费,也可以随意修改到爹都不认识;但与此同时,我不会为你的任何潜在的损失承担责任。这次也不例外。
既然做开源项目放到 GitHub 上就是赚个吆喝,不为盈利,也不承担法律责任,那么很显然,”信任“就是一个项目最为金贵的核心价值。
大家都是拿出业余时间无偿参与到产品的改进和贡献中的,如果其中的信任缺失了,那么至少作为项目发起人本人来说,他辜负了其他参与者的热情和努力,就必须面对自己在项目中”凉了“的前景。
开源的深层悖论
有一个经典的比喻,说商业软件的开发,是一个自上而下的系统工程,就像建造一座”大教堂“;而开源软件的开发过程是一群级别平等的人,共同为某个事物贡献自己的一点力量,聚沙成塔,资源互换,更像一座热闹的”集市“。
”大教堂与集市“的对比,让坚持开源路线的人们颇为自豪。中心化的商业软件开发流程,容易受到防不胜防的外界侵袭,也不能对新涌现出来的需求做即时,快速的反应,显得步调迟缓笨拙。
相比之下,开源软件的每一个细节,都暴露在”阳光之下“,只要有心,人们都可以发现,所以理论上任何一点想拿开源产品”图谋不轨“的做法都不会得逞。正如有人怀疑AntD”下次会不会直接用代码挖矿“这样的担忧,就应该是没有必要的。
但是,今天这起事件的发生,又反映了什么?为什么理应有人看到并监督的问题,却安静地躺了两个月都没人发现?
航通社认为,答案可能就出在大企业作为初始贡献者,给用户们带来的这份”安心感“。
以”因为信任,所以安全“作为口号的支付宝,虽然一度曾经做过”社交“的尝试,但至少在管好我们广大网民的钱袋子这个本职工作上,还能说是尽职尽责,让人放心的。
蚂蚁金服开发的AntD也因为清亮的设计语言,以及严谨,简约的代码写作而受到程序员们的好评,还是体现出了大企业规范的开发流程,和靠谱的开发人员的好处。
不过,可能恰好因为这一点,使用AntD的人们会在不知不觉间,忘记这是一个开源软件,而且它诞生的本意是支撑蚂蚁金服内部产品的前端设计。
在蚂蚁金服内部的工作环境里,员工们可能都喜欢过圣诞,都能读出彩蛋背后的含义,并正确地理解它。所以,一次性把所有按钮都加上彩蛋,如果在蚂蚁内部的话,可以说无可厚非。
当AntD的适用范围走出蚂蚁内部之后,开源社区本来应该尽到代码审查的义务。在实际使用之前,每个单独的用户都要仔细看这个代码的各部分是否已经充分满足了自身业务的需要,有什么不足或多余的地方,如果是能影响到很多人的问题——就比如”下雪“,就应该及时反馈给初始开发者,让他们改进。
因为对蚂蚁作为大公司的”信任“,这次应用AntD并不幸中招的前端同学们,可以说都没有再花心思去审查代码。”最安全的地方“也就变成了”最危险的地方“。
现在,大公司拥抱开源,将非核心业务甚至部分核心业务代码开源,依靠订阅服务而不是单独产品赚钱,已经成为一种通行做法,像微软、IBM这样的大公司,其从商业”教堂“到开源”集市“的大转弯更让人瞠目结舌。
大多数时候,多些商业公司做开源,总是好事。代码共享出来了,就会有更多人的精力被解放,不至于”重新造轮子“;而全球研发人员的智慧也能一定程度共享,依靠全球社区的力量,更能建造一座完美的”通天塔“。
只是,正如上面提到的一样,这一切的基础,都应该是基于”信任“这个核心价值。
不管是AntD这种”好心办坏事“,还是早前Facebook曾针对React Native设下的专利”陷阱“,都挫伤了社区对于项目的信任。其结果,本来安心使用的客户们仓皇出逃,寻找替代品,一切从头再来,大量增加无效的重复建设的成本。
我们都说,现在你装个App,连许可协议和隐私协议都懒得看,都是一路下一步的,那人家递给你的现成品,你还要拆开看看它有没有害你,是不是太神经过敏了,也太强人所难了?
要想大家都舒服一点,那除非所有自认为拥抱开源的大公司,都更认真的对待自己在社区的角色,通过更严格的自律和自我审查,才能让大家继续安心用着你的产品,真正的为开源做出贡献。