zoukankan      html  css  js  c++  java
  • 软件设计是怎样炼成的(2)——优秀设计从分析需求开始

    摘要:

    设计应该针对需求来做,这个大道理似乎人人都懂,但实际操作时往往就不是这样。所以我们也不说大道理,直接通过一个“很简单”的案例来体验一下优秀设计应该如何从分析需求开始,体验架构设计是如何全面考虑各种需求、项目的工期限制预算限制,还有项目组人员水平后做出来的。

    大纲:

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

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

    3.优秀设计从分析需求开始

    设计应该针对需求来做,这个大道理似乎人人都懂,但实际操作时往往就不是这样。所以我们 也不说大道理,直接通过一个“很简单”的案例来体验一下优秀设计应该如何从分析需求开始。

    3.1 案例挑战:考勤系统的软件设计

    某公司要做一个内部用的考勤系统,希望达成以下目标:

    1)规范员工的上下班、请假、外出工作等行为。
    2)
    方便计算员工的薪金。
    3)方便管理各种带薪假期。

    你如何考虑本系统的设计呢?

    你可能会说:我靠,才三句话的需求,怎样做设计呢?

    说得太好了!我们做软件设计的,第一步并不是直接去设计,而是分析需求!

    3.2 如何分析需求?

    当你接受一个项目的设计任务时,可能会遇到比较尴尬的情况,那就是需求有问题!

    具体的情况可能有:

    a)需求很简单,几句话或者是一页纸的需求。
    b)需求很详细,可能有几十页甚至上百页,这些需求是招标书中提供的,或者是客户直接提供的。不要以为有这么多需求是好事,这些需求通常是前后有点矛盾、逻辑有点混乱,甚至是不知所云滴!

    c)你们有专门的部门或者专职完成了需求工作,提供了一份需求文档。你也不要以为这是好事,因为很可能会出现这样的情况:需求文档的提供者认为自己写的需求文档很牛逼,水平很高;但负责实现的开发部门认为该文档质量太差,比方说:不考虑实现的可能性和难度,没有考虑到客户的真正需求等等。有时候甚至出现开发部门忽略掉需求部门,直接找客户重新调研,重新编写需求文档的情况。

    上述三种情况一句话总结就是:需求的质量有问题!

    我们需要重新分析一次需求,先从业务角度审视一次,然后再从软件设计的视角审视一次。通常我们需要按顺序思考以下问题:

    1)什么人会使用这个系统?
    2)不同的人将会使用这个系统的什么功能?
    3)还有哪些不确定或不具体的需求点?
    4)哪些需求对技术提出了怎样的要求?
    5)系统的大致架构应该如何考虑?

    下面开始我们看几个图,按顺序逐一思考一下上述的几个问题。本小节回答问题1、2,后面的小节回答其他问题。

     1)什么人会使用这个系统?

    不少技术人员分析需求时往往是技术的视角,当你问他系统有什么用户时,你可能得到的结果有两种:

    a)没有什么用户啊,所有人都是用户,因为系统只需要配置一下权限,谁都可以用。
    b)系统有两种用户,就是:用户和管理员。

    我们从业务的角度来审视一下考勤系统的可能用户,请看下图:

    图2.1 系统可能用户分析

    此图列出了如下可能用户:

    employee:员工
    finance:财务
    receptionist:前台
    manager:经理
    senior manager:高级经理
    administrator:管理员

    而上述用户还有这样的关系:finanace(财务)、receptionist(前台)、manager(经理)继承employee(员工);senior manager(高级经理)继承manager(经理)。

    用户之间的继承关系,是什么意思呢?

    我们都知道代码中B类(子类)继承A类(父类),子类就具备了父类的特点。用户之间的继承关系是相同的意思,我们继续看看下图你就可以理解了。

    下图将会回答这个问题:

    2)不同的人将会使用这个系统的什么功能?

    图2.2 系统的需求分析

    图2.1和图2.2都是UML的用例图,两个图加在一起比较完整系统地表达了以下问题:

    a)什么角色会用本系统?
    b)这些角色通过本系统分别能干什么事情?
    c)角色之间有可能会有继承关系,请留意父类能干的事情,子类也能干,例如:employee可以打卡,manager也可以打卡,尽管图2.2中manager没有直接与”打卡“相连,但图2.1中已经说明了manager继承employee。

    UML是需求分析的有力工具,我的工作中很喜欢用UML。但你的工作中、你的需求文档中可能会没有UML图,不管你们是否用UML图,分析需求时都需要从业务的角度思考这些问题:

    a)什么人(角色)会用这个系统?
    b)这些人(角色)分别需要用系统的什么功能?

    需求分析其实是一个负责的高难度的话题,回答上述两个问题仅仅是需求分析的第一步而已,我们还需要深入分析业务,包括业务流程、业务数据结构等等。如果之前的需求工作不到位,就需要我们立马开展软件设计工作,其实将会埋下很多地雷,后患无穷。关于需求分析的更多分享,请留意我的其他文章。

    3.3 找出设计关注点

    本小节我们回答这两个问题:

    3)还有哪些不确定或不具体的需求点?

    4)哪些需求对技术提出了怎样的要求?

    软件设计师需要有敏锐的需求及设计触觉,看着图2.1和图2.2 嗅出一些问题,你能嗅出一些问题吗?

    请看下图:

    图2.3 系统的设计点分析

    图2.3主要从设计的视角对需求再进行一次审视,以下是一些建议:

    a)你需要更加深入思考需求,考虑到各种不同的业务场景和特殊情况,例如:领导不在公司时如何审批请假?
    b)你需要思考需求的细节,例如:报表的具体形式?
    c)你需要思考各种技术方案,例如:打卡数据的同步方案,财务软件是否要对接等等?
    d)你要做出平衡,用合适的方案和尽量少的工作量来满足需求。

    3.4 针对需求做初步的架构设计

    本小节将会回答这个问题:

    5)系统的大致架构应该如何考虑?

    接下来你要做初步的架构设计了,架构设计是难度很高的事情,需要你全面考虑需求,考虑工期限制预算限制,考虑项目组人员的水平,而做出的一种平衡。请看下图:

    图2.4 系统架构的考虑

    图2.4是UML的部署图,这个图比较粗糙,而且为了降低大家阅读难度,我仅仅是用了部署图的最基本最少的语法来表达。

    图2.4中的每一个立体的矩形,表示的就是物理上或者是逻辑上的一台设备,设备之间 有物理连接的话就用线条连接,每台设备中”{ }“括起来的文字是对该设备的进一步说明。

    图可能是表达设计的最好方式,建议大家用UML,表达系统架构时,用UML的部署图、组件图和包图是比较合适的。我们设计的系统多数是分布式系统,不是单机系统,用部署图来表达分布式系统的架构设计可能是比较合适的。

    图2.4针对图2.3中提出的问题进行了初步的回应,图2.4 就是一个初步的架构设计,当然后续我们还需要继续细化这个设计。

    3.5 小结:如何需求驱动设计?

    本篇的例子告诉我们:

    1)优秀的设计是需要从分析需求开始的。
    2)需求的质量可能有问题,那么我们需要从业务的角度重新审视一次。
    3)从设计的角度审视需求,我们会提出很多需求细化及设计方案的问题。
    4)架构设计是全面考虑各种需求、项目的工期限制预算限制,还有项目组人员水平后综合做出来的一种平衡。

      

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

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

    作者:张传波

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

    软件研发管理资深顾问

    CMMI首席专家

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

    软件知识原创基地创办人

  • 相关阅读:
    SpringBoot项目启动与关闭脚本
    springboot mybatis启动初始化数据库
    springboot mybatis多数据库支持
    Tomcat配置https访问
    Oracle批量生成版本
    Oracle创建用户表空间
    OracleServiceXE服务没有了
    IDEA离线升级
    js过滤并校验XSS
    docker命令
  • 原文地址:https://www.cnblogs.com/umlonline/p/3533247.html
Copyright © 2011-2022 走看看