阅读更多

27顶
0踩

编程语言

转载新闻 用 Unix 的设计思想来应对多变的需求

2012-05-04 10:18 by 正式编辑 nemohq 评论(14) 有11802人浏览
在软件设计领域,有很多设计模式可以参考。但本文作者另辟蹊径,从UNIX设计思想的角度来阐述什么是好的软件设计,什么样的设计可以把需求变更对软件开发的影响降到最低。

以下为原文文章

我曾经在《UNIX传奇》的下篇中写过一些关于UNIX的设计哲学和思想(这里重点推荐大家看一下《The Art of UNIX Programming》),以前也写过一篇《一些软件设计的原则》。不过,这些内容都太多了,记不住。其实,这么多年来,我的经验告诉我,无论是UNIX设计,还是面向对象设计,还是别的什么如SOA、ECB、消息、事件、MVC、网络七层模型、数据库设计等等,他们都在干三件事——解耦,解耦,还是解耦!所谓解耦,就是让软件的模块和模块间尽量少地依赖起来


一、现实当中的例子

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

1、现实社会中,制造灯具的工厂完全不关心制造灯泡的工厂,制造灯泡的工厂也完全不关心制造灯具的工厂。但是,灯泡和灯饰可以很完美地组合成用户所喜欢的样子。他们是怎么做到的?

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

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

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

二、UNIX设计的例子

下面是几个UNIX下的例子:

1、UNIX下,所有的硬件都可以通过文件的方式存取。于是,软件和硬件的耦合被解开了,操作系统只需要把硬件统统变成文件即可。而程序也只需要使用三个工具:一个是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、PHP 5.3,你不但可以方便地在系统中切换这两个环境,你甚至还可以同时启动它们。

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

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

三、应对需求变化

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

  • 解耦、解耦、解耦。尽量地让你的模块不要在实现上耦合,而是耦合某个规范,某个标准
  • KISS、KISS、KISS。要做到高度解耦,你的模块就一定要很简单。当然不是说简单到只有几行代码,而是简单到只做一件事,并把这件事做到极致,然后通过某个标准拼装起来
  • 拼装、拼装、拼装。我想不起来是谁曾说过这样一句话:“当我想用一个模块的时候,我直接调用就好了,没有必要像C或Java一样,还要编译”。是的,拼装需要一个框架,需要一种标准协议,然后让所有的系统都耦合在这种规范上,各自独立运行。就像一个机器上的各个部件,当我觉得这个部件性能不好,换一个部件就是了(例如,当我们在尝试不同的算法的时候)。
你还可以再想想建材和家具市场,无论用户过来想要装修什么,我都可以满足用户的不同需求。只要要求是和家具装修相关,我基本上都能满足,不是吗?无论你怎么变,只要不变态,我基本上都可以满足你。这就是解耦、拼装带来的好处。

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

  • 大小: 35 KB
来自: 酷壳
27
0
评论 共 14 条 请登录后发表评论
14 楼 dohkoos 2012-12-13 16:07
引用
UNIX下,软件都是绿色地安装。在iOS上更明显——各个程序间基本上互不干扰,这个程序产生的垃圾文件不会影响到另一个程序。你删除一个程序不会影响到另一个程序。你也可以删除这些程序,只要把内核留着,系统依旧可以启动。


