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