我的期望与痛:SICP

几天前,袁英杰在微信中推荐《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs,SICP)。

他的推荐词说:

SICP是一本无论如何都应该去仔细阅读的书。读完它,如果你不是变成了fp的狂热爱好者,而是除了理解fp之外,也更加深刻的理解了OO,logical programming,以及认识到用任何一种方法描述世界都有其局限性,从而放弃对单种范式的狂热(但过程式是个例外,你需要从这个泥潭中越早跳出来越好),那么你才没有白读这本书。

其实,在2013年,我还在ThoughtWorks时,就曾经和同事一起整理了一份ThoughtWorks读书雷达,在编码实践象限中推荐了SICP。推荐词如下:

在Coding Practice象限中,我们唯一推荐了一本似乎与工程实践无直接关联的书籍,即Harold Abelson与Gerald Jay Sussman的著作Structure and Interpretation of Computer Programs《计算机程序的构造和解释》(即SICP)。

作为MIT(曾经的)计算机系第一门编程课的教材,这本书没有像诸多基于C或者Java的编程入门教材那样纠结于语法和库——LISP的语法确实也没什么可以纠结的。

本书讲的是一些最基本的问题,比如什么是计算、什么是抽象、什么是模块化、乃至什么是时间和什么是自然数。一个以软件开发为业的程序员,或早或晚终归要想透这些问题,然后才能看破各种琳琅满目的编程语言所提供的五花八门的语法糖,以不变应万变地坦然面对一切不涉及并发的程序设计问题。把这本书当做第一本编程教材或许有些激进(MIT也已经不再这样做),但你早晚会遇到它。

有人不无夸张但相当在理地说:自SICP以降,无并发的编程没有任何新鲜问题;如果你觉得自己有了新发现,要么是SICP已经写过只是你不知道,要么是你想错了。

这一段是熊节的推荐。

应该在2014年,ThoughtWorks成都Office的杨阳在Office开展了SICP的系列Workshop,选用了clojure语言来尝试阐释书中理论和思想。可惜当时我出差在外,没有机会参与这个有趣的活动。至今想来抱憾。

按:clojure是我一直想学却一直未学的一门语言,而SICP是我一直想读却一直未读的一本书。

Anyway,得听本书的大名并且许下要阅读此书的宏愿,比这还要早得更早。可以称得上是我内心隐藏的期望了,如今倒成了一种痛。我像一个倒吃甘蔗的吝啬鬼,舍不得把最好的那段留到最前面。我总是说我要读它,因为它实在太好,反而不舍得去阅读了。

借口!

其实是心中怀抱一种恐惧吧。我害怕我有点读不懂它,就像是高高在上的女神,我有点自惭形秽不敢去追求。——于是,我买了中文版的SICP,却从来没有翻开它;我在GitBook下载了LFE(Lisp Flavored Erlang)版本的SICP,却从来不曾点开它。我将它藏起来了,貌似珍藏,实则逃避。说是拖延症吗?其实未必呢。

隐隐地,我总觉得阅读此书是重要的,却并非紧急的;于是无意识中让许多紧急却并不重要的事情抢到了前面,阅读的优先级一退再退。若按小刀的说法,则认为阅读此书与解决自己的痛点不符。大约也有道理,因为阅读本书可能看不到直截了当的短期效果。短平快的收益,是学习一门语言,学习一件工具,学习一个平台。有多少会熟练编写C++、Java、C#、Scala、JavaScript、Ruby、Python语言的人,又读过SICP呢?读了它,未必能成道;不读它,也足以成为高手;得道的可能万中存一,于是就放弃了。

剖析我的心路,大抵如此。

既然给英杰说要逼逼自己,就不要拖延到明天了。明日复明日,也许真要拖到老了。虽然英杰说读此书是It's never too late。不过早总比晚好,要不,今天就开始阅读。从第一章Building Abstractions with Functions开始。

2017-02-17 20:02193FP