知识卡片
Unix哲学的三个设计原则:统一接口、逻辑布线分离与透明实验
内容
Unix工具之所以能像水管一样自由拼接、组合出远超单个程序能力的数据处理任务,靠的不是巧合,而是三条设计原则的共同作用。一是统一接口:所有程序都用”文件”(一串有序字节流)作为唯一的I/O抽象,无论是磁盘文件、进程间通信通道还是设备驱动,都能共享同一个连接方式,这与URL和HTTP让互不相关的网站能彼此链接是同一类”统一接口”思想。二是逻辑与布线分离:程序默认从标准输入读、往标准输出写,不关心数据到底来自文件、键盘还是另一个程序,这种晚期绑定/控制反转让shell用户能随意组合任何两个程序,而不必修改程序本身;这个分离原则的代价是只能处理单一输入输出流,需要多路输入输出的场景(网络连接、多个数据源)就变得棘手。三是透明性与实验友好:输入文件默认不可变,可以随意重跑命令尝试不同参数而不损坏数据;管道可以在任意阶段截断查看中间结果;某阶段的输出可先写入文件再作为下一阶段输入,方便调试和重启。发散:这三条原则后来几乎原样投射到了MapReduce与Hadoop的设计里,只是把”文件”换成了”分布式文件系统”。
参考来源
- 位置:《数据密集型应用系统设计》第十章《批处理》"Unix哲学""统一的接口""逻辑与布线相分离""透明度和实验"(源文件:_epub-src/ch10_split_000.html)
- 结论依据:原文分别阐述统一接口(文件抽象)、stdin/stdout的逻辑布线分离(晚期绑定/控制反转)、输入不可变带来的透明调试能力三条Unix设计原则,并指出它们共同支撑了Unix工具的可组合性,直接支撑本卡片结论。
- 原始内容:所有程序必须使用相同的I/O接口……在Unix中,这种接口是一个文件……将输入/输出布线与程序逻辑分开,可以将小工具组合成更大的系统……Unix命令的输入文件通常被视为不可变的。