以视频分析为主要载体的人工智能算法在泛安防场景中是怎样落地的?>> 了解详情
写点什么

《Clojure Recipes》书评与问答

  • 2016 年 3 月 23 日
  • 本文字数:3490 字

    阅读完需:约 11 分钟

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

2016 年 3 月 23 日 19:121281
用户头像

发布了 428 篇内容, 共 155.3 次阅读, 收获喜欢 27 次。

关注

评论

发布
暂无评论
发现更多内容

DeFi去中心化平台源码开发|智能合约系统搭建

量化系统19942438797

记一次PHP渗透测试实战教程

网络安全学海

php 网络安全 信息安全 渗透测试 安全漏洞

仿imtoken钱包源码,TP钱包源码开发

13823153121

从新手村出来,我在 Apache APISIX 社区发出了第一个 PR

Apache APISIX 中国社区

开源 后端 API网关 APISIX

网络攻防学习笔记 Day102

穿过生命散发芬芳

态势感知 网络攻防 8月日更

端口占用解决方案

一个大红包

8月日更

异步编程的终极解决方案 async/await:用同步的方式去写异步代码

前端依依

前端 js 经验分享 异步 知识讲解

数据缓存历险记(五)--LRU缓存算法的最终篇

卢卡多多

缓存 LRU Redis 协议 8月日更

极客时间《Linux性能优化实战》学习笔记

刘帅强

前端之算法(一)

Augus

数据结构与算法 8月日更

LeetCode题解:80. 删除有序数组中的重复项 II,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

Ipfs靠谱吗?ipfs中国授权公司都有哪些?

分布式存储 区块链+ IPFS fil

fil矿机怎么购买?fil矿机在哪买?

fil矿机怎么购买 fil矿机在哪买

手把手 Golang 实现静态图像与视频流人脸识别

声网Agora

音视频 人脸识别

新药开发瓶颈问题或将被打破,北鲲云超算平台开启药物研发“加速度”

北鲲云

基于时间和窗口的算子(六)

数据与智能

flink 窗口函数 算子

RESTful API

escray

学习 极客时间 如何落地业务建模 8月日更

区块链难懂?人民日报评论员讲给你听

CECBC区块链专委会

用区块链加强知识产权保护

CECBC区块链专委会

Github上365道Java高频面试复习题,助你吊打面试官

程序员改bug

Java 程序员 架构 面试 编程语言

【前端 · 面试 】HTTP 总结(十一)—— HTTPS 概述

编程三昧

面试 https 8月日更

MySQL知识点整理

一个大红包

8月日更

融云CTO杨攀:把握核心技术,促进产学研用融合发展

融云 RongCloud

分布式事务最终一致性-CAP框架轻松搞定

Java技术那些事

Java 编程 程序员 计算机 8月日更

企业不可忽视的三大关键时刻

石云升

管理经验 关键时刻 体验设计 8月日更

CSS 文档中定位指南:static、relative、absolute、fixed、sticky

devpoint

CSS 8月日更

阿里P8面试官不小心泄露的500道万字java面试题和答案

程序员改bug

Java 编程 架构 面试

从安卓转到Java开发,我吃透了这份pdf,终于4面拿下美团offer

Java~~~

Java spring 面试 微服务 JVM

iTerm2 + Oh My Zsh,打造专属你的终端神器

村雨遥

macos 8月日更

🏆「作者推荐」【JVM 性能调优】JVM分析与调优技巧分析(原理篇)

浩宇天尚

JVM JVm虚拟机 8月日更

写作 7 堂课——【6. 清单式写作】

LeifChen

清单 写作技巧 8月日更 检查清单

《Clojure Recipes》书评与问答-InfoQ