Unix哲学

软件开发用语

Unix哲学是一套基于Unix操作系统顶级开发者们的经验提出的软件开发的准则和哲学。

来源

UNIX 哲学由 Doug McIlroy 在1978年的《Bell System Technical Journal 》中发表:[1]

McIlroy:A Quarter Century of Unix

道格拉斯·麦克罗伊是Unix系统上管道机制的发明者,也是Unix文化的缔造者之一。他归纳的Unix哲学如下:

程序应该只关注一个目标,并尽可能把它做好。让程序能够互相协同工作。应该让程序处理文本数据流,因为这是一个通用的接口

更加简化的版本是:只做一件事,将其做至极致。虽然只有第三条是特指Unix系统的,但Unix开发者们常常同时强调这三个信条。

Pike:Notes on Programming in C

罗勃·派克在他的《Notes on Programming in C页面存档备份,存于互联网档案馆)》中提到了以下格言。虽然这些规则是关于程序设计的,但作为Unix哲学丝毫不为过:

  1. 你永远不会知道你的程序会在什么地方耗费时间。程序的瓶颈常常出现在意想不到的地方,因此在你确信找到瓶颈后再动手优化英语Optimization (computer science)代码吧。
  2. 测试代码。只有在你详细测试了代码,并且发现一部分代码耗费了绝大部分的运行时间时再对程序作速度优化。
  3. 功能全面的算法(fancy algorithm)在处理小规模问题时效率很低,这是因为算法时间效率中的常量很大,而问题往往规模很小。除非你知道你遇到的常常是复杂的情况,否则就让代码丑陋但是简单而高效吧。(即使问题规模确实很大,也首先尝试第二条规则。)
  4. 功能全面的算法比简单的算法更容易产生bug,更难实现。尽量使用简单的算法和数据结构
  5. 数据决定一切。如果选择的数据结构能很好的管理数据,算法部分往往不言自明。记住,数据结构,而非算法,才是编程的关键。
  6. 没有第六条规则。

派克的第一、二条规则重申了高德纳的著名格言:“过早的优化是一切罪恶的根源。”[2] 派克的第三、四条规则被肯·汤普逊改述成:“疑惑不定之时最适合穷举。”事实上,这两条规则也是KISS原则的具体表现。规则五在之前Fred Brooks人月神话中也被提及。乔恩·本特利的《Programming Pearls英语Programming Pearls》中也有一章阐述了相同的设计哲学。此规则作为“如果你的数据结构很好,那么控制它的算法就无关痛痒了”的例子常常被简化成“简约地写代码,聪明地用数据”。第六条规则当然只是派克针对蒙提·派森之小品Bruces sketch英语Bruces sketch的幽默发挥而已了。

Mike Gancarz的《UNIX哲学》

1994年,X窗口系统开发组的成员Mike Gancarz根据他自己的Unix系统经验以及和其他领域使用Unix系统的资深程序员们的讨论结果,写成了The UNIX Philosophy,提出了9条训格之言:

  1. 小即是美。
  2. 让程序只做好一件事。
  3. 尽可能早地建立原型。
  4. 可移植性比效率更重要。
  5. 数据应该保存为文本文件
  6. 尽可能地榨取软件的全部价值。
  7. 使用shell脚本来提高效率和可移植性。
  8. 避免使用可定制性低下的用户界面。
  9. 所有程序都是数据的过滤器。

此外还有十条原则则并不为所有人认同,甚至还是争论的焦点(如宏内核微内核之争):

  1. 应该允许用户定制操作环境。
  2. 让操作系统核心小而轻。
  3. 使用小写字母并尽量简短。
  4. 节约纸张,保护树林。
  5. 沉默是金。
  6. 并行地思考。
  7. 部分加部分大于整体。
  8. 寻找问题的帕雷托法则
  9. 程序随需求而增长(更糟就是更好)。
  10. 层级地思考。

糟糕的更好

理查德·P·加布里埃尔英语Richard P. Gabriel提议Unix的一个关键优势是他称作“糟糕的更好”的设计哲学。在“糟糕的更好”的设计风格下,接口和实现的简单性比系统的任何其他属性都更重要,包括准确性、一致性和完整性。加布里埃尔主张这种设计风格拥有关键的进化优势,尽管他也怀疑一些结果的质量。

参考文献

引用

  1. ^ Doug McIlroy, E. N. Pinson, B. A. Tague. Unix Time-Sharing System: Foreword (PDF). The Bell System Technical Journal. Bell Laboratories: 1902–1903. 8 July 1978 [2019-10-06]. (原始内容 (PDF)存档于2022-04-27).  参数|journal=与模板{{cite web}}不匹配(建议改用{{cite journal}}|website=) (帮助)
  2. ^ Knuth, Donald: Structured Programming with Goto Statements页面存档备份,存于互联网档案馆). Computing Surveys 6:4 (1974), 261–301.

来源

外部链接

参见