React Ant Design 错了吗?

dsh0416 · December 25, 2018 · Last by infoseek replied at May 15, 2019 · 13641 hits
Topic has been selected as the excellent topic by the admin.

Ant Design 今天的圣诞门闹得沸沸扬扬,Ant Design 内建的圣诞彩蛋在各个使用 antd 的产品中被「强制」弹出,令许多人措手不及,造成了很大的社会影响。但事实上,Ant Design 使用的是 MIT LICENSE,完全是一个使用者「后果自负」的协议。然而,Issue 里哭天喊地要开发者「负责」的舆论却又一面倒。

在此,我要问一个问题:「Ant Design 错了吗?」

就我来看,毋庸置疑,错了。

但这篇文章讨论的是以下几点:

  • Ant Design 犯了什么错?
  • 开源的权利与责任的界限在哪里?
  • 我们应当怎么从这个事件中获取教训?

Ant Design 犯了什么错?

从产品的角度来看,这个彩蛋,连彩蛋的定义都不符合。彩蛋(Easter Eggs)是一个隐藏在程序中的信息,而不是突然糊在你脸上的定时炸弹。所以从想出这个问题的那个人就已经不太对劲了。但我们抛开这个产品的问题,从实现上,这个 Santa.jsx 文件也同样是非常糟糕。作为一个组件级项目,很多人会对组件样式做二次开发,这一坨硬编码(Hardcoded)并没有起到它彩蛋的作用,相反还把很多网站弄得一团糟。如果你试图阅读过 Ruby 的代码,你往往会发现 Ruby 有那么多错误命名的 C API 为什么一直不把它改对呢?因为这种语言级别的东西,你无法确定用户是怎么使用的时候,就必须保持最低限度的兼容。Ant Design 也是如此。

然而「人主之患在莫之应,故曰:一手独拍,虽疾无声。」导致 Ant Design 问题的,不单单是彩蛋本身的错,更大的是 Ant Design 开源社区开发流程的问题。或者换一句话说:是软件工程的问题。

如果我们现在要往一个开源项目中加入一个不合适的东西,其实并不那么容易。Ant Design 有基于 GitHub Pull Request 系统的 Code Review 机制。一个并非紧急的代码,为什么可以直接跳过 Code Review 直接推上去?Ant Design 作为一个组件级的基础项目,到底应该怎么设计测试?

这个 2017 年 12 月 25 日 写下的代码,写入到发作的这一年中,暴露的并不是谁的错,而是这个项目本身就是一个错误。

如何运行一个开源项目?

Ant Design 错了,需要检讨,需要反省,需要道歉。但另一方面,在 Issue 下大骂「要阿里负责,要阿里赔偿」的则是走向了另一个极端。今天的开源项目,在使用常见的 Copyleft 许可证的情况下,大多数(包含且不止包含 MIT、BSD、GPLv2、GPLv3、AGPLv3、LGPLv3、MPL 2.0、Apache License 2.0、The Unlicensed)都在许可证中明确写了,不包括任何保修的条款,使用者自行负责。这让很多人听起来匪夷所思,觉得 Ant Design 一个阿里的产品,怎么也是阿里在背书。然而事实上,可能除了信誉,没有规定任何东西是实质的背书。前几天有人在 Ruby China 上开了个帖子问:

到某某网站上浏览时,发现上面说,以上版本均需获取商业授权,方可做商业运营使用,既然是开源的,咋还涉及到商业授权啊,不理解,请指教。谢谢!

然而版权的实际情况却恰恰相反。源代码放出来只是让你看,并不能让你用。就像别人放在那里的芒果,你不能寻思是别人不要了吧。代码是不是开源,需要取决于使用什么授权协议。哪怕是 GPL 的 RedHat 也有卖商业服务的。如果人家没有设定任何授权协议的话,那就只能默认是 Copyright 私有了。而只有签了具体包含保修责任的条款的协议后,对方才有保修的义务。不然,我自己写着玩开源出来,你用的时候也已经同意免责了。你用出问题了为什么要来找我呢?有问题你自己 fork 了改不就好了?

