Addison Wesley最近出版了一本由Julian Gamble撰写的新书 《Clojure Recipes》 ,本书旨在帮助开发者深入理解Clojure,在初步了解语言的特性及语法的基础上构建更复杂的项目,与外部库进行集成。因此,《Clojure Recipes》所面向的读者并非Clojure的初学者,它并没有提供对该语言本身的任何介绍。尽管如此,书中的代码都加入了详尽的注释,让缺乏经验的读者也能够顺利地读下去。
本书列举了一系列自包含的“在周末时间即可完成的小项目”,通过这些项目为开发者展现如何通过Clojure解决一些常见的问题,包括:
正如上文所说,每个章节都包含一个独立的项目,使读者能够在较短的时间之内消化这些内容。这也意味着例如Cascalog与Datomic这些更复杂的主题将分几个章节讲述,每个章节详细讨论一个具体的特性。
本书中的所有章节都采用了一种类似的结构:首先为读者展示一个项目案例,然后指导读者完成一些必需的文件的创建过程,最后再简明地解释代码的作用。由于本书采用了一种具备实用性的编写方式,因此关键在于读者需要跟进并实际实现每个感兴趣的项目。另一方面,本书并不强迫你按顺序阅读每一章节,不过最初的几个章节比起后续章节明显在内容上更偏重于介绍性,同时也涵盖了如何搭建你的Clojure开发环境的步骤。
InfoQ与本书的作者Julian Gamble就本书的写作过程,以及他对这门语言的看法进行了一次访谈。
Julian Gamble:在我开始启动这本书的编写计划时,市面上还没有一本关于Clojure“秘诀”类型的书,而这在其他编程语言中是很常见的。这是一个明显的空白,我的编辑也认同这一点。在这一写作项目启动过程后没过多久,O'Reilly又推出了Clojure方面的书籍,但仍然缺乏我想要的“秘诀”(不过我和作者本身就是好朋友,还在技术大会上击过掌。Clojure社区就是这么融洽!)。之后我发现,这种类型的书籍也存在着一些变体,《Clojure Recipes》专注于以小型项目(而不是按照代码片段)组织章节,在每个章节提供能够运行的完整示例。
其他的动力还包括壮大Clojure社区,以及通过大量可访问的示例推广函数式编程。本书所面向的群体非常广泛,包括追求Lisp风格编程技术、函数式编程范式、以及Clojure本身的程序员。我希望为读者指明方向,让他们能够学会Clojure,并且能够应用在日常工作中,即使他们是在大企业中工作。
Julian:我阅读了大量由Paul Graham与Steve Yegge撰写的软件开发方面的文章。他们两位总是劝说“满足于用Java完成日常工作的程序员”:外面的世界很精彩,如果你不走出Java语言这个圈子,就会错过许多风景。他们对于Lisp也都非常关注。我在2007年开始使用Racket与Common Lisp,并且发现了一本至今都令我爱不释手的书《The Little Lisper》。
Clojure是在2007年问世的,我看着它的社区一点点壮大起来。Clojure能够将我的JVM背景与LISP的强大能力结合起来。Clojure有很多乐趣,每个人都在博客文章中讲述他们的探索故事。编写Clojure代码,并且与人们谈论Clojure,这为我带来了许多乐趣。
Julian:与其说“具有一定经验”,我更倾向于“只要知道在Clojure中会用到括号,并且知道REPL是什么”就可以了。《Clojure Recipes》是为那些通过实践进行学习的读者所准备的。本书适合于持有这种问题的读者:“我想在这个周末开发一个Clojure项目,应该从哪里着手?”
读者可以期望从本书中找到能够运行的项目、对于他们怎样、为什么能够运行的详细解释,以及这些秘诀中“不确定的部分”。读者们不应期望在本书中找到对于语法、数据结构、纯函数或STM自下向上的完整讨论,这些内容去搜索一下就知道了。这本书面向的是想要做出点什么东西的读者。
Julian:这种方式主要的吸引力在于有些读者的学习风格、或是学习这么语言的动力可能有所不同。有些读者希望能够看到一个完整的、可工作的解决方案,他们可以对其进行调整,并学习它的构建方式。某些读者出于自身需要,希望能够深入其中并学习整个生态系统的基础。某些读者将编程语言的学习视为一种手段,而不是对于知识的探索。究竟哪种方式是最好的,这方面存在各种不同的观点。《Clojure
Recipes》的目标是让你能够“动手”学习,并通过大量的帮助让你学习这门语言。
Julian:对于用例的选择是双向的。我的第一个问题是:“Clojure的长处在哪里?与Java相比,Clojure能够使哪些任务得到简化?”。第二个问题是:“如何在你的工作环境中开始使用Clojure?”
我对于用例的简洁性有一定要求,一方面,我希望他们有一定复杂度,具有自包含性,并且是可以运行的。而另一方面,我又希望他们不会过于复杂,只关注于某个具体的领域。关键在于能够通过对用例的调整解决读者的问题,或者至少能够让它运行起来,再将其集成至一个更大的项目中。
Julian:最有趣的一个用例是在Pedestal Framework Server上实现的股票行情自动收录器。这个用例中使用了各种技术,包括服务端与客户端技术,它已经很接近一个实用的业务应用了。
最复杂的用例是关于Datomic DSL的那几个章节(需要最多的时间进行开发以及改进)。这几章可能是本书中最深奥的部分了。
我曾经想收录一个章节,在其中讨论如何打破由宏进行代码生成方面的限制,以解决一个在Rails框架中出现的类似问题。当时我已经写好了一个可运行的演示,并写好了这一章节,它能为你展示如何在一个运行的应用中获取一个表名,自动生成路由与行为,并在运行时显示所有生成的模板。你还可以通过REPL在运行时修改模板。虽然这个想法很酷,但我感觉它对于宏知识的要求过高,已超过了它所带来的价值。因此,我将这一章内容分解成一些独立的部分,并收录在附录中“调试宏”的这一部分。
Julian:Clojure独有的特性包括软件事务内存(STM)、可持久化的不可变数据结构、可通过REPL进行交互式的编程、以及与JVM良好的集成能力,包括可编译为字节码和良好的Java互操作性。Clojure还会对你提出一些挑战,让你思考如何编写良好的Java代码,从而使你成为更优秀的Java程序员。
Julian:主要的竞争优势在于能够快速地推向市场。一位来自Clojure用户组的朋友告诉我们,他非常惊讶于看到承包商能够如此快速地发布各种web服务与web页面,因此他决定来到这个用户组一探究竟。Paul Graham也在他的文章 “Beating the Averages” 中提及了这方面内容。此外,使用Clojure能够简化JVM的应用,从而减少了bug的数量。
Julian:Clojure非常适合于开发web服务,它正赶上了这一波微服务的强劲势头。此外,Clojure是基于JVM的,因此更易于在企业中使用。Clojure同时也擅长数据的处理,因而能在大数据的浪潮中占据一席之地。最后,Clojure的开发体验能带来很多乐趣,而且非常易于上手。
Julian Gamble 是一位软件开发者,他在金融服务行业具有十年以上的工作经验,其工作内容牵涉到数十亿美元在全球范围内的流动。闲暇之余,他也会在 juliangamble.com 撰写与软件相关的文章及进行演讲。
查看英文原文: Clojure Recipes Review and Q&A