神刀安全网

《Clojure Recipes》书评与问答

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

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 《Clojure Recipes》书评与问答

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