我发现许多研究电脑程序的人说技术含量都一定会说“底层”,认为所谓的“底层”是电脑程序的技术含量所在。当然这些他们所说的“底层”,从源代码看到CPU如何执行这段程序,技术含量肯定比写几个CRUD高一些,但显然这并不是计算机科学的全部,甚至只是其中很小的一部分。
CSAPP就是被持有这种观点的人广泛推崇的一本书。对于这本书,我早就感受过它的名气,而不久之前我翻开这本书的时候,其中的内容和观点却让我大跌眼镜。随便说一句,能让我这么失望的软件相关的东西只有看golang之父Rob Pike写的the go programming language,虽然之前对golang的各种缺点早有听说…然而Rob Pike的设计审美却让我看了10页就想把书扔了。
理论和实践
宣传CSAPP这本书的人往往有一种这样的观点,要完全理解计算机程序就要彻底搞清电脑,或者电脑程序是如何执行的,从源代码,到电脑的结构,到CPU的运作方式。我并不是说这些知识毫无作用,但这些知识其实根本无助于理解计算机的本质。为什么这么说呢,翻开CSAPP,这本书自称是为程序员展现计算机的基本结构,然而…你会发现它仅仅展示了“现代”的计算机和“现代”的操作系统的基本结构。至于其中选取了什么细节,那可以说是相当的随意。我不知道这些知识对于并不是专门维护操作系统的人究竟有什么太大的意义,尤其是对程序员来说。当然我从来都没认为程序员只需要去理解CRUD,或者库代码,只是CSAPP里面的知识,并没有那么大的价值。对于其中大多数章节我都不是太熟悉,然而其中关于编译器的章节基本可以定性为,你几乎不能从中看出什么编译技术的原理。当然,并不是没有,就连《编译原理》这本同样广负盛誉和被广泛吐槽的经典教科书也被认为没有展现编译技术的精华,何况是一本走马观花的书的其中一个章节呢?所以这里又看出为什么CSAPP并不是一本好书了–本来就是留下一个大致印象的书,其中却有不少细节,而且不少细节根本没有说明任何道理。
相对论,原子弹和CSAPP
我一直认为受过基本的科学训练的人都不会认为倒腾那些硬件有什么技术含量,这一点其实可以用相对论来类比。众所周知原子弹是在相对论的指导下制造出来的,是E = MC2给了核武器制造的可能性。所以到今天大家都知道是爱因斯坦直接影响了原子弹,而不是美国的曼哈顿工程里面制造钢材,炸药,或者提炼铀元素的人。然而这种情况在现在很多尝试理解电脑如何运作–或者认为自己应该去理解电脑如何运作的人来说,却完全相反。
举一个最简单的例子,一些人认为知道了CPU由门电路构成,知道CPU里面有ALU和寄存级,或者知道的多一点的说得清流水线的结构和实现就觉得自己理解了CPU。然而完全可以反问:CPU可能解决什么样的问题?如果不在一开始确定CPU能做什么,电脑甚至不会被做出来。这个问题当然有确定的答案,CPU可以计算所有的可计算问题,但是–什么样的问题是可计算问题?又是什么使得CPU能够计算所有的可计算问题?关于这些东西当然CPU的结构不会告诉你。就好象你每天都在看宇宙最基本的规律,或者原理在对每一件事起作用,但是自物理产生的两千年来,还没有任何一个人发现宇宙最基本的规律究竟是什么。
幸运的是人类其实完全知道计算机运行的规律–计算机的一切对于人来说都是可预测的。然而如上文所说,知道CPU是什么样的,并没有澄清CPU为什么是这样。这个答案要去那里找呢,其实是数理逻辑。当然大多数言必称底层的人都停在了是什么。
总而言之,现代操作系统或者硬件的很多设计没有太多的道理,现实本来就是dirty的,历史和硬件的局限都会导致妥协和设计的复杂,那些设计和科学什么联系。当然,计算机科学本来就不是科学。