这就牵扯到了另一个问题:开源的社会价值。当一个开源产品,比如 Ant Design,有大量的用户在使用的时候,对于这个开源社区的期待是完全不同的。这也是为什么世界上大多数的大型开源项目,都有一个庞大的组织在维护着。其目的很大程度上,就是要维护代码的可靠性,担负起其社会价值。你觉得阿里价值观能担负起社会价值吗?

有人在我微博下呛:

照右边这个逻辑的话,广大 MIT 框架作者应该纷纷往自己代码加挖矿,这世界不需要开源,人与人也不需要信任。别人写好的高级语言也别用啊,一起汇编起来。

然而事实上,如果你愿意找一下,GitHub 上许多 MIT 项目是有暗藏挖矿的,甚至还有暗藏后门的。至于「别人写好的高级语言也别用啊」也是如此,UNIX 创始人 Ken Thompson 在 30 年前获得图灵奖的获奖演说中,就有提到这种类似的暗藏在 C 语言编译器中的手段实现攻击。这也是为什么一方面 C 语言编译器也有一套复杂的自举发布流程,像 gcc 还会有严格的代码审查机制来避免这种问题的发生。然而甚至硬件本身,也不是 100% 可信的。这不是「人与人的信任」问题,相反,就算 100% 相信别人不去做坏事,但是由于人都会犯错,总会做出错误的东西,我们需要的是通过机制来避免它发生。

在以前一个非常有名的 NVIDIA 开源驱动的维护项目 bumblebee 中就有出现过开发者疏失,导致更新的用户直接把所有的 /usr 用户文件不小心删了个精光。甚至有人曾试图通过给 Linux 项目提交 patch 的形式,将后门埋入操作系统中。并且这些看起来不经意的错误,甚至会使得一些人为的 Code Review 失效,所以 Linux 还有复杂的安全性和回归测试来保证其可靠性。

如果这不是无意的行为,而是有意的。那么对于开源世界,我们有个更简单的方法:fork。我们只要分叉一个自己的版本,自己维护自己负责就可以了。MySQL 被 Oracle 收购后,虽然 Oracle 暂时还没有做什么坏事,大家为了谨防这种情况发生,就有一些开发者 fork 出了 MariaDB。

但是,我也反过来问一句:你 fork 后的项目,你真的能维护得更好吗?

软件工程是一个复杂而庞大的东西,把七个积木搭在一起,和把七千万块积木堆在一起是完全不同的系统工程问题。开源软件的管理看起来松散,于是更需要设计合理的制度防范于未然。在挑选开源项目的时候,并不只是挑一个能用的就行了,对于其质量、维护能力、开源协议都必须是评估的内容。我不是在说「用开源的东西不审查代码,出了问题活该」,但是什么都不看,不出问题才奇怪吧?

教训

为什么包括谷歌微软在内的大公司,在使用别人的开源项目时,都要经过内部审查。虽然不至于精确到每行代码,但也要大致确认一下这个项目的状况。这也是为什么,Facebook 之前内部许可证事件沸沸扬扬,因为这真的很重要。就好像,警察在努力阻止盗窃案的发生,但我们自身平时就要做好防范,而不能大门敞开,出了事去骂警察吧。

然而现实的情况却是,用 Ant Design 的本来就是一群想用个组件库草草了事的人,根本没有可能去参与到开源项目的审查中。而 Ant Design 目前草率的开发流程,确实也无法承担如此大的社会责任。如果今天不是「偏右」的圣诞节代码出了问题,明天后天一样会出别的问题。如果今天是「偏右」辞退就来平息风波,那么明天后天 Ant Design 还是会继续出问题(毕竟是阿里嘛)。

今天 Ant Design 的问题是一个典型的软件工程问题,让任何一个个人来负责,都只是息事宁人的策略,并不能从根本上解决问题。对于一个「开发公司 HR 工具的离职谈话功能推到开发者头上;匿名表达对老员工,特别是对彭姓员工不满,大老板可能含沙射影地让你滚;用脚本在公司网站抢月饼,可能违反价值观」的公司,你指望它在软件工程上有秩序吗?

我觉得你在做梦。

总结一下:

  • 开源项目本身并没有所谓的「责任」的概念,你要有自己评估其可靠性的能力,并承担风险。
  • 评估可靠性不在于其背后是多大的公司,更在于其是否有健全的开发流程,因为人为疏失不可避免。
  • 越是底层、组件级的项目对于可靠性的要求越高。
  • 只要不是主观上故意犯错误,我们更应该检讨我们的系统工程,而不单单是检讨个人。
