BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Coursera为什么喜欢Scala

| 作者 孙镜涛 关注 2 他的粉丝 发布于 2014年3月18日. 估计阅读时间: 10 分钟 | 都知道硅谷人工智能做的好,你知道 硅谷的运维技术 也值得参考吗?QCon上海带你探索其中的奥义

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这样健康的开发者社区的价值。随着我们加入到ScalaPlay社区,我们的团队已经发现了很多这样的优点。”

对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开发人员都是在公司学习的ScalaScala是一门复杂的语言,它需要时间学习。不可能一个通宵就可以学会ScalaCoursera的学生和雇员都可以参加我们的深度价值学习和教育。我们喜欢互相教导新的概念,同时扩宽自己的知识面。我们之所以选择Scala一是因为它本质上是一门富有成效的、健壮的编程语言,二是因为它还教会了我们新的编程范式。因此我们通过学习Scala投资于我们的代码库和团队。事实上,Coursera公司的许多工程师都是通过参加我们平台上的函数式编程响应式编程课程一起学习的Scala。”


感谢包研对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

深度内容

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT