用卫报(guardian.co.uk)编辑的话说,这家报纸拥有世界上第二大的读者群,仅次于纽约时报;而它的开发团队正在逐渐从Java迁移到Scala。迁移工作是从Content
API开始的,使用这套API可以查找并聚合卫报的内容。
Guardian.co.uk网站大概有10万行代码。它用的是很典型的Java开源技术栈:Spring、Apache
Velocity、Hibernate,数据库用的是Oracle。它的Content
API和网站一样,都是用Java做的,但开发团队决定把它换成另一套基于JVM的语言──Scala。Web平台开发团队的主管Graham
Tackley在采访中说:
我们过去几年都在用Java,也一直做的挺好。不过作为一家新闻网站来看,我们需要对各种事件做出快速响应。我们现在用的Java平台可以每两周就发布一次
www.guardian.co.uk。比起很多企业级Java应用来,这已经很好了,但是跟其他网站相比,就差的没法说了。
所以我们早就开始寻找各种工具、流程、语言,希望能交付的更快一些。包括使用轻量级的Java框架,如Google
Guice;完全不一样的Java开发方式,如Play框架;也用过其他框架,如Python+Django。在尝试的过程中,我们用了一段时间
Scala,但是跟其他的实践不同,我们在尝试期间,没有用Scala写过任何产品代码。
我们迫切期望着Content
API的第一个非beta版本能够成为一个标志,它的发布将意味着这个API走进了持续演进的第一个迭代,从此以后,每当我们发现从前没有想到的有意义的功能,这套API都可以快速进化。但我们得保证API的客户端不会受到影响,所以我们需要一系列面面俱到的集成测试。我们一开始用Java来写集成测试,写了一段时间以后,决定都换成用Scala写。主要原因有三点:
- ScalaTest提供了很灵活的测试DSL。
- 我们希望写集成测试的过程充满愉悦,而不是令人厌倦。
- 只用Scala写测试,就不直接影响产品代码,我们还能忍着怒气继续用Java。
但是,用Scala写了4周测试代码以后,我们再也忍受不了只用Java来写产品代码了,于是决定把大部分代码都换成Scala。
InfoQ:
总的来说,你们是怎么做移植的呢?是一次性的把所有Java代码都用Scala重写,还是这两种语言共存了一段时间?
Content API的beta版本用的是一个私有的搜索引擎。当前版本已经换成了Apache
Solr这款很优秀的搜索平台(这儿可以看到卫报是如何使用Solr的),而且跟beta版的风格差异很大──beta版在一件事情上做的很好,它让我们看到了API不应该变成什么样子。在真正开始用Scala之前,我们决定先把API重新实现一遍,而不是重用原先的代码库。
这项工作用了三个人六周的时间,然后才开始引入Scala,这样就有了一个稍微干净点的起点。但说到要把当前的项目停上几星期用来切换到Scala,我们当时还没做好这个准备,所以还是先一点点移植现有的集成测试。当时我们用的Maven做构建,引入Scala就很简单了,maven-scala-
plugin可以构建混合Java/Scala的项目,只要按照它的说明来就行。这个插件可以允许Java和Scala代码共存,还能相互依赖。我们一个类一个类的重写,情况比我们预想的要好得多:它直接就能工作了。
在重写产品代码的时候,我们用了同样的办法:在几周的时间里,每碰到一点代码,就重写一点。到最后又用了几天来扫尾。
InfoQ: 你们用到了哪些类库/框架?
因为这门语言我们都没接触过,所以我们打算控制一下,不引入太多的新东西。我们依然用了普通的servlet,Google
Guice做依赖注入,这也是我们现在构建Java应用的方式。还用了SolrJ,这是跟Apache
Solr通信的Java客户端。用Joda-time来做时间处理,用Mockito做mock(这个类库也能跟Scala代码协同工作)。
有时候,为了保证定期交付,我们会有意保留一些我们熟悉的东西:比如它是用javax.xml.stream.XMLStreamWrite生成XML格式的端点(endpoint),而不是Scala那套很强大的XML
API。因为我们在换用Scala之前已经把这些给做完了,这些代码可以工作,容易理解,就留下了。不过生成Json格式的端点的时候,我们就换成了
Lift用的JSON库──lift-json,因为它写出来的代码比Java的JSON库要干净很多。
InfoQ: 你们用的是什么IDE?Scala对IDE的支持怎么样?
我们用的是Jetbrains IntelliJ IDEA
10。有些用的社区版,有些用的收费版。代码补全、检查调用点、类和方法跳转这些功能基本上一直都挺好用。但是它不能够很完美的识别出无效语法并且加上红色标记。查找ScalaTest的测试方法也有问题。不过比起我们之前所熟悉的环境来,这些不便之处换来的是一门强大而卓越的语言。
|