《程序原本》作为电子书首发已经一个月了(下载附后),它到底是一本怎么样的书呢?我想站在我自己的角度对它做一些阐述,或是有利于对它的理解与传播的。

本电子书可自由下载和传播。

什么是“原本”

书名取自于《几何原本(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(在这里)获取下载。

其它下载点(不定期更新)

  • CSDN下载页:http://download.csdn.net/user/aimingoo/uploads

  • 图灵出版社区:http://www.ituring.com.cn/book/2429

  • 我的Github:http://github.com/aimingoo/my-ebooks

电子书《程序原本》小述相关推荐

  1. 电子书《我的架构思想》小述

    接下来谈谈<我的架构思想>.上一篇是"电子书<程序原本>小述",在这里:http://blog.csdn.net/aimingoo/article/deta ...

  2. 斗米客户端的架构思想

    2019独角兽企业重金招聘Python工程师标准>>> 背景 随着移动互联网产业的兴起,各式App层出不穷,技术方案多种多样.同样,我们也面临了各式各样的问题,比如产品如何开发能够更 ...

  3. Android架构师亲述:我从某度外包到字节,你知道我经历了什么吗?

    Android架构师亲述:我从某度外包到字节,你知道我经历了什么吗? 朋友在某大型互联网公司担任架构师.刚毕业那年,他以外包的身份进入了某度,那个时候几乎每一天都很焦虑,大家技术能力没差太多,为何我是 ...

  4. 前端笔记之NodeJS(四)MongoDB数据库Mongoose自制接口MVC架构思想|实战

    一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...

  5. T系统和应用集成-从SOA架构思想到服务架构规划设计

    T系统和应用集成-从SOA架构思想到服务架构规划设计 原创 人月聊IT 2020-09-23 13:48:20 作者:人月神话,新浪博客同名 简介:多年SOA规划建设,私有云PaaS平台架构设计经验, ...

  6. 架构思想--基础架构

    最近研究一些架构思想,看看李云华老师的专栏(从0开始学架构),做些笔记有些个人的思考. 一.基础架构 1.1简介 架构设计面临复杂度:高可用,可扩展,低成本,安全,规模. 架构设计主要目的为了解决软件 ...

  7. 剥析surging的架构思想

    1.前言  前面第一篇阐述了采用基于.NET CORE微服务架构,应用surging服务端与客户端之间进行通信的简单示例以及对于surging服务化框架简单介绍.在这篇文章中,我们将剥析surging ...

  8. Jetpack Compose 中的架构思想

    Jetpack Compose 中的架构总览 如果应用打算使用 Jetpack Compose 来开发,那么就可以跟以前的MVC.MVP.MVVM等乱七八糟的架构全部说拜拜,这些名词也将在Androi ...

  9. Python上下文语法with小述

    Python上下文语法with小述 本文环境python3.5.2 上下文语法with 该语法糖主要便于在Python的编程过程中,能够有效管理防止编程过程中,对有关资源编程时忘记释放的问题,比如通过 ...

最新文章

  1. 使用GitLab或者Github简单实用地将数据导入Colab的方法
  2. Halcon中MIN宏定义与自己定义的C++中MIN函数--重命名冲突问题解决方法
  3. zemax图像模拟_zemax2014免费版
  4. java 列表框简单案例
  5. Angular.js中使用$watch监听模型变化
  6. Oracle学习笔记:数据字典
  7. 语音识别学习日志 2019-7-15 语音识别基础知识准备4 {Baun-Welch算法}
  8. C#获取文件夹及文件的大小与占用空间的方法
  9. CTF---Web入门第二题 上传绕过
  10. 自己动手做Arduino玩具(二)
  11. cad插入块_CAD图块全攻略第三期——高级技巧动态块,快来提升逼格!
  12. linux 360云盘下载文件夹里,360安全云盘Linux版图文使用说明
  13. 如何在Tomcat中发布网站
  14. [Mysql] 3.Mysql 数据类型
  15. Docker基础命令学习
  16. 羊驼笔记:清算bot
  17. 中国电信 合约协议   转载
  18. (转)Cognos Transformer IQD文件结构及规则
  19. 诺基亚“东山再起”业务重组 全球裁员引关注
  20. 网络原理考点之BSC协议

热门文章

  1. VSCode C/C++ Theme主题自定义配色方案
  2. 如何解决后台传回的数据不是正常的json数据,例如是个List [ ]
  3. 使用74LS164和74LS165实现简单I/O扩展
  4. 2345浏览器如何显示浏览器推送内容
  5. 树莓派实现MQTT通信
  6. javax.naming.OperationNotSupportedException: Context is read only
  7. qt飞扬青云 / Qt开发经验
  8. laravel下视图间共享数据
  9. python如何群控手机_python调用adb脚本来实现群控安卓手机初探
  10. 【FLink源码分析】:Accumulator源码分析