回想起第一次接触 Scala,最早要追溯到 2013 年,一晃眼已是十年的时间。这十年间发生了很多事情,有不少用 Scala 写的项目火了,也有很多新编程语言火了,就连 Java 这棵老树也发了新芽,更新了十几个版本。

不过有一说一,Scala 这门语言还是相当小众的,市场上除了 Spark 也基本没有 Scala 的需求。作为为数不多一直在跟 Scala 打交道的人,对这门语言还是很有发言权的。今天太可研究所(techinstitute)想和大家分享一个观点:我为什么不看好 Scala 的未来。

Vol.1

Scala 诞生在 2005 年,相比于 Java 诞生的 1995 年,也就年轻了 10 岁,比起更年轻的后辈 Golang、Rust 那也算是叔叔辈了。Scala 的设计深受 Haskell 的影响,把函数作为了一等公民设计,而函数式在并发编程领域有巨大的优势,随着多核、并发编程成为主流,函数式编程已经成了新兴语言的标配。

我刚开始接触 Scala 也是因为工作原因。2013 年的时候,用 Scala 写的影响力最大的项目 Spark,还属于新兴的技术,主流还在使用 MapReduce。有趣的是,我和 Scala 打交道并不是因为 Spark,而是前司那个喜欢选非主流技术的架构师选择了 Scala 技术栈。

现在回想起来,选 Scala 技术栈的确是有一些好处:

  • Scala 是基于 JVM 的语言,可以充分享受到 Java 繁荣的生态;
  • 使用 Scala 写的 Akka Framework,基于 Actor 的并发编程模型,在高并发场景下很有优势;
  • 可能没有第三个好处了

写到这儿,不难看出,Scala 的优势是把面向对象的编程生态融合了函数式编程的理念,既能用到生态的力量,又能在多核、并发场景下发挥函数式的优势。尤其是 Akka Framework,虽然它本身名声不显,但早年的 Spark、后来的 Flink 都是基于 Akka 开发的,其威力可见一般。而 Akka 选择的 Actor 并发编程模型,在 AI 领域声名显赫的 Ray 同样也是基于 Actor,说明在路线上也没问题。

那么,这么好的语言,为什么现在除了大数据生态,几乎没人用呢?

Vol.2

首先是写业务无比失败。

我最开始用 Scala 写业务时就无比难受。但是作为一个刚毕业没多久的小伙子,对很多事情是没有判断力的,那个时候甚至会反思,是不是自己没有理解 Scala 背后优秀的设计才觉得难。所以,当时查了相当多的资料,去学习 Scala 的函数式、柯力化、模式匹配、高阶函数、函子等概念。

直到后来又招聘了不少新同学接手项目,他们同样觉得很难,才回过头来思考是不是这个技术栈有问题。再后来,接触了 Java 的 Spring Boot、Python 的 Flask、Go 的 gin,同时又接触了很多做业务开发的同学之后,才深刻理解到:一门语言、一套技术栈如果要让开发者用得好,并不是要有多好的设计理念,而是要做好开发者体验,这其中包括以下几点:

  • 语言低门槛。这恰恰是 Scala 的天然劣势,无论是函数式、隐式转换、复杂的类型系统、宏、运算符重载这些特性还是 Actor 并发编程都是让人望而却步的东西。
  • 工具链友好。Scala 兼容 JVM 的工具链,但是 java 生态的工具链只能说是丰富谈不上好用,而 Scala 也有自己的构建工具叫 sbt,属于“甲之蜜糖,乙之砒霜”,甚至会有人直接高呼“ sb tool”。
  • 生态丰富。Scala 虽然可以依托 Java 的生态,看上去很丰富,但绝大部分 Java 包和 Scala 的风格都是不搭的, Java 库的作者也不会去考虑 Scala 用户的感受。同时,由于 Scala 设计 Option、Function 的时候 Java 8 还没出来,等 Java8 出现之后这些类型又和 Java 原生的 Optional、Function 不兼容,一起使用无比别扭。还值得一提的是,Scala 的 Collection 和 Java Collection 也不是一套类型,这使得很多使用标准 Java Collection 接口的库都无法直接用。
  • 轻量级的使用。用过 Go 和 Python 的同学们,应该都有体会,编译及运行一个简单的程序是多么容易的事情。Scala 则相反,需要依赖 jvm、scala-library、scala-reflect、scala-runtime、scala-compiler 等几十 M 的 jar 包,要写稍微复杂一点的程序,下载几十个依赖是最基本的配置,这样一来就没法像 Go 或 Python 直接一个命令启动,肯定需要 Maven 或 sbt 管理复杂无比的工程。
  • 强大的商业公司或社区支持。Go 就非常适合写高并发的后端,Python 非常适合 AI 领域,同时他俩在其他方向干得也不差。而对 Scala 而言,貌似 Java能 做的场景它也可以,但几乎没有强有力的公司在背后进行支持,社区里倒是有些大佬把它移植到 Android、Native、Web 开发等领域,demo 看起来酷炫无比,但稍微复杂的场景需要其他库配合的时候就难受了。

