写点什么

Coursera 为什么喜欢 Scala

  • 2014-03-17
  • 本文字数:3099 字

    阅读完需:约 10 分钟

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 )关注我们,并与我们的编辑和其他读者朋友交流。

2014-03-17 05:156146
用户头像

发布了 321 篇内容, 共 118.9 次阅读, 收获喜欢 19 次。

关注

评论

发布
暂无评论
发现更多内容

以购物车为例探讨 Flutter 的状态管理的必要性

岛上码农

flutter ios开发 安卓开发 跨平台应用 5月月更

《对线面试官》 JavaNIO

Java3y

Java 开源 编程语言 语言 & 开发 5月月更

11月数据库排行:PostgreSQL起飞、三巨头分数持续低迷

爱好编程进阶

程序员 后端开发

14-Docker 镜像安装实践

爱好编程进阶

Java 程序员 后端开发

2021年最新版阿里、腾讯、美团300道Java初级

爱好编程进阶

程序员 后端开发

在线URL解码还原工具

入门小站

工具

【Python】题集 of ①

謓泽

5月月更

网站开发进阶(三十九)重磅推出:优良的编码风格!

No Silver Bullet

5月月更 编码风格

网站开发进阶(四十四)input type=“submit“ 和“button“的区别

No Silver Bullet

5月月更 button submit

k8s client-go源码分析 informer源码分析(2)-初始化与启动分析

良凯尔

容器 云原生 #Kubernetes# Client-go

Docker下的Spring Cloud三部曲之三:在线横向扩容

程序员欣宸

Spring Cloud java 5月月更

【刷题第2天】买卖股票的最佳时机

白日梦

5月月更

# Java基础复习(DayEight

爱好编程进阶

程序员 后端开发

java内存模型之重排序

急需上岸的小谢

5月月更

在线TSV转Excel(xls/xlsx)

入门小站

工具

【PIMF】OpenHarmony啃论文俱乐部——拼音输入法原理_从触摸事件到汉字

离北况归

OpenHarmony Openharmony啃论文俱乐部 OpenHarmony应用开发 PIMF团队

上海疫情封控期间,模拟芯片巨头变相裁员后续:补偿是不可能补偿的!

IC男奋斗史

职业规划 裁员 芯片

Nginx 和 Apache 配置 SSL 文件签名的不同

HoneyMoose

TypeScript 里的 Reference Type 和 Triple-Slash Directives

汪子熙

typescript 编程语言 angular 5月月更 directive

Intellij官方中文语言包,它来了

FunTester

linux时间格式化命令

入门小站

Linux

Python 实现设计模式之工厂模式

宇宙之一粟

Python 设计模式 工厂模式 5月月更

第八周作业

Asha

正向代理与反向代理

HoneyMoose

32岁的我裸辞了,八年 Java 老鸟,只因薪水被应届生倒挂

爱好编程进阶

Java 程序员 后端开发

用阅读和写作应对未来风险

石云升

写作 阅读 5月日更

2020年春招复盘:技术三面+HR面

爱好编程进阶

Java 程序员 后端开发

01-初识Git

爱好编程进阶

Java 程序员 后端开发

16个 Redis 常见使用场景,面试有内容聊啦

爱好编程进阶

Java 程序员 后端开发

2021年金三银四必问的1000道Java面试题及答案整理

爱好编程进阶

Java 程序员 后端开发

2022年编程语言排名,官方数据来了,让人大开眼界

爱好编程进阶

Java 程序员 后端开发

Coursera为什么喜欢Scala_Scala_孙镜涛_InfoQ精选文章