jasl mark as excellent topic. 26 Dec 00:10
Reply to huacnlee

return "" if Setting.app_name != "Ruby China" 这个条件判断,很专有。😐

唯一的错就是不够严谨。 嚷嚷着要阿里负责的就像偷别人韭菜吃进医院反过来去要赔偿一样,但似乎还真能要到 昨天居然还有看到跟 zz 扯上一把的。码农界有这么多闲人?看来工作量都不饱和啊

简单复述一下自己对这件事的掌握:

框架的核心开发者在代码中埋了一个逻辑:在圣诞期间会触发一个“彩蛋”,这个彩蛋的触发引起了广大人民群众的的抵触。进而在舆论上造成了一些风波。

应该就是这么个事情。

在我个人看来(个人观点),这件事情根本不应该被拿出来说。 发展到现在的“状况”的根本原因是,互联网的“羊群效应”和利用羊群效应挣钱的媒体的精彩表现。这个彩蛋给谁造成了伤害?给谁造成了损失?心理上?身体上?都没有。

核心问题是该核心贡献者的“审美”和大众有些距离,如果是个优美的彩蛋,现在应该是一片掌声。

对于至于软件代码质量和交付过程的批评,可能有些苛责阿里巴巴了。没有谁有义务在一个免费的开源项目上化大的精力和时间像保证商业产品质量那样去付出,商业社会这是不现实的。况且这个彩蛋真的是没有造成什么损害。(本人能力有限,非阿里职员,也没能在开源项目的贡献者,仅仅客观评价)

至于那些在 github 上喷人的我就不在这里骂它们了,理解点开源精神都不会那样做。

跳的高的,喊的厉害的,都不过是被操控的玩偶而已,你没看到有很多人在欣赏着自己的“操控能力”,另一方面在开心的数钱。

Reply to early

有理,不过客观来讲对于一些不过“洋节日”的国企来说,这种设定不可避免还是造成了一些影响,起码是一定程度的“惊吓”。 😐

Ant Design 没错,错的是 UI,积雪效果做的太 TM 丑了,真的跟狗啃了一块似的,没考虑白色背景的情况。

对比 2003 年我刚接触动网论坛的时候,十几年来编程技术日新月异,而美工的水平原地踏步甚至退步了,03、04 年的时候,动网论坛的爱好者做的论坛圣诞皮肤,比 Ant Design 的圣诞效果炫酷多了。也许是 HTML5 的发展,把设计人员踢出了互联网这个行业。

Ant Design 的问题是跳过了开发者,将“彩蛋”直接呈现给最终用户。

彩蛋通常在用户进行了某些特定的操作时出现,而 Ant Design 这个是时间触发,并不是用户去触发的。

前端果然是娱乐圈 那么多人表示不爽 有时间喷干嘛不自己造一个轮子

喷的都不会造的 只会动嘴~~ ~~

作为一个放羊的实在不明白 不看源码 接口是怎么调用的~~~

  • 用别人开源东西
  • 怎么就修改你的东西
  • 这句话说的真不要脸
  • 既然不是你的
  • 那么 GitHub 源码修改了
  • 公开的自己眼瞎不看
  • 怪别人没有提示
  • 怪别人没有写进文档
  • 文档真有人看就不会问各种智障问题了
  • 开源确实开箱即用
  • 喷的那些人不是都是开箱即用吗?
  • 一句话 >> 自己没本事 不会写 别人写的懒得 看也看不懂 看不懂了就骂人缺少文档 这事情写了文档 照样挨骂 照样骂不会文档写的不清楚,字体不够突出。
  • 不会用了就骂 用不好了就骂
  • 那么问题来了,
  • 为什么要用呢?
  • 因为大家都在用?
  • 因为开箱即用
  • 因为开源的出问题有人背锅。
  • 开源的东西人人都在参与。出问题甩锅给人家。这问题跟自己没本事怪不好一样,一个道理!

This is like that you fucked a whore, and you think she shall love you.

为什么会有人觉得框架介绍里有「企业级」就意味着框架维护者要为自己背锅呢?

