免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1853 | 回复: 5
打印 上一主题 下一主题

用Unix的设计思想来应对多变的需求 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-05 12:01 |只看该作者 |倒序浏览
之前,@风枫峰 在“这是谁的错?”中说过开发团队对需求来者不拒,而@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一样,还要编译。是的,拼装需要一个框架,需要一种标准协议,然后让所有的系统都耦合在这种规范上,各自独立运行,就像一个机器上的各个部件一样,当我觉得这个部件不爽,换了就是了。(例如,当我们在尝试不同的算法的时候)

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

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

(全文完)


http://coolshell.cn/articles/7236.html

论坛徽章:
0
2 [报告]
发表于 2012-05-05 12:03 |只看该作者
这到底是谁之错?


【感谢 @风枫峰 投递本文】

故事一:
背景介绍:RT是一个外包公司,ZWZX是项目承接公司,YD是甲方。

RT公司每天下班的时候都会接到ZWZX负责人的电话,询问一天的工作情况,然后布置任务要求晚上加班做完,RT公司的员工很无奈也很气愤因为每天都要加班,员工们就问项目经理:“为什么天天加班赶需求,今天才提一个需求,明天就要上线,还让不让人活了?” 项目经理无奈的说:“我有什么办法啊?这是人家ZWZX负责人说的啊,对方逼得紧。”

多次以后项目经理也忍不住了,就问ZWZX的负责人怎么天天这样啊,ZWZX的负责人就说了:”明天就要向YD的负责人展示这个页面,我也没有办法啊?YD那边老总就是这么要求的,我怎么办,我也不想这样啊?”

然后RT的项目经理实在受不了了就辞职了,新上任的项目经理又会走他的老路,因为从开始我们就被培养“满足客户的需求是最重要的”。RT的员工也就这样一直抱怨着,一直忍受着。天天在心里咒骂YD的老总真是没有人性,不拿人当人看啊!

人换了一批又一批,加班也就慢慢的变成了应该的,你不加班说明你不敬业,不合格。

故事二:
IE6一直存活着,所有的前端开发人员都痛恨它,都不想兼容它,可是产品经理看到IE6的市场占有率还是这么高,就会要求前端开发人员必须兼容IE6。

矛盾又来了,就像故事一一样,前端开发人员天天抱怨,产品经理也天天抱怨,但是面对IE6的市场份额,产品经理会劝开发人员说:“我有什么办法啊?IE6的市场份额就是这么高,不兼容怎么办啊?我也不想啊!” 开发人员也就这样忍受着,然后不断地抱怨用IE6的用户低端,没文化,怎么还用IE6啊!天天兼容IE6就够烦的了,还怎么创新啊!

这两个故事里出现的问题到底是谁的错误引起的?

故事一的罪魁祸首是YD的老总吗?

故事二的罪魁祸首是那些还用着IE6的用户吗?

从这两个嫌疑最大的罪魁祸首眼中看一下这两个故事:

故事一:
我是YD的老总,我要建立一个网站,找到了ZWZX公司,签订了合同,我提需求他们实现。

我不懂制作网站,可是我才思敏捷,创意无限,不停的会有好点子从我的脑海里蹦出来,每当有一个好点子蹦出来后,我都会给ZWZX公司的负责人讲清楚我的想法,让他实现,开始我不知道做一个页面需要多长时间。第一次我试探性的说了一周必须把我这个点子做出来,ZWZX公司负责人很痛快的答应了,一周后我果然看到了这个功能。

可是会不会我给他们的时间太长了?对!肯定是,要不也不会答应的这么痛快。这些人啊!天天就是想拖时间,好多骗我点钱。

点子又来了,这次我要求5天做出来,这个点子和上个点子类似,我倒要看看5天能不能做出来~  ZWZX公司负责人一副痛苦的表情,我会不会逼的太紧了,5天是不是真的做不出来?到时候看看吧,如果5天没做出来估计是我给的时间太少了。

5天过去了ZWZX公司的负责人很高兴的拿出了我要的功能实现,哎,看来开始真的骗了我两天。就是不知道5天会不会还是多了啊?下次给3天~

又拿出来了,虽然他装的好像时间太紧似的,可别以为我不知道,你第一个功能最多3天就做出来了,我还给了你7天的项目经费,你们多赚了我多少啊!!!! 真是没良心。 下次1天!!!

啊啊啊啊啊啊啊啊!!! 1天就出来了,这些人。。。。。  有没有良心,原来做这个这么简单,以后就给1天,不 ! 一天N个功能。

故事二:
我买了个电脑,没什么别的用途,就是打开电脑上上网,上上QQ和儿子聊聊天,QQ是儿子给我装上的,这样我就可以和他视频了。有一次QQ提醒我说我的QQ版本太低了,不能视频了,我打电话问儿子,儿子说按提示升级一下QQ就行了,呵呵,我按QQ的提示,儿子的指示一步一步的升级QQ成功了,看来电脑也不难啊!

到这里您认为开始的两个故事的罪魁祸首是谁啊?

我们一直以加班,甚至通宵去满足客户不合理的要求,只因为他是客户。只因为人人都认为满足客户的要求是我们最大的
价值,可是不合理的要求不能去拒绝吗?套用刘欢说的一句话“我们是不是活的应该有些尊严”,一味的迎合客户,只会让我们自己越来越痛苦,反而得不到用户的尊重,肯定。

我一直有个疑惑,很多人说网站不支持IE6,而选择让用户去升级IE,这样的用户体验不好!如果按照按照这个逻辑,是不是我们都应该是Web应用,而且都应该是IE6下的Web应用呢?为什么微软还要出WIN8,一直XP不是挺好的吗?让用户升级系统,用户体验多么不好啊?QQ,360,搜狗输入法,等等客户端软件用户体验不都不好吗? 都还要用户下载。

实在搞不懂为什么我们做个东西非要去支持IE6呢?检测到用户是IE6,给个提示,给个升级链接不就行了? 这样做用户体验是有多么不好吗? 你天天去支持IE6,还要天天磨叽用户使用IE6,你不觉的很矛盾吗?再说我一个普通用户,你如果不提醒,我怎么知道要升级IE6啊?

对于遭遇了故事一,故事二的人只能送上一句话“哀其不幸,怒其不争!”

原文链接:http://hfcc8685.github.com/blog/2012/04/19/shui-zhi-cuo/

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
3 [报告]
发表于 2012-05-05 13:10 |只看该作者
说来容易做来难。。。

如果大家理解了就能做到完美,程序猿就不会那么苦逼了!

论坛徽章:
0
4 [报告]
发表于 2012-05-05 13:34 |只看该作者
本帖最后由 三月廿七 于 2012-05-05 13:35 编辑

OODer and OOper is so sblity !
喜欢舞文弄墨的腐儒,

论坛徽章:
0
5 [报告]
发表于 2012-05-05 16:35 |只看该作者
windows有它自己的思想,就是要做的集成,搞成平台.
比如有配置文件这么简单的东西不用费劲搞出来一个大家都看不懂的注册表,就是这个道理

论坛徽章:
0
6 [报告]
发表于 2012-05-05 17:03 |只看该作者
真是说起来容易,做起来难啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP