这本书被称为Unix世界"教外别传"的心法,此言不虚!
大家都公认主流的IT文化就是Unix的文化。此书对这种原来靠言传身教和源代码流传的文化进行总结。是一本深入到文化精髓,值得仔细反复玩味的经典。 同时书中还有很多坊间故事,对Unix历史发展历史的梳理,案例的分析等。有助于了解历史的脉络,深入理解文化精髓的奥秘。
翻阅此书不时能发现一些或让人眼前一亮,或茅塞顿开,或醍醐灌顶,或沉思良久,亦或莞尔一笑之处。
现将印象深刻的几点做一小结。
- 明示胜于隐喻
这是一条Unix发展过程中非常重要的原则。在实现方面体现在采用文本化的协议,文本化的配置,反对专有软件。提倡能够使用最普通的文本工具即可读取与修改;也体现在提倡代码的开源(提高对程序员用户的透明度),反对二进制的封闭。
这种文化的内涵乍看不过尔尔,细想其实不然。比如没有受过unix文化熏陶的人(比如在下)在通讯协议上,往往会采用基于二进制的格式。而二进制的协议导致不得不依靠专有工具才能阅读与调试,大量专用代码与工具的产生。稍有不慎,常常会落得不可扩展的结果。而文本化的协议,几乎避免了绝大部分这种情况。从HTTP协议及大量基于HTTP协议的扩展协议可见一斑。
这种文化不尽在Unix上发扬光大,而且在其之上发展起来的编程语言也深受影响。比如所谓的Python之禅中就明确“ 明了胜于晦涩”。
- 数据重于算法
"程序=数据结构+算法"是一个众所周知的公式。这一公式虽然有名却未必获得了真心实意的应用。现代主流编程思想更多的体现在OO方面,在算法方面。而对数据的关注较少。
先辈们已经在结构方面发展出大量方法和技术,比如数据流图,数据字典,ER,甚至关系型数据库等等等等。这些方法可以非常自然,非常直接的反映出现实世界的模型。有时候比OO更加直接与明朗。
举个例子,在OO方法里,有一个非常著名的通过找名词,动词来确定对象及其方法的技术。然而真正运用这些方法的话,就会发现找出来的对象往往莫名其妙,名称怪异。甚至会陷入到一个词究竟是名词、动词还是形容词的纠结当中。这完全是把宝压在了从不精确的自然语言提炼精确的OO表达之上。语言是否能够完全描述现实都不一定,从其上提炼出来的对象就更可想而知了。
换个角度,如果从数据的视角来看,几乎能够将现实世界的某些模型直接映射到数据上来。这个过程精确而直接。
- 现有实现再有标准
标准的制定必须要有实现的验证。据说X标准是与其实现同步编写的,在此之后标准几乎没有变化。
- 除非必要,绝不写庞大的软件
一个软件应该专注于其所面对的核心功能,其他功能尽量能够借助已有的工具/库来完成。提倡编写短小精悍,功能足够的小型软件。除非别无选择。
这一原则背后还有Unix通过管道,重定向等基础设施构建起来的上下文环境管理的支撑。这两者相辅相成,最终让Unix成为一个最好用的开发平台。也有助于培养程序员协作,共享,专注的思维。
- 烂代码就要扔掉
众所周知,维护烂代码远比重写编写的成本要高。在Unix文化里对烂代码从不姑息,现在流下来的代码都是经过历史考验遗留下来的。都是非常优秀的代码。
这一原则给我们大胆重构,重写提供了底气。但动手之前,一定要有足够的理由认定这是维护代价高昂的烂代码,而不是出于对_别人的代码不可靠,只有我的才是最棒_的心里因素。