编程语言很重要

一番暴论


编程语言不仅是语法

在大学时,就一直听到一些言论

  1. 学什么编程语言不重要,重要的是理解语言背后的设计思想
  2. 学会一门编程语言后,再学其他语言就很容易了,因为语法都是通用的

今日突发奇想,想发表一番暴论,

语言很重要,重要的是生态和向后兼容

npm 依赖管理

学习一门语言不仅仅是为了写 Hello World 或解几个算法题,而是用它去创造一些软件,用软件满足一些人的需求。在今天,我们已经很难从0开始实现一个软件,大部分时候都要依赖框架,库去开发我们的软件。这就涉及到一个问题,X 语言如何管理项目的依赖?

我极度讨厌使用 npm 管理依赖( node_modules 太恶心了)。曾尝试过使用浏览器支持 JavaScript Modules 去导入依赖,但后来发现绕过 npm 很难。因为这个社区的大部分人都是使用 npm/yarn 来管理依赖的,你不使用 npm/yarn,使用其他人的库时就会遇到奇怪的问题。在社区中,你必须要顺应主流,要不然就要比其他人多花费时间。

Python 的依赖管理也同样让人头疼,Python 中有大量的库使用了 C/C++ 语言去调用其他 C/C++ 库,setup.py 中可以声明依赖的 Python 库,但无法声明依赖的 C++ 库。很多 Python 库都是推荐使用 apt/yum/brew 等系统的依赖管理工具来管理其依赖的 C++ 库,这样就增加了复杂度,且也容易让系统出问题。

向后兼容

我学过的语言中,向后兼容做的最差的就是 Python 和 NodeJS,不同版本之间差异太大,导致项目升级困难。

我任职的公司有个前端项目,每年年底时都会用到它,但每年都会重写一遍,因为重写的成本比较低,之前尝试过在原有项目的基础上改动,但光把项目运行起来就卡了好久。

Python 更不用说,2/3 的兼容性吓跑了很多人,Python 3 版本之间的兼容性也没做到完美,升级 Python 3 版本时,经常会发现某标准库的 API 出现了改动,需要改项目代码。

我遇到的向后兼容做的最好的是 Java 和 Golang,Java 自不必说,字节码都是向后兼容的,这样才保证了 JVM 生态的繁荣。Go 目前还比较年轻,历史包袱少,break changes 几乎没有,最大的黑点就是依赖管理从 GOPATH 迁移到 go module 需要做修改。曾在 twitter 上看到过某人说,自己五年前的一个 Go 项目,用新版本的 Go 编译器 build,仍然能够通过,这种特性真的太让人羡慕了。

一门语言做到向后兼容,会背负很多历史包袱,但也延长了项目的生命周期。语言设计者为了自己方便,做出 break changes。到头来工作量转移到了开发者的头上,如果项目没有用还好,要是项目还在使用的话,就需要开发者花时间去做升级。人生苦短,远离那些随意做出 break changes 的语言

2022年03月07日 / 23:03