阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

JavaScript 很糟糕吗?

  • 2019-11-14
  • 本文字数:2610 字

    阅读完需:约 9 分钟

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 很糟糕。


原文链接:


https://ror6ax.wordpress.com/2019/08/27/javascript-is-bad/


2019-11-14 16:462387

评论 6 条评论

发布
用户头像
map 函数任何文档都会介绍,handle 函数有三个参数;没有认真看文档,想当然着用,还说是所谓的「不是预期的行为」,预期行为就是想当然了么
2019-11-15 11:33
回复
作者是拿自己无知来秀优越感,真可悲
2019-11-15 13:29
回复
用户头像
这篇文章就像一个泼妇在骂自己的老公,实际上长话连篇在诉说故事,但没在说到底问题出在哪里
2019-11-15 10:58
回复
造成axios这么鬼不合逻辑的元凶是浏览器的api,这个换什么语言来写都一样,而浏览器提供的api是所谓高大上的c++来实现的。你不去怪api设计不合理,来说js是个设计糟糕的语言?怕是没有一丝说服力
2019-11-15 11:01
回复
再说npm外部模块多的问题,难道java外部模块就不多?模块多不多本身取决于业务的复杂程度和代码设计的合理程度。这一点你怪语言本身,合理吗?
2019-11-15 11:06
回复
用户头像
一万点同意
2019-11-14 19:53
回复
没有更多了
发现更多内容

Redis应用之缓存实现,java异步编程实战pdf

Java 程序员 后端

Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案

Java 程序员 后端

Spring Boot 2(1),蛙课网java教程资源库

Java 程序员 后端

Spring Cloud Stream 编程模型的基础知识,很多老司机都不知道

Java 程序员 后端

Spring Boot Redis 实现分布式锁,真香,kalilinux入侵教程

Java 程序员 后端

Spring Boot 实战(11)整合MyBatis-Plus,mysql原理相关文章

Java 程序员 后端

【Flutter 专题】13 图解最基础的 http 请求方式

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 11月日更

Shiro等权限管理框架本质很简单,一个注解+拦截器就可实现

Java 程序员 后端

spring boot 整合Swagger2 构建API文档,linux学习路线图

Java 程序员 后端

Redis源码剖析——客户端和服务器,springboot入门程序

Java 后端

RocketMQ ACL版本升级过程中的曲折经历(大厂线上环境大规模MQ升级开启ACL实战)

Java 程序员 后端

002|CocoaPods 优化知多少?

棒棒彬👻

CocoaPods 认知偏差 工程能力 开源软件

RPC框架编写实践——服务治理的基石,这位阿里P7大牛分析总结的属实到位

Java 程序员 后端

linux 环境安装Flutter

坚果

flutter 安装 11月日更

Spring Boot 谷粒学院、谷粒商城项目问题汇总,tomcat面试题

Java 程序员 后端

spring boot增删改查,javassm框架面试重点

Java 程序员 后端

Spring Boot核心技术之Rest映射以及源码的分析,java从入门到放弃

Java 程序员 后端

Spring cloud stream【入门介绍】,java开发实例大全云盘

Java 程序员 后端

RPC服务和HTTP服务对比,java基础实验报告总结

Java 程序员 后端

shiro(三)shiro实战,java面试题项目中的难点

Java 程序员 后端

spring boot 使用Spring Cache集成Redis,java编程基础实验报告小结

Java 程序员 后端

Rpc与RMI服务,java面试笔试题代码

Java 程序员 后端

Seata 新特性,APM 支持 SkyWalking,java流式编程原理

Java 程序员 后端

Spring AOP 源码分析——创建代理对象,绝对干货

Java 程序员 后端

Spring Cloud Gateway限流实战,万字详解微服务的哨兵机制

Java 程序员 后端

redis数据迁移之redis-shake,java高级技术经理面试题

Java 程序员 后端

Redis的各种用途以及使用场景,mybatis技术原理

Java 程序员 后端

Sentienl 动态数据源架构设计理念与改造实践,阿里P8大牛手把手教你

Java 程序员 后端

Sentinel:万字详解微服务的哨兵机制,我跪了,mysql编程入门教程

Java 程序员 后端

Servlet+JSP(七,java界面开发的三层架构技术

Java 程序员 后端

Spring Boot 实战(9) springboot 整合 JPA,2021必看

Java 程序员 后端

JavaScript很糟糕吗?_编程语言_ror6ax_InfoQ精选文章