若是在我目前的职业生涯中要选出一本对我影响最大的书籍,我必定会选择ESR的《UNIX编程艺术》。第一次读此书时资历尚浅,更多的是当作一本课外读物来看,可是随着职业中接触了更多不一样的操做系统,完成了更多项目产品的设计、架构、实现,对书中所讲内容产生了更大的共鸣。在第三次读此书之际,把书中不少有价值的思想提取出来给本身一个总结,但愿也能给你们带来一次分享。程序员
本书关注的重点:不止于方法,更重乎理念。知识(方法)和专能(理念)差别巨大,凭借知识能够推断出该作什么,而专能让你甚至在无心之间,条件反射似的把事情作好。编程
看看UNIX的生命力:今天,化生为Linux、BSD、Solaris、MacOS X以及好几个其它变种的Unix,使其史无前例的强大。UNIX这种稳定并且强大的生命力会让你的知识投资更趋稳定。windows
UNIX的设计理念:最终用户永远比操做系统设计人员更清楚他们究竟须要什么。它提供的是机制,而非策略。,虽然这种自由放纵主义风格会让它失去不少非技术型用户。但从长远来看,这是个优点,由于策略相对短寿,而机制才会长存。架构
对windows的批评:在这样的操做系统中,完成操做系统预见的任务很容易,可是完成其没有预料到的任务,用户不是机关用尽就是痛苦不堪。但UNIX却具备很是完全的灵活性。ide
UNIX的hack之趣:对于程序员和开发人员来讲,若是完成某项任务所需付出的努力对他们是个挑战却又刚好又在力所能及的范围内,他们就会以为颇有乐趣。所以,趣味性是一个峰值效率的标志。充满痛苦的开发环境只会浪费劳动力和创造力;只会在无形中耗费大量时间、资金、机会。性能
Unix哲学是自下而上的,而不是自上而下的。Unix哲学注重实效,立足于丰富的经验。你不会在正规方法学和标准中找到它,它更接近于隐形的半本能的知识,即UNIX文化所传播的专业经验。学习
模块原则:使用简洁的接口拼合简单的部件优化
计算机编程的本质就是控制复杂度。操作系统
用清晰的接口把若干简单的模块组合成一个复杂软件。如此一来,多数问题只会局限于某个局部,那么就还有但愿对局部进行改进而不至牵动全身。设计
清晰原则:清晰胜于机巧
维护如此重要而成本如此高昂;在写程序时,要想到你不是写给执行代码的计算机看的,而是给人——未来阅读维护源码的人,包括你本身——看的。
组合原则:设计时考虑拼接组合
在输入输出方面,Unix传统极力提倡采用简单化、文本化、面向流、设备无关的格式。
分离原则:策略同机制分离,接口同引擎分离
简洁原则:设计要简洁,复杂度能低则低
来自多方面的压力经常会使程序变得复杂,其中一种就是来自技术上的虚荣心理。
过分的复杂性每每来自项目的要求,而这些要求经常基于当月的推销热点,而不是给予顾客的需求和软件实际能提供的功能。
要避免这些陷阱,惟一的办法就是鼓励另外一种软件文化,以简洁为美,人人对庞大复杂的东西群起而攻之——这是一个很是看重简单解决方案的工程传统,老是设法将程序系统分解为几个可以协做的小部分,并本能的抵制任何用过多噱头来粉饰程序的企图。
吝啬原则:除非别无他法,不要编写庞大的程序
透明性原则:设计要可见,以便审查和调试
由于调试一般会占用四分之三甚至更多的开发时间,因此一开始就多作点工做以减小往后调试的工做量会很划算。一个特别有效的减小调试工做量的方法就是设计时充分考虑透明性和显见性。
健壮性:健壮源于透明和简洁
表示原则:把知识叠入数据以求逻辑质朴而健壮
数据要比编程逻辑更容易驾驭。因此接下来,若是要在复杂数据和复杂代码中选择一个,宁愿选择前者。更进一步:在设计中,你应该主动将代码的复杂度转移到数据之中去。
通俗原则:接口设计避免标新立异
最易用的程序就是用户须要学习新东西最少的程序——或者,换句话说,最易用的程序就是最切合用户已有知识的程序。
缄默原则:若是一个程序没有什么好说的,就保持沉默
补救原则:出现异常时,立刻退出并给出足量错误信息
软件要尽量从容的应付各类错误输入和自身的运行错误。可是,若是作不到这一点,就让程序尽量以一种容易诊断错误的方式终止。
经济原则:宁花机器一分,不花程序员一秒
生成原则:避免手工hack,尽可能编写程序去生成程序
优化原则:雕琢前先得有原型,跑以前先学会走
90%的功能如今能实现,比100%的功能永远实现不了强。作好原型设计能够帮助你避免为蝇头小利而投入过多的时间。
先制做原型,再精雕细琢。优化以前先确保能用。
先给你的设计作个未优化的、运行缓慢、很耗内存可是正确的实现,而后进行系统地调整,寻找那些能够经过牺牲最小局部简洁性而得到较大性能提高的地方。
多样原则:决不相信所谓的“不二法门”的断言
扩展原则:设计着眼将来,将来总比预想快
要为数据格式和代码留下扩展的空间。
设计协议或者文件格式时,应使其具备充分的自描述性以即可以扩展。
全部的Unix哲学浓缩为一条铁律