敏捷人士认为代码是最好的文档,盖因只有代码才能真实表达设计者与实现者的意图。然而,一旦系统变得复杂,通过阅读源代码来理解系统就会变成一桩苦差事。系统千头万绪,直接阅读源代码,常常会陷入“只见树木,不见森林”的困境。可以说,纯粹理论描述的文档太空,直接阅读源代码又太细,任选其一都不利于对系统的了解。若能为二者搭建一座桥梁,问题就迎刃而解了。真实的源代码加上明白通畅的理论描述,或许可以称得上是学习软件技术的“终南捷径”。
郝庆丰先生显然体会到了这一点,他的大作《返璞归真-UNIX技术内幕》节选了10000行UNIX内核源码,并结合自己在UNIX环境下浸淫多年的宝贵经验,对UNIX的内幕进行了彻底的解剖。剖析入木三分,鞭辟入里,更有自己独到的见解与项目实践,说是呕心沥血之作,绝不为过。
我曾经使用过SUN的Solaris与HP-UNIX,不过都是浅尝辄止,并没有深入去了解操作系统的内核。我拜读过Eric S. Raymond的杰作《UNIX编程艺术》,但该书更多地关注在设计层面,而不是阐述与剖析UNIX的实现。系统的实现总是枯燥无味的,何况是软件系统中最为复杂的操作系统的实现。要彻底啃下UNIX的内核代码殊为不易,若要融汇贯通,则没有多年的项目体验与分析思考,几乎不可完成;如果再要将自己体会所得,以明白晓畅的方式著书立说,更无异于“蜀道之难,难于上青天”了。我对本书质量最初报以怀疑的态度,因为我知道要写成这样的书籍,其中的困难非同等闲,但等我阅读了本书的前面几个章节之后,就彻底打消了这个疑虑。关键之处在于,作者擅于以图文结合的方式阐述原理,而他对于源代码的注释讲解,虽然不多,却字字关键。
以本书第三章《虚拟内存》为例,首先即以图例表达出虚拟内存的本质(参见书中的图3-1),然后再以七页的篇幅内容向读者介绍了虚拟内存的优点、PDP11/40的虚拟内存机制。有了这些理论内容作为铺垫,再来学习UNIX的虚拟内存实现,自然就能水到渠成。作者对UNIX核心代码的分析非常自信,对每一段重要代码都有自己的看法与理解。从对malloc函数的分析可见一斑。首先给出函数原型与功能描述以及参数说明。在讲解参数map结构时,以图例方式(参见本书图3-20)介绍了map数据结构指向内存块的方式。接着,给出了malloc函数的代码,并对实现的算法与设计的原理给予了详细的描述,甚至以流程图方式(参见本书图3-21)剖析了malloc的执行流程。最后,再给出一个简单案例,分析malloc的使用,并以图例(参见本书图3-22和图3-23)说明函数执行的过程与结果。条理清晰,叙述得当,代码、文字与图例相结合,能够更好地帮助读者理解这些优雅但略显艰深的UNIX内核代码。通观全书,作者一直保持这样严谨却又不失生动的风格,图文并茂,增强了书的感染力。
本书的优秀还在于作者对主题内容的选择。作者面对的读者群应该是那些渴望深入了解操作系统原理与UNIX内核,希望提高编程能力、逻辑思维能力和算法分析能力的开发人员。如果选择某一厂商的UNIX系统,难免会顾此失彼。UNIX V6是现代各类UNIX操作系统的源头,包含了对进程管理与调度、内存管理、文件系统等的支持。了解了UNIX V6,可以说就是把握了类似Solaris、HP-UNIX等操作系统的命脉。本书的价值不仅于此,即使是无心UNIX技术的C程序员,也能够从本书提供的大量源代码以及代码阐释中有所收益,毕竟这些代码都是C语言的鼻祖Kenneth Thompson和Dennis Ritchie所编写。阅读大师作品,当然有助于我们的成长。无论是编码风格、编码习惯、高效编程以及各种巧妙技能的运用,包括大师的设计思想与原则,都散发出熠熠光辉。本书打开了这扇门,登堂入室的道路就需要读者自己的努力了。
“如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。”伟大的科学家牛顿如是说道。UNIX内核的代码能够开源,并为我们所用,是我们的幸运。站在大师级的UNIX开发高手的肩膀上,无疑让我们能够看得更远。而本书则是一把阶梯,可以帮助我们更加容易地攀爬上大师们的肩膀。如此而已,却又如此令人钦佩与赞赏。