摘要:

前文提到我们应该需求驱动设计,那就直接来一个更干脆的做法,我们将需求表示为一个一个的用户故事,软件设计分别针对用户故事来做就行了,只要将用户故事逐个实现了,系统也就完成了。果然能这样做吗?

大纲:

1.什么是优秀的设计?
2.优秀的设计能节省项目工作量
3.优秀设计从分析需求开始
4.软件系统不是木桶型的
5.软件设计的“大道理”
6.规划系统骨架——架构设计
7.打造系统的底蕴——数据库设计
8.细节决定成败——详细设计
9.用户感觉好才是真的好——用户体验设计
10.持续提升设计水平

本文章是系列文章之一,如果你还没有看过之前的文章,建议先看完前面的文章再看本篇,这样效果更好。

4.软件系统不是木桶型的

 

4.1 某种“需求直接驱动设计”的工作方法

案例分析:某敏捷实践项目小组的设计方式

某项目小组正在如火如荼地实践敏捷,任务看板上已经粘贴了很多“用户故事”,项目小组经常在看板前讨论问题:

1)讨论每一个用户故事的实现方法,并进行估算;
2)项目小组成员领取用户故事,负责实现该用户故事;
3)每天检讨进度情况和遇到的问题。

该工作模式给项目小组带来了新鲜的动力,调动了大家的工作热情,取得一定的工作成绩,但也带来了一些思考:

1)只要我们将每一个用户故事的设计想好并实现,每个用户故事都能通过测试,软件就能完成?
2)用户故事之间没有关系吗?软件设计不需要统筹考虑全部的用户故事吗?

4.2 软件是木桶型的吗?

请看图:

图3.1 软件是这样工作的吗?

一般我们的系统会采用分层架构,以三层架构为例子:

1)最外面的是表现层,主要就是程序的界面了;
2)界面后面就是我们写的程序;
3)程序后面就是数据库。

按照上述的“需求直接驱动设计”的工作模式,只要有新的需求,其实就是有新的用户故事,那么在这个用户故事驱动下,直接设计对应的界面、程序和数据库表就行了。这样的框架下工作,我们可以无惧需求变更。软件就是一个大木桶,需要实现更多需求,那就增加更多的木条就可以了;如果要修改需求,那就修改某条木条就可以了!

我发现很多系统是按照这样的思路来设计的,举一个某电信网站的例子。

我到该网站交费,发现有免费宽带提速的服务,需要输入电话号码来确认该电话线路是否具备提速的条件。我觉得很郁闷,明明我已经登录系统了,系统应该知道我的电话号码,为啥还要我填一次?好吧,为了免费提速,我就输入一次电话号码吧,提交后系统告诉我一个订单号,告诉我大概什么时候会搞定之类的信息。过了几天再次上这个网站,免费提速宽带的窗口又弹出来,我很烦关掉它:我已经提交订单了,还干嘛一直提示我!但它又继续弹出来,我烦了,那再提交一次订单吧,居然可以提交成功!被这样的系统折腾几次其实也不算什么,只要能免费提速也就值了,但最终的结果是电信一直没有帮我提速,我也懒得去投诉了,按照我以往投诉的历史经验,那是折腾自己的事情!

很多商家在不同时期有很多的促销等市场活动,需要软件系统来支持。我们按照木桶原理来做系统的话,看上去似乎事情变简单,但功能与功能之间其实存在很多交叉点,不考虑这些情况,会导致很多问题:

1)首先是用户体验超级不爽。有些系统甚至没有做到用户信息和权限信息共享,就好像上述这个电信例子。
2)没有能发现功能与功能之间的“重用”部分,没有从架构上和数据库底层上认真规划,其实会带来更大的总体工作量。
3)会留下一些系统漏洞甚至是安全漏洞,万一出问题后果很严重。

4.3 软件的内部架构是怎样的?

请看图:

图3.2 软件常见的工作模式

此图说明了以下问题:

1)需求并不是由一个个孤立的“用户故事"组成的,业务概念、业务流程其实是贯穿多个用户故事的,软件设计应该多从业务概念、业务流程的角度来思考;
2)表面上看上去一个用户故事对应一组界面,其实界面之间是很可能有重用和共享部分的;
3)业务逻辑层中的一些类很难将其分拆开来与用户故事、界面组一一对应,存在交叉、共享和重用的可能;
4)数据操作层的代码,有可能是用工具自动生成的、通用的;
5)数据层中的某张表,通常会支撑多个用户故事而不是一个用户故事。

下面我在列举一下无法单独考虑的设计点,以下列出来的可能都需要从软件架构上做一个整体的考虑:

1)权限控制;
2)性能要求;
3)日志记录;
4)工作流;
5)全文搜索;
6)多数据库支持;
7)搜索引擎优化;

……

实际上很少需求是可以通过单独添加一些类,加一些数据表就搞定的,需要通盘的考虑。如果我们硬生生地将系统看成是木桶型的,去添加系统的木条,会让软件很丑很难用,存在诸多漏洞,而且工作量会更大。

4.4 小结

有时候由于目前能力有限,无法全面考虑需求,只能暂时按照木桶型的方式来设计系统,这样也不是不可以的,但要注意的是至少要做到:

1)用户信息和权限信息是共享的;
2)要杜绝安全漏洞。

木桶型的设计方法其实会让系统很难用、弹性很差、工作量更大,而且部分需求我们无法通过添加木条的方式搞定,我们需要尽快升级我们的设计水平,下一节开始为你介绍比较实用的软件设计方法。

本文是系列文章的第3篇,要做软件设计师一点都不简单啊,请留意后续文章!

如果本文对你有帮助,麻烦点一下“推荐”啦,谢谢!

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

