JSConf EU 2019 大会上,前 npm CTO CJ Silverio 发表了名为“npm economy”的演讲,讲述了 npm 从一个开源项目发展为私营企业的前世今生,批判了 npm 公司唯利是图的本性,并发布了名为 Entropic 的去中心化开源包管理库解决方案。演讲内容全文编译如下。
这是一个悲伤的故事。
谁在掌控 JavaScript 语言的公共资源?为什么事情会变成这样?为什么我们需要改变这种状况?这是一段关于 JavaScript 的故事,但其中到处都是金钱和权力的味道。
我要讲的是我自己的所见所闻。我并非全知全能,也有自己的偏见,所以别人关于这段故事也会有不同的看法。但我作为亲历者可以带给大家一个很好的视角。我曾身处漩涡中心,直到去年我都是运营 Javascript 包管理库 npm 公司首席技术官,所以我在这方面拥有的专业认知是非常少见的。这个故事中也会包含我自己的观点和看法,听众需要时刻谨记这一点。
这是关于 Javascript 包管理的故事,你们也是其中的一部分,但我觉得你们肯定没意识到这一点。听到最后你们就会知道它的原因和意义所在。
我会谈到金钱,谈到那些有钱人,以及那些自己并非开源软件作者却能从中牟利的人们的套路。故事的开端是你们的无心插柳与我自己的有意为之,这些有意无意的决定影响至今。我要讲的是所有权、控制权,以及它们所带来的种种后果。
这也是一场关于权力的大戏——谁在掌权?你们有多少权力?权力又能用来做些什么?
npm 最初的故事
很久很久以前,在 21 世纪头一个十年的中期,如今没落的雅虎公司彼时如日中天。雅虎身处当时众多 JS 活动的核心位置,聘请了许多 Javascript 思想领袖,如 Douglas Crockford 等,并推动了诸多前沿技术的发展。雅虎的商业战略可能不是很好,但却有一个优秀的技术栈。
雅虎的技术栈中有一个名为 ypm 的软件包管理器,有一些出色的特性。
当时 Javascript 语言越来越有吸引力,这要归功于 jquery 和遵循统一规范的现代浏览器。服务端 Javascript 是个热门话题,那时有几个项目正在试图实现这一目标。
JSConfEU 会议曾是服务端 JS 浪潮的舞台。2009 年 JSConfEU 大会上,Ryan Dahl 发布了 node.js。
node.js 成为了理想的服务端 Javascript 平台。早期的 node 社区高手遍地,他们呼吸着技术前沿的甜美空气,尽情探索这一全新生态的诸多未知领域。一些 node 先驱者发现 node 很需要包管理系统,开始编写包管理器——是的,那时有好几家产品互相竞争。
其中一位先驱是雅虎的员工,当时刚开始接触 node。他辞掉了工作,这样就能参考 Yahoo 的包管理器写针对 node.js 的开源实现了。他的智慧体现在几个方面:他深入参与了 node 项目,于是就能参与起草 node 中 CommonJS 模块的规范。他还做了一些事情来取得领先地位,比如让一些项目对他的包管理器发出请求之类。
这个包管理器表现很出色,得到了 node 内部的充分支持,于是赢得了竞赛。node 包管理器,也就是 npm,开始与 node 打包在一起发布,从此无需单独下载。这一官方支持的地位延续至今。
然后在某一天,Joyent 花了一笔小钱从 Ryan Dahl 手中收购了 node。
这就是资本主义的故事。每天有几百万人使用 node.js 这项工具开发 Javascript,而它的发明者获得的收益只有几万美元。不管今天谁从 node 中赚得盆满钵满,他们都不是当初那位养蚕人。Ryan Dahl 倒是因此有了一份工作,雇主就是 Joyent。(这里要提一下,有人说 Dahl 拿的钱不止几万块,那么短期来看交易还算不错,但长期来看还是亏大发了。)
编写 npm 的程序员也被 Joyent 雇来参与 node 的业务——但注意这里的伏笔——他保留了 npmjs.org 域名、npm 源代码以及他自己所有发明的知识产权。他没有把一切都贱卖给 Joyent,这个决定影响深远,记住这一点。
2012 年 Dahl 离开了 node,npm 的发明者开始领导整个项目,而此时只有 npm 保持着自己的独立性。
那时候大家也开始走进这个世界了。你们是 Javascript 程序员,喜欢写 Javascript,希望用 Javascript 编写工具!所以大家开始用 node 编写 Javascript 了。与此同时,很多人发现用 node 编写 I/O 多路复用服务非常方便,因为 node 内置了很棒的反应器模式,用不着操心线程问题。2013 年开始越来越多的人加入进来,node 越来越欢迎,npm 也开始广泛流行。
npm 的优势
一切都很美好不是吗?
其实 npm 不仅是一个 cli 工具,Cli 只会抓取代码塞进你硬盘里的 node_modules。实际上 cli 可能是 npm 中最边缘的部分。npm 最重要的是中心化包托管和存储库。包托管服务一开始就有,运行在 CouchDB 数据库中。“包托管库”是一个包含大量 Javascript 包、名称、作者和其众多版本的列表,使人们很容易找到所需的 node 包,并快速可靠地安装它们。
先来谈一谈中心化的优势。npm 包托管库是中心化的。中心化有一些明显的可用性优势——也就是一站式服务。中心平台有一些强制的统一规则——内容长得都一样,提供相同类型的信息,而且就算提交者不管不顾了,内容也不会凭空消失。
中心化对用户有很多好处。有一个一站式的来源就能很容易找齐所需的资源。我最近一直在用 Go 编程,而找 Go 的软件包很麻烦,因为它们无处不在,只能靠谷歌搜索,或者查一查老式的文本列表。安装 Go 软件包时还得从 Github 仓库安装,安装源随时可能消失不见,令人不爽。相比之下,过去 8 年来使用 npm 的经历真是舒服。
时至今日,中心化都是互联网的主旋律。例如博客都转向了 Tumblr 和 Medium 之类的中心化平台上,社交媒体自己就中心化了,而开源内容都跑到了 Github 上。
所以 npm 就是所有 node 包的中心化托管库,不过 2013 年的时候它还问题多多。中心化的缺点在于成本也是集中的。npm 库的缺点是它需要运行在带有数据库的服务器上。
npm 引起了商业之战
可服务器需要花钱啊同学们。
那么谁掏钱呢?
之前的几年,npm 是靠捐款维持服务器运营的。npm 用了 CouchDB 作为数据库,免费借用后者的托管服务。很长一段时间里它都被视为 CouchDB 做的广告和 IrisCouch 提供的服务。后来 IrisCouch 被 NodeJitsu 收购,他们继续支持 npm 作为他们的 CouchDB 和 node 托管服务的廉价广告。
但 2013 年开始所有人都涌进 node 了,npm 的使用率大增,成本飙升,服务器开始不堪重负。2013 年 10 月 npm 一半时间以上都无法访问,问题已经非常严峻了。
npm 需要更好的服务器,需要一位专职维护人员。npm 需要钱。
这对编程语言生态系统来说不是什么新问题。RubyGems 也需要钱。Perl 很久以前就用 CPAN 镜像网络解决了它的问题。
npm 的唯一所有者决定尝试一条全新的路线:他决定找些风投资金并将他的软件变成公司。他亲眼目睹 Joyent 才给 Ryan Dahl 那么点儿钱,可现在 node.js 价值连城。所幸他保留了 npm 的所有权,他在 node 项目中的员工身份和这个没关系。
于是他炒了 Joyent 鱿鱼,自己成立了一家公司——npm 有限公司——并从一家风投公司获得种子资金。
node 项目决定听之任之,并继续为 npm 有限公司提供与 node 打包在一起的特权。
用户们也选择了用脚投票,继续留在 npm,社区继续支持 npm 库的发展,相当于为这个决定投了赞成票。
你们可能根本不觉得自己曾经做过什么决定。你们只是默认了这一事实罢了。你们从未质疑过 npm 存在的事实,甚至可能没意识到或者不在乎它其实是一家公司。
当时这个决定是有争议的。之前为 npm 提供免费托管的 Nodejitsu 就很不高兴。他们自己做了一个 #scalenpm 方案,当时也在为其筹集资金,和 npm 所有者的筹资活动刚好撞车。那时有很多法律交锋,细节我也不太了解。我知道的是 npm 很快就不再用 Nodejitsu 的托管服务了,事情变得一团糟,两家公司开始扯皮,都在找自己的律师。后来,npm 很快也不再用 Joyent 的托管了,因为这两家公司也开战了。
一旦涉及到钱,大家就不再是兄弟了。人们可以在开源的乐园中其乐融融,但开始为钱争斗的时候就会撕掉这层温情的面具。
那时我个人也做出了一个决定:我也支持让风投基金拥有 Javascript 语言的公共资源所有权。不过当时我为此想出了很动听的理由。我告诉自己,这个决定最终能让 node 走向成功。我真的很喜欢用 node 编程,而我第一次参与开源工作就是在 npm 项目里。我心潮澎湃,希望自己的参与能让它越做越好。我相信了 npm 的所有者给我们展示的愿景,那就是 npm 将会自给自足,有自己的一大堆服务器,愉快地向广大开发者分发软件包。
资本家看到了 npm 背后的商机
春去秋来,时钟走到了 2014 年。现在 npm 成为了一家公司,有了风投注入的资金,也开始招聘新人了。第一份聘书发给了 RaquelVélez,就在本次大会上他也做了演讲;第二份就给了我。
最后我负责领导 npm 的工程团队。我们扩展了 npm,进而帮助 node 进入了高速增长期。人人都开始用 node 构建整个 JS 世界,而 npm 成为了每位 Javascript 程序员工作流程中不可或缺的一部分。npm 帮助开发者重塑了 Web 开发产业,这是前所未有的成功!
暂停一下,先不谈 npm 的辉煌时刻。
来谈谈钱吧。
node 和 npm 颠覆了业界,为什么 Ryan Dahl、James Halliday、Dominic Tarr、Jan Lehnardt,所有这些开创世纪的天之骄子,却没能躺在自己的热带小岛上悠闲地喝鸡尾酒?
你们听说过这些名字吗?你们在电脑上每天使用的这些软件中上千个开源程序的核心都是他们开创的,甚至每家财富 500 强企业都运行着这些人编写的软件。其他还有很多人 node 和 npm 发展初期做出了贡献,但尽管他们编写的软件创造了巨大的价值,自己却几乎没有回报。
资本主义社会应该奖励像他们这样的人,但实际结果恰恰相反。
我认为,大多数为 Javascript 公共资源做出贡献的人们都不是冲着钱来的。他们也可能想要有自己的热带小岛,但并不指望靠自己贡献的代码换来什么。在 node 的早期发展阶段,npm 的用户互相都还很熟悉,当他们编写这些模块并打造出 node 生态系统时,脑子里想的并不是钱。
他们做的是另一回事,是在一种与金钱没什么关系的生态中与志同道合的朋友交换礼物。
加拿大和美国西北海岸的原住民有一种习俗,他们喜欢送出而非接受礼物。这种习俗叫 potlatch。Potlatch 这种文化被西方殖民者血腥埋葬了,但这一词汇留存至今,因为这种行为源自人类的天性。Potlatch 也是我们来到今天会议的动力源泉。早期的 node 世界奉行的就是 Potlatch 文化:人们追逐自己的兴趣,彼此共享软件库,帮助大家的 node 程序更好地工作。
没有企业支持,单纯靠民间开发者打造的所有开源项目中都有 potlatch 的影子。这种文化没有被暴力打压,因为资本主义就喜欢这个!资本主义社会找到了一种办法来将它转化为武器,枪口调转来打击开发者,这种武器就是 Eric Raymond 风格的开源软件。
你们可能已经意识到了 Richard Stallman 风格的自由软件和 Eric Raymond 风格的开源软件之间的区别。Stallman 的 GNU 许可证要求使用共享源代码的用户也要共享他们使用这些源码构建的产物,或者至少共享他们自己的源代码。而 ESR 的开源风格则是说,开发者共享代码时可以附加许可条件——显然 ESR 的策略取胜了。
资本家喜欢 ESR 开源,因为企业可以从中免费获得很多好东西。资本家还会要求你开源自己的创造成果,告诉你“我们招人是会看 GitHub 的”,然后伸手拿走你的免费代码,做出成品高价卖掉。
Dominic Tarr 就这样交出了自己的 pull-stream 项目,于是所有财富 500 强巨头都可以免费享用他的劳动成果,这就是我们面对的现实。
如果有谁没有放弃自己的知识产权,那么就最有可能因此赚上一笔。当然,他赚到的那点钱比起风投基金赚到的就是小巫见大巫了——一开始谁的钱多,谁最后就会是真正的赢家。大赢家和 Javascript 毫无关系,最后却成了 JS 公共资源的主宰。
Javascript 公共资源
那么 Javascript 公共资源到底是什么意思?
所谓公共资源,本质上是社会所有成员都可以获得的资源集合。它可以是自然资源,例如空气、阳光和水;也可能是一片公地,大家可以自由放牧。
对于 Javascript 社区来说,我们的公共资源包括语言规范本身。它是由一个名为 TC39 的组织控制的,Javascript 的所有利益相关者都可以通过这个组织合作设计和构建规范。
另一种公共资源是我们共享的代码。Babel、Webpack、TypeScript、React、Angular……以及其他几千种软件包的源代码都是我们的公共资源。列出所有这些共享代码的包管理库也是我们公共资源的一部分,我们要通过管理库来查找和分享这些资源。此外还有我们围绕这些公约资源发展的一系列惯例——我们命名和更新共享事物的约定俗成。
但所有这一切现在都由私营风投基金所有。
去年的会议上,node 的发明者 Ryan Dahl 又回来做了一个声明。他谈到了 node 的一些设计缺陷,以下是其中之一:
不幸的是,node 有一个中心化的(私人控制的)存储库。——Ryan Dahl
npm 沦为金钱工具
我们的 Javascript 共享包列表受私人控制,这意味着什么?
就是说管理列表的策略不是由 Javascript 社区控制的,控制权在私营企业手中。为什么删除某个包?如何解决各种争议?某个包和它的依赖可能会一夜之间消失,而背后的政策都是黑箱——要圣旨?来人啊,给他写一条!
开发者想要包裹签名功能?想的美,这个功能没什么钱景,所以慢慢等吧。也许只有安全威胁或大众的强烈抗议才能推动某个功能的实现。
这里我说的只是包管理库的情况,它是闭源的,其运营政策并不受外界影响;npm cli 是开源的,但无关紧要;API 目前是开源的,因为公司现在还允许它开源。开发者并没有对 API 的控制权,想改进它也没有什么途径。
这些公共资源对开发者来说是不透明的。除非拥有它们的公司认为有利可图,否则这种不透明的状况会一直持续下去。你们不知道包里的数据是不是被动过手脚——你们只能去信任公司而已。
但没有问责制就没有信任的基础,而我们 Javascript 社区无法让 npm 有限公司承担责任。
npm 的运营团队可以说他们的动机很好,说他们值得信任——但这个答案没什么意义,我们没办法去测试,出了问题也没法让他们负责。
npm 这家私营实体控制了我们的公共资源,它不是一家性本善的机构,也没这个可能性。当年它的所有者将控制权交给风投基金时一切都不一样了,npm 变成了一种金融工具。
金融工具是利益方之间的货币合约。它们是可以交易的筹码。npm 公司拥有 JS 语言生态系统的控制权,拥有包管理库,以及开发者每天使用的软件包集合——但在其所有者眼中这一切不过是刀俎下的鱼肉罢了。他们用这些资源当作筹码来交易,赚取真金白银。
与 npm 及其代表人员打交道的时候请务必牢记这一点。你们要看看他们是被什么激励的。在这个故事中,很多人的动力来源于白花花的钞票。
跟着钱走。
公司对你没感情,甚至对你喜爱的事物也没兴趣。
广告里当然不是这么说的,广告里这种金融工具是你们的朋友,你们都是兄弟,兄弟就要一家亲,公司要为所有人着想不是吗?
当然不是,想得美。npm 有限公司位于特拉华州,是一家金融工具公司,旨在为少数人赚取更多利润。
以前 npm 还是有很多粉丝的,我自己也曾向大家宣传这类口号,让 npm 获得更多人的喜爱。我曾站在讲台上塑造这种和谐的氛围,连我自己都信了。
现在我想这类宣传再也骗不了什么人了。过去几个月来 npm 已经撕掉了所有的面具。这种事情本来没必要发生的——但公司的高层做出了这样的选择,狠狠打了大家的耳光。这就是我们面对的现状。
到底出什么事了?为什么好好的房子突然着火了呢?
到了 2018 年,大家都在享用免费的 Javascript 软件包午餐。你们不会关心这些包来自何处,或者思考谁在为服务器付费。只需键入 install 即可获得软件包。
但带宽需要花钱,而有人需要付钱。
这时候,npm 已经花了风投基金的好些美元来支付服务器和带宽成本。终于,一切的后果开始显现了,风投资本家清了清嗓子:“咳咳,还记得我们吗?我们想要拿回我们的钱了。我们开风投基金可不是为了做慈善哦,基金是冲着 10 倍投资回报率来投钱的哦,大家都知道哦。“想要拿他们的投资,必须让他们相信最后资本家能当赢家,要讲一个吸引人的好故事,不断找来更多的投资,循环往复。
在我看来,创业者一开始就拿风投的钱绝对没有错。许多企业的目标与风投资金的目标完全一致,而且也不是所有风投基金都长是一个模子里刻出来的。一些基金目光很长远,像 Futureshape 这样的基金明显是有兴趣改变世界的。但大多数情况下,风投资金还是想快点拿到回报,而这里就是激励的源泉了:赚钱,然后卖给新主人,拿到 10 倍投资回报。快点成长,长成巨头,要么就回家凉快去吧。
请记住,npm 有限公司只对它的所有者负责,并不对那些向它贡献软件包的开发者负责。
因此 npm 公司必须赚钱,或者讲一个将要赚钱的好故事,从而筹集资金来设法赚钱。
这位前雅虎员工曾认为应该与全世界分享雅虎的包管理器,这个想法是正确的;但除此之外他就没什么能耐了,可经营公司并不是什么轻松的工作。因此在 2018 年,他聘请了一位新 CEO 打理一切,好戏开始了。这位 CEO 新官上任第一把火就是改变 npm 的文化——以前不是说 npm 热爱大家来着么?这种可持续的,富有同理心的文化是这位新人第一把要烧掉的累赘。
但作为 CEO,他一定要面对一个无法回避的问题。
大家最关心的是公共包管理库,所有软件包都在库里存储和索引。它消耗了 npm 的大量成本投入,同时也是投资者眼中的价值所在。它控制着所有 Javascript 开发工作,因为所有 Javascript 开发代理都愿意通过它运作。这些使用数据是最有价值的部分。npm 中所有与软件包相关的文件都位于一个 s3 存储桶中,装满了你们所需的各种有趣的数据块。这种状况也反过来影响了 API 的设计。公司并不想减少客户在安装软件时打支持电话的频率,因为这些请求都包含了有价值的数据。
包管理库给 npm 带来了沉重的负担。团队每天都要设法满足指数级增长的需求。我主导工作的那段时间里,这项工作是一个非常小的工程团队负责的。为什么人那么少呢?是因为 npm 没钱,因为它没能向新的投资者编织出吸引人的愿景,吸引更多投资,或者潜在的投资者知道实际情况并不那么美好。不管怎样,npm 是有钱维持运转,让免费的 Javascript 代码流向广大开发者,但没能想出良好的商业模式。风投基金设定的大限一天天逼近,团队必须要展现赚钱的能力,要么就完蛋。
跟着钱走吧。
所以我们现在就处于这种境地,npm 公司还没适应自己的真正角色,也就是设法为那些和 Javascript 毫无关联的人们赚取利润。也许它会开始增长,也许会完蛋,也许会做一些我们都不喜欢的事情,利用这个巨大的数据库,利用我们每个人的开发习惯产生的数据来恰饭。
我们现在都知道 npm 并不爱我们,也不喜欢它的员工。它没有我们心中的那些善意,但我们仍然要通过它安装软件包。但我认为这种扭曲的状况不会持续很久,很多人与我的观点是一致的。
我们并不是非要选择这条路的。我们的主角本来可以选择其他的方式来达成他们的目的。但一切已经发生了,无法回头。我们的公共资源掌握在我们无法信任的事物手中,因为它的动机与我们 Javascript 程序员的社区需求是不一致的。
我们该怎么办呢?
一个答案是我们什么都不做,因为有人说我们也无能为力。2013 年 npm 曾陷入危机,我们都曾深受影响。现在我们也只能等 npm 自己完蛋,然后经过几个月的混乱另寻出路。
我不太喜欢这个答案。
想象一下 npm 公司最后被卖给某家专门捞钱的基金,他们接手陷入困境的公司,为了赚钱做大刀阔斧地改革。像这样的人可能没有动力让公共包管理库继续免费运营,或者会设法挖掘用户数据捞钱。
更乐观的结果是,可能有一家规模更大的企业救世主过来拯救我们心爱的 npm,维持原有的运转模式。但即便如此最后也会出现问题。今天的微软看起来很和善,但他们并不是向来如此。谷歌曾经也慈眉善目,但他们现在与 90 年代微软的垄断者嘴脸一模一样。
我希望这次演讲不用在十年后再来一遍。
我同意 Ryan Dahl 的观点。Javascript 的包管理库不应该被私营企业控制。我认为中心化必然会导致私有化,因为服务器总要花钱。但如果我们能够将负载分配到许多人头上,这种负担也能被分散开来。
你们可能觉得这是天方夜谭,你们也曾认为 npm 的统治牢不可破。几个月前我也是这么想的,结果被现实狠狠打了耳光。npm 公司撕下了所有温情的面具,抛弃了社区、文化和美好的价值观。
但我依旧相信共享经济。我也不想冷眼旁观,我不是那种人。我认为人们分享自己的成果是一件好事,就算有些公司从中赚钱也没什么。
Entropic
所以我今天要向大家宣布我和同事 Chris Dicknson 一直在努力的一项成果,那就是 JS 的公共包管理器,Entropic。
Entropic 基于 Apache 2 许可证,你们可以用它打造自己的软件包库。
Entropic 有自己的 cli,我们称之为 ds,也就是 entropy delta。
Entropic 提供了一个用于发布和安装包的全新 API,可以大大减少相关任务所需的网络流量。基本的安装单元是单个文件,而非 tarball。
Entropic 是联盟制的。你可以依赖来自其他任何 Entropic 实例的包,并且你的主实例将为你镜像所有依赖项,使你自给自足。
Entropic 将镜像你从旧版包管理器安装的所有软件包。
需求清单很短,我们已经全部 docker 完毕。
你可以使用 GitHub 帐户登录,任何 oauth provider 均可接入。
该项目只开发了一个月而已,还没准备好公开,但已经自托管了。
项目还会加入更多功能,准备做的事情很多。
Entropic 的宗旨是什么?
首先,我想向大家证明我们也是可以做些什么事情的。我们群众有力量,要乐观,要主动,力量就在我们大家手中。
其次,我和 Chris 等人深刻理解包管理库需要解决的问题,尤其是大规模库的技术。我们的社区现在需要这种专业知识,我们希望向大家分享。
第三,我认为中心化的潮流已经接近尾声,我想帮助大家走向新的未来。过去十年一直是中心化和单体服务唱主角,但未来十年将是联盟合作的舞台。联盟制能够分摊成本,扩大人们的控制权;它将分散政策的主导权,并将我们语言生态系统的控制权交还给广大开发者。
我希望 Entropic 能帮助我们拿回公共资源的所有权,不再被风投资本家挟持。Entropic 是我们重新掌控我们语言的运动。
关于 Entropic 还有很多话要说,有很多工作要做,但现在是与大家分享的时候了。
如果我们意识到 npm 并不爱我们,也已经意识到私人公司不应该控制公共资源,那么是时候用脚投票了。我相信 node 社区是由有才能的好人和建立惊人事物的兴趣组成的,不应该由一家公司来定义,我们不应该让他们控制我们的命运,让 Web 的未来危在旦夕。我们需要收回控制权,为此我们需要一起完成 Entropic 的构建。
请与我们一起踏上这条征途。
原文链接:https://github.com/ceejbot/economics-of-package-management/blob/master/essay.md
评论 1 条评论