序
那是2004年的一天,我才刚开始编程的职业生涯没多久,当我坐下来,选中了这门在当时还没多少人知道的语言时,我根本无从想象,是怎样的探索和发现的旅程在等待着我。
最初,使用Scala编程给我的感受跟使用其他语言并没有特别的不同:试错、实验然后发现,误解然后受教。那时,我能获取的学习资料十分有限:没有教程,没有博客,没有能教我的熟手,当然,更没有像《Scala编程》这样的书可以参考。我有的仅仅是一门语言,各种神奇的新特性,但没有人能完全肯定怎样用是合适的。赋能的同时,也让人无所适从!
我的Java程序员背景让我对Scala有所准备,但在日常开发中使用Scala还是很不一样。我记得早期的一次印象深刻的Scala编程经历,当时我跟另一个伙伴一起用Scala做一个中等规模的项目。项目过程中我决定执行一次重构操作——我总是能不断发现新的特性和模式,这已经成了常态——然后就是好几轮的编译。每一次编译器都会向我报告错误清单和每个错误的行号,而我每次都会找到对应的代码行,看看是哪里不对,更新代码修复问题(问题通常都不会消失,而是换个地方出现)。不过每一步,编译器都能直接把我引到问题发生的地方。有时候,我会重复上述的步骤,好几天都没有一次成功的编译。不过当编译错误从100条逐步减少到10条,然后1条,然后0条——成功编译——这时我终于能够跑一跑这个经过大力重构的系统。
然而,出人意料的是,它竟然能正常工作。作为一个之前只用过Java、Perl、BASIC、PHP和JavaScript的年轻程序员,我简直无法相信这是真的。
时间来到2015年,在我组织的首届Scala World大会上,Rúnar Bjarnason在开场主题演讲中提到“约束即解放,自由有束缚”。在这一点上,没有什么比Scala编译过程更有说服力:当程序员知道scalac会执行一整套约束检查,其目的是让我们免于经历运行时错误——最糟糕的一种错误——的痛苦时,会获得解放。这会让程序员在哪怕没有完整的测试套件时,也能充满信心去实验和探索,开启大刀阔斧的改造。
在过去的这些年,我不断地学习Scala,直到今天还能发现新的可能性、细微差异和不同特性之间有趣的交集。我不知道还有什么其他语言能像Scala这样经过多年还持续让人陶醉其中。
Scala即将迎来一次巨变。Scala的下一个主要版本,Scala 3,其更新幅度将不亚于我15年前从Java升级到Scala。日常的Scala编程体验大部分还会继续保留,但新的语言特性将交叉融合,并深远地影响Scala的方方面面。在本书付印之时,离Scala 3被大面积采纳还有几年的时间,Scala 2在可预见的未来仍是Scala事实上的标准版本。
本书所涵盖的Scala 2最新版本,2.13,在标准库中引入了全新的集合类库,吸取了大量来自实战的经验教训,以简化为目标做了重新设计,而上一次这种规模的重构要追溯到Scala 2.8。新的集合将支持交叉编译到Scala 2和Scala 3,使用新集合类库的代码将无疑为下一个十年打好基础。当所有人对下一个版本的Scala都充满期待时,不失为入手《Scala编程》开始学习的良好契机!
Jon Pretty
2019年9月12日
波兰 克拉科夫