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

转自酷壳

之前,@风枫峰 在“这是谁的错?”中说过开发团队对需求来者不拒,而@weidagang 也在“需求变更和IoC” 中说过用IoC来最大程度地解决需求变更。今天我也想从Unix设计思想的角度来说说什么是好的软件设计,什么样的设计可以把需求变更对开发的影响降低。(注意:这并不能解决用户或是PM的无理需求,面对无理需求,需要仔细分析需求,而用技术的手段无法搞定这个事,但是可以减轻需求变更带来的痛苦)

我曾经在《Unix传奇》的下篇中写过一些Unix的设计哲学和思想(这里重点推荐大家看一下《The Art of Unix Programming》,我推荐过多次了),以前也发过一篇“一些软件设计的原则”,不过,这些东西都太多了,记不住。其实,这么多年来,我的经验告诉我,无论是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一样,还要编译。是的,拼装需要一个框架,需要一种标准协议,然后让所有的系统都耦合在这种规范上,各自独立运行,就像一个机器上的各个部件一样,当我觉得这个部件不爽,换了就是了。(例如,当我们在尝试不同的算法的时候)

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

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

(全文完)

时间: 2024-09-14 05:03:08

用Unix的设计思想来应对多变的需求的相关文章

Android 3.0设计思想规范和UI设计规范

文章描述:Android 3.0(蜂巢)交互&UI设计规范. Android OS自上市以来,由于缺乏统一规划,使得不同设备在 1.5.1.6.2.0.2.1.2.2.2.3几大版本徘徊,本人用的HTC Hero(俗称G3)也是从1.5~2.3一个个版本,10多个rom手动刷机试过来的,过程及其纠结 ~.多系统版本带来的问题就是缺乏交互.UI的一致性,外加硬件厂商HTC.摩托罗拉.三星.夏普(创新工场点心OS).小米(MIUI)等公司热衷于UI的个性化发挥,以及民间高手的DIY rom 等因素,

从网站抄袭谈民间设计思想匮乏

设计  网易学院:蓝色你好,很高兴能约你作这期关于设计的访谈.中国有句老话,叫"盗亦有道",但在互联网上,很多人显然忘记了这句古训.如今在网上有很多网站都跟你的网站是一样的.说的好听是模范.借鉴,说得不好其实性质就是抄袭甚至是照搬.您是怎么看这个问题的. 蓝色:这个问题是由来以久的,现在的网络开发者,有大致三种,一种是半道出家,一种是程序员出身,一种是设计师出身. 有很多人是半路出家的,不是程序师,也不是设计师出身,他们有自己做网站的优势,比如对某个专业了解.有兴趣.有精力,所以选择了

jQuery设计思想 读书笔记

jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司甚至把jQuery作为他们的官方库. 对于网页开发者来说,学会jQuery是必要的.因为它让你了解业界最通用的技术,为将来学习更高级的库打下基础,并且确实可以很轻松地做出许多复杂的效果. 虽然jQuery上手简单,比其他库容易学会,但是要全面掌握,却不轻松.因为它涉及到网页开发的方方面面,提供的各种方法和内部变化有上千种之多.初学者常常感到,入门很方便,

Draw2D--1. 设计思想和相关模式

设计 1.  Draw2d 设计思想 Draw2d是一个宿主在SWT Composite控件中的轻量级的构件(widge)系统.一个Draw2d应用程序由一个 SWT Composite控件, 一个轻量级系统, 以及其内容(figures)组成.Figures是Draw2d的建造块.下面的"Hello World"例子程序演示了如何实现一个最简单的draw2d程序.Listing for "Hello World" import org.eclipse.swt.wi

面向对象设计思想(C#)

       有了翅膀才能飞,欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光, 让僵冷的翅膀重新飞起来.结合实例,通过应用OOP.设计模式和重构,你会看到代码是怎样一步一步复活的. 为了更好的理解设计思想,实例尽可能简单化.但随着需求的增加,程序将越来越复杂.此时就有修改设计的必要, 重构和设计模式就可以派上用场了.最后当设计渐趋完美后,你会发现,即使需求不断增加,你也可以神清气闲,不用为代码设计而烦恼了.       假定我们要设计一个媒体播放

设计思想:产品的成功都有三个必备要素

文章描述:设计思想:产品的成功都有三个必备要素. 对于流行的"敏捷发布"概念,我的感情很复杂.一方面我自己就是敏捷发布的忠实支持者,但又看到了对它大量的滥用,甚至我自己也有可能滥用. 前些日子看见一个典型案例,一同行说,自己的新浪微博应用,从提出创意到发布只用了6天,6天!这款应用叫"APP汇",思路上挺带感的APP社交推荐服务.从正面的意义讲,尽早拿出一个可用原型来接受市场检验,再根据真实数据与反馈来调整产品,远比隔靴搔痒的"用户建模.竞品分析"

简单分析网易网首页的设计思想

原文:http://www.ued163.com/?p=369 很多人可能认为门户网站首页设计只是把一些导航.资讯内容和广告堆积起来摆放得好看就可以了,虽然这个观点也并不是完全错误的,确实门户网站首页是由这三方面内容组织而成,但随着互联网的快速发展,用户对访问网站的要求也越来越高,在互联网行业,因为很多东西是免费和相似的,用户转移成本会比较低,在这个网站有的东西去其他网站基本都能找到,只是输入个网址就可以了.网站营运商如果想留住用户和吸引更多的用户浏览自己的网站,那这个时候就是需要提高网站的用户

以用户为中心的设计思想不完全正确

长期以来,中国的教育都是"填鸭子"式的应试教育,不管是什么样的学生,都采用的是同样的教程同样的教学方式,所以造成了很多从学校走出来的学生缺乏应有的生存技能.正是因为存在这样的情况,所以很多学校都开始打出"因材施教"的口号,虽然很多时候这只是一个口号而已,但起码也是一种进步,起码开始区分不同的"材". 其实这就犹如是WEB设计的进步,从最初的以产品设计者为中心的设计,到现在的以用户为中心的设计,只有本质上的改变才是真正的改变. 自从跨入WEB2.0

Web开发学习心得5——Asp.net的设计思想

自从有了html与http,就有了浏览器与Web服务器,并有了Web应用,最初的交互模式是这样的: 开发学习心得5--Asp.net的设计思想-">该模式很好地运行了很多年.然而,随着计算机应用的发展,人们越来越不满足于只有静态内容的页面,而由某种机制动态产生html等代码的需求越来越迫切,于是,很多技术就应运而生,Asp.net就是这样一种技术.从本质上讲,Asp.net就是一种服务器端动态产生html.css.javascript等浏览器认识的代码的技术.Asp.net的交互模式如下: