写点什么

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:156130
用户头像

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

关注

评论

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

DDD 中的那些模式 — 使用 Specification 管理业务规则

Joshua

设计模式 领域驱动设计 DDD 架构模式

区块链技术大显身手,仅用20分钟就打完一场官司!

CECBC

CECBC 区块链技术 数字版权 存证

clang-format 使用与集成介绍

Geek_101627

后疫情时代,区块链的发展迎来曙光!

CECBC

CECBC 区块链技术

ARTS-1

你当像鸟飞往你的山

ARTS 打卡计划

我的编程之路 -6(新时代)

顿晓

android 编程之路 时代

5G时代下应用的安全防御研究

Nick

5G 5G网络安全 5G安全

像孩子一样认识新事物 —— 读《终身幼儿园》

YoungZY

学习 读书笔记 读书

Java日志门面系统

泛泛之辈

Java 日志 slf4j

爬虫框架Scrapy应用实践-淘宝保险频道数据抓取【2】-抓包分析

hadesxiong

Python 爬虫 保险 Scrapy

[ARTS打卡] week 01

Mau

ARTS 打卡计划

2万字长文带你细细盘点五种负载均衡策略。

why技术

Java 负载均衡 源码分析 面试 dubbo

如何设置线程池参数?美团给出了一个让面试官虎躯一震的回答。

why技术

Java 源码分析 面试 线程池

ARTS打卡第一周

GKNick

数据产品经理实战-数据门户搭建(上)

第519区

数据中台 开发数据

ARTS 打卡 WEEK2

编程之心

ARTS 打卡计划

体验一次简洁的代码

你当像鸟飞往你的山

如何做好Code Review?

架构精进之路

Code Review

ARTS-01

NIMO

ARTS 打卡计划 ARTS活动

重学 Java 设计模式:实战单例模式

小傅哥

设计模式 编程思维 重构 优化代码

那些会阻碍程序员成长的细节[2]

MavenTalker

程序员 程序人生

ARTS week 3

刘昱

Flutter开发环境配置

玉龙BB

flutter android vscode

ARTS打卡计划_第一周

叫不醒装睡的人

ARTS 打卡计划

MySQL 可重复读,差点就我背上了一个 P0 事故!

楼下小黑哥

Java MySQL

Apache DolphinScheduler新特性与Roadmap路线

代立冬

大数据 数据中台 工作流调度 海豚调度 数据湖调度

如何使用 Apache CXF 快速实现一个 WebService

Rayjun

Java WebService CXF

Mysql索引不会怎么办?6000字长文教会你

Super~琪琪

MySQL 数据库 sql 索引

深入计算机底层,从几本靠谱的书开始

HackMSF

计算机工作原理

关爱孩子的心理建设

Neco.W

人生 感悟 教育

眼中有码,心中无码

小眼睛聊技术

学习 深度思考 程序员 最佳实践 算法

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