Coursera 是由斯坦福大学的计算机科学教授吴恩达和达芙妮·科勒联合创建的一个营利性的教育科技公司,其目的是与世界顶尖大学合作,在线提供免费的网络公开课程,让数以百万的学生都能够获得高质量的学术课程。最近该公司最初的 Scala 倡导者、基础设施工程师 Brennan Saeta 发表了一篇博文,解释了 Coursera 喜欢 Scala 的原因。
Brennan Saeta 表示在公司成立之后的两年中,他们的用户基数和工程师团队呈指数增长,在这个过程中他们尝试了一些语言和框架,但最后的结论是:Scala 应该是他们首选的(如果不是唯一)服务语言,从今往后所有的新服务都将使用 Play 框架用 Scala 编写。
为什么选择 Scala?
Brennan Saeta 表示他们喜欢 Scala 的原因是:它是一个类型安全的语言,在成熟的技术平台之上提供了强大的并发模型。他指出:一些斯坦福的学生最初编写代码时使用的是 PHP,而伴随着工程师数量的增长,Coursera 开始寻找新的技术平台,在这个过程中他们尝试过很多技术平台,包括 Python 和 Go,但是最终还是选择使用 Scala 和 Play 框架,因为这两者能够完美地契合他们的需求。
类型安全
Coursera 致力于支持教育领域的创新,同时提供始终如一的、卓越的用户体验。因此平台发展的非常迅速——编写的代码会被频繁的重写。他们认为重构静态类型的语言要比重构动态类型的语言更容易;而修改现有的 PHP 甚至是 Python 代码则是一个较为困难的工作,工程师通常会回避这种工作因为这样做往往会造成更多的 bug。重构 Scala 不仅是可能的,而且定期重构还能保持代码库的健康。
Coursera 的移动工程师、比特币大亨 Jacob 表示:
“归功于 __Scala__ 的类型系统,它提供了我所见过的最简单的重构体验。”
强大的并发模型
尽管 Python 和 PHP 都支持重量级的进程分支,但是它们却不支持轻量级的并发,例如真正的多线程。而随着 Coursera 的基础设施变得更加多样和复杂(例如每个请求需要与多个数据库通信),他们需要跨多个数据库和服务的聚合能力。Play 的反应式内核和异步类库(例如 WS)能够与该生态系统中的其他强大的并发框架(例如 Akka)无缝地集成。理解并使用这些可组合的框架能够让异步并发代码看起来和简单的同步代码一样,开发者能够编写可读、可维护、有效的服务,而不是让人无法理解的回调。
成熟的生态系统
Brennan Saeta 认为 JVM 生态系统比任何其他的生态系统都要成熟。而 Scala 正好构建在 JVM 和 Java 生态系统之上,利用了该平台强健的工具和类库。很多现代的“大数据”工具——例如 Hadoop 生态系统,Apache Spark 和 Cassandra——都是基于 JVM 构建的,因此他们可以使用这些生态系统基本的客户端类库。此外,与 PHP(在某种程度上甚至也包括 Python)形成鲜明对比的是,Scala 和 Play 项目仅需要在服务集群上安装一个 JVM,极大地简化了服务器的部署和管理。最后,JVM 是一个快速的、功能完善的虚拟机。从堆 Instrumentation 和强大的垃圾收集算法到即时编译器,从功能方面其他运行时都赶不上它。
ASCII 架构师、学习体验工程主管 Eleith 表示:
“作为一个前端开发人员,我深刻体会到了像 __nodejs__ 这样健康的开发者社区的价值。随着我们加入到 __Scala__ 和 __Play__ 社区,我们的团队已经发现了很多这样的优点。”
对 Scala 的担忧
没有一个平台、框架或者语言是完美的。Brennan Saeta 表示他们在开始使用 Scala 之前也有很多担忧,但是幸运的是经过证明只有几个担忧对开发人员而言是严重的问题。
编译时间
Scala 的编译器非常复杂——它运行的阶段超过 25 个——公认的编译很慢。对于这一点 Brennan Saeta 表示:
_“幸运的是,编译时间对我们而言一直都不是一个重要的问题,因为 __SBT__ 的增量编译器能够有效地工作。虽然 __Scala__ 的代码量比 __PHP__ 或者 __Python__ 要多,但是编译通常也就需要几秒钟。_SBT__ 的增量编译连同 __Play__ 的热加载能够让开发人员维持快速的编辑—刷新节奏。尽管随着代码库的增长这依然是一个问题,但是到目前为止还没有发生由于编译时间太长导致我们需要慢下来这种严重的问题。”
Coursera 的基础设施工程师 Frank 表示:
“我个人认为编译和重新加载时间还是相当可以接受的,虽然并不像 __PHP__ 编辑—测试循环那样紧凑,但是与 __Scala__ 给予的类型检查和其他优点相比,这还是可以接受的。”
Coursera 的基础设施主管 Nick 则表示:
_“是的,_scalac__ 是很慢。另一方面,动态语言需要你不停地重新运行或者测试代码,直到找到所有的类型错误、语法错误和 __null__ 解引用为止。当 __scalac__ 为我做这些工作的时候我宁愿喝一杯咖啡。”
晦涩的语法
找到看起来像行噪音的 Scala 示例并不难。更糟的是,有一些类库会滥用 Scala 的能力定义任意的符号操作符,这会让没有经验的人难以理解 Scala 代码。但是尽管 Scala 拥有灵活的语法,它依然是一个相当常规的语言,与其他语言相比它的特殊情况或者陷阱少的多。事实上,如果你熟悉规则,Scala 将会比那些有少量高级功能的语言更容易理解。最后,操作符重载并不是对语言本身的批评。在很多情况下,操作符实际上能让代码更可读。例如,a + b 比 a.plus(b) 更易读。
高级功能
Scala 是一门深奥的、强大的语言,它有很多高级功能,例如宏、隐含类型和存在类型。Brennan Saeta 表示:
_“我们担心的是,开发人员会使用高级功能编写一些甚至连自己都无法理解的复杂代码。在代码中使用高级功能的时候我们会非常小心。例如,在编写服务业务逻辑的时候我们并没有定义新的隐含类型或者宏。但即便如此,我们确实在重要的类库和框架中利用了这些强大的功能。没有它们,_Scala__ 可能没那么有用,我们将不得不求助于代码生成或者忍受大量的样板文件。”
Coursera 的产品工程师 Josh 表示:
_“使用任何语言都可以写出可读性差的代码。_Scala__ 的简练和强大的语言特性能让我们的开发人员编写干净简单的代码;风格指南和同行的代码审查能够确保其他人也能读懂这段代码。”
Scala IDE
编译型语言的开发工作可以通过支持工具分担,其中最重要的工具就是 IDE。这一点 Scala 与 Java 相比非常不足。尽管 Scala IDE 也在持续地改进,但是许多功能依然缺失,例如“类型层次”和“调用层次”;其他的功能也有问题,例如“移动”。Brennan Saeta 表示他们期望随着时间的发展这些空白能够被弥补,但是就目前而言 Scala IDE 依然是该生态系统的一个弱点,幸运的是 Coursera 的工程师正在通过解决一些 bug 为该生态系统做贡献。
Coursera 的基础设施工程师 Daniel 表示:
“与 __Java__ 相比 __Scala IDE__ 落后了几英里,但是人们正在积极地改进它,实际上到目前为止我已经解决了 __2__ 个问题。”
学习 Scala
与 Python、Java 和 Ruby 社区相比 Scala 社区的规模还比较小。Brennan Saeta 表示:
“可以雇佣的 __Scala__ 程序员很少,这意味着 __Coursera__ 公司几乎所有的 __Scala__ 开发人员都是在公司学习的 __Scala_。Scala__ 是一门复杂的语言,它需要时间学习。不可能一个通宵就可以学会 __Scala,_Coursera__ 的学生和雇员都可以参加我们的深度价值学习和教育。我们喜欢互相教导新的概念,同时扩宽自己的知识面。我们之所以选择 __Scala__ 一是因为它本质上是一门富有成效的、健壮的编程语言,二是因为它还教会了我们新的编程范式。因此我们通过学习 __Scala__ 投资于我们的代码库和团队。事实上,Coursera__ 公司的许多工程师都是通过参加我们平台上的函数式编程和响应式编程课程一起学习的 __Scala。”
感谢包研对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论