用 Unix 的设计思想来应对多变的需求

虫虫
 虫虫
发布于 2012年05月03日
收藏 45

无论是Unix设计,还是面向对象设计,还是别的什么如SOA,ECB,消息,事件,MVC,网络七层模型,数据库设计,等等,他们都在干三件事——解耦,解耦,还是解耦所谓解耦,就是让软件的模块和模块间尽量少地依赖起来。

现实当中的例子

让我先举几个现实生活中的例子:

1、现实社会中,制造灯具的工厂完全不关心制造灯泡的工厂,制造灯泡的工厂完全不关心制造灯具的工厂,但是,灯泡和灯饰可以很完美地组合成用记所喜欢的样子(这和@weidagang 在“需求变更和IoC”说到的那个PC的例子相仿)。他们是怎么做到的?

2、互联网上,做网站的人完全不用关心用户在用什么样的操作系统,什么样的客户端浏览器 (当然事实上,浏览器的不标准让网站那边很头痛,这里只是举个例),反过来,上网的人也不关心做网站的人在用什么的技术开发网站。但是大家在完全不关心对 方的情况下,可以很正常地协同工作在一起。为什么?

 

这样的例子太多了。为什么可以做成这样呢?因为大家依赖的是一个接口,灯具和灯饰并不互相依赖,他们依赖的是一个接口,做网站的人和浏览网站的人依赖的还是接口——HTTP协议。这就是面向对象的核心思想——依赖于接口而不是实现,这就是解耦。当你看过这两个例子以后,我希望你以后设计的软件至少不能比我们现实社会中的这些方法要差。不然,你就是在让社会倒退了,呵呵。

你会说,这和Unix,和应对需求变化有什么关系?好让我们再来看一下Unix的设计。

Unix设计的例子

下面是几个Unix下的例子:

1、Unix下,所有的硬件都可以通过文件的方式存取。其统统在/dev下。于是,软件 和硬件的耦合被解开了,操作系统只需要把硬件统统变成文件,而程序只需要使用三个东西,一个是fd,一个是read(),一个是write(),就可以来 操作任意的硬件了,这就是抽象,简单到不行。

2、Unix下,所有的命令都可以用管道串起来(管道绝对是个伟大的发明),这样,所有 的命令间的交互全部解耦到只依赖于STD_IN, STD_OUT设备上。最酷的是,用户可以使用管道任意地拼装那些命令,以完成各式各样的功能。管道这个设计思想可以映射为今天的Web Service,你可以任意地拼装各种Web Service。

看到这里,你会发现,这还是解耦,本质上来说,也是一种依赖倒置——OOD的精髓。但是,Unix还不仅仅是这些。我们再来看几个例子:

1、Unix下,软件都是绿色地安装。在iOS上更明显——各个程序间基本上互不干扰,这个程序产生的垃圾文件不会影响到另一个程序。你删到一个程序不会让另一个程序不举,各是各的空间。你可以删除这些程序,只要把内核心留着,系统照样可以启动。

2、Unix下,你可以通过设置一些环境变量,让多种环境同时存在,比如:某个LAMP 用的是Apache 2.0, Mysql 4.0, PHP 4.0,某个LAMP用的是Apache 2.2, Mysql 5.0,PHP5.3,你不但可以方便地在系统中切换这两个环境,你甚至还可以同时启动他们。

3、Unix下,你可以随意地替换你想要的程序。比如,你不喜欢bash,你可以替换成ksh/csh等,你不喜欢awk,你可以替换成gawk,所有的东西都像零件一样,你不喜欢什么,你就可以替换什么。

这三个例子告诉了我们——当你把你的软件设计地耦合度非常地低时,你可以随意地组合,随意地安排你的系统。想当的灵活,灵活到Windows到今天都学不会。

应对需求变化

