JavaScript 很糟糕吗?
虽然 JavaScript 是目前最流行的技术,但它确实也是一种设计糟糕的语言。这就是现实。只有承认现实,我们才能开始解决这个问题。
根据 Stack Overflow 2018 年的调查,JS 是当前最流行的一项技术。我们这里有一个宝贵视频。JavaScript 的作者说,JS 的现状如同BASIC 之于C++ 一样。本文不是关于JS 的技术特性的,而是关于我们的多元无知如何使玩具语言先成为事实上的浏览器语言,然后延伸到服务端,现在被用于控制台仿真和数据科学。
正如标题所示,我认为JS 的流行是一件糟糕的事情。首先,JS 是一种非常糟糕的语言。 Wat 谈话做了大量工作来解释具体问题。各位可以参考以下优质资源来了解更多详情。当你读完所有资料,就会发现所有这些糟糕设计都明显源于 JavaScript 的历史。
Why is JavaScript so hated?
The Top 10 Things Wrong with JavaScript
JAVASCRIPT:THE REAL BAD PARTS
“WHY DOES JAVASCRIPT SUCK?”
为了保护 JavaScript 的想法不被竞争提案打败,该公司需要一个原型。1995 年 5 月,Eich 在 10 天内写了这样一个原型。
这就是问题所在,这就是为什么我们不能拥有美好事物的原因。当然,我并不认为这个原型没有被重写过上百遍,我指的是这个方法,即现有实践并不重要,“快速实现,打破常规”。普通的编程语言都有着多年的设计历史记录,通常 10 年左右。wiki 上的历史副标题实际上都措辞相同,只是名称和日期不同而已。设计一种语言需要受过良好教育的专家进行大量规划和决策过程。JS 的最初设计以及它的后续迭代都是由商业决策驱动的,为了占领浏览器市场。
这有点儿像作秀。
问题是,现在最流行的编程语言不能正确执行基本的代数运算,而许多人对此习以为常。受欢迎程度被错误地认为是正常的。很多新加入这个行业的人认为这没关系,很正常。
这有些直接后果。
连 Is-even 软件包都有依赖关系和怪异的发布历史!一般项目的 node_modules 都有成千上万的依赖。
让我们来稍微谈谈 Axios 。
Axios 是一个 HTTP 请求库。截至目前,Axios 在 GitHub 上拥有 5007 个 fork 和 61,660 个 star。仅在 GitHub 上就有差不多 150 万个项目在使用它。
假设你想发起一个请求,而如果请求失败,打印用于诊断的错误日志。那么,下面是开发者为你提供的官方样本:
axios.get('/user/12345')
.catch(function (error) {
if (error.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else if (error.request) {
// The request was made but no response was received
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
// http.ClientRequest in node.js
console.log(error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
console.log(error.config);
});
我直到今天都不能相信自己的眼睛。如果我曾在第三世界的无名大学提交过像这样的课程作业,我会得到巨大的羞辱。现在是 2019 年,显然设计模式和干净的代码仍是必备知识。
自从 2017 年,这个 bug 就已经打开并被标记为一个众所周知的 bug。显然,编写嵌套的 if 花费了 3 年。我将在其他语言最流行的 HTTP 请求库中发现同样糟糕的打开了 3 年的 bug。祝你好运。撇开 Axios 的话题,让我们继续聊吧。
灾难就在这里。搞砸map 函数对于语言设计者来说就像获得奥林匹克金牌一样。奇怪的是,人们说“JS 是奇怪的”反而是少数,有相当多的人说他们从这篇文章中学到了一些东西。老实说,我不知道他们指的是什么。检查一种语言中的每个函数是否与其它30 多种主流编程语言是否一致?坦率地说,.map(f) 与.map(x => f(x)) 有什么确切的不同,是有用的知识吗?这都是“黑魔法”,不是预期的行为。
在极简主义中,作为一个维护者轻而易举。但对于JS 世界来说,并非如此。无论是否有意义,新版本总是层出不穷。3 年前的版本从零开始重建并不比升级容易。我使用过的任何JS 项目都至少会有几个警告说它的 Babel 版本将会过时,很快会被弃用。Babel 有一个捐赠页面,上面写着他们的年度预算是308,084 美元。作为一个社区,我认为这可以让开发者知道什么是向后兼容性并尊重它的用户群体。
OpenCollective 是一个很有趣的浏览工具,但是太令人郁闷了。这个页面显示,Webpack 的年度预算是惊人的一百万美元。那些认为将可执行代码放到配置文件或环境变量中需要重新设计的天才们,比这个称为OpenSSL 的小项目获得了10 倍还多的资金。如果OpenSSL 被破解了,你的银行、互联网供应商、云服务……都要崩溃。如果Webpack 崩了,你可以立即得到gulp、grunt、browserify 或任何其它发烧友的玩具,而且那将不过是一键式迁移。想象一下世界从OpenSSL 迁移,想象一下编写OpenSSL 的功能克隆,或者数百个现代IT 基础设施的基础项目,由没有通过任何赞助页面之类的渠道捐赠的人维护。
我听起来像是一个在互联网向志愿者索要东西的人,这是一件不道德的事情。事实上,我要表明的是,作为从业者,如果基于运行在浏览器上和支持emoji 这些优点就接受低于标准的方案,贬低了那些编写可靠的良好设计的软件的人的努力。作为兴趣项目和原型当然可以,它也就“还行”,正如PHP“还行”一样。有时,它确实好使。我要指出的问题是广泛的推理模式——JS 是如此流行,那么它一定和其它语言和生态系统一样优秀。这不符合逻辑。
JavaScript 目前是市场上最被需要的技术。其它语言没有这么多炒作,人们四处奔走,设计师设计 logo、T 恤和 3d 打印的吉祥物,通过财富 100 强公司和小额捐赠服务募集资金。所有这些,都必须有价值反馈。到目前为止,反馈的价值是负的,这让整个行业陷入低谷。JS 设计委员会在 20 年时间内似乎对于修复基本的语义不感兴趣。我不知道他们在做什么,但很明显,它们的首要任务并没有放在提升编程体验上,反而创造了一种“随用随想驱动开发”的文化,劫持了整个 JS 生态系统,也劫持了整个行业。
JavaScript 确实很流行,但也确实很糟糕。这就是现实。只有当我们承认现实,才能开始修复这个问题。
总之——JavaScript 很糟糕。
作者:ror6ax
译者:张健欣
来源:InfoQ