回眸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 条评论
登录 后参与评论

相关文章

来自专栏更流畅、简洁的软件开发方式

主动编程与被动编程!(8/2原则的续集)

1、被动编程。      就好比对日外包的项目,不是太了解,只是有所耳闻。听说日本公司那面会发过来一份(也许用一批更好一些)很详细的文档,里面的内容就是编写...

20470
来自专栏王清培的专栏

微服务架构—自动化测试全链路设计

从 SOA 架构到现在大行其道的微服务架构,系统越拆越小,整体架构的复杂度也是直线上升,我们一直老生常谈的微服务架构下的技术难点及解决方案也日渐成熟(包括典型的...

42710
来自专栏腾讯大讲堂的专栏

如何为红包提供稳定支付体验

腾讯大讲堂隆重推出【100亿次的挑战】系列海量服务之道2.0讲座,覆盖技术、产品、项目管理、支撑、支付5个维度。第一场【技术篇】3000名鹅厂员工参与,场面火爆...

256100
来自专栏顶级程序员

相较其他语言,Python到底好在哪儿?

就个人发展而言,选择学习的技术与要就读的大学可谓同等重要。如果决定做错了,那往往会收到一堆麻烦,而不是想要的高薪工作。我想,现在你点开这篇文章,就代表你已考虑选...

13630
来自专栏菩提树下的杨过

ROR学习笔记(2):Asp.Net开发者看ROR

ROR集成了诸多"先进"的理念,比如mvc,模板替换,orm,实体验证,ajax,数据库迁移,session的多种保存机制...等等,也许在今天看来,这些东西都...

19180
来自专栏Java学习网

你需要每天写代码吗?

你需要每天写代码吗? 就像运动员每天锻炼一样,每天练习写代码可以成就更优秀的你。 最近我看过的博客,基本上每篇都有提到,“你需要每天写代码”。什么主题不重要,关...

29770
来自专栏斑斓

如何在咨询项目开展Inception

本文通过我在咨询工作中的真实案例讲解了如何将敏捷开发的Inception与可视化咨询手段结合。2014初,我作为咨询师为客户提供咨询服务,负责一个新项目的敏捷咨...

32740
来自专栏python学习指南

计算机系统结构——01结论

1.1 计算机系统的层次结构 从使用语言的角度,一台由软、硬件组成的通用计算机系统可以被看成是按功能划分的多层机器级组成的层次结构。具体的计算机系统,其层次数的...

26480
来自专栏我是攻城师

如何学好一门编程语言或技术?

38650
来自专栏刘望舒

开源项目源码阅读指北

作为一个程序员,阅读大牛们优秀的开源项目源码是一个提升个人编程能力、扩展思维的重要途径。在实际工作中,相信并不是所有人接手的项目代码都很优雅和优秀,而且很大可能...

12620

扫码关注云+社区

领取腾讯云代金券