《Scala实用指南》译者序二
我是在开始学习Java的同时开始接触Scala的,在此之前饶有兴致地学过Scheme,也看过几章《Haskell趣学指南》,因此对Scala中的一些函数式编程的概念并不陌生。我喜欢Scheme那种简洁之美,但是很遗憾,使用Scheme构建应用程序往往缺砖少瓦,困难重重。而Haskell给人一种繁复艰深的感觉,阅读和编写Haskell代码的心智负担比较大。Scala是一门理想的语言,既满足了编程语言爱好者不灭的好奇心,又恰到好处地弥补了Java语言所缺失的简洁和表达力。得益于与Java良好的互操作,使用Scala可以站在Java庞大的生态之上,迅速构建出应用程序。
Scala的美在于精巧的内核,Scala的丑陋在于复杂的实现。作为程序员,我们不可能只品尝精巧的美而忽视复杂的丑陋。本书的长处在于克制,恰到好处地引导Java程序员进入Scala的世界,也指明了深入学习的路径。对已经熟悉Scala的程序员来说,本书也可以作为编写易读Scala代码的指南。Scala是多范式的,从实际工作的角度,我个人比较推崇编写贴近Java风格的Scala代码,并适度地利用Scala的语言特性简化代码,我认为这也是本书一以贯之的主题。
因为Java语言表现力有限,所以我们需要使用各种设计模式提高代码的抽象能力,固化编码逻辑。Scala这门语言在设计之初就借鉴了大量现存的语言特性,并吸取了许多设计模式中的精华,因此表现力非常强大。就我个人所了解的,Spark Catalyst源代码中利用逻辑计划的模式匹配做执行计划的优化,直观明了,大大降低了SQL执行计划优化器开发的门槛。很难想象,使用C或者C++,如何才能够编写出易于阅读、易于维护的等价实现。
Scala太灵活了,在学习的过程中难以避免会遇到不少艰深的小技巧,也会遇到各种陷阱。因此,一方面我们编码需要克制,另一方面我们需要加深自己对JVM上代码运行机制的理解。王宏江的博客是不可多得的学习资料,能够帮助我们拨开语言特性的迷雾,直击代码运行的本质。本书与其如出一辙,也有不少深入JVM字节码的分析,模仿这种分析方式,结合GitHub上的Scala标准库源代码,我们能够提升自己诊断问题的能力,加深对这门语言的理解。
本书诚如其名——实用。在内容的编排上,本书除了对语言本身的提炼,也同时介绍了Akka和单元测试,这对工程实践来说有极大的帮助。对还没有参与过真正工程开发的读者来说,掌握单元测试是必要的。在阅读大型开源项目的时候,从单元测试入手,可以窥得项目的设计轮廓和API完整的使用方法。越是优秀的开源项目,其单元测试越是完整、易读。在翻译本书的时候,个人还没有接触过Akka,审阅合译者翻译的本书第13章之后,我理解了Actor模型中隔离的可变性。在最近的工作中,这些知识和Akka的文档,帮助我发现了一个使用Akka的开源软件中对IO操作和Actor模型误用而导致的性能问题。
Scala官方也提供了Gitter的中文聊天室,贴代码比较方便,任何Scala相关的问题都可以在聊天室交流。我( @sadhen)和 @何品 (@hepin1989)都在聊天室中。
最后,感谢在翻译过程中挖财诸位同事在工作上的帮助,也非常感谢我的领导曹宝开明的管理风格和一贯以来对技术好奇心和驱动力的鼓励。当然,也非常感谢合作译者何品大哥,何品大哥对技术的执着和热情、在开源社区的参与度、技术深度和流畅严谨的译笔,都深深地感染着我鼓励着我。
沈达
2018年3月于杭州城西
返回闲话Scala专栏目录