一个名字引发的血案: left-pad 和 npm 的那些事

近日,一个只有 11 代码的 left-pad 被作者 unpublished。 npm 圈子因此闹得鸡犬不宁。究竟发生了什么呢?

发生了啥?

Azer 是一名 Javascript 程序员,他写了 273 个 Javascript 封包放在 npm 上供大家使用。一个叫 left-pad 的封包包,虽然只有 11 行,但被上千个项目用到,其中包括著名的 babel 和 react-native。

module.exports = leftpad;
function leftpad(str,len, ch){
      str = String(str);
      var i = -1;
      ch || (ch = '  ');
      len = len - str.length;
      
      while(++i < len){ 
         str = ch + str; 
      }
}

一天 Azer 收到一封邮件。邮件上说,“Hi, Azer. 我们是 kik 公司的,我们要发布我们的封包 kik, 发现 kik 这个名字已经被你占用了。你能把名字改改嘛?”。

Azer 内心 os “大哥,有木有搞错,这个名字我已经用了”,便回了一封邮件说,“我拒绝”。

kik公司收到回复之后,又给 Azer 发了一封关于敬酒罚酒的邮件,Azer 再拒绝。。。就这样几个回合之后, kik 公司灵机一动,心想“我干嘛和你死磕,我找 npm”,于是给 npm 公司发了一封关于敬酒罚酒的邮件。

npm 表示我们做了一个艰难的决定,然后把 kik 封包转给 kik 公司了。

Azer “吾操汝母!”,一怒之下将自己在 npm 上的 273 个封包全部撤下,其中就包括 left-pad 封包。一石激起千层浪,依赖 left-pad 的上千个项目包括 babel 和 react-native 瞬间崩溃。大量开发者看着自己项目构建失败,顿时被吓尿。

Javascript 的微型封包

看到这个事情,我的第一反应: 就 11 行的代码有必要搞个封包嘛?这个封包可真够微型的。不是只有我这么想,好多人吐槽的好吧。比如这篇文章 NPM & left-pad: Have We Forgotten How To Program? 怒斥大家还会不会写代码,疾呼“函数不是封包”。文章还举了一些更加匪夷所思的例子,比如 isArray 被下载了1800W次,被另外 72 个包依赖,实际上这个封包只有一行代码

return toString.call(arr) == '[object Array]';

除了写文章,另一些人则用行为艺术吐槽。有人建立了一个 left-pad 服务。还有人建立了一个检查输入数字是不是 13 的封包 is-thirteen,然后在 Github 上获得 700 多个赞了。

大家对这类微型封包的吐槽是有道理的。微型封包最大的问题在于,你为了完成一个完整项目引入很多微型封包,导致你的项目需要依赖很多东西。多一个依赖就意味着你多了一份不可控性。只要其中一个微型封包代码出了问题,你的项目就坑爹了啊。

其实,这一类函数是有意义的,其最大的意义在于 hiding complexity。函数开发者写好这些函数并进行充分测试,提供给其他程序员使用。这些程序员就不用重复前人的工作,而是把时间和精力放在更有生产效率的地方。正如有人在 github 讨论中说道,“你怎么知道一个数等于 -0 呢? x === 0 && 1 / x === -Infinity 确实很简单。但你真的希望你怎么写并搞清楚为什么嘛?还是你更倾向于直接使用 negative-zero呢”。大家吐槽的是为什么一个函数就能形成一个封包。因为 Javascript 提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。大家又要用,便各自写各自的。如果只是这样,还不致于一行代码一个封包。npm 和 bower 等包管理出现使得 Javascript 拥有非常方便快捷的包管理,大家都可把自己写的小函数传上去,别人可以很方便地下载这些函数并导入自己的项目中。Javascript 标准函数库不足,加上方便快捷的包管理,程序员们养成一个函数一个封包的习惯就不足为奇了。现在已经有一些人开始解决这个问题。比如 lodash 和 underscore,这两个封包就可以用于来弥补 Javascript 标准库的不足。

命名空间

由于 npm 将 kik 控制权转移,被各路人马骂惨了。npm 的官方说明 kik left-pad and npm 被骂得关闭了评论。那么 Maven, Github 和 DockerHub 等分发平台是怎么解决这个问题的呢?对比这些分发平台,我们可以发现 npm 的症结在于没有命名空间。Maven、 GitHub 和 DockerHub 封包名是两家命名 Group_id (Userid) /Artifact_id, 而 npm 的封包名直接是Artifact_id。

