Unix 哲学基础

也许你在开发过程中,从不同的同事、领导那获得过一些指导,如:

  • 要合理分层、控制软件复杂度
  • 过早优化是万恶之源
  • 设计要给未来留出扩展空间
  • 要遵循 KISS 原则
  • ......

这些建议有些是口口相传,有些来自于个人对实践的总结,都是一些自下而上的经验,十分珍贵,这些软件开发的指导思想都和 Unix 哲学不谋而合。


Unix 哲学基础

Unix 哲学是自下而上产生的,即先有实践,后有总结抽象。它注重实效,立足于丰富的经验。

Unix 不是遵循学院派的条条框框,小心翼翼设计出的易碎艺术品,而是脱胎于实践,经过精心打磨和实践检验的工程结晶。


没什么软件比操作系统还复杂

有的架构理论高高在上无法落地,但 Unix 设计哲学中的很多设计思想,很容易能对应到日常开发中,毕竟,有什么软件能比操作系统还复杂呢?我们日常开发中遇到的问题,在操作系统设计中可能已经遇到无数次了,从这个角度来说,Unix 的设计哲学值得每个程序开发人员学习。


Unix 哲学的一些零散描述

不同的 Unix 先哲曾在不同的场合,阶段性地描述过 Unix 的设计思想:

Unix 管道发明人、Unix 传统的奠基人之一 Doug Mcllroy 说过:

  1. 让每个程序做好一件事,不要往原程序中加入新功能而搞得复杂
  2. 假定每个程序的输出都会成为另一个程序的输入,哪怕那个程序还是未知的
  3. 尽可能早地将设计和编译的软件投入试用
  4. 工欲善其事,必先利其器

观点 1 指导我们功能拆分要正交,这种思想在模块、组件的设计中都有借鉴意义;观点 2 指导我们在设计接口时要简洁,不要有无关信息的干扰,这也是管道的核心思想,小到函数输入输出、大到微服务接口设计,都可以用得上;观点 3 在软件开发中也有很大的指导意义:要尽早开发出产品原型,投入试用并获得反馈,避免路子越跑越偏,最后进入死胡同;观点 4 告诉我们在开发中要充分利用已有的工具,提升开发效率,别重复造轮子。

后来他把这些哲学思想做了更简洁的提炼,即:
一个程序只做一件事,并做好。程序要能协作。程序要能处理文本流,因为这是最通用的接口。

最伟大的 C 语言大师之一,Rob Pike 从另外一个稍微不同的角度表述了 Unix 的哲学:

  1. 程序瓶颈通常出现在想不到的地方,除非你已经找到了,否则别乱改代码
  2. 没对代码进行估量,特别是没找到耗时的那部分之前,别去优化速度
  3. 花哨的算法在 n 很小时通常很慢,而 n 通常很小
  4. 花哨的算法更容易出现 bug,更难实现
  5. 编程的核心是数据结构,而不是算法

Rob Pike 从优化时机和代码可读性几个方向阐述了自己的编程原则。

从这些 Unix 先哲们的描述中我们可以发现,Unix 哲学不是那种高高在上的学院派理论,它很容易融入到我们的日常开发工作中。


结语

Unix 哲学的更多内容不是这些先哲口头表述出来的,而是由他们所做的一切,和 Unix 本身所作出的榜样体现出来的。作者总结了 Unix 哲学的十七大原则,这里就不一一列举了。


参考资料:

  1. 《Unix 编程艺术》—— Eric S·Raymond