我总是努力写零外部依赖的代码,多年以后依然可以运行。这是人类对抗熵的战争中, 我所做出的一点贡献。
– 乔·阿姆斯特朗(Joe Armstrong),Erlang 语言的发明发明者

这是看到阮一峰老师的科技爱好者周刊引用的一句话。

现在我们写的代码,引用的外部依赖越来越多了,这是个不可避免的趋势,软件越来越复杂和庞大,已经不可能从0开始搭建自己的每一行代码了,势必要站在前人的肩膀上。

几乎每一个现代语言,都拥有包管理器,让我们可以方便集成别人的代码,正因为这样,软件也越来越脆弱。

举一个最近的例子:一个 laravel 项目中,引入了钉钉的开发包,因为升级 laravel 到最新的8.0,这个包却不能用了, 提了个issue,见这里
(这个包的作者最近停止维护了,唉,近平热情开源还是很难持续的,不过这是另外一个话题。)

代码中引入的依赖越多,不确定的风险就增多了。
一是不确定引入的依赖本身是否有问题;二是引入的依赖又依赖了其他的包,一层层套娃。

在我的印象中,业界就发生过几次著名的依赖包引发的问题,比如: npm 的 left-pad 事件、rails 的 mimemagic事件,以及更著名的 Ant Design 的圣诞节彩蛋。

另一个问题依赖之间的版本互相有牵制,版本的管理也需要格外小心,包管理器通常在安装后会生成一个 lock 文件来锁定版本,以防跑不起来的情况。
关于这一点,前几年我在第一家公司时,当时用的是PHP5.3,已经非常老了,准备升级到 7.0,但是因为当时依赖的一个第三方组件还没有发布 PHP7.0 的驱动,只能搁置……

我非常羡慕那些 Unix/Linux 上各种系统工具,它们简单又可靠,可谓坚若磐石。它们大多直接调用系统接口,自然稳定的多。
而作为应用层开发者,只能期盼依赖的代码不出幺蛾子 :)