回眸Unix设计哲学

我觉得一切伟大的设计似乎都是不朽的,例如矗立在雅典卫城石灰岩山岗上的帕特农神庙,米开朗基罗刀工斧凿下充满雄性魅力的大卫,毕达哥拉斯对勾股定理的演绎证明,乱臣贼子亦为之惧怕的孔子春秋大义与君子之道,观苹果坠落而引发思考的牛顿三大定律,门捷列夫探索元素本质进而发现的元素周期表以及冯·诺伊曼定义的计算机硬件体系架构,都是不朽的。这些设计或许在某个时刻已经不再为人所用,或者仅供瞻仰,但其设计的精神却恒久而不废。

大约,Unix的设计哲学亦如此。

Doug McIlroy, Elliot Pinson和Berk Tague总结了两点Unix设计哲学:

  • Make each program do one thing well. To do a new job, build a fresh rather than complicate old programs by adding new “features.”
  • Expect the output of every program to become the input to another, as yet unknown, program.

一个程序只做一件事情,符合“单一职责原则”,每个程序变得简单。粒度如原子一般精简的小,则可以通过组合完成更为复杂的功能。程序的输入和输出都是统一的,就能统一接口(uniform interface),支持自由的组合,程序之间“老死不相往来”,没有依赖,设计的扩展也就变得游刃有余。

Unix中“管道”的隐喻高度抽象整个输入输出,化之为文件流(Stream),无论是文件系统,还是Unix Socket,设备驱动,内核API,TCP连接,都可以视为流而统一对待。

参与管道的各个独立程序遵循了同样的契约。输入为stdin,输出则视结果而为stdout或stderr。思考架构模式中的“管道过滤器”模式,思考事件驱动架构(EDA),思考Storm或者Spark Streaming对流的处理,思考Scala中Parser的原理,几乎都看到了这一Unix设计哲学的影子。

Martin Kleppmann在文章Apache Kafka, Samza, and the Unix Philosophy of Distributed Data中比较了Unix设计哲学与数据库的设计哲学。

Unix设计哲学将stdin和stdout视为通信通道(communication channel),数据库的设计模式则是服务器/客户端。虽然数据库通过存储过程、trigger、SQL等多种机制为客户端提供了强大的扩展功能,但数据库之间或者其他数据源之间却不能组合起来,例如无法将MySQL的数据通过管道传给ElasticSearch。

Martin Kleppmann认为数据库的设计思想是Self-Centered

我认为数据库的设计非常以自我为中心(self-centered)。数据库将自己视为宇宙的中心:是你存储和查询数据唯一的栖息之地,乃真理之源,所有查询的目标。

这种设计思想可以总结为“one size fits all”,这与Unix分而治之的设计思想背道而驰。

当我们需要集成不同的数据库时,DB的这种设计就暴露出问题了。每个DB都是一个独立的系统,如果需要集成多个数据库,就像处理“烟囱系统”那般困难,需要专门的集成方式,例如通过ETL对不同格式的数据进行加载、提取和转换。

Unix依旧如服了长生不老药一般继续工作下去,不眠不休。若没有它的设计哲学作指引,它或许已经崩溃、疯狂或者死亡,正如人没有信仰。软件设计需有思想的支持,否则设计的结果没有灵魂。

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2015-09-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐享123

用TCP/IP进行网际互连 (笔记)

1194
来自专栏linux驱动个人学习

GPU与CPU的区别

1133
来自专栏大数据

UC Berkeley提出新型分布式执行框架Ray:有望取代Spark

译者|马卓奇 编辑|Natalie AI 前线导读:下一代人工智能应用程序需要不断地与环境交互,并从这些交互中学习。这对系统的性能和灵活性提出了新的要求,而现有...

2518
来自专栏Java分享

Java程序员从阿里、京东、美团面试回来,这些面试题你会吗?

最近有很多朋友去目前主流的大型互联网公司面试(阿里巴巴、京东、美团、滴滴),面试回来之后会发给我一些面试题。有些朋友轻松过关,拿到offer,但是有一些是来询问...

3486
来自专栏吉浦迅科技

DAY30:阅读CPU与GPU之间的数据传输

864
来自专栏木东居士的专栏

漫谈并发和并行:概述

1294
来自专栏杨建荣的学习笔记

图表分析系统调优全面性的必要(r6笔记第80天)

继昨天对系统进行了初步的调优后,效果还是比较显著,DB time从500%降到了100%以内,当然过程还是充满艰辛,期间也是各种工具和分析语句斟酌了再三。 今天...

3197
来自专栏韩伟的专栏

帧同步游戏开发基础指南

最近一个月休了个假,体验了一下类似欧洲的田园生活。所以更新几乎荒废了,但是总结和积累是一直持续着的。根据前一阶段对于实时对战游戏的开发思考,写了这一篇入门级的文...

4276
来自专栏Java学习网

低级程序员和高级程序员的区别

低级程序员和高级程序员的区别   低级程序员认为自己与高级程序员的区别, 主要是高级程序员任何功能都能编码实现, 编码速度快, 代码无 bug. 正如一惯的那样...

21110
来自专栏吉浦迅科技

DAY48:阅读 Atomic Functions

An atomic function performs a read-modify-write atomic operation on one 32-bit o...

521

扫描关注云+社区