Blog

Blog

PHODAL

编程语言的被淘汰:选错语言毁终身

在我当前所在项目里,其中的某一个子系统是用 Groovy 中的 Gradle 插件。Groovy 作为一个运行在 JVM 上的脚本语言,天生具有胶水的特性。加之,它支持 DSL 与其程式的简洁语法。嗯,如果不考虑性能问题,这真的是不一个不错的语言。

可真的是如此吗?

开始之前,我再次 FBI warning 一下:

  1. 关于编程语言的讨论,并非能真实,都存在或多或少的个人偏爱因素。因此,文中的某些观点或许会有些偏颇。若是不正确又或者是出入较大,也希望大家能指正。
  2. 这里的场景主要是基于团队协作的场景之下讨论的,而非个人项目,又或者是小项目。也就是说,只有团队协作时,才会出现的问题,才会出现各种讨论。
  3. 说起这一点我也是有个人偏好,如业余开发选各种语言,而真正做项目的时候,选的语言便是 Java;业余开发用 React、Stencil.js,在公司做项目的时候,还是 Angular 大法好。

引子 1 :编程语言的读与写

我们都知道,编程语言是写给人看的代码,写机器运行的机器码。所以呢,对于编程语言而言,我们会有一个简单的判别标准,即它的读与写。从使用体验上呢,我们可以分为:易读易写,易读难写,易写难读,难写难读,这么四类的语言。

为了贴合文章的主题,我大概对我在项目上用过的 JVM 语言做了一个分类。(PS:真实情况下,差异没有这么大。)与此同时,由于每个语言的使用场景不一样,我们并不考虑诸如于性能等问题。

难度 易写 难写
易读 Java Groovy
难读 Kotlin Scala

简单说明一下 (笑,我们并不讨论他们的优点。例子中的 Kotlin 不太适合,只是我暂时没有在项目上用过其它 JVM 语言,也许 JRuby 就不好读了):

Java 语言嘛,大家都懂,又好读又好写,所以 Java 程序员便宜。

Groovy (Gradle 所采用的 DSL 语言)难写的地方在于,文档少、语法糖导致IDE 支持差(相对而言)。事实上,它也不是那么好懂,在 IDE 支持的情况下,要用碳基脑做个类型推断。

Kotlin,如果已经熟悉 Java 或者其它语言的话,写 Kotlin 并不是一件难事。这件事情难就难在阅读别人的 Kotlin 代码,可能会有点费劲,除非你有良好的 IDE 支持——它的亲爸爸可能是 Jetbrains。离开了 IDEA,找个扩展(extension)都得找半天。所以难度总体上还是不难的,只是相对难读一点——因为语法糖。

Scala,早期的某个项目,我几个月后看不懂几个月前写的代码。

而如上所说,对于语言每个人是有偏好的。所以,这里依旧是我的一些个人观点。 我也并非这方面的专家,只是从个人阅读开源代码和编写相关代码的感受来说的。

引子 2: 适用领域与流行应用

谈及编程语言,我们要讨论的是另外的另一特质:适用领域。如我们熟悉的:

  • Golang 背靠云原生和 Google
  • Python 是科学家们的偏好,毕竟不是以代码为生。
  • JavaScript 是交互方式发生了变化
  • Ruby 是 Rails 框架,所以流行开了。
  • Java 用于企业编程,因为程序员便宜

而诸如 Rust 这样的小类语言,还没有正式有一个能发扬光大的场景。

引子 3 :编程的快乐,先写得爽

有一些语言能让你拾起编程的快乐,比如 Ruby,但是也能让你不想去维护代码——让人又爱又恨的 Method Missing,可以让你搞起元编程。也能分分钟让你看不懂别人写的代码。如果没有文档的话,那么我觉得你不会再看了。

又比如说,操作符重载也是一个让人写的代码更加直观。嗯,再重载一下赋值操作符,是不是非常爽。

对于快乐来说,维护性那是以后要考虑的问题。

编程语言的被淘汰

在项目上经历了惨痛的 Groovy 开发大型项目的经验后,我和我的同事们一致觉得这是一门可能被淘汰的语言。主要原因有这么几个:

  1. 可维护性丢失
  2. 缺失更好的 IDE 支持(相比于 Java 之类的)。说白了就是开发人员写起来不爽。
  3. 在最广泛的场景之下,可迁移语言出现(如 Kotlin Script)

如果你还想把编程语言的一些缺点考虑一下,那也是可以的。

可维护性丢失

这也并非是语言本身的问题,而是语言应对大型项目时,将会遇到的一个挑战。对于大型项目而言,自由灵活的语法糖会带来大量的问题。而随着项目的进一步扩大,保持同一套代码风格容易,而要使用同一套语法越来越困难。如同样是声明类型,有的用具体的类型,有的则是用 def 或者是 var

缺失更好的 IDE 支持

嗯,如果你习惯了用 IDEA 对 Java 代码进行快速的重构之后。而与此同时,你并不能使用相似的方式来对你的 Groovy 代码进行重构。你们就会慢慢陷入了一个循环,既然有一个更好的语言,为什么我们不去使用它们呢。

退而求其次的,为了使用 IDEA 的高级功能,如重构。我们开始将代码中的 def 转换为具体的类型。

可迁移的语言出现

而其实上面两个问题,并不是这个语言的主要问题。毕竟,对于小的项目来说,IDE 和可维护性支持都不是问题。

过去,我们根据 Gradle 官方文档,使用 Groovy 来编写 Gradle 插件。而有一天,Gradle 官方文档同时提供了 Kotlin Script 的支持。

这就相当于是,上帝真的抛了个橄榄枝给你。你可以同时拥有更好的 IDE 支持,更好的可维护性。同时,还可以快速地迁移过去。为什么不呢?

其它

与之相似的一个例子便是 JavaScript 和 TypeScript,但是浏览器运行的是 JavaScript。所以,JavaScript 并不能这么容易被取代。

结论

有没有可能出现一个兼容所有语言的语言?


或许您还需要下面的文章:

关于我

Github: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806
comment

Feeds

RSS / Atom

最近文章

关于作者

Phodal Huang

Engineer, Consultant, Writer, Designer

ThoughtWorks 技术专家

工程师 / 咨询师 / 作家 / 设计学徒

开源深度爱好者

出版有《前端架构:从入门到微前端》、《自己动手设计物联网》、《全栈应用开发:精益实践》

联系我: h@phodal.com

微信公众号: 最新技术分享

标签