山外看山 —— 评The Art of Unix Programming

原创 2004年10月21日 12:55:00


山外看山
评The Art of Unix Programming

作者:涩涩 http://blog.csdn.net/sese

 声明:本文发表于程序员杂志今年第9期,略有删节,非经杂志社和作者书面许可,请勿擅自转载部分或全部内容。

上世纪初,英国记者斯文顿天才地将内燃机、履带、武器和装甲这些风马牛不相及的东西结合,发明出了坦克——可以边移动边攻击的钢铁堡垒。在法国战场上,德军士兵被这看似笨重的玩意打得防不胜防、节节败退。在第一次世界大战后期的许多重要战役中,坦克都屡建奇功,某种意义上深刻地影响了一战的格局,被尊为“武器之王”。事隔多年,当我们再看到坦克的时候,却肯定不会再像当年的人们一样,大加赞叹榴弹炮加装甲履带是何等伟大的发明。这似乎应验了“静听不闻雷霆之声,熟视不睹泰山之形”的古语(刘伶《酒德颂》):人们总是会觉得已有的、习惯了的东西稀疏平常,不足为奇,似乎只是自己生不逢时,没有机会像斯文顿上校一般名留青史。

今天,当我们坐在Unix字符终端前,习惯地用管道重定向组织数个简单Unix程序的输入输出,完成复杂的任务(例如我就常用grep在make的提示中寻找编译错误的原因,再将结果保存到指定文件或是送到打印机),似乎谁也不会觉得这些简单的“|”, “<”,“>”符号背后有着怎样的学问。苏东坡的诗写道,“不识庐山真面目,只缘身在此山中”,伟大往往便蕴含在平凡之中身在Unix系统“此山中”的我们,对周遭的一切似乎早已习以为常,而难以看清“真面目”——领略当初Unix设计者们的过人智慧了。。Eric S. Raymond的这本书The Art of Unix Programming (以下简称TAOUP) ,就是要带着读者扶摇直上,凌驾香炉峰之颠,拨开云雾,一览千里庐山无限风光。

TAOUP的作者Eric S. Raymond(他总是喜欢以ESR为自己的代号)几乎要算是地球上最著名的黑客了。作为《黑客词典》的主要编撰人以及维护者,他被认为是黑客文化的“历史学家”和“人类学家”,也是最受大众传媒追捧的黑客。1997年之后,Raymond投身于随着伟大的开放源代码运动中,的发展,Raymond 并逐渐跻身开放源代码运动的领军人物行列。所谓“时世造英雄”,而由于开源运动的精神领袖Richard Stallman太过超凡脱俗,且有点“敏于行”却“讷于言”,在他为开源运动开山立派之后,却未能著书立说,将开源运动进一步理论化。历史于是选择了Raymond , 将为开源运动奠定理论基础这一伟大使命交给了他。Raymond陆续发表了以著名的开源运动宪章《大教堂和集市》为代表的五部曲,对开源社群产生根本性的影响。我只在国内校园网上广为流传的关于Linux的电影《Revolution OS》中一睹此君的真颜,他的音容笑貌实在让人跌破眼镜,远不如Stallman般“招摇”地有着一副标准黑客的外表,整个一副标准美国中年蓝领劳工形象,让人难以和他的惊人著述和言论联系起来,这倒是应了“人不可貌相,海水不可斗量”的老话。
Raymond的这本获得2004年的“软件生产力大奖”(Software Productivity Award)的著作由Addison-Wesley于2003年9月出版。该书写作过程历时五年,经过电子版广泛的“Beta测试”后才终于定稿,前后修改不下十次。Raymond颇有曹雪芹先生著《石头记》“披阅十载,增删五次”的风范,这种专业精神实在要让国内那些两个月出一本IT书的作者们汗颜无地了。

TAOUP一书计560页,分为四个部分共二十二章,四个部分分别是:Context(背景),Design(设计),Implementation(实现)和Community(社群),分别介绍了Unix的历史和哲学,Unix系统的设计原则和模式,Unix上的编程语言、开发工具等实现技术,和独特的Unix社群文化。全书的结构清晰,开讲于“形而上的哲学思想”,再详细讲解哲学指导下的“设计方针”,随后轻轻点出为实现这些设计而必须的若干“形而下的实现细节”,最后满足读者“看了鸡蛋还想看下蛋的鸡”(钱钟书语)的固有好奇,绕有兴致地介绍了Unix开发者的社群和独特的社群文化。

