第1版序
我们正在被复杂性淹没。其中绝大部分是偶然复杂性——并非源自问题本身,而是源自于我们为了解决问题而采用的方法。面向对象编程看起来容易,但生产出来的程序,往往会成为一张由可变对象交织而成的复杂巨网。单单是因为调用了一个对象上的方法,就可能会引起遍及整个对象关系图的一连串变化。在这种情况下,想要理解何时将会发生何事,事物是如何进入某种状态的,或是为修正某个bug而试图让对象回到特定状态,都变得极为复杂。而且一旦混入了并发问题,事情很快就会变得无法收拾。我们对程序使用了仿制对象(mock objects)和测试套件(test suites),但依然收效甚微。这不得不让我们对手头的工具和编程模型产生质疑。
函数式编程提供了别的选择。通过强调纯函数—传入和返回的都是不可变值(immutable value),副作用的存在成为了特例,而不再是常态。在多核架构中,我们面临的并发问题日益增加。因此,这种特性只会变得更加重要。Clojure的设计目标,就是要让函数式编程更加平易近人,且兼备商业软件开发者所需的实用性。首先要能运行在像Java虚拟机这样可靠的基础设施之上,还要能支持现有客户在Java框架及库方面的投资。Clojure非常清楚满足上述两点的必要性,以及这么做能带来的巨大实用性。
这是一种面向专业开发者(Stuart自己就是)的编程语言。Stuart的这本书之所以让人如此激动,源于他对Clojure的把握。很明显,他对Clojure瞄准的痛处有着充分的体验,这也增强了本书务实的态度。阅读本书,就像是一次充满激情的旅行,以实际应用为基础,逐步介绍Clojure的关键特性——有可能是一些全新的概念。我希望它能鼓舞你运用Clojure去编写软件,然后,回过头来你会说:“我不仅仅完成了工作,而且没想到采用的方法竟然如此健壮和简单,最棒的是,编写Clojure代码实在是太有乐趣了!”。
——Rich Hickey
Clojure之父