编程世界就好比江湖,各种技术与思想有如各种内外家功夫在历史的舞台上纷呈登场,各领风骚。如今,自C、C++传承而来的以Java为代表的命令式语言一派可谓如日中天、门徒万千。多年来,这几门语言一直占据着TIOBE编程语言排行榜前几名,而很多“没落”的语言却在最近这几十年里逐渐淡出了人们的视线。在命令式语言中,随着面向对象编程的流行而兴起的对设计模式的探讨始终是OO程序员群体中的热门话题,设计模式的相关问题也一度成为面试官遴选候选者的硬性指标。
然而,江湖上逐渐出现了一种说法,“有些设计模式事实上是用来弥补语言本身不足的”,也就是说有人认为:大部分设计模式或许并没有存在的必要,只要将设计模式融入语言设计之中,使语言拥有足够的表现力,那么很多模式将不再需要或可以得到极大的简化。或许你对这一说法还将信将疑,不置可否。但一个“没落贵族”已经再现在你的面前,它就是函数式编程语言。
函数式编程语言曾一度在江湖上销声匿迹,或许大部分人只在象牙塔中领略过它们的风采。它的“没落”并不是没有原因的,比如早期人们对它在性能表现上的质疑等。然而,凭借着大数据时代的东风,拥有着函数式血统的继承者们再次站上了浪潮之巅,并在江湖上留下了它们的足迹。
Google的论文MapReduce: Simplified Data Processing on Large Clusters表明,MapReduce编程模型的抽象是受到了Lisp等函数式语言中的map和reduce原语的启发而设计出来的。
分布式实时计算系统Storm的核心代码是采用Clojure编写的,而当《程序员》杂志问及Storm创始人Nathan Marz为何会选择Clojure时,Nathan回答道:“Clojure是我迄今用过的最好的语言。它允许我轻松地使用不可变性及函数式编程等技术,令我的效率大幅提高。基于Lisp的动态特性,我总能将Clojure塑造成符合最佳抽象的状态。假如没有Clojure,Storm倒不会有什么不同,但实现过程将痛苦得多”。
新一代分布式计算系统Spark不仅在实现中选择了Scala,其提供的首选编程语言也是Scala。而从RDD所提供的API来看,你不难发现这便是典型的函数式编程,其充分利用了函数式编程的简洁性和不可变性。
……
处于大数据时代的你,估计对以上的事迹已有所耳闻。凭借着当今大规模的分布式计算能力和无限的水平扩展能力,原本函数式编程在单机性能上的不足已不再是人们最为诟病的问题。尤其是在当代高性能JVM的平台之上,像Scala和Clojure等函数式语言的性能已不可同日而语。而我们更为看重的是其简洁的声明性编程风格与丰富的语言表现力,而其对不可变性的推崇和“无副作用”函数也让程序的编写变得更加简单,从而进一步解放了程序员的生产力,让“码农”们可以节省下更多的时间去喝喝咖啡,做些更有创造力的事情。这也是为什么技术社区对Java 8加入Lambda表达式支持的呼声如此之高的主要原因。
回到设计模式的话题,GoF的设计模式是基于面向对象编程而总结提出的,它的确指引了一代OO程序员的成长。然而,一旦你了解了更多的编程范式之后,你就会发现原来OO的模式在很多其他范式的语言中并不再是必需的,尤其是在函数式编程语言之中,它的关注点是拥有头等支持的函数,而不再是对象。而其声明性的编程风格和丰富的语言表现力让你可以不再样本化地照搬照抄设计模式,一些内置的指令和语法糖让你可以像编写诗歌一样,以简洁、精炼、优雅的方式来编写代码。相比于命令式风格的语言,函数式语言解决相同问题的代码量可以减少到前者的一半,有时甚至是数量级的精简。所以,在函数式语言中,我们可以采用一些更为简洁的方式来替代原来在面向对象编程中的设计模式。而在纯函数式编程的实践中,先行者们又沉淀出了一些专注于函数式编程的模式,它们是函数式编程中的最佳实践。
如果你是一名Java程序员,那么《Scala与Clojure函数式编程模式》就是为你而准备的。这是一部专注于采用Scala和Clojure来讲解函数式编程模式的武功秘籍。Scala和Clojure都是基于JVM平台的函数式语言。由Scala设计者Martin Odersky所开设的名为Functional Programming Principles in Scala的课程成为了Coursera上通过率最高的编程课程之一。自2012年起,已经有至少5万人参加了该课程的学习,而其中有1万人通过了课程认证,其受欢迎度可见一斑。而相比拥有一部分面向对象血统的Scala,Clojure的函数式基因则显得更纯粹一些,它出自名门Lisp一脉。Paul Graham曾在《黑客与画家》中对Lisp的生产力推崇备至,其江湖地位也无需置疑。作者Michael Bevilacqua-Linn采用了这两种JVM语言来对比地讲解函数式编程模式,其中前半部分结合了面向对象的模式,列举了一些面向对象模式在函数式编程中的替代方案。而后半部分则重点讲述了在函数式编程世界中所独具的编程模式。通过阅读本书,你可以领略到各种函数式编程思想与技巧,为从原来普通的Java命令式编程顺利过渡到函数式编程打好坚实的基础,从而在JVM上编写出更加精益的程序。
原文地址:http://blog.csdn.net/turingbooks/article/details/45840939