其实与其说TAOUP是一本Unix技术书籍,倒不如说这是一本有关Unix技术的哲学书和历史书,这点从出版社特地为之选择了颇具中国禅宗风格的封面便可以看出。作者在接受自由作家Robert McMillan采访时表示,“要较少地讲述 Unix 应用程序编程接口和如何完成工作的低层次细节,而要更多讲述设计模式和关于为什么应该以某种特别方式做事的高层次内容。”在这一点上,我认为Raymond做得相当成功:作为一本讲“Unix Programming”的技术书,全书几乎看不到一段源代码,作者一直是以一个技术历史学家和技术哲学家的立场,用带有文学气质的语言娓娓到来,使人如坐春风而丝毫不生厌倦。我甚至因为读这本书闹了个大笑话,在机场候机时读刚买的TAOUP入迷以致错过了换登机牌的时间而误了飞机,只好改签到次日才能成行,至今我的TAOUP里面还夹着这张贴着改期标签的机票,既做为书签,又给自己留一段有趣的回忆。

全书最值得一读的是第二部分关于Unix系统设计的部分,也是全书的重点所在,Raymond归纳了关于Unix系统设计中的十条基本原则,依次是:Modularity(模块性),Textuality(文本化),Transparency(通透性),Multiprogramming(多进程),Minilanguages(微语言),Generation(生成),Configuration(配置),Interfaces(接口),Optimization(优化),Complexity(复杂)。这些章节初读下来仿佛平淡,这些原则貌似也是老生长谈,但随着Raymond的条分缕析地加以阐释和引证,读者总是有一种大呼“原来如此”豁然开朗的感觉。TAOUP在写作风格上最为特别之处在于,Raymond在每阐述了一个原则或模式之后,马上会列举几个Unix系统上的例子来佐证,所选的例子不但生动地佐证了作者归纳的关于Unix的原则或模式,加深了读者的认识,而且让众多读者拓宽了关于Unix的知识范围,了解了许多原来不熟悉的 Unix特性或者软件工具。相信没有几个人对Unix领域的熟悉程度能和Raymond相比,他的推荐着实能让人开拓视野。同时,Raymond对例子的把握相当到火候,既能一针见血地说明问题,又点到为止,丝毫不觉冗繁。从模式的观点看,作者总结的这些原则构成了Unix系统的模式语言,它们不仅影响了Unix操作系统的构建,更影响了Unix上所有应用程序的设计,而Unix平台的使用者,在不知不觉间就浸淫在这些模式语言之间,当他们设计新的软件系统的时候,往往会不自觉地使用这些模式语言。在这本书中,读者便会发现这样一些事实,在许多非Unix软件的设计思路,其实依然滥觞于Unix系统的这些模式原则。因此,这本书的读者群不是仅限于Unix系统用户,每一个程序员都可以从中获益。

这本书的另一个特色是它的百科全书般的博大与庞杂,Raymond凭借他对Unix系统的无比熟悉,如同一位资深导游一般,游刃有余地带着一干读者在Unix系统地大观园里纵横捭阖、几出几进,时而历数各种开发工具,时而盘点众多文档格式,如数家珍般介绍着关于Unix系统的零零种种。如果没有一段时间的Unix经验的读者,恐怕真是要像刘姥姥一般感到晕头转向了;而如果你像我一样经常生活在Unix下,依然能够发现自己其实一直“视若无睹”地忽略了不少大观园里的景致。而当Raymond为你点开这些迷雾的时候,读者不禁要如梦初醒般大呼痛快了。

老子曰“天下皆知善之为善,斯不善已”。世上从来没有一样物事是完美的,更不会有一样物事能够得到世人交口称赞。网上关于此书一直争议不断,毁誉夹杂。关于TAOUP最有趣的一则批评来自Amazon上的一位匿名读者,他批评Raymond此书不过是一本“Autohagiography”,这个词由词根auto和hagiography组成,hagiography是圣徒传记,加上auto则成为“圣徒自传”。该读者对Raymond在书中表现出来的指点江山般的踌躇满志颇有微辞。不过我反倒激赏Raymond这般写书的气势,一方面,他的老资格黑客身份和他的开源运动领袖地位使他能够这样高屋建瓴,另一方面,此书得到了包括Ken Thompson(Unix和C语言发明者)、Jim Getty和Keith Packard(X11作者)等十余位Unix大佬的襄助和支持(书中不少文字出自他们笔下),这等阵容,想不霸气都难。这种感觉正如C++之父在Bjarne Stroustrup在著名的The C++ Programming Language开头就不无得意地写道“I invented C++, wrote its early definition, and produced its first implementation”,使得所有读者不得不服气地聆听教诲一样。相比于国内许多内容空洞又自以为是好板起脸孔训人的技术书籍,我宁可领教Raymond这种底气十足的激昂文字。不过TAOUP里还是有不少地方我不是十分认可,最突出的一点莫过于Raymond从写作《大教堂和集市》时候就染上的“癖好”,老是用他自己的fetchmail说事,几乎每个章节举的例子都有fetchmail,这确实也难怪人家要诘难他在写“圣徒自传”了。当然fetchmail本身并不坏,只是好比饺子好吃也不宜一年到头顿顿吃。还有一点便是Raymond似乎对面向对象思想以及各种面向对象的编程语言并非十分熟悉,再评论C++,Java的时候显得略有些力不从心。同时,关于Unix历史的描述稍显冗长而重点不够突出,显然不是每个读者都对一些闻所未闻的Unix非主流发行版本的来龙去脉感兴趣,那一段读起来稍微有点乏味。
在书的前言中,Raymond写道,这是一本讲“Why-to”的书,而不是“How-to”的书。我觉得,这是一本关于Unix“智慧”的书,而不是一本关于Unix“知识”的书,这是我读完全书后最大的感觉。尤其难能可贵的是,Raymond始终一如既往的理智、平静而且技术中立,没有如许多其他黑客(比如Stallman)一样,动辄流露出对于技术本身的强烈爱憎和狂热,我觉得这点对于这样一本关于技术的历史和哲学著作而言,显得尤为珍贵。TAOUP一书是我读过最棒的技术书籍之一,我相信这本书会成为Unix/Linux爱好者的圭臬;每一个对Unix感兴趣(事实上,我认为任何一个严肃的软件领域从业人员都没有理由漠视Unix),每一个希望从Unix系统这一二十世纪人类最伟大工程成就之一的杰作中汲取知识和智慧的人,都应当认真翻翻这本The Art of Unix Programming。

 