看到这里,你可能明白我想说的是什么了,你可能开始觉得怎么样的系统设计会更有效了。如果你还记得《Steve Y 对平台的长篇大论》,你就会知道我想说什么了。是的,我想说的就是,当你真正了解了Unix的设计思想后,你会觉得今天的这些东西都是对Unix设计思想的一种传承或是变种。这种东西就是:

1)解耦,解耦,解耦。尽量地让你的模块不要在实现上耦合,而是耦合某个规范,某个标准。

2)KISS,KISS,KISS。要做到高度解耦,你的模块就一定要很简单,当然不是说简单到只有几行代码,而是简单到只干一件事,并把这件事干到极致。然后通过某个标准拼装起来。

3)拼装,拼装,拼装。我想不起来是谁说的了,这句 话是这样的,当我想用一个模块的时候,我直接调用就好了,没有必要像C或Java一样,还要编译。是的,拼装需要一个框架,需要一种标准协议,然后让所有 的系统都耦合在这种规范上,各自独立运行,就像一个机器上的各个部件一样,当我觉得这个部件不爽,换了就是了。(例如,当我们在尝试不同的算法的时候)

想想建材和家俱市场,无论用户过来想装修什么,我都可以满足用户的不同需求,只要你是和家装相关,我基本上都能满足你,不是吗?无论你怎么变,只要不变态,我基本上都可以满足你。这就是解耦,拼装带来的好处。

你可能会说我说得太简单了,另一方面,你可能觉得有一些系统这样做没必要,我承认,不过,你可以有选择的或多或少地试试。(其实,我相信你已经在不自觉得或多或少地使用这种方式开发软件了)

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:用 Unix 的设计思想来应对多变的需求
加载中

最新评论(32

springfieldking
springfieldking
一直在关注coolshell,尤其是那篇程序员练级攻略,迷茫的时候就看一眼...总是能增加不少动力。
louis99
louis99
类unix系统是给开发人员使用的.
硬件支持是个问题.
分支过多也是个问题.
对于普通人员来说. 图形界面更加是个问题了.
代雅男
代雅男
强大。
林纳斯脱袜子
林纳斯脱袜子

引用来自“ZYud”的评论

引用来自“阿酷”的评论

“想当的灵活,灵活到Windows到今天都学不会。” 普通用户要的是好用,不是灵活,所以桌面系统 Win 赢了。

当年unix如果不是版权问题,谁赢还不一定.

不提当年勇!现在服务器市场,不是还是 类unix的天下么 虽然windows server也很牛X啦
林纳斯脱袜子
林纳斯脱袜子

引用来自“魔力猫”的评论

20 21楼的。世界上一切的交互,都是有所谓的协议的标准的。没有就无法交互了。两个人说话,两个人都理解的语言就是标准和协议。写书和读书的,文字就是标准和协议。给你本没学过语言写的书,你没有这种语言文字作为协议,你就无法读取书的内容。

有理,有理!
林纳斯脱袜子
林纳斯脱袜子

引用来自“晓谢”的评论

引用来自“阿酷”的评论

“想当的灵活,灵活到Windows到今天都学不会。” 普通用户要的是好用,不是灵活,所以桌面系统 Win 赢了。

理念不同
这与其说是一个目标不如说是一个结果。如果“用户”这个词带有“单纯得傻乎乎”的蔑视含义,我憎恨一个为“用户”设计的系统。

—Ken Thompson

用户也分N种,咱们的父母辈的和咱们,这种用户需要的体验是不一样的。
Raymin
Raymin
真正的面向对象是从业务逻辑上面向对象,而不是在代码层次上一层层的封装,耦合。
Z
ZYud

引用来自“阿酷”的评论

“想当的灵活,灵活到Windows到今天都学不会。” 普通用户要的是好用,不是灵活,所以桌面系统 Win 赢了。

当年unix如果不是版权问题,谁赢还不一定.
Raymin
Raymin
顶!
有些人为搞对象而搞对象,耦合耦合再耦合!
返回顶部
顶部