写点什么

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

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

关注

评论

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

ACK One x OpenKruiseGame 全球游戏服多地域一致性交付最佳实践

阿里巴巴云原生

阿里云 开源 容器 云原生

IT外包:打通企业和IT技术人才之间的障碍

Ogcloud

IT外包 IT外包公司 IT外包服务 IT外包企业 IT外包服务商

Acrobat Pro DC 2023 for mac激活版:强大的PDF编辑器

iMac小白

Acrobat Pro DC 2023下载 Acrobat Pro DC 2023 激活

当「软件研发」遇上 AI 大模型

阿里云云效

阿里云 AI 云原生 通义灵码

架构实战营 - 模块六作业

满心

银行核心背后的落地工程体系丨Oracle - TiDB 数据迁移详解

PingCAP

数据库 TiDB

mysql索引条件下推 、 count(*)、count(1)、IN 、exists等

百度搜索:蓝易云

MySQL 云计算 Linux 运维 云服务器

JAVA下唯一一款搞定OLTP+OLAP的强类型查询这就是最好用的ORM相见恨晚

EquatorCoco

Java 开发语言

数据仓库 vs 数据湖 vs 湖仓一体:如何基于自身数据策略,选择最合适的数据管理方案?

tapdata

什么是数据仓库 什么是数据湖 湖仓一体是什么 数据仓库和数据湖的区别是

Rust vs Go:如何选择最适合你的编程语言

伤感汤姆布利柏

怎么给程序员定 KPI ?原则和最佳KPI

爱吃小舅的鱼

软件开发 KPI

ubuntu22.04文件管理器nautilus配置默认终端为alacritty

百度搜索:蓝易云

Linux ubuntu 运维 Alacritty Nautilus

IT外包的可扩展性及其如何推动业务增长

Ogcloud

IT外包 IT外包公司 IT外包服务 IT外包企业 IT外包服务商

东南亚淘宝代购系统,东南亚国代购网站建设

tbapi

淘宝代购系统

为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用

PingCAP

数据库 TiDB

您可知道如何通过`HTTP2`实现TCP的内网穿透???

不在线第一只蜗牛

网络协议 网络 HTTP

保姆级指南,从0到1打造你的个人开源项目

快乐非自愿限量之名

开源 项目开发

TiDB Vector 太香啦:以图搜图初体验!

PingCAP

数据库 TiDB

ON1 NoNoise AI 2024 for Mac激活版:强大的图像降噪软件

iMac小白

ON1 NoNoise AI下载 ON1 NoNoise AI破解

php解决time()时间戳超过2038年出错问题的解决方案

百度搜索:蓝易云

php 云计算 Linux 运维 Web

30 秒出服装设计稿,森马用函数计算+AIGC 整“新活”!

阿里巴巴云原生

阿里云 Serverless 云原生 函数计算

视觉语言模型详解

不在线第一只蜗牛

自然语言 语言模型

当「软件研发」遇上 AI 大模型

阿里巴巴云原生

阿里云 云原生 通义灵码

科普:基于FMU模型的TSN交换机仿真

DevOps和数字孪生

FMU模型 TSN

PPT软件Gamma平替!这款AI生成PPT工具千万别错过!

彭宏豪95

PPT 在线白板 PPT模板 办公软件 AI生成PPT

这届黑客马拉松,和效率“杠上了” | StartDT Hackathon

奇点云

黑客马拉松 数据技术 奇点云

嵌入式Linux的学习误区

梦笔生花

Linux 嵌入式 处理器

巧用 TiCDC Syncpiont 构建银行实时交易和准实时计算一体化架构

PingCAP

数据库 TiDB

Docker私有镜像仓库(Harbor)安装

百度搜索:蓝易云

Docker Linux 运维 Web Harbor

基于Gin框架的HTTP接口限速实践

百度搜索:蓝易云

Linux 运维 HTTP 云服务器 gin

深入理解Python多进程:从基础到实战

快乐非自愿限量之名

Java Python 网络

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