Scala的升起和下落

Scala是如何诞生?如何成功?又是如何衰退?

5年前,Scala似乎像编程语言中的下一件大事,因为它优雅地在一个面向对象范式中同时激活函数式编程,今天,Scala的人气似乎是在衰落,像LinkedIn和Yammer等公司抛弃了它。TIOBE指数(www.tiobe.com)软件语言的人气排名第一的Scala在2012是第 13名 ;现在2016年八月降到32名,属于小于6%的小众编程社区。

这里又有一个Scala不祥的征兆,lightbend是其母公司,现在发布Scala版本之前竟然首先发布一个java API版本的新框架。有趣的是,遭遇不止一个开发经理,他们都是在采取Scala一年以后不得不放弃它。

Scalal还是最好的选择吗?

首先我们从其最初为什么流行开始说起:我们必须首先了解现代编程范式的演变。首先,有过程式编程,程序被看作是一系列的语句,应该一个又一个接着执行。然后,来了面向对象编程,其中的程序被视为Actor行动者,能够知道如何执行基于对象的操作,并能够彼此相互交谈以完成任务。

相比之下,函数式编程将一个程序作为一个数学函数来看待,目地是产生一个结果值。该函数可以调用嵌套函数,而嵌套函数可以调用更多的嵌套函数。嵌套函数的计算返回产生一个结果。从那里,这个结果是被函数封闭传递的,使用嵌套的函数值来计算它自己的返回值。为了使函数可以方便地传递数据给其他函数,函数性编程语言通常使用最通用的可能途径来定义数据结构,将其定义一个集合(任何东西的集合)。

他们还允许传递函数到其他函数,似乎他们是函数的输入数据参数一样。在这个范式中的一个函数是不允许产生任何副作用,比如不能修改一个带有状态信息的全局变量,相反,它只允许接收参数,并对它们进行一些操作,以产生其返回值。

执行一个函数程序包括计算最外层的函数,这反过来又导致了所有的嵌套函数的计算,递归向下计算到最基本的函数,直至没有嵌套函数。

为什么函数式编程是一个大事情?

1.清晰:没有副作用的编程范式创建的代码更容易遵循:一个函数完全由从哪里来和到哪里去所描述。一个今天产生正确结果的函数明天还会产生正确的结果。这样创建的代码更容易调试,更容易测试,并且更容易使用。

2.简洁:在函数语言中,数据通过一个通用的集合数据类型,隐式地从一个嵌套函数传递给它的父函数。这使得函数式程序比其他范式更紧凑,其他范式需要大量的“管家”代码来实现数据从一个函数传递到下一个函数。

3.高效:由于函数没有副作用,可以重新排序或并行执行,从而优化性能。如果结果不被使用任何其他函数使用可以完全跳过。

函数式编程语言已经存在了几十年,在上世纪50年代开始在麻省理工学院的约翰·麦卡锡创造了LISP语言。这些都被视为小众语言,感兴趣的主要是学者和理论家。Scala开始也作为一个学术项目,Martin Odersky创建于2001年,然而,Scala设计者做出了几个关键的决策,成为了突破性语言,Scala将函数式编程推向主流:

1.Scala结合面向对象编程与函数式编程。作为一种多范式的语言,它可以作为一个面向对象的程序员进入函数性编程世界的桥梁。

2.在java虚拟机(JVM)中运行Scala代码。这意味着它可以很容易地部署在任何运行java的机器上(大约85%的PC机)。这也意味着Scala代码理论上可以与java代码互操作,提供一个java开发团队轻松切换到Scala的桥梁。

3.Scala的语法类似于java,像java一样在编译的时候执行类型,而不是在运行时检查,从而消除类型不兼容导致运行时出现错误的可能性。这些相似性降低java程序员最初的学习曲线。

4.Scala将Akka作为标准库,支持丰富的并发模型。作为Actor模型,这使得它很容易为程序员实现复杂的创建,处理的流媒体数据,其中每个Actor并行地处理数据。

难怪最初大家对Scala报以很高热情, 将它看作是函数式编程的主流语言。用William H. Calvin话说:“你总是可以在拓荒者的背上发现一只箭。”斯卡拉肯定是推广函数式编程的先驱。为什么潮流转向Scala,但到今天它的开发者基数不断萎缩?

1. java编程语言从java 8引入函数式编程结构。Java和Scala有细微的差别方式,虽然两者都支持函数式编程,毫无疑问的是,Scala的方法是优越的,但是java还是超越了Scala这个卓越的函数性编程语言,因为程序员已经掌握java。

2.Scala是一个很难掌握的语言 因为其原理是基于数学型理论,这只有最学术和数学头脑的程序员完全能理解。Scala的多语言功能,包括implicits隐含的和macro宏,可能会导致竟然连基本代码的程序流都失去控制,这对大多数程序员跟踪或调试代码都变得很难。一个优秀的程序员如果理解Scala一切将比java程序员的生产率更有效率,但从平均看可能会反而更低,不只是从java过渡到Scala时,由于学习曲线导致暂时下滑,还包括一些开发团队全年已经采用Scala的观察所得。

3.不像java,scala有一个灵活的语法,通常提供了许多方法来达到相同的结果。而不是让Scala对每个程序员变得更可用,Scala社区似乎花了很多时间争论这几个功能相同的解决方案哪个是正确的。

4.Scala还没有做好保持兼容性这一重要语言特性,无论是与早期版本的Scala或与java。

因为这些问题,scala将很有可能不会如java演变成一种主流的编程语言。然而,仍然有特定的使用情况下,Scala是一个理想的适合的、应该选择的编程语言:

1.大数据实现。scala的优点是非常适合于大数据的编程模型,一个任务需要将不变的集合作为输入,使用map和reduce操作转换集合,并生成一个新的结果集。大数据的工具,如Spark火花,使用Scala的优势是压倒性的,因为一个程序的Scala版本通常会比相同功能的java程序代码短5—10倍。

2.许多问题最好的解决方法是给用户规定一个特定领域的语言(DSL),他们可以用它来写脚本。假设您的用户要求一个工具,让他们能够安排和运行自动化的质量测试。由于你不能预测他们将需要运行的测试的所有组合,你需要给他们一个脚本语言,他们任何情况下可以定义这些测试的顺序和位置。Scala是唯一适合开发的DSL,多亏了一些重要特性如模板匹配、特征、句法的灵活性,和运算符重载。

总结:Scala在推广函数式编程方面扮演了催化剂关键作用,并对java函数编程设计产生强大的影响力。Scala可能永远不会成为下一个大的编程语言。但是,它会在几年左右来作为大数据编程方面的好的特定问题域编程语言。

The Rise and Fall of Scala - DZone Java

复杂的东西是不可能流行的

从 Spark,Kafka的流行度来说,Scala已经是一个相当成功的语言了。
Scala也是一个非常有表现力的语言,是高级程序员的秘密武器,当然不能太流行。