阅读更多

27顶
0踩

编程语言

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

2012-05-04 10:18 by 正式编辑 nemohq 评论(14) 有11780人浏览
在软件设计领域,有很多设计模式可以参考。但本文作者另辟蹊径,从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,网络七层模型,数据库设计,等等,他们都在干三件事——解耦,解耦,还是解耦!所谓解耦,就是让软件的模块和模块间尽量少地依赖起来...

  • (源码)基于JavaWeb的饮品销售管理系统.zip

    # 基于Java Web的饮品销售管理系统 ## 项目简介 本项目是一个基于Java Web的饮品销售管理系统,主要用于学校实训课程的作业。系统涵盖了从用户管理、商品管理、订单管理到购物车管理的全套功能,旨在提供一个完整的在线饮品销售解决方案。 ## 项目的主要特性和功能 ### 用户管理 用户注册与登录支持用户注册新账号和登录系统。 用户信息管理包括用户信息的查询、修改和删除。 用户类型管理区分不同类型的用户(如管理员、普通用户)。 ### 商品管理 商品CRUD操作支持商品的添加、修改、删除和查询。 商品分类管理支持多级商品分类的查询和管理。 商品分页查询支持按页查询商品信息,提高查询效率。 ### 订单管理 订单CRUD操作支持订单的创建、修改、删除和查询。 订单明细管理支持订单明细的添加和管理。 订单状态管理支持订单状态的更新和查询。 ### 购物车管理

  • BitmapFunc.rar

    BitmapFunc

  • c++课程设计-产品入库管理操作系统.zip

    c++课程设计-产品入库管理操作系统

  • c语言火车票订票管理源码.rar

    c语言火车票订票管理源码

  • 仿新浪微博下拉刷新继承FrameLayout.zip

    仿新浪微博下拉刷新继承FrameLayout

  • 浮动搜索框(SearchManager).zip

    浮动搜索框(SearchManager)

  • (源码)基于ParticleTracker框架的传感器浮标系统.zip

    # 基于Particle Tracker框架的传感器浮标系统 ## 项目简介 本项目是一个基于Particle Tracker框架的传感器浮标系统,旨在通过集成多种传感器和通信模块,实现对环境参数的实时监测和数据传输。该系统主要应用于海洋监测、环境监测等领域,通过浮标上的传感器收集温度、湿度、位置等数据,并通过Particle Tracker平台进行数据处理和传输。 ## 项目的主要特性和功能 1. 传感器集成 集成BMI160传感器,用于检测三轴加速度和三轴陀螺仪数据。 集成Grove温度和湿度传感器,用于实时监测环境温度和湿度。 集成NTC热敏电阻,用于精确测量温度变化。 2. 位置追踪 使用UBLOX GPS模块,提供高精度的位置追踪功能。 支持地理围栏功能,能够检测浮标是否进入或离开预设区域。 3. 数据通信 通过CAN总线实现传感器数据的高效传输。

  • python《树莓派使用OpenCV库实现人脸识别》+项目源码+文档说明

    <项目介绍> - 树莓派使用OpenCV库实现人脸识别 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

  • 毕业设计&课设_基于 UserCF 与 CB 后融合的网络电视节目推荐系统(含多种技术,有详细实现步骤及数据处理).zip

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

  • PHP基于Linux的远程管理系统服务器端的实现(源代码+论文).rar

    PHP基于Linux的远程管理系统服务器端的实现(源代码+论文)

  • c语言课程设计-产品管理系统.zip

    c语言课程设计-产品管理系统

  • 人工智能-大模型-一个智能问答系统,能够自动将用户的自然语言问题转换成 SQL 查询,并以可视化形式展示结果

    一个智能问答系统,能够自动将用户的自然语言问题转换成 SQL 查询,并以可视化形式展示结果 用户使用自然语言查询数据。基于 Python、MySQL 和 Milvus 构建,将用户的问题转换为 SQL 查询,安全地执行,并产生符合echarts的数据可视化呈现结果。

  • C#医生健康科普问答咨询平台(前端+后台)源码带手机端数据库 SQL2008源码类型 WebForm

    医生健康科普问答咨询平台(前端+后台)源码带手机端 医生健康科普问答咨询平台,主要提供专业、及时的健康咨询服务,问题涵盖面广,包括内科、外科、 妇科、儿科、男科、中医、五官、等科室。可以通过视频,音频,文章,问答等方式进行科普。 前台首页:1、包含幻灯片 2、权威医生 3、医学视频 4、语音科普 5、科普文章。 6、健康问答 7、个人中心。 网站管理后台:各模块可以灵活管理和配置。 1、信息管理: (1)会员系统。(2)轮播系统。(3)权威医生。(4)医学视频。(5)语音科普。 (6)科普文章。(7)健康问答。(8)友情链接。(9)帮助中心。(10)栏目板块。 2、用户管理:(1)管理员管理。(2)部门管理。(数据权限)(3)用户组管理。(菜单权限) 3、页面管理:(1)高级标签(SQL)。(2)自定义静态标签。(3)静态页面生成。 4、系统管理:(1)网站参数管理。 (2)模型管理。(可以生成板块,对应字段后台展示不同控件,并有相应维护功能,可以根据模型 及模型下栏目创建标签,将标签放入html模板中,生

  • (源码)基于Python和OpenMVCamera的图像处理与通信系统.zip

    # 基于Python和OpenMV Camera的图像处理与通信系统 ## 项目简介 本项目基于OpenMV Camera,结合MicroPython,实现了图像捕获、处理与通信功能。通过UART和SPI协议,实现了与Arduino和ESP32等设备的通信,实现了图像数据的传输和接收。项目涵盖了图像捕获、处理、传输、反馈等多个环节,旨在实现机器视觉应用中的图像数据采集与通信。 ## 主要特性和功能 1. 图像捕获使用OpenMV Camera进行图像捕获,支持灰度图像和彩色图像。 2. 图像处理对捕获的图像进行二值化、灰度转换等处理,用于后续机器视觉任务。 3. UART通信通过UART接口,实现与Arduino、ESP32等设备的通信,发送和接收图像数据。 4. SPI通信作为SPI从设备,与Arduino主设备进行通信,实现数据的传输。 5. LED状态指示使用LED灯指示程序运行状态和图像捕获处理进度。

  • 2_Análises_Geoespaciais_utilizando_Python_e_GEE.ipynb

    gee python 教程(西班牙语)

  • 按钮点击WIN8 磁贴效果.zip

    按钮点击WIN8 磁贴效果

  • 动态ListView,支持异步更新列表,异步更新图片.zip

    动态ListView,支持异步更新列表,异步更新图片

  • PHP教材管理系统设计(源代码+论文).rar

    PHP教材管理系统设计(源代码+论文)

Global site tag (gtag.js) - Google Analytics