简单的看了一看,不理解问题所在。

  1. 不单说是彩蛋 ( 或是其他什么额外"功能" ), 甚至乎是木马,其他安全漏洞,等等也没有分别。从来没有人说过开源就必须要附上"商业"责任。不管是任何形式的 LICENSE, 你免费的用,还希望得到免费的支援?

  2. 虽然说没有"商业"责任,"社区"责任还是有的。毕竟"开源"本身就是一个庞大的开发社区,很多大企业也将开源成为一个市场推广目标。希望能够吸引优秀的开发人才。

  3. 与其说这是一个彩蛋,更确实的说这是一个坑吧。如果这件事在外国,公关手法处理得不好只有一种结果,开发人员大规模抵制所有阿里旗下产品。就是 Vote with your Wallet.

https://github.com/ant-design/ant-design/issues/13098#issuecomment-449596558

一个月前有人提了 issue,结果当天就被关掉了

是不是里面隐藏病毒,也要怪使用者没有一行行看源码进行测试啊

Reply to Liberxue

开源产品免费、开源,但最终是一款“产品”,产品特性就要有合理、合规、合适的问题。此次事件可以说是开发者失误,道歉了,根据协议也没有商业责任,社区也接受道歉。但你跳出来,非得一副使用者“活该”的样子,那我不得不用你的逻辑怼你一下。以下言论仅代表本人的一种愤慨:

你就职于一家互联网公司,你们老板每天免费给你们送饭吃,美味可口,愚人节这一天,老板在饭里掺了一坨屎。有的员工看到了,没吃;你没注意,你吃了屎。你很生气?对不起,按照你的逻辑,你活该吃屎:

  • 吃别人免费的饭
  • 怎么说在你的饭里掺屎
  • 这句话说的真不要脸
  • 既然不是你的
  • 那么饭里掺了屎
  • 公开的自己眼瞎不看
  • 怪老板没有提示
  • 怪老板没有写进文档
  • 文档真有人看就不会问各种智障问题了
  • 免费的饭确实可以饭来张口
  • 喷的那些人不是都是饭来张口吗?
  • 一句话 >> 自己没本事 省钱 别人送的饭懒得看 看也不仔细看 吃到屎就骂人缺少文档 这事情写了文档 照样挨骂 照样骂不会文档写的不清楚,字体不够突出。
  • 饭不好吃就骂 饭菜凉了就骂
  • 那么问题来了,
  • 为什么要吃呢?
  • 因为大家都在吃?
  • 因为可以饭来张口
  • 因为免费送的饭有人背锅。
  • 免费的饭人人都在吃。吃到屎甩锅给人家。这问题跟自己没钱买饭怪社会不好一样,一个道理!

免费用别人的东西,不代表别人要为你买单,没有错,就算有,也没义务认错,又没收钱,通过为了出名来发贴来指责他错的行为也没错,都是为了热度和出名,不然就没人认识了

然而许可证大不过法律。如果能举证证明这种行为触犯了法律,那么许可证再怎么写也没用。

比如你免费提供饭菜,但是饭菜里下毒,把人毒死了,你并不可以以事先同意过某种合同来免除自己的责任。

如果这次的事件闹到法院,法官认为这是破坏计算机系统罪(通过植入代码影响他人的计算机功能),再怎么许可证都救不了。(当然,这种小技巧应该没法官会判的。)

Reply to msg7086

人家又没让你用,再说了。代码是你写的,系统是你写的。

彩蛋作者的做法固然可圈可点。,但是 谁让你不加版本控制的,加了之后大多数的人都可以避免。 谁让你没有 watch 的,别人看到了你没有看到呢。 这事都是瞎起哄的多,真正受到波及的没有多少人,前端就是个娱乐圈。

Reply to 403

我没用 ANTD,也没写系统。可你我是中国人,你有办法逃避法律的监管和制裁吗?

在免费饭菜里下毒你可以以「人家没让你吃,你自己吃的」为理由免除有期徒刑吗?

你是什么大人物啊,觉得自己能高过法律?

Reply to msg7086

你这就有点偷换概念了,有没有主观恶意,是很大的区别

我觉得这篇文章算是一个很深度的评论了。

You need to Sign in before reply, if you don't have an account, please Sign up first.