[总结]Unix设计哲学 <<Unix编程艺术>>

转载请注明出处:http://blog.csdn.net/horkychen

学习了<<Unix编程艺术>>第一章关于哲学的部分, 做个汇总.

现在对精简设计, 舍弃华而不实是普遍认可的。但早在Unix发展的时期, 这一条原则却是在实践中不断提炼出来的. 这就是最为根本的一条:
  KISS - Keep it Simple, Stupid!  这句话其实常见, 尤其是花过功夫学习英文的朋友. 而这个原则可以应用在生活的各个方面. 这一原则是历经多少项目的检验结果, 而我们正是站在一位巨人的肩膀上直接看到现在的理所当然的基本规则.

如何翻译呢? 我觉得字面上是"简洁, 朴实", 精神上可以相较于"大智若愚", 哲学上则相似于:"生一,生二, 二生三, 三生万物"中的"道". 这就是Unix最为基本的哲学. 人生也不过如此.

太玄! 再从基础展开.

首先, Unix从发展之初,就注重实效, 立足于经验, 工作方式是自下而上的. 也就是它强调个人的能力体现, 而不是遵循条条框框. 正因为如此, 那个时期各个领域涌现出一大批影响深远的大师. 这就是百家争鸣的结果. 

作者总结了Unix哲学中的17条原则:
 1. 模块原则: 使用简洁的接口拼合简单的部件.
 2. 清晰原则: 清晰胜于取巧. 设计有可能从简单到复杂,但最终一定再回归到简单.
 3. 组合原则: 设计时考虑拼接组合.
 4. 分离原则: 策略同机制分离, 接口同引擎分离.
   很多设计模式都可以看到这一原则的影子. 目的为解耦, 中心是要模块的职责清晰. 在Unix世界常见的应用就是将某个系统功能分为前端和后端.
 5. 简洁原则: 设计要简洁, 复杂度能低则低.
 6. 吝啬原则: 除非确无它法,不要编写庞大的程序. 让程序只做一件事。
 7. 透明性原则: 设计要可见, 以便审查和调试.
 8. 健壮原则: 健壮源于透明与简洁.
 9. 表示原则: 把知识体现在数据结构上, 以追求逻辑质朴且健壮.
   不要让复杂的数据定义破坏你优雅的设计.
 10. 通俗原则: 接口设计避免标新立异.
 11. 缄默原则: 如果一个程序没什么好说的,就沉默.
 12. 补救原则: 出现异常时,马上退出并给出足够错误信息.
 13. 经济原则: 宁花机器一分, 不花程序员一秒. (我最喜欢这一条.)
 14. 生成原则: 避免手工hack, 尽量写程序去生成程序. 
   (patch算是13&14好的示例了)
 15. 优化原则: 雕琢前先要有原型, 跑之前先学会走. 按小步快跑的节奏展开.
 16. 多样原则: 决不相信所谓"不二法门"或"银弹"的断言.
 17. 扩展原则: 设计着眼未来, 未来总比预想来得快.

不过,如果你固守这些条条框框, 大谈Unix哲学, 你可能已经偏离了真正的所谓Unix哲学了。 Unix最为崇尚的是实用至上, 拿来主义(SPOT "真理的单点性"原则,DRY更直接!)。 这些原则就是经验总结,代表的是过去,仅供参考. 形式永远只是形式. 

既然作者以Unix哲学比较禅宗,但我们也来思考一下. 寒冬下的寺庙内三位和尚:
 1. 未加忍耐, 劈开佛像取暖.
 2. 经忍耐后, 劈开佛像取暖.
 3. 自己冻死, 保住佛像.
你觉得谁已经开悟了?  想清楚这个问题, 就可以很容易理解作者最后提到的"态度也要紧"!

*还要清楚的认识到, 这些总结出来的原则是从成功的项目中总结出来的, 那些不成功的项目以及追求编程艺术化的努力不知道能不能数得清了. 现在的Unix和Unix-Like的系统都是逐步演化的结果. 其实我是不认为这里有什么新的哲学,终归还是回到基础的方法论上了。

程序就是程序,仅此而已!

时间: 2024-09-22 14:55:01

[总结]Unix设计哲学 &lt;&lt;Unix编程艺术&gt;&gt;的相关文章

unix设计哲学

说到Unix为我们所带来的软件开发的哲学,我必需要说一说.Unix遵循的原则是KISS(Keep it simple, stupid).在http://en.wikipedia.org/wiki/Unix_philosophy 上有很多的基本上大同小异的Unix哲学,都是很经典的.   Doug McIlroy 是认为UNIX的哲学是这样的:三条哲学,简明扼要,就是这三条哲学贯穿着整个Unix世界.尤其是第一条"do one thing and do it well"真是相当精彩!  