这个就是个大笑话。也许古老的unix-like系统是这样,但现在的unix-like安装个软件的话,你就会发现依赖另一个package,装那个package时又发现依赖另一个library,就一直这样,反正依赖比较严重
13 楼 shirne 2012-05-07 10:53
耦合度低有它的好处,也有弊端,就是效率的问题。
关键是在这之间找一个平衡点。
系统的模块我不太了解,就拿一个简单的脚本来说:
每个函数都实现一个独立的功能,需用到就支调用。
这叫低耦合。
但某些模块,是需要多种功能,循环调用,如果把功能代码嵌入到里面,就可以提高效率。
但换成调用到公共模块,带来的就是效率的损失。
12 楼 wentao_tang 2012-05-07 10:16
其实 主要是在设计 和 过度设计间取得一个很好的平衡,这个才是比较困难的。
11 楼 sp42 2012-05-06 21:33
不错 顶 学习!
10 楼 hardPass 2012-05-06 10:26
有道理。但同时应该注意另外一个词:“过度设计”
9 楼 amcucn 2012-05-06 08:58
说起来容易,但做起来却是另外一回事,通常这样的思想大家都知道,难的是如何建立接口,每个人的站的角度不一样,定义的接口也不一样,所以最终很难定义一套可供大家完美使用的实现方案。
8 楼 xiaoyao3857 2012-05-06 00:18
楼主思想理解得很透彻啊,学校老师虽然偶尔会讲,但说出来时,总又没有说到实质有影响的话或例子!
7 楼 helloqiner 2012-05-05 21:41
越是真理越是简单。同样的道理,不同的人理解不一样。楼主的这篇文章值得想成为砖家级别的码农好好领悟下。
6 楼 xieye 2012-05-05 13:17
引用
例如,某个LAMP 用的是Apache 2.0、Mysql 4.0、PHP 4.0,而另一个个LAMP用的是Apache 2.2、Mysql 5.0、PHP 5.3,你不但可以方便地在系统中切换这两个环境,你甚至还可以同时启动它们。


嗯嗯,我知道。
5 楼 mathgl 2012-05-04 23:20
beyondqinghua 写道
你还可以再想想建材和家具市场,无论用户过来想要装修什么,我都可以满足用户的不同需求。只要要求是和家具装修相关,我基本上都能满足,不是吗?无论你怎么变,只要不变态,我基本上都可以满足你。这就是解耦、拼装带来的好处。

但是很多需求就是很BT,你懂的。


再bt的需求,只要能实现都会被还原到代码。
4 楼 weng 2012-05-04 21:11
好文章,得领悟
3 楼 beyondqinghua 2012-05-04 18:10
你还可以再想想建材和家具市场,无论用户过来想要装修什么,我都可以满足用户的不同需求。只要要求是和家具装修相关,我基本上都能满足,不是吗?无论你怎么变,只要不变态,我基本上都可以满足你。这就是解耦、拼装带来的好处。