人生三重界---看山不是山,看水不是水

  宋代禅宗大师青原行思提出参禅的三重境界:参禅之初,看山是山,看水是水;禅有悟时,看山不是山,看水不是水;禅中彻悟,看山仍然山,看水仍然是水。   佛家讲究入世与出世,于尘世间理会佛理之真谛。人之一...
  • vince6799
  • vince6799
  • 2007年09月30日 14:23
  • 45679

《一天攻破K60》笔记(使用山外库5.3版本)

K60引脚功能表注意:本功能表只是阐述各个引脚支持的功能,具体引脚名称标注和排列方式以相应最小系统板为准 IAR工程的建立建立工作空间File->New->WorkSpace建立工程Project-...
  • lczdk
  • lczdk
  • 2016年12月27日 01:11
  • 6561

2017知乎看山杯总结(多标签文本分类)

关于比赛详情,请戳:2017 知乎看山杯机器学习挑战赛代码:https://github.com/yongyehuang/zhihu-text-classification 基于:python 2....
  • Jerr__y
  • Jerr__y
  • 2017年08月31日 21:59
  • 5026

看书的三重境界(摘编)

人生参禅,有那关乎山水的三重境界,你我共知。然而,山水存于静态,领悟却是个变化沉淀的过程。正如考试之于会计人——考试是山,是水,又不只是山水,是吸收、领悟、转换知识的过程。   “等到风景都看透,让...
  • aerchi
  • aerchi
  • 2015年06月21日 10:57
  • 482

【世外桃源】福音节目 swtychina.com

今天小编满怀热情,带着激动地心情,颤抖的双手,以“大无畏的精神,高山仰止的情操”为大家郑重推荐很好的一个福音节目: 《世外桃源》...
  • frogoscar
  • frogoscar
  • 2015年06月08日 17:35
  • 1065

山外论坛每日一贴的学习

要点1:          const int *p; // p 可变,p 指向的对象不可变         int const *p; // p 可变,p 指向的对象不可变         i...
  • u014183377
  • u014183377
  • 2015年01月24日 17:22
  • 1786

学习笔记 山外K60库图像解压函数原理(底层代码详解)

图一 用户调用的函数 图二 山外K60库底层函数原图像imgbuff数组中0表示白色,1表示黑色,转化为img数组后255表示白色,0表示黑色。底层库中img_extract函数运行流程如下...
  • julengdong2179
  • julengdong2179
  • 2017年11月24日 00:12
  • 70

#山外K60函数&nbsp;&nbsp;FTM_PWM_…

void FTM_PWM_Duty(FTMn_e ftmn, FTM_CHn_e ch, uint32 duty) {     uint32 cv;        注:定义cv为无符号长整型,32位 ...
  • Washxin
  • Washxin
  • 2017年06月17日 11:42
  • 678

the art of unix programming--笔记(chap12)

chap 12 optimizationpremature optimization is the root of all evel--C.A.R.Hoare这一章我是认为正本书第二好的一章,最好的当...
  • ccanan
  • ccanan
  • 2007年07月30日 11:47
  • 989

程序性能优化探讨(5)——高速缓存、存储器山与矩阵乘法优化

高速缓存、存储器山与矩阵乘法优化
  • u013471946
  • u013471946
  • 2014年12月24日 15:19
  • 1696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:山外看山 —— 评The Art of Unix Programming
举报原因:
原因补充:

(最多只允许输入30个字)