UNIX 哲学基础

一个程序只做一件事,并做好。程序要能协作。程序要能处理文本流,因为这是最通用的接口。

尽量使用简单的算法配合简单的数据结构。

数据压倒一切。如果已经选择了正确的数据结构并且把一切都组织得井井有条,正确的算法也就不言自明。编程的核心是数据结构,而不是算法。

模块原则:使用简洁的接口拼合简单的部件。

计算机编程的本质就是控制复杂度。

排错占用了大部分的开发时间,弄出一个拿得出手的可用系统,通常与其说出自才华横溢的设计成果,还不如说是跌跌撞撞的结果。

汇编语言、编译语言、流程图、过程化编程、结构化编程、所谓的人工智能、第四代编程语言、面向对象、以及软件开发的方法论,不计其数的解决之道被抛售者吹得神乎其神。但实际上这些都用处不大,原因恰恰在于它们“成功”地将程序的复杂度提升到了人脑几乎不能处理的地步。

要编制复杂软件而又不至于一败涂地的唯一方法就是降低其整体复杂度————用清晰的接口把若干简单的模块组合成一个复杂软件。如此一来,多数问题只会局限于某个局部,那么就还有希望对局部进行改进而不至于牵动全身。

清晰原则:清晰胜于机巧

维护如此重要而成本如此高昂;在写程序时,要想到你不是写给执行代码的计算机看的,而是给人————将来阅读维护源码的人,包括你自己————看的。

在UNIX传统中,这个建议不仅意味着代码注释。良好的UNIX实践同样信奉在选择算法和实现时就应该考虑到将来的扩展性。而为了取得程序一丁点的性能提升就大幅度增加技术的复杂性和晦涩性,这个买卖做不得————这不仅仅是因为复杂的代码容易滋生BUG,也因为它会使日后的阅读和维护工作更加艰难。

透明性原则:设计要可见,以便审查和调试

软件系统的透明性是指你一眼就能够看出软件是在做什么以及怎样做的。显见性指程序带有监视和显示内部状态的功能,这样程序不仅能够运行良好,而且还可以看得出它以何种方式运行。

出于充分考虑透明性和显见性的目的,还应该提倡接口简洁,以方便其它程序对其进行操作————尤其是测试监视工具和调试脚本。

健壮原则:健壮源于透明与简洁

软件的健壮性指软件不仅能在正常情况下运行良好,而且在超出设计者设想的意外条件下也能够运行良好。

大多数软件禁不起磕碰,毛病很多,就是因为过于复杂,很难通盘考虑。如果不能够正确理解一个程序的逻辑,就不能确信其是否正确,也就不能在出错的时候修复它。

这也就带来了让程序健壮的方法,就是让程序的内部逻辑更易于理解。要做到这一点主要有两种方法:透明化和简洁化。

在有异常输入的情况下,保证软件健壮性的一个相当重要的策略就是避免在代码中出现特例。BUG通常隐藏在处理特例的代码以及处理不同特殊情况的交互操作部分的代码中。

模块性(代码简朴,接口简洁)是组织程序以达到更简洁目的的一个方法。另外也有其它的方法可以得到简洁。接下来就是另一个。

表示原则:把知识叠入数据以求逻辑质朴而健壮

即使最简单的程序逻辑让人类来验证也很困难,但是就算是很复杂的数据,对人类来说,还是相对容易地就能够推导和建模的。

数据要比编辑逻辑更容易驾驭。所以接下来,如果要在复杂数据和复杂代码中选择一个,宁愿选择前者。更进一步:在设计中,你应该主动将代码的复杂度转移到数据之中去。

应用UNIX哲学

  • 只要可行,一切都应该做成与来源和目标无关的过滤器
  • 数据流应尽可能文本化(这样可以使用标准工具来查看和过滤)
  • 复杂的前端(用户界面)和后端应该泾渭分明
  • 当且仅当只用一门语言编程会提高程序复杂度时,混用语言编程才比单一语言编程来得好
  • 宽收严发(对接收的东西要包容,对输出的东西要严格)
  • 过滤时,不需要丢弃的信息决不丢

标签: none

评论已关闭