但是很多需求就是很BT,你懂的。
2 楼 myaniu 2012-05-04 13:05
自从熟悉linux(unix)以后,设计软件一直都是这么干的,甚至一个系统中,都会同时采用多种开发语言,每个进程只关注一个问题,每种语言只用来开发它擅长的部分。以后复用也很容易。
1 楼 x_root 2012-05-04 12:58
引用
其实,这么多年来,我的经验告诉我,无论是UNIX设计,还是面向对象设计,还是别的什么如SOA、ECB、消息、事件、MVC、网络七层模型、数据库设计等等,他们都在干三件事——解耦,解耦,还是解耦!所谓解耦,就是让软件的模块和模块间尽量少地依赖起来。
有道理!

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

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

    今天我也想从Unix设计思想的角度来说说什么是好的软件设计,什么样的设计可以把需求变更对开发的影响降低。(注意:这并不能解决用户或是PM的无理需求,面对无理需求,需要仔细分析需求,而用技术的手段无法搞定这个...

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

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

  • 最新版仿天涯论坛系统源码带后台

    亲测正常使用版,代码精简,压缩包也小,程序运行速度更快,效率更高,服务器抗攻击能力更强 功能方面: 仿天涯论坛模板的免费论坛系统在功能方面也很强大!程序本身包含一个PC版网站和一个手机版网站 支持打包APP安装包,开放式PHP原生态模板在线编译,音频视频发布直接生成HTML5代码,能够适应各种界面浏览器

  • 三自由度机械臂神经网络自适应控制,径向基函数逼近动力学与未知反馈状态的高增益观测器应用,机械臂自适应神经网络控制,机械臂为三自由度,神经网络逼近系统的动力学和滞回非线性 利用径向基函数的神经网络近似

    三自由度机械臂神经网络自适应控制,径向基函数逼近动力学与未知反馈状态的高增益观测器应用,机械臂自适应神经网络控制,机械臂为三自由度,神经网络逼近系统的动力学和滞回非线性。 利用径向基函数的神经网络近似机器人的动力学。 对于系统状态未知的输出反馈,采用高增益观测器估计系统状态。 ,核心关键词:机械臂; 自适应神经网络控制; 三自由度; 神经网络逼近; 动力学; 滞回非线性; 径向基函数; 输出反馈; 高增益观测器。,基于神经网络的自适应控制:三自由度机械臂的滞回非线性动力学逼近研究

  • 《已调试》SpringBoot网上水果蔬菜商城系统(源码+sql).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

  • 西门子中央空调智能控制程序:标准化冷水机组运行,模糊控制开启与切换策略,自动均衡磨损与故障管理,西门子中央空调程序 冷水机组程序,标准化很好的程序,内部用的函数封装成标准块 采用模糊控制,根据需求

    西门子中央空调智能控制程序:标准化冷水机组运行,模糊控制开启与切换策略,自动均衡磨损与故障管理,西门子中央空调程序。 冷水机组程序,标准化很好的程序,内部用的函数封装成标准块。 采用模糊控制,根据需求及制冷量来确定开启冷水机组及冷冻泵,冷却泵的台数。 夏季开启冷水机组,冬季开启锅炉制热 均衡磨损(为了专利保护只可调用,):水泵均衡磨损,冷机均衡磨损,故障,时间到了自动切,根据需求自动启动停止水泵。 需要的老板滴滴中央空调程序。 冷水机组程序,标准化很好的程序, 注:内部用的函数封装成标准块。 可以直接调用,部分源文件有保护, ,西门子中央空调程序; 冷水机组程序; 模糊控制; 开启/关闭机制; 标准化; 函数封装; 均衡磨损; 自动切换; 保护源文件; 老板滴滴中央空调程序,西门子中央空调冷水机组标准化程序:智能控制与均衡磨损管理

  • 三相逆变器并联系统功率均分研究:VSG控制策略下的LCL滤波与预同步技术,多台三相逆变器并联(本模型为三台并联,市面上多为两台并联)matlab simulink仿真 功能:实现并联系统中各逆变器输

    三相逆变器并联系统功率均分研究:VSG控制策略下的LCL滤波与预同步技术,多台三相逆变器并联(本模型为三台并联,市面上多为两台并联)matlab simulink仿真。 功能:实现并联系统中各逆变器输出功率均分。 (有能力的话还可以研究下垂特性、功率指令以及静态功工作点三者之间的联系) 控制策略:VSG控制策略(同步机控制) 逆变器主电路:三相逆变器,LCL滤波电路,VSG控制模块。 VSG控制模块:定、转子方程,dq变,电压电流双闭环,预同步,pwm发生器。 ,基于VSG控制的LCL滤波三相逆变器并联系统仿真研究:多台逆变器功率均分与下垂特性分析

  • 2025年高级经济师笔试真题及答案.docx

    2025年高级经济师笔试真题及答案.docx

  • 三相维也纳整流器的双闭环控制仿真模型:电压PI与电流Bang Bang滞后控制器实现单位功率因数与低谐波运行,三相维也纳整流器的仿真模型 控制算法采用电压和电流双闭环控制 外部电压环路为PI控

    三相维也纳整流器的双闭环控制仿真模型:电压PI与电流Bang Bang滞后控制器实现单位功率因数与低谐波运行,三相维也纳整流器的仿真模型。 控制算法采用电压和电流双闭环控制。 外部电压环路为PI控制器,内部电流环路为bang bang滞后控制器。 网侧单位功率因数运行,电网电流谐波非常小。 ,三相维也纳整流器; 仿真模型; 电压和电流双闭环控制; PI控制器; bang bang滞后控制器; 网侧单位功率因数运行; 电流谐波。,三相维也纳整流器仿真模型:双闭环控制算法与网侧单位功率因数运行下的电流谐波优化

  • Java毕业设计-springboot-vue-旅游网站(源码+sql脚本+29页零基础部署图文详解+29页论文+11页答辩+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:配套答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

  • 《已调试》springboot美食菜谱分享平台优化版(源码+sql+论文报告).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

  • 1737204114470.jpg

    1737204114470.jpg

  • Nuclei使用手册操作语法

    Nuclei使用手册,语法,命令,操作,都在其中

  • 汇川PLC三轴简易示教系统:强大可编程,触摸屏操作,四组工艺路径保存,源码可修改,离线仿真学习体验,三轴示教 可编程 触摸屏程序 功能强大 触摸屏 PLC 程序 汇川plc 三轴简

    汇川PLC三轴简易示教系统:强大可编程,触摸屏操作,四组工艺路径保存,源码可修改,离线仿真学习体验,三轴示教 可编程 触摸屏程序 功能强大 触摸屏 PLC 程序 汇川plc 三轴简易示教系统,学习性强,程序简单易用。 支持工艺路径保存,可以保存四组工艺路径。 每个工艺路径支持示教100步。 汇川H5U与 mcgs触摸屏简易示教系统,支持离线仿真。 有较好的学习性,可以在源码基础上任意修改,注释明确。 注意:源码程序文件。 ,三轴示教; 可编程; 触摸屏程序; 功能强大; PLC程序; 汇川PLC; 工艺路径保存; 离线仿真; 注释明确; 源码程序文件。,"汇川简易示教系统:多轴编程,触摸操作,强大功能与易用性并存"

  • Java毕业设计-springboot-vue-视频网站(源码+sql脚本+29页零基础部署图文详解+32页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

  • "风能储电系统模糊逻辑控制仿真模型研究:通过蓄电池变换器驱动,实现电网惯量供应与功率平滑输出的有效整合",风-储系统仿真模型;通过模糊逻辑控制策略驱动蓄电池变器运行,以达到为电网提供惯量的目的 可以

    "风能储电系统模糊逻辑控制仿真模型研究:通过蓄电池变换器驱动,实现电网惯量供应与功率平滑输出的有效整合",风-储系统仿真模型;通过模糊逻辑控制策略驱动蓄电池变器运行,以达到为电网提供惯量的目的。 可以实现功率平滑输出 ,"模糊逻辑驱动的风储系统模型:提升电网惯量与功率平滑输出的仿真研究"

  • 541心灵治愈交流平台.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

  • 永磁同步电机谐波注入补偿与Simulink模型仿真:电流谐波抑制技术研究,永磁同步电机的谐波注入补偿simulink模型仿真 5次7次电流谐波抑制;^-^ ,核心关键词: 永磁同步电机;谐波注入补偿

    永磁同步电机谐波注入补偿与Simulink模型仿真:电流谐波抑制技术研究,永磁同步电机的谐波注入补偿simulink模型仿真 5次7次电流谐波抑制;^_^ ,核心关键词: 永磁同步电机;谐波注入补偿;Simulink模型仿真;5次7次电流谐波抑制;谐波抑制。,"Simulink模型仿真:永磁同步电机谐波注入补偿策略及5/7次电流谐波抑制"

  • 滑模控制策略在永磁同步电机PMSM模型预测转矩控制中的性能仿真分析:转速与负载条件下的鲁棒性评估,基于滑模控制器的模型预测转矩永磁同步电机PMSM控制仿真 1将原有的PI控制器成了滑模控制器,一定

    滑模控制策略在永磁同步电机PMSM模型预测转矩控制中的性能仿真分析:转速与负载条件下的鲁棒性评估,基于滑模控制器的模型预测转矩永磁同步电机PMSM控制仿真 [1]将原有的PI控制器成了滑模控制器,一定程度提高了电机的鲁棒性。 与传统DTC相比,基于滑模控制策略的永磁同步电机直接转矩控制系统中电磁转矩脉动幅值更低,且具有更好的动态性能和抗扰动能力, [2]传统矢量控制存在系统计算量大、动态响应慢等缺陷,直接转矩控制则存在谐波损耗大、磁链脉动大、低速性能差等问题。 因此,结合了模型预测控制技术以提高永磁同步电机的性能。 [蓝圆]仿真工况:给定转速为500rpm,仿真时间为0.5s。 空载启动,在0.25s时,施加0.5Nm的负载 配有滑模控制器参考资料 ,关键词:滑模控制器; 模型预测控制; 永磁同步电机(PMSM); 转矩控制; 鲁棒性; 动态性能; 抗扰动能力; 空载启动; 仿真工况。,基于滑模控制与模型预测的PMSM控制仿真研究:提升鲁棒性与动态性能

  • mmexport1736921254924.jpg

    mmexport1736921254924.jpg

Global site tag (gtag.js) - Google Analytics