「译」唐纳德·克努特的《计算机程序设计的艺术》

书架上的书(总是)看起来很美. 不仅是因为书籍本身的魅力,而且(更是)因为书籍也能(为我们)彰显出其作者的魅力.

唐纳德的那四本精装卷的《计算机程序设计的艺术》—— 都用深紫色的书皮纸包裹着 —— (这)传达出一个确切的消息:
让开,麻瓜们,站在你面前的是一个真正的程序员! 一位庄重的计算机科学实践者!

比尔盖茨曾经这样说过: 如果你觉得自己是一位优秀的程序员…读一读《计算机程序设计的艺术》…..如果你能读完
了整本书,不妨给我发个简历….(译注:原句是: 如果你觉得自己是一名优秀的程序员,那就去读《The Art of
Computer Programming(计算机程序设计艺术)》吧.对我来说,读完这本书不仅花了好几个月,而且还要求我有极
高的自律性. 如果你能读完这本书,不妨给我发个简历.)

对我来说,订购这个系列的书感觉像是(我取得了)一个重大的专业成就. 在我还没拿到这些书之前,我便早早的在我的书架
上为它们腾出一个位置,这就跟人们可能会在仓库中为一个崭新的主机腾出一个地方一样.

这也不是那些早早带着厌恶离开影院的影评人所作出的评价之一. 唐纳德的书是史诗般的作品.他是一位掌握计算机编程
基本原理、编程原理的数学根源和这两个领域交叉点处的真正的大师.(他站在了这两个领域的交叉点.) 他如此值得我们
尊敬.

只是我不配体会到到TAOCP(《The Art of Computer Programming》)所发出的那种魅力.

我已经读了三四遍卷一的序言.我试着想象如果整个系列都完成了会是什么感觉. 我将远离网络,带着大量的纸、几盒的
铅笔、TAOCP、一些数学书和足够使用90天的Adderall(注:一种治疗注意力缺失/多动症的药)独自搬到怀俄明山顶的小屋
中去.

我将在山中远足,深入的思考书中的基本算法.没有笔记本电脑,没有WiFi,没有电力 —— 这些都是使我分心的原因. 日落之后,
我将在摇曳的烛光中,继续阅读.我的梦想是在调和数、二项式系数和非线性数据结构的宇宙中尽情畅游.

但是,这些都没能发生.因此,当我昨天又一次的读完前言之后,我觉得我应该停下来反思一下我到目前为止的整个旅程.

这就是唐纳德对于计算机的热爱,整个系列的书都专注于一个:20世纪50年代流行的IBM 650大型机.这是第一个被"大规模的生 产"的计算机,这种计算机的造价高达几十万美元(以今天的美元). 这种类型的计算机就是他最先接触到的计算机.

在20世纪50年代,对计算机感兴趣就等于对应用数学感兴趣. 早期的IBM 650具有基本的数学运算和控制结构,它是围绕十进制
而不是二进制构建的.

没有显示器,没有命令行,人便是操作系统:控制台允许操作员启用或者停止程序等等.

假设您想编写一个程序来生成斐波那契数列. FORTRAN 此时还不存在 —— FORTRAN 的出现是在IBM 650发布四年之后.因此,在这最初的
几年里,你不得不为你想做的事情编写出机器级别的操作代码.然后,手动的组装你的程序,用打孔机打出一堆”印”有你程序的卡片.

当然,这里有几种方法来优化你的程序. 您可以设计一个更快的算法或部署更适合该问题的数据结构.

你也能够优化程序的加载和运行方式 —— 利用机器的特性运行. 磁鼓存储器是现代硬盘的先驱,是 IBM 650 的主要存储器,但是它非
常慢.作为一个程序员,您的目标是最大限度地减少 12,500 RPM 鼓机的旋转延迟,这样您的所有代码和数据都可以在执行期间的适当
时刻轻松到达CPU. 您希望主机的CPU周期与这些鼓存储器旋转之间完美同步.

计算机编程就是在这里(在数学和机械工程的粗糙交叉点)被诞生出来的. 它可以被任何一个非常聪明的人完全理解. 但这已不再是事实.
唐纳德和那个时期的程序员必须比 IBM 650 (型号的计算机)更聪明. 它们熟记着每个真空管和控制开关的位置和作用. (而现在,)在
这方面,我们不再比我们的电脑聪明.

在第一段的前言中,唐纳德将编程称作为”一次审美体验,就像写诗或者绘画一样”.我认为这种美感依旧吸引着每一个有抱负的程序员. 自从
20世纪50年代以来,她沿着指数曲线行进了很长的距离之后,知道这种美感(依旧)保持完好是令人欣慰的. 虽然现在的我们不再需要设计出
程序,然后将其输入到一个热的、响亮的计算器中去,但是编程的美依旧渗透在抽象的每一层.

我想知道编写软件的这一表述行为的性质是如何受到(8kb内存内)手工组装的限制,以及制作穿孔卡的劳动的影响而形成的. 想象一下,在
Knuth的时代,编写代码的时候,会有一种激动人心的感觉,当然也有走钢丝的风险. 一个小小的错误也是会让人感受到痛苦的.

从这以后,几十年的抽象就像是一堆床垫一样(慢慢地)被堆积起来,现在我们中大多数人只是在上面打滚而已.

今天的软件的短反馈循环和扩展性是需要付出代价的.虽然如今的软件开发可能更加的有趣,但(在我们思考之前)进行黑客攻击也更容易,而
且(这种软件开发的方式)会产生很多问题.伟大的软件仍然需要大量的思考,(但是很显然)我们很容易就会失去严谨性.

IBM 650的约束是艰难而快速的,而今天的约束更为温和,往往是自我强加的. 手机的微小屏幕预示着经济软件和界面设计的创新浪潮. 令
我感到震惊的是,任何选择目标开发环境限制的人都在为我们未来的创新选择竞争环境。