《程序原本》作为电子书首发已经一个月了(下载附后),它到底是一本怎么样的书呢?我想站在我自己的角度对它做一些阐述,或是有利于对它的理解与传播的。
本电子书可自由下载和传播。
什么是“原本”
书名取自于《几何原本(Euclid's Elements)》,因此这个“原本”,其实原意应从Elements来找,一般来说理解成“不可或缺的、核心的要素,或元素”就好了。
《程序原本》确实就是想从这个角度来阐述“程序”这个主题。这本书从数、算以及抽象的源起谈起,从它们之间的关系,以及计算范式的定义谈起,把“计算机程序(或程序计算)”整件事的骨架抽离出来。然后再谈到在这个骨架之外来描述它的语言——计算机程序设计语言的方方面面。
这是这本书的前面部分。坦率地说,这部分并没有什么“新”东西。因为这些认识其实一早都有了,先哲大贤们已经论述得很清楚了,而我只是做了个引线人,把这些东西串起来并摆成了一个角度以便于大家观察罢了。
我在这个观察之外提出的问题是:“程序”是如何演进的?如今你所见的种种语言,以及由这些种种语言所得的种种“程序”之间的关系是如何的?
怎么来讲述这些“原本”
在书中,我总是试图用非常严谨地推论来提出或论证观点。我已然尽极大可能地来做这件事,并尝试让读者还能“不太费力”地理解它。
《结构程序设计》这本书在“论证”这件事上做得远比我要好得多,然而却更多的使用了数理逻辑。我可能采用的逻辑会略有些不同。比如下面这段:
这段文字在讲述一个“获取/捕获/剥离”抽象的过程,它最终只是想说明“对于计算来说,equ0()
与值0
是同义的”。这句话看起来没有什么特别需要强调的——也许你早就明白了,或者它已经显白得不需要论述。但是,有了这个观点,接下来的论述就完全成立了:
现在,我们提出最后一个推论。
- 既然
equ0
可以指代任意有限的计算步骤,那么它必等价于图灵机的“顺序逻辑”中所有步骤;- 既然
equ0
可以指代图灵机所有的顺序步骤,则必然能指代顺序步骤的两种特例:分支与循环;- 既然
equ0
既可以指代计算的要素“数”,又可以指代计算的要素“算”,还可以指代描述正确计算所必须的逻辑,那么equ0
本身——在概念抽象上——必然等同于一个完整的计算系统。这就是“函数式”计算范式的基本抽象。
这直接地解释了“函数式”是什么的问题,解释了“函数式”的核心的“值无关”和“值等义于函数(以及其确定性)”的问题,解释了函数式计算完备的问题……
非但对“语言范式”的解释如此,整本书对它所讨论的几乎所有主题,都是采用这种方式来叙述与论证的。一旦你理解了一个观点、概念与逻辑,那么更多的内容就如同覆盆之珠,琳琅满目了。
什么是“不变的”
我们总试图在纷繁的表相之中找到其内在“不变的”那些规律,有人谓之为“道”。我也是这样,我试图去追寻这些不变的东西,所以也有朋友说我是“求道者”。这其实太过抬举——我并不求道,我追求的只是知道而已。
这也许谈得远了,然而更近一些的问题是:我为什么要去寻找“程序原本”中那些不变的东西呢?
这十余年来,我的架构经历告诉我:所谓问题,要么是系统与其要素之间的矛盾,要么是观察与其预期之间的矛盾。撷其一而论,若是“系统与其要素”之间的矛盾,那么认清“这些要素是什么”就是极重要的问题了。
所以我会去找寻一个“计算系统”内部的种种要素,从最核心的,到某种特定系统的,无一遗漏。正是在这个过程中,我得到了《程序原本》一书的全部框架。也正是因此,这本书就是在描述这一切要素以及它们之间的冲突与矛盾。
更重要的是,我看到了这么多年以来(我的意思是自有“计算机程序”至今),我们从末改变过的解题思路:结构化。要知道,时至今日,我们居然只知道、只尝试过、只成功过这样一种方法。
这难道不是一件可怕的事吗?
为什么是“架构师的入门之径”
在《程序原本》这本书的简介中称,这本书“是架构师的入门之径”。你也许会奇怪我为什么会这样来介绍它。
其实这套电子书的第一版(《大道至易》)中,我的确就是先从《程序原本》写起的,之后再写到《我的架构思想》。因此从思维的路径来说,我也是将这“程序原本”作为了我讨论架构话题的入门之径的。所以,这简介也并非妄言。
如果你仔细地读这本《程序原本》,你会发现它已经讨论到了“系统”、“子系统”、“模块”、“分布”、“依赖”等等这些系统架构的“元素”,在它的后半部分更像是涉足到架构领域的书了。然而,它仍然是在“程序”这个体系下进行深入的讨论,而对“架构”只字不提。
这就是所谓“入门之径”的另一层真义了。
我们真的太容易在种种大会以及种种文章中听到或看到上面这些词汇(以及要素)了,并且由它们所组成的方案更是多如牛毛。然而,这些听来的看来的,最多让你知之皮表而已,你真的了解“架构为何物”,以及“如何得到架构”吗?
不,《程序原本》原本就只是打算让你清晰、明了、一览无遗地看到这些皮表,而已。更多的,我们要到《我的架构思想》中去谈。
下载
1. 高质量的PDF版本 【下载】
推荐在桌面系统、PAD或大屏幕移动设备上阅读。
2. 适用于Kindle的版本 【下载】
下载后用USB上传到Kindle即可。
如果你使用Amazon的“发送到设备”服务,那么这本书是不显示封面的。并且可能你需要将书的扩展名从.azw3改为.mobi。
上述的修改不影响阅读效果。
3. 使用了SVG图的.epub版本 【下载】
推荐在Macbook、iPhone或iPad中的iBooks软件上阅读。在其它支持“内置SVG图的.epub电子书”的阅读器上也有较好的阅读效果。
4. 一般质量图片的.epub版本 【下载】
一般的掌上阅读软件都可以支持。
5. 低版本Kindle使用的阅读格式
即低版本.mobi文件,阅读体验较差。请移驾我的Github(在这里)获取下载。