NodeJS

一位 NPM 模块的开发者撤回了他的代码,导致了多个重量级项目(如 React 和 Babel)出现问题。然而对软件代码本身的分析却发现,这个被许多项目使用的模块就包含几行代码,进一步研究发现,NPM 包管理器中有大量类似的被广泛使用但只有几行代码的模块。

有人为此发出疑问:程序员连代码都不会写了吗?举例来说,一个叫 isArray 的软件包一天的下载量有 88 万,2016 年 2 月有 1800 万次下载量,它本身就一行代码。NPM 生态系统中的许多开发者看起来宁愿复用其他人写好的代码而不是自己写。这种做法存在严重的安全隐患,因为一个被广泛使用的软件包存在 bug,你的代码也会受到影响,而你却无法自己去修正。


两天前,一名 NPM(Node.js Package Manager)社区的贡献者 Azer Koçulu 出于对 NPM 管理层的怨愤,不声不响删除了自己在 NPM 上面的全部代码,其中就包含只有 11 行代码的“Left-pad”,没想到从中国北京到美国硅谷,从大学宿舍学习 Node.js 的新手到 Facebook 的资深工程师,整个互联网界都炸开了锅,他们手中的许多 Node.js 模块,全罢工了。

虽然 NPM 管理员在危机发生后采用强制重新编写发布了 Azer Koçulu 的代码,但是这次 NPM 风波无疑意义深远。

要理解 NPM,首先就要知道 Node.js。Node.js 是基于 Javascript 语言的后端编程框架,开发网站用的语言,可以理解为 PHP 的替代品。Node.js 最明显的特征在于,除了使用 Javascript 语言,同时还拥有许许多多公用的模块,都由来自世界各地的开发者贡献,这些模块使用 NPM 管理,NPM 就有点像苹果的 App 商店,只不过这些模块都是免费的。

Azer Koçulu 本来是 NPM 的热情粉丝,经常为 NPM 贡献代码,其中之一就有个叫 Kik 的模块,但是这个模块可能是功能简陋,也可能是知名度不高,反正用的人很少,没什么存在感。巧巧合的是,刚好有一家公司也叫 Kik,是一款类似微信的社交工具。

Kik 公司也要在 NPM 社区用到 Kik 这个名字,于是就给 Azer Koçulu 发律师函,义正言辞要求他把自己的 Kik 换成别的,否则会有律师找上门。Azer Koçulu 觉得 Kik 公司说的很有道理,然后拒绝了。毕竟取名不应该先到先得吗?凭啥你说什么我就信什么,凭什么你要我做啥我就做啥。而且我又没做错什么,我在刚开始编写 Kik 模块时候并不知道有 Kik 这个公司。

Kik 公司交涉失败,直接就向 NPM 官方投诉了,没多久,NPM 社区管理员没经过 Azer Koçulu 本人同意,就把他在 NPM 上面的 Kik 模块的控制权交给了别人。

这下 Azer Koçulu 简直要爆炸了,对于 NPM 大失所望,没想到 NPM 社区是这种玩意,保护大公司,漠视个人开发者。这简直就是对自己价值观的奇耻大辱。

愤怒难抑,Azer Koçulu 决定复仇,他要和 NPM 决裂,一下子删光了自己在 NPM 上面的所有代码。其中就包括流行组件“left-pad”。这个组件只有 11 行,功能很简单,就是在给定的字符串左边重复插入给定的字符,以达到需要的字符串长度。

这个 Node.js 模块虽然简单,但是应用非常广泛,下载量超过 57 万次。Facebook、Spotify 以及 Netflix 等著名公司大型软件项目中都用到了 Babel 这个模块,而 Bel 本来这个模块又调用了“left-pad”这个模块。同时受影响的还有当今非常著名的 React 框架,这个框架帮助前端工程师更便捷地开发网站界面,全世界同时学习 React 框架的程序员可能数百万,但是突然就都不能用了。据 NPM 官方博客,“left-pad”删除后,受到影响的模块达到数千个。

这就像飞机的发动机突然掉了一颗螺丝,点火时候系统就肯定会报错,但是你却很难定位为题的出处。毕竟 Node.js 采用连环套的设计思想,你调用的模块可能调用了其他模块,其他模块也调用了自己的其他模块,一层又一层,代码量千千万,定位并修复所有的问题代码,实在工程浩大。

这场意外迅速在 Twitter、以及微博上炸开了锅,众多网友反应 React、Babel、Ember 无法使用,数小时后也有网友反映 Babel 已经推出了紧急修补版。

意外发生 4 个多小时后,NPM 社区管理员决定出手,把“left-pad”这个名字从 Azer Koçulu 手中夺了回来,重新写了一个“left-pad”函数,终于才抚平了千万程序员躁动的心。

这次意外发生后,众多开发者开始怀疑 NPM 的管理能力,庞大的 Node.js 社区竟然危机四伏,今后如果有贡献者误操作或密码被盗,全世界无数的 Node.js 开发者瞬间无法工作。同时也有人开始怀疑 NPM 的设计哲学,为什么不设计官方标准库,而是把十来行,甚至只有 1 行的代码设计成独立的模块。比如有个叫 isArray 的模块,下载量达到 88 万次,其实只有 1 行代码而已。