《Unix编程艺术》重读笔记(二)

软件设计有两种方式:一种是设计得极为简洁,没有看得到的缺陷:另一种是设计得极为复杂,有缺陷也看不出来.第一种方式的难度要大得多. 模块化代码的首要特质就是封装,API在模块间扮演双重角色,实现层面作为模块之间的滞塞点,阻止各自的内部细节被相邻模块知晓:在设计层面,正是API真正定义了整个体系. 养成在编码前为API编写一段非正式书面描述的习惯,是一个非常好的方法. 模块的最佳大小,逻辑行200-400行,物理行在400-800之间. 紧凑性就是一个设计能否装入人脑中的特性.测试软件紧凑性的一个简

我来说说Android touch 系统的设计哲学

环境 设备:nexus4 ,系统:Android4.4.2,源代码:Android api 19, debug工具: android studio. 目的 分析Android的touch传递机制,为实现各种hack效果(比如继承listview,实现下拉刷新效果)和复杂的交互效果提供理论支撑. 研究对象 activity . viewGroup.view的子类. Android对touch系统的设计哲学 touch事件包括DOWN MOVE UP 三类基本事件,touch系统里面(这里除去Act

lcd设计电子时钟protues ,keil编程

问题描述 lcd设计电子时钟protues ,keil编程 以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:使用字符型LCD显示器显示当前时间.显示格式为"时时:分分:秒秒".用4个功能键操作来设置当前时间.功能键K1-K4功能如下. ?K1-进入设置现在的时间. ?K2-设置小时. ?K3-设置分钟. ?K4-确认完成设置. ?程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示"00:00:00",然后开始计时.c语言编程 解决方案

《指针的编程艺术(第二版)》一第一篇 C语言篇

第一篇 C语言篇 指针的编程艺术(第二版)C语言最早是在AT&T(American Telephone and Telegraph,美国电话与电报公司)内部使用的语言,但为了发布UNIX操作系统,不得不公开这一程序语言.主导这语言的两个灵魂人物,分别是Dennis Ritchie与Brian Kernighan.ANSI C已于1989年公布.Dennis Ritchie生于1941年,哈佛大学数学博士,是C语言之父.Brian Kernighan目前在普林斯顿大学计算器科学系(Departme

《指针的编程艺术(第二版)》一3.7 命令行参数

3.7 命令行参数 指针的编程艺术(第二版)在C程序语言中,函数是平等的,而main() 函数是程序的进入点.在执行程序时可以附加一些选择项,这有点类似早期DOS(现称为命令行参数模式)的指令或UNIX的指令,如DOS的dir/w,其中的/w为一个选择项,表示当执行dir指令时,是以wide的模式输出,如UNIX下的 ls -l –a``` ls与dir指令具有相同的功能,其中-l和-a都为附加的选择项. 假设有个排序的程序,并且在此程序中有递增(由小至大)和递减(由大至小)的功能.不同的用户,

重读《JavaScript DOM编程艺术》(第一版)

今天来了雅兴去图书馆看书.把<JavaScript DOM编程艺术>温习了一遍,平时写js的机会不是特别多,很多知识都有些模糊了. 伴随着身边键盘卡啦卡啦的声音,一位手速不是一般的快的程序猿.我也快速的回顾了下~ Chapter 1     JavaScript简史 1.Netscape(网景)/Sun公司 2.JavaScript 1.0 - Netscspe Navigator 2 3.VBScript - IE 3 4.ECMA标准化 - 浏览器之争 5.什么是DOM? W3C 文档对象

JavaScript DOM编程艺术问题

问题描述 JavaScript DOM编程艺术问题 新手初学JavaScript,第十章moveElement实验是碰到一个error, moveMessage的第三行报Uncaught TypeError: Cannot read property 'style' of nullmoveElement,自己尝试了一下断点调试,发现第一次运行moveMessage函数不会报错,第二次递归调用的时候就会报这个错,新人求助,html代码传上来标签就看不到了,无奈只好发图 addLoadEvent.j

《指针的编程艺术(第二版)》一3.5 指向数组的指针

3.5 指向数组的指针 指针的编程艺术(第二版)ptr[4] 和 (ptr)[4] 所表示的意义是不同的.ptr[4]已在前面讨论过了,而(*ptr)[4]是指向数组的指针(pointer to array){XE "指向陣列的指標(pointer to array)"},表示ptr是一指针,指向一个有4个元素的数组,其实它也可视为是一个二维数组ptr[][4],因为和[]是互通的,我们以范例pointerToArray-1来说明. 范例pointerToArray-1 / point