基本信息
编辑推荐
公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond倾力多年写作而成
内容涉及覆盖范围广且深邃,完全展现了作者深厚的经验积累和领域智慧
内容简介
作译者
目录
序 xxv
part I 1
第1章 哲学 3
1.1 文化?什么文化 3
1.2 Unix的生命力 4
1.3 反对学习Unix文化的理由 5
1.4 Unix之失 6
1.5 Unix之得 7
1.5.1 开源软件 7
1.5.2 跨平台可移植性和开放标准 8
1.5.3 internet和万维网 8
1.5.4 开源社区 9
1.5.5 从头到脚的灵活性 9
1.5.6 Unix hack之趣 10
1.5.7 Unix的经验别处也可适用 11
1.6 Unix哲学基础 11
1.6.1 模块原则:使用简洁的接口拼合简单的部件 14
1.6.2 清晰原则:清晰胜于机巧 14
1.6.3 组合原则:设计时考虑拼接组合 15
译者序
《The Art of UNIX Programming》,简称TAOUP,作者Eric S. Raymond,简称ESR。这大概是计算机类书籍中很少见的一本课外读物。TCP/IP编程之类典型Unix编程书中讲到的东西在这本书里面找不到,所以书里讲到的当然就是别的书里找不到的东西。读者也许需要有相当的Unix背景、或者长期钻研某个专题,才能体会到作者的弦外之音。ESR作为老牌黑客信手拈来的典故,如果不是在Unix里面长期浸淫,大概很难有所共鸣,所以把这当作Unix的一部坊间史话倒也合适。
本书总结了历史上Unix众多成功的经验和失败的教训、经时间考验和临时搭救的编码策略、大众喜爱和小众受用的实用工具;一些被跨国界信仰地广泛接受,一些则在不同环境中各有见地。被TAOUP总结为失败的,也许恰恰是某些工程的保命神药;总结为成功的,也许正好是压垮另一些工程的最后一根稻草。情景各异而已。书是写给程序员看的,因此很多观点都太过技术味儿,比如所见即所得的编辑器不如手写标记的纯文本更直接——90%的人会想:这怎么可能?!
这本书是给读者增长见识的,很多案例分析不管结论如何,读者都可以从中见到红蓝两方的思维方式和行事方法,以及各方高手看待问题的角度。无论成功还是失败,都只是一念之间,而读者只需要体味出这些对自己过去的、手头的、未来的项目可以有何种借鉴,便已得其中三昧。
网络上关于TAOUP的书评甚多,正负反响各有不少,负面评价大体集中在认为作者视角较窄、对商业公司有偏见以及过分抬爱自己的fetchmail几方面。我个人的感觉,Unix、尤其是开源Unix上有太多好用的工具极欠雕琢,目标受众太过技术。ESR并未回避这些,读者不妨多留意为数不多的痛切之笔。
本书翻译经历一年多的时间,之前我曾经约略翻过纸版,偶尔见到一些合我胃口的言论,于是心有灵犀认为这书不错;然而等到译到中途,便发现ESR实在是个美国愤青,这便是课外读物和工本教程给读者的不同感受了。翻译的过程对译者是精读的过程,但希望读者能用它打发堵车、候机、等人时的无聊时间,这书适合从任何一篇翻起。
翻译过程颇为艰辛:何蔡两位初译,由我统稿。书中寻章摘句之处,我们尽力将其还原。书名保持原文并给出译名,人名不译,专有名词给出原文,特意不加入任何译注。相关背景常识、翻译感受以及付梓后的任何问题,可以在中译版网页上与我们交流。这一年间,侯捷老师的推荐,周筠老师、方舟和兴璐两位编辑、何蔡二位给我的莫大帮助和宽容使得本书最终面世;身边诸位好友同事也不同程度地在各个技术方面给予指导和支持,尤其感谢bz、主任、delphij、kola几位。我的爱人王冰陪我加班,容忍我对程序的沉迷,给我心灵的温暖,是我翻译这本书的力量源泉。
KISS。
姜 宏
2005年12月于北京
序言
Unix is not so much an operating system as an oral history.
与其说Unix是个操作系统,不如说是一部口述历史。
——Neal Stephenson
知识和专能差异巨大,凭借知识可以推断出该做什么,而专能让你甚至在无意之间,条件反射似的把事情做好。
这本书确实有关“知识”,但更着眼于“专能”。你将学到那些Unix专家们都不自知的Unix开发知识。少一点技术,多一些共享文化:显见和隐微的,直观和潜流的——这是本书和大多数Unix书籍不同的地方——不止于方法,更重乎理念。
理念于实用大有裨益,有太多设计不良的软件:体积臃肿,难于维护、移植和扩展——这些都是蹩脚设计的症候。我们希望本书的读者能品出什么是Unix所教示的良好设计。
本书分为四部分:场景、设计、工具和社群。第一部分(场景)涉及哲学和历史,为后续内容埋下伏笔。第二部分(设计)将Unix哲学的原理细分为有关设计与实现的、更专门的建议。第三部分(工具)着眼于Unix所提供的工具,可助你解决问题。第四部分(社群)则讲述人与人之间的事务与约定,而这正是Unix文化拥有高效能的原因。
这本书是关于共享文化的,我从未想像过独自完成它。你会发现正剧中包含数位Unix资深专家的客串演出,正是这些人塑造了Unix的习俗。本书曾有过公开大范围的审阅过程,这期间我邀请这些明星人士对书稿进行评审与研论。这些意见没有湮没在本书定稿中,而你可以在书中聆听到他们的真实声音:无论是为本书呐喊助阵、还是摇头反对。
本书中用到人称“我们”时,我并不是虚张声势,仅以此说明这是整个社群都清楚明了的事实。
因为本书着力传递文化,因此加入了很多野史和坊间传说,这在技术书中并不多见。希望你喜欢,这些东西其实是Unix程序员的教养。须弥不重,芥子不轻。我们希望以这种方式更好地讲述故事。了解Unix的由来和变迁,会培养你对Unix风格的直觉。
同样地,基于此,我们不打算使用回述历史的腔调。你会发现本书参考了众多时下信息。我们不希望给你一种错觉:书里说的都是亘古不变的终极真理。参考时下的信息这一做法,也提醒读者,三十年河东,三十年河西,眼前所见,也许过不了多久就会过时,而需要重新检省。
另外,本书不是C教程,不是Unix命令和API的手册,不是sed/yacc/Perl/Python的语言参考,也不是网络编程入门,更不是巨细靡遗的令人费解的X指南。本书也不打算带你巡游Unix内幕和体系。有很多其它的好书涵盖这些领域,本书会在适当的时候告诉你该看哪些。
在这些技术细节外,Unix文化有一个未见诸笔端的行工传统,以熟练工的考量,它已经有几百万人年的发展 。本书即立足于这样一个信念:领会此传统,并将它的设计手法应用到手边,你将成为更好的程序员和设计师。
构成文化的是人,一直以来,获知文化的方式大约是口口相传、潜移默化。本书不打算取代人际的文化传播,但可以促进这一过程,使你能俯耳倾听他人的心声。
谁应该看这本书
如果你是个Unix编程老手,经常教导菜鸟,或者与人进行操作系统论战时无法阐明使用Unix方案所带来的好处时,可以看看这本书。
如果你是个C、C++或者Java程序员,有其它操作系统的开发经验,现在轮到你开展一个Unix项目时,可以看看这本书。
如果你是个初级或者中级水平的Unix用户,但是没什么开发经验,想学习在Unix下如何高效地设计软件时,可以看看这本书。
如果你不在Unix下编程却发觉Unix的传统给你带来某种启迪,那你就对了,Unix哲学适用于其它的操作系统。因此我们会花比其它Unix书籍更多的篇幅关注非Unix环境(特别是微软的操作系统);当所用到工具或者案例可用于其它操作系统时,我们会告诉你。
媒体评论
——KentBeck.Extreme Programming Explained,Test Driven Development和Contributing to Eclipse的作者
“令人愉悦陶醉的读物,给任何OS的程序员上了解决问题之道的一课。”
——BruceEckel,Thinking in Java和Thinking in C++的作者
书摘
terminfo本身使用文件系统作为一个简单的层级数据库。这种偷懒相当具有建设性,符合经济性原则和透明性原则。这意味着对文件系统进行浏览、检查和修改的所有普通工具都可以用于对terminfo数据库进行浏览、检查和修改;无需编写和调试专用工具(用于打包和解包单个记录的tic(1)和infocmp(1)工具除外)。这也意味着要加速数据库的访问就得要加速文件系统本身,知道这一点可以使更多应用程序受益,而不仅仅是curses(3)的用户。
这种结构还有另外一种优点,但在terminfo例子中没有展示出来:你开始使用Unix的授权机制而不用自己编写带来额外bu9的访问控制层。这也是采纳而不是对抗Unix“一切皆文件”基本原则的结果。
terminfo目录的布局在大多数Unix文件系统上都很浪费空间。每条目长度通常在400~1400字节之间,但是文件系统通常为每一个非空磁盘文件至少分配4k的空间。出于选择压缩二进制格式的同一个原因,即为了把terminfo使用的程序的启动延时降到最小,设计者接受了这个代价。同一价格所能买到的磁盘容量已经猛增了一千倍,更能证明这个决定的正确。
比较这种格式和Microcsoft Windows的注册表文件所用的格式很有启发意义。注册表是Windows本身及应用程序都使用的属性数据库。所有注册记录都存放在一个大文件中。注册记录既包含文本也包含二进制数据,需要专用的编辑工具。别的不说,这种“一个大文件”的方法还导致了臭名昭著的“注册表蠕变”现象;平均访问时间随着新记录的加入而无限上升。因为系统没有提供标准APl来编辑注册表,应用程序本身使用专用代码编辑注册表,使得注册表极易受损,甚至能够锁定整个系统。
使用Unix文件系统作为数据库是一种策略,对数据库要求简单的其它应用程序可以效仿并从中受益。不这样做的充分理由通常与性能问题无关,更可能的情形是数据库关键字不太适合做文件名。无论如何,这是在原型设计时非常有用的一种很好的快速编程方法。
6.1.7 实例分析:Freeciv数据文件
Freeciv是一款受到Sid Meier经典的Civilization H启发而制作的开源策略游戏。在该游戏中,每个玩家从一群到处流浪的新石器游牧民开始缔造一个文明。玩家的文明可以探索并拓殖世界,参与战争,从事贸易和研究先进技术。有些玩家实际上可能是人工智能;和这些电脑玩家玩单机游戏很有挑战性。如果谁统治了整个世界,或者第一个研制出先进技术从而获得宇宙飞船飞往半人马座阿尔法星(Alpha Centauri),谁就是游戏的胜利者。源码和文档可以在处获得。