软件知识原创基地创办人

转载于:https://www.cnblogs.com/umlonline/p/3534321.html

软件设计是怎样炼成的(3)——软件系统不是木桶型的相关推荐

  1. 软件设计是怎样炼成的(8)——用户感觉好才是真的好(用户体验设计)

    摘要: 软件的UI是客户直接体验软件的地方,好的用户体验可能比追求新技术和追求漂亮设计更加重要,优秀的软件应该是既有外在美也有内在美的.但大部分用户是"外貌协会"的,你和用户说你的 ...

  2. 视频教程-软件设计是怎样炼成的?-软件设计

    软件设计是怎样炼成的? 近二十年软件开发.软件设计.需求分析.项目管理.部门管理.公司管理及过程改进等经十五年的需求分析及需求管理工作经验,负责数十个大型项目的需求分析和需求管理工作,涉猎建筑.通讯. ...

  3. 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)

    摘要: 数据库是系统的根基,如果需求变更导致你要经常修改数据库的字段,甚至需要修改表及表关系,相信多折腾几次谁都受不了!因为数据库结构的变化,不仅仅是数据库本身的变更,实体类.数据操作层.逻辑层和表现 ...

  4. 软件设计是怎样炼成的(5)——规划系统的骨架(架构设计)(上篇)

    摘要: 概要设计和详细设计,可能是最开始听说的设计,但后来发现如果局限在这两个设计的框架下,可能会有诸多不顺,我们需要架构设计.数据库设计.模块设计和用户体验设计,本文主要分享架构设计,此文有点长,所 ...

  5. 软件设计是怎样炼成的(1)——什么是优秀的设计?

    摘要: 某项目的设计文档评审会上,各路技术大牛进行了"热烈"的讨论,讨论的焦点是怎样的设计才漂亮!大家围绕着如何OO,如何高内聚低耦合,如何反转控制等话题进行了"热烈&q ...

  6. 软件设计是怎样炼成的(7)——细节决定成败(详细设计)

    摘要: 当我们需要考虑类.类的内部细节.类之间的关系时,这时我们已经开始做详细设计了.详细设计不一定是一份文档,也不一定是Word文档,详细设计也不一定叫"详细设计",有时候&qu ...

  7. 软件设计是怎样炼成的——Gregory T. Brown

    作者:Gregory T. Brown,期刊 Practicing Ruby 出版人:非常流行的 PDF 生成库 Prawn PDF 的原作者:IT 咨询顾问,帮助过各种规模的公司确定核心业务问题,力 ...

  8. 学习笔记---程序员练级攻略(入门篇、修养篇、专业基础篇、软件设计篇、高手成长篇)

    根据极客时间 左耳朵耗子 整理,请忽略每一行最后的数字 文章目录 1. 入门篇 47 2. 修养篇 51 3. 专业基础篇 56 4. 软件设计篇 60 5. 高手养成 63 1. 入门篇 47 1. ...

  9. 我的敏捷、需求分析、UML、软件设计电子书 - 下载(持续更新中)

    我将所有我的电子书汇总在一起,方便大家下载!(持续更新) 文档保存在我的网站--软件知识原创基地上(www.umlonline.org),请放心下载. 1)软件设计是怎样炼成的?(2014-4-1 发 ...

  10. 10双屏鼠标过不去_灵耀X2 Duo双屏笔记本是怎样“炼”成的?对话华硕笔记本设计团队...

    2020年的CES上,华硕推出了一款灵耀X2 Duo笔记本,灵耀X2 Duo采用了和灵耀X2 Pro相同的屏幕技术,C面同样采用了一块ScreenPad Plus副屏,机身也更轻更薄.如今灵耀X2 D ...

最新文章

  1. Flex布局教程(来源:阮一峰)
  2. Good Bye 2019 SZU cf集训C~D
  3. c#实现 改进弧长法判断点在多边形里面
  4. Xshell6连Linux
  5. bootcmd和bootargs
  6. 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题
  7. optionals_Java Optionals获得更具表现力的代码
  8. 在给定约束下可以使用a,b和c形成的字符串数
  9. 【剑指offer】面试题33:二叉搜索树的后序遍历序列(Java)
  10. Java服务,内存OOM问题如何快速定位?
  11. DPDK PMD( Poll Mode Driver)轮询模式驱动程序
  12. java juc 包_JUC java并发包
  13. 跟KingDZ学HTML5之八 HTML5之Web Save
  14. 聚类分析用matlab还是spass,利用Matlab和SPSS软件实现聚类分析
  15. Android webview拦截请求
  16. 黑鲨给电脑重装系统的详细步骤
  17. [希腊神话--英语]另类重看英语词汇---序言
  18. python微信抢票脚本_春节到了 教你使用python来抢票回家
  19. flex布局文字溢出显示省略号失效的解决方法
  20. 安装 truffle (CentOS7 与 Windows)

热门文章

  1. try与raise用法
  2. C1083: 无法打开包括文件: “stdafx.h”: No such file or directory
  3. python center用法_【语言学习】python——字符串
  4. mysql约束_mysql数据库的基本建库,建表,约束,属性 操作--001
  5. lbs的核心技术都有哪些?_直击现场 | 腾讯云“揭秘智慧出行核心技术与创新实践”活动完美落幕!...
  6. 机器学习 python 随机抽样random sampling 代码
  7. DevOps使用教程 华为云(6)文档报告 项目进度 会议记录 迭代评审
  8. 【Django 2021年最新版教程30】ubuntu中停止和重启django项目
  9. kubernetes视频教程笔记 (22)-存储-Secret
  10. kubernetest pod为ContainerCreating、ImagePullBackOff状态 怎么办