这些缺点远比 Scala 带来的优势难受,所以一直是一门三梯队的语言,进一步导致了市面上能写好 Scala 的人很少。这又强化了公司在技术选型时不太会考虑 Scala,进一步减少了对 Scala 程序员的需求。估计最初 Scala 社区也没有成为一梯队语言的想法,而后来大数据的异军突起让 Scala 看到了一丝曙光。

Vol.3

缘分这种东西说起来真是妙不可言,我写了几年业务代码之后换到大数据赛道,竟然又碰到了 Scala 这个老朋友。

像 C++、Python、Java 这些一梯队语言都有很多世界级影响力的产品、公司在使用,使用 Scala 开发的产品数来数去也就 Spark、Flink、Kafka、Akka 比较有影响力,而这几个产品好巧不巧都是大数据领域的基础软件。

我最早接触了几位用 Scala 开发 Spark 任务的 Data Engineer,作为专门研究过如何优雅地写 Scala 的程序员,他们的代码只能用不堪入目来形容。举个至今记忆犹新的例子:Spark rdd 的 map 函数返回值强行用逗号拼接成 String,下一个算子再把输入的 String 按照逗号 split 开再写后续逻辑。

说实话,看到这段代码的时候我是有点震惊的,问他们为什么这么写,回答的大意是他们也不知道是为什么,只知道换种写法就报错了。现在想来 Spark 大力推广 Dataset、SQL、Python 接口真是造福社会,市面上大部分人确实弄不懂 Scala 那些花活,降低使用者的心智负担真的是一个好产品的核心竞争力。

后来,我主要的经历在计算引擎这个领域,和 Spark 打交道很多,早年间痛苦的 Scala、Akka 学习经历确实能帮我快速弄懂 Spark 的各种黑科技。说回周围人的 Scala 水平,只能说略高于 Data Engineer,大部分人还是把 Scala 当 Java 写,不过好在当时 Java8 已经普及,程序员们已经有些函数式编程的习惯了,所以同学们写的 Scala 代码勉强还能入眼。

Scala 在大数据领域有这么大的影响力,和自身的优势密不可分,但更多的是时势造英雄。首先受 Hadoop 影响,大数据领域的产品绝大部分都是Java 开发的,选择基于 JVM 的语言成为了一种必然。其次,Scala 的函数式、并发友好,同时又有 Akka 这么好的库,因此 Spark 选择 Scala 是一件顺理成章的事情。Spark 早期使用了 Akka 作为底层的并发、网络框架,虽然后来由于种种原因去掉了,但代码里依旧有不少 Akka 的影子。至于 Kafka 则是因为 LinkedIn 的主流开发语言是 Scala,开发 Kafka 使用 Scala 也挺合理。

伴随着 Spark、Flink、Kafka 等项目的火热,Scala 在大数据领域有着举足轻重的地位,但也不是没有危机。这几年随着数据库玩家纷纷进入大数据领域,以及 JVM 生态在性能、资源利用率和 GC 方面的劣势,C++ 和 Rust 成为了这个方向的宠儿,执行引擎方面 Databricks 没有开源的 Photon,开源领域的 Arrow,以及流式计算的 RedPanda、 RisingWave 都在冲击着上一代的技术,老牌技术的生态优势短时间内还在,但中年危机已经慢慢袭来。

Vol.4

两个月前,我闲来无事,又翻了翻 Scala 的文档,惊奇地发现 Scala3 都发布到 3.3 了。但不得不说,Scala3 的语法变化可真大,这也让我对 Scala 的未来充满担忧。Python 2 升 3 的例子还历历在目,Scala 这种激进的修改语法的行为,无疑会让本不健壮的社区进一步分裂,扛把子项目 Spark 默认的 Scala 版本还是 2.12,远没有要升级到 Scala3 的意思,而新兴的项目在有了很现代的 Java17、Rust、Go、C++20 等选择之后为什么还要选 Scala 呢?而翻一翻 GitHub 的 Scala Trending 榜单,还是 Spark、Kafka、Play Framework 这些老家伙,新面孔大部分也是围绕 Spark 生态的产品。

Scala 的诞生背景是一个学术项目,这也让它的发展带着浓浓的学术风,对于一线开发者的痛点没那么在意。凑巧在大数据刚火的那几年 Java8 还没普及,Scala 弥补了生态的空缺,占得了一时的先机。随着大数据生态一点点地被数据库蚕食,Scala 3 社区又在分裂,未来它的走向一定充满坎坷。总结起来,我非常不看好 Scala 的未来,刚入行的朋友如果做 Data Engineer 或要维护 Spark 确实可以学一下 Scala,如果想学喜欢搞花活的语言,还是去学 Rust 吧,至少出路多一些,社区也更活跃。


太可研究所
1 声望1 粉丝

热爱与科技有关的一切。