没有命名空间会带来很多麻烦。比如,你以为下面的代码是 Google 官方出品的重量级封包?

nmp install google

Too young, too simple, sometimes naive! 虽然它是调用 Google 搜索的封包,但它本身和 Google 官方没有半毛钱关系。用它自己的话说就是 “A module to search and scrape google. This is not sponsored, supported, or affiliated with Google Inc.”。 有一天 Google 想发布自己的 google 的封包的时候,就懵逼啦。稍微能理解 kik 公司了吧?

再比如,一名开发者开发一个封包,一时不知道取啥名字,随手取了一个名字 ntt。经过一段时间的开发和推广,有人开始在自己的项目中使用 ntt 封包,开发者也因此获得了一定的知名度。这时候,日本电信公司 NTT(Nippon Telegraph and Telephone, NTT)要求开发者将这个封包让出来。你要是这位开发者你能忍?对 Azer 的遭遇是不是更加感同身受了?

如果 npm 有命名空间,那就没有这个问题了。比如,我要发布了一个 google 封包, 全名叫lietal/google。没有人会觉得这个东东来自 google 吧。 我再发布一个 lietal/ntt, ntt 公司也不至于叽叽哇哇。

一点思考

软件工程领域著名的《人月神话》用了一些的政治隐喻。比如,它的第 4 章的标题是“贵族专制、民主政治和系统设计”。再比如,它的第 7 章 “为什么巴别塔会失败” 也进行了一些政治性讨论。我以前看的时候,只觉得例子好奇怪,没有什么其他的感觉。现在的 left-pad 和 npm 事件倒让我意识到了现实的复杂性。代码孕育政治啊!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏日暮星辰

Cloudflare 1.1.1.1公共DNS上线Cloudflare Public DNS

1222
来自专栏企鹅号快讯

春运要来了!微信可以实时接收高铁出行信息,无论是购票还是改签

就在今天,更加便民的服务来了! 从今天起,微信可以实时接收高铁出行信息,无论是购票、改签、退票等行程通知,都能在微信上获取! 绑定的方法有两种 第一种——微信公...

1856
来自专栏阮一峰的网络日志

Google遵循的软件行为准则

昨天,我写了Google发现的十条真理,其中第六条就是著名的"不干坏事,也能成功"(Don't be evil)。 那么,什么样的事情算是"坏事"呢? Goog...

2865
来自专栏FreeBuf

揭开暗网服务的神秘面纱(上)

各位Freebuf的同学们大家好,我将会在这一系列的文章中跟大家讨论有关匿名系统安全方面内容,包括暗网的运行机制以及其中的各种匿名服务。以下是我在2016年Ha...

2035
来自专栏PHP在线

PHP 开发者的 Docker 之旅

用 PHP 作为我们「Docker 开发大礼包」开篇是带着一些朝圣的心情的。这是一门堪称「古老」的语言,这也是一门争议最多的语言,这更是一门不断涅槃的语言。「P...

3539
来自专栏申龙斌的程序人生

搞定GTD-掌控流程之一:捕捉(2)

GTD流程的第一步是捕捉,来一次全面捕捉(收集)只是开始,要把收集变为日常的一种习惯,如果你看到一个人在闲聊的过程中不经意地掏出一个小本子,写了几笔之后又放入口...

2728
来自专栏Java技术栈

Elastic Search 上市了,市值翻倍,这群人财务自由了!

国庆长假,大部分人还深浸在风花雪月之中,而就在昨天(美国时间10月5号),我们 Java 程序员所熟知的大名鼎鼎的 Elastic Search 居然在美国纽约...

732
来自专栏Timhbw博客

苹果iOS10开发者预览版Beta1新特性:支持卸载部分系统应用

2016-06-1408:30:34 发表评论 326℃热度 和以往一样,苹果公司在WWDC2016首日开幕主题演讲结束之后,正式放出iOS10开发者预览版B...

3066
来自专栏Alan's Lab

windows 10 私人不负责任评测(多图预警)

最牛的一个: Mac 下 Flash 一直是个痛,只有用虚拟机的 Win 7 才勉强敢看,但拿 Win 10 试了一盘三国杀+两部腾讯视频(拿 Mac 看过腾讯...

733
来自专栏大神带我来搬砖

想搞大数据??你这样是自寻死路!!

近日来,家住北京市朝阳区的程序员诸葛建国非常郁闷,因为他的公司审时度势,附庸风雅,牵强附会的上了一套大数据系统,可谓麻雀虽小五脏俱全,包括了: 分布式文件系统H...

2946

扫码关注云+社区