从最开始写博客到今天已经有将近七年的时间了,有很多博客的读者都向作者要过书单,但是一直以来这件事情都没有提上日程。作者一直都觉得分享书单和推荐书籍是一件很严肃的事情,大多数工程师的时间和精力都很有限,不希望因为推荐的不合适书籍而浪费大家的时间。
这篇文章以及可能存在的后续文章会审慎地推荐书籍,虽然所有的书都是作者读过并且严格挑选的,但是因为读者的背景不同会有完全不同的体验,这些额外的变量是作者无法控制的,希望各位读者可以理解。
可能是因为大多数英文书籍的名字都很长,很多比较出名的书籍都有广为人知的缩写,今天要介绍的三本书籍也都有各自的缩写,SICP、CTMCP 和 DDIA,可能很多人都听过这三本书的名字,这三本书对作者都有很大的影响。
在这里首先要介绍和推荐的就是《计算机程序的构造和解释》[^1](Structure and Interpretation of Computer Programs、SICP),相信很多人都曾经看到过这本书的推荐,而作者在这里也不能免俗。我们想谈一谈作者在阅读这本书时的一些经历和主观上的感受。
SICP
图 1 - 计算机程序的构造和解释
第一次听说这本书的时候是在大二,具体从哪里听到过这本书已经不记得了,最开始觉得这本书的名字有一点故弄玄虚,仅凭书名无法想象这本书的内容(这可能也是很多好书被埋没的原因)。因为之前一直接触的都是面向对象的编程语言,所以开始学习这本书时受到了极大的震撼,它为我理解计算机程序提供了非常不一样的视角。
作为一本介绍计算机程序的书,它选择一门非常小众的编程语言 Scheme[^2],Scheme 是 Lisp 的方言,作为 1970 年从 MIT 实验室中走出的语言,它却一开始就支持了函数式的编程范式。与今天复杂的编程语言相比,该语言中的概念和元素非常少,然而越是简单的工具越能揭示编写计算机程序时遇到的基本问题。
近些年来,函数式编程的思想基本上已经入侵了大多数的编程语言,无论是 Objective-C 中的代码块、C++ 中的成员函数引用、Java 和其他编程语言中的匿名函数都会有一些函数式编程的意味。然而 Scheme 作为根正苗红的函数式编程语言,我们能更清晰地理解函数式编程到底是什么,如何使用函数式的编程范式如何构建复杂的软件系统。
(let loop ((n 1)) (if (> n 10) '() (cons n (loop (+ n 1))))) ===> (1 2 3 4 5 6 7 8 9 10)
虽然学习这本书的过程异常艰难,作者大概花了三、四个月的时间阅读这本书,作者还将 1986 年该书的作者 Hal Abelson 和 Gerald Jay Sussman 在 HP 公司上课的视频作为辅助资料学习。我相信阅读这本书并观看相关的视频对于没有接触过函数式编程的读者来说,会从根本上改变对编程的看法。
作者在学习完 SICP 之后,还曾经痴迷于 Haskell 并且在 Coursera 上学习过函数式编程语言的相关课程,而函数式编程语言的学习也是对作者的影响最深的几个事件之一。
《计算机程序设计的概念、技术和模型》[^3](Concepts, Techniques and Models of Programming Language、CTMCP)是 Peter Van Roy 和 Seif Haridi 在 2004 年出版的大部头。这本书通过统一的方式介绍主流的全部编程范式、它们之间的关系以及它们的具体应用。
CTMCP
图 2 - 计算机程序的概念、技术和模型
编程范式在今天应该不是一个令人感到陌生的名字,面向对象编程、函数式编程都是编程范式的一种,今天的编程语言往往由多个复杂的编程范式组成的。在某种程度上,我们可以将编程语言理解为编程范式的集合。
programming-paradigms
图 3 - 编程范式
这本书的作者为了展示书中介绍的不同编程范式,特意设计并实现了名为 Oz 的多编程范式的编程语言[^4]。该编程语言包含了大多数主流的编程范式,其中包括逻辑、函数式、命令式、面向对象、约束式、分布式和并行编程,这种设计使得比较不同范式时不会遇到上下文不同导致的问题,避免了因为编程范式实现细节的不同而陷入的琐碎问题。
如果对这本书没有那么感兴趣,其实快速阅读该书的前九章就足够了,感兴趣的读者也可以阅读剩余的内容,虽然书中有很多代码,但是因为语言不是主流的编程语言,所以可能会遇到示例代码无法跑通的情况。我们在阅读这本书时也应该更加关注概念以及形而上的知识,而不是形而下的一些具体实现。
最后要介绍的是豆瓣上评分 9.7 分的《设计数据密集型应用》[^5](Designing Data-Intensive Applications、DDIA),该书是 2018 年出版的一本新书,初看这个名字可能会误认为这是仅仅给数据开发者阅读的书籍,但是作者相信这本书能给所有的开发者带来不同的阅读体验。
DDIA
图 4 - 设计数据密集型应用
该书的第一部分是围绕数据本身展开的,其中介绍了数据的模型、查询语言、存储和获取以及编码方式;第二部分介绍了分布式的数据应该如何处理,其中包括副本、分片、事务、一致性和共识等内容;最后一部分主要介绍的是衍生数据的处理,其中包括批处理、流处理和未来的数据系统,而真正与研究大数据开发方向的同学关系紧密也是这一部分。
作者认为,虽然这本书没有创新性的引入一些新的概念和技术,书中描述的大多数问题和解决方案都能在网络上找到,但是这本书的阅读可以帮助我们重新构建系统性的知识体系、打通不同知识之间的联系。它能让我们在看待数据和分布式系统时带着更加通透的感觉,而这也是作者想要推荐这本书的目的。
在这里还是想强调一点,上面的这三本书都是作者阅读过的书籍,这里做的评价都仅仅出于作者的主观判断。虽然作者确实从这三本书中获得了大家所说的 "Aha moment",但是这三本书都是大部头,认真阅读这三本书可能需要花费大半年的时间,作者不能对各位读者自身的阅读体验负责,也希望各位读者在选择输入源时有自己的判断、也更加谨慎地思考。
如果各位读者对这个系列比较感兴趣,作者在后面还会推荐一些自己阅读过的其他书籍,也欢迎大家在评论中留下带给自己 "Aha moment" 的书籍,我们可以一同学习和讨论。
[^1]: 计算机程序的构造和解释(原书第2版) https://book.douban.com/subject/1148282/
[^2]: Wikipedia: Scheme https://en.wikipedia.org/wiki/Scheme\_(programming\_language)
[^3]: Concepts, Techniques and Models of Programming Language https://book.douban.com/subject/1782316/
[^4]: Wikipedia Oz (programming language)https://en.wikipedia.org/wiki/Oz\_(programming\_language)
[^5]: 数据密集型应用系统设计 https://book.douban.com/subject/30329536/