在软件开发的世界里,需求分析就如同盖房子前的设计图纸,是整个开发过程的基石。如果需求分析做得不到位,后续的开发工作就会像在流沙上建楼,随时可能崩塌。想象一下,你想要一款能在线点餐的 APP,结果开发者给你做了一个外卖配送管理系统,这就是需求分析失败的典型案例。今天,我们就自顶向下、全面详细地聊聊软件需求分析,让小白也能轻松掌握其中的精髓。
3.1 需求分析的任务
需求分析是软件开发的第一个关键阶段,它的核心任务是搞清楚 “系统到底要做什么”。具体来说,包括以下几个方面:
3.1.1 确定对系统的综合要求
这一步要明确系统在功能、性能、可靠性、安全性等方面的具体要求。以一个电商平台为例,功能要求可能包括商品展示、购物车管理、订单提交等;性能要求可能是页面加载时间不超过 2 秒,支持同时在线 10 万人;可靠性要求是系统全年 downtime 不超过 1 小时;安全性要求则包括用户信息加密存储、支付过程安全等。
3.1.2 分析系统的数据要求
数据是软件系统的血液,分析数据要求就是要明确系统需要处理哪些数据,这些数据的来源、格式、存储方式以及它们之间的关系。比如在电商平台中,需要处理的用户数据包括用户名、手机号、地址等;商品数据包括商品名称、价格、库存等。我们可以用一个简单的表格来梳理数据要求:
数据类别
数据项
来源
格式
存储方式
用户数据
用户名、手机号、地址
用户注册
字符串、数字
数据库表
商品数据
商品名称、价格、库存
商家上传
字符串、浮点数、整数
数据库表
3.1.3 导出系统的逻辑模型
逻辑模型是对系统功能和数据的抽象描述,它不涉及具体的技术实现,只关注系统 “做什么” 而不是 “怎么做”。结构化分析方法中,逻辑模型主要由数据流图、实体联系图和状态转换图组成。比如对于电商平台的下单功能,逻辑模型会描述用户从添加商品到提交订单过程中的数据流向和处理逻辑,而不关心是用 Java 还是 Python 实现。
3.1.4 修正系统开发计划
在需求分析过程中,我们可能会发现最初的开发计划存在不合理之处,比如对开发时间的估计不足,或者所需的技术资源无法满足等。这时候就需要根据需求分析的结果对开发计划进行修正。例如,原本计划 3 个月完成电商平台的开发,但在需求分析后发现需要实现的支付接口集成工作比预期复杂,于是将开发时间调整为 4 个月。
3.2 与用户沟通获取需求的方法
获取准确的需求离不开与用户的有效沟通,以下是几种常用的沟通方法:
3.2.1 访谈
访谈是最直接的需求获取方法,分为正式访谈和非正式访谈。正式访谈适用于获取结构化的需求,比如针对电商平台的功能模块,我们可以准备好详细的问题清单对商家和用户进行访谈;非正式访谈则更灵活,可以在闲聊中获取用户的潜在需求。在访谈前,要做好充分准备,明确访谈目标和问题;访谈中,要积极倾听,及时记录;访谈后,要对访谈内容进行整理和确认。
比如我们访谈电商用户时,可以问:“您在购物时希望能看到商品的哪些信息?”“您对订单跟踪功能有什么要求?” 等问题。
3.2.2 面向数据流自顶向下求精
这种方法从系统的顶层功能入手,逐步细化,直到明确每个具体的功能点。就像剥洋葱一样,一层一层深入。以电商平台的订单处理为例,顶层功能是 “订单处理”,向下求精可以分为 “订单创建”“订单支付”“订单发货”“订单完成” 等子功能,每个子功能还可以进一步细化,比如 “订单支付” 可以细化为 “选择支付方式”“提交支付请求”“接收支付结果” 等。
3.2.3 简易的应用规格说明技术
这是一种面向团队的需求收集方法,旨在解决传统沟通中信息不对称、需求遗漏等问题。它通常由用户、开发者和领域专家组成一个团队,通过会议的形式共同讨论需求。在会议上,大家提出各自的看法和需求,然后一起分析和整理,形成初步的需求规格说明。
例如,在电商平台需求收集会议上,用户提出希望有优惠券功能,开发者提出实现该功能需要考虑优惠券的生成、发放、使用规则等,领域专家则补充了优惠券在电商行业的常见玩法和注意事项,最终团队共同确定了优惠券功能的需求细节。
3.2.4 快速建立软件原型
建立原型是最有效的需求分析技术之一。原型是一个可以运行的简易版本,它能够直观地展示系统的功能和界面,让用户提前感受系统的使用效果。通过用户对原型的反馈,我们可以快速调整和完善需求。
比如在开发电商平台的购物车功能时,我们可以先制作一个简单的原型,包含添加商品、修改数量、删除商品等功能。用户使用后可能会提出 “希望能看到商品的小计金额”“增加批量删除功能” 等需求,我们根据这些反馈对原型进行修改,直到满足用户需求。
3.3 分析建模
分析建模是需求分析的核心环节,采用结构化分析方法,通过建立模型来更好地理解问题。结构化分析包括数据建模、功能建模和行为建模,它们分别对应实体联系图、数据流图和状态图,而数据字典则作为三个模型的粘合剂,确保模型之间的一致性和完整性。
3.3.2 软件需求规格说明
软件需求规格说明(SRS)是需求分析阶段的最终产物,它详细描述了系统的功能、性能、数据、接口等需求,是开发者和用户之间的一份契约。SRS 应该具有准确性、完整性、一致性、可追溯性等特点。
一份完整的 SRS 通常包括以下内容:引言(项目背景、目的等)、总体描述(系统功能概述、运行环境等)、具体需求(功能需求、性能需求、数据需求等)、接口需求、非功能需求(安全性、可靠性等)、其他需求(如法规遵循等)。
3.4 实体联系图
实体联系图(E-R 图)是数据建模的重要工具,用于描述系统中的数据对象、属性以及它们之间的关系。
3.4.1 数据对象
数据对象是现实世界中存在的事物,是我们要收集和处理的信息实体。在电商平台中,数据对象可以是用户、商品、订单等。
3.4.2 属性
属性是数据对象的特征,用来描述数据对象。比如用户的属性有用户名、手机号、年龄等;商品的属性有商品名称、价格、品牌等。
3.4.3 联系
联系是数据对象之间的关系。在电商平台中,用户和订单之间是 “购买” 关系,商品和订单之间是 “包含” 关系。联系可以分为一对一、一对多和多对多三种类型。例如,一个用户可以有多个订单,属于一对多关系;一个订单可以包含多个商品,一个商品也可以出现在多个订单中,属于多对多关系。
3.4.4 实体 - 联系图的符号
E-R 图使用特定的符号来表示数据对象、属性和联系。通常用矩形表示数据对象,椭圆表示属性,菱形表示联系,线条用于连接它们。比如用矩形框写 “用户” 表示用户这个数据对象,用椭圆写 “用户名” 表示用户的属性,用菱形写 “购买” 表示用户和订单之间的联系。
3.5 数据规范化
数据规范化是为了减少数据冗余和异常,提高数据的一致性和完整性。常见的范式有第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。
第一范式要求每个属性都是不可分割的原子值。比如 “用户地址” 这个属性,如果包含省、市、区等信息,就需要拆分成 “省份”“城市”“区” 等原子属性。
第二范式在第一范式的基础上,要求非主属性完全依赖于主关键字。例如,在订单表中,订单 ID 是主关键字,商品名称、价格等非主属性应该完全依赖于订单 ID,而不能依赖于其他非主属性。
第三范式在第二范式的基础上,要求非主属性不传递依赖于主关键字。比如在用户表中,用户 ID 是主关键字,用户所在地区的邮政编码依赖于用户地址,而用户地址又依赖于用户 ID,这就存在传递依赖,需要将邮政编码拆分到地区表中。
举个例子,一个不规范的订单表可能包含订单 ID、商品 ID、商品名称、商品价格、用户 ID、用户名等字段。其中商品名称和商品价格依赖于商品 ID,用户名依赖于用户 ID,存在数据冗余和传递依赖。规范化后,我们可以将其拆分为订单表(订单 ID、商品 ID、用户 ID、数量)、商品表(商品 ID、商品名称、商品价格)和用户表(用户 ID、用户名)。
3.6 状态转换图
状态转换图(STD)是行为建模的工具,用于描述系统在不同状态下的行为以及状态之间的转换。
3.6.1 状态
状态是系统在某一时刻的行为模式。在电商平台的订单系统中,订单可能有 “待支付”“已支付”“已发货”“已完成”“已取消” 等状态。
3.6.2 事件
事件是触发状态转换的因素。比如用户支付订单会触发订单从 “待支付” 状态转换为 “已支付” 状态;商家发货会触发订单从 “已支付” 状态转换为 “已发货” 状态。
3.6.3 符号
状态转换图使用圆角矩形表示状态,箭头表示状态转换,箭头上的文字表示触发转换的事件。例如,用圆角矩形写 “待支付” 表示订单的待支付状态,从 “待支付” 指向 “已支付” 的箭头旁写 “用户支付” 表示触发该转换的事件。
3.6.4 例子
以电商平台订单状态转换为例,状态转换图如下:
“待支付” 状态在 “用户支付” 事件触发下转换为 “已支付” 状态;“已支付” 状态在 “商家发货” 事件触发下转换为 “已发货” 状态;“已发货” 状态在 “用户确认收货” 事件触发下转换为 “已完成” 状态;“待支付” 状态在 “用户取消订单” 或 “超时未支付” 事件触发下转换为 “已取消” 状态。
3.7 其他图形工具
除了上述提到的图表,还有一些其他常用的图形工具可以辅助需求分析。
3.7.1 层次方框图
层次方框图用于展示系统的层次结构,从上到下逐步细化。以电商平台为例,顶层是 “电商平台系统”,下一层可以分为 “用户管理子系统”“商品管理子系统”“订单管理子系统” 等,每个子系统又可以进一步细化为具体的功能模块。
3.7.2 Wainier 图
Wainier 图用于描述功能和数据之间的关系,它将功能和数据分别列在图的两侧,用线条连接表示它们之间的关联。例如,“添加商品” 功能与 “商品数据” 相关联,“提交订单” 功能与 “订单数据”“用户数据” 相关联。
3.7.3 IPO 图
IPO 图(输入 - 处理 - 输出图)展示了一个功能模块的输入、处理过程和输出。以 “订单支付” 功能为例,输入是订单信息和支付信息,处理过程是验证支付信息、扣减库存、生成支付记录等,输出是支付结果和更新后的订单状态。
3.8 验证软件需求
验证软件需求是确保需求的正确性、完整性和一致性,为后续开发工作奠定坚实基础。
3.8.1 从哪些方面验证软件需求正确性
正确性:需求是否准确反映了用户的实际需求,是否符合项目的目标和范围。完整性:是否涵盖了所有必要的需求,没有遗漏。一致性:需求之间是否存在矛盾和冲突。可行性:需求是否在现有技术和资源条件下可以实现。可检验性:需求是否具体、明确,能够通过测试等方式进行验证。
3.8.2 验证软件需求的方法
需求评审:组织用户、开发者、领域专家等对需求规格说明进行评审,找出其中的问题和不足。原型演示:通过演示软件原型,让用户直观感受系统功能,收集用户反馈,验证需求的准确性。测试用例设计:根据需求设计测试用例,如果能够设计出明确的测试用例,说明需求是可检验的。追溯性分析:检查需求是否能够追溯到用户的原始需求,以及后续的设计、开发等环节是否能够追溯到需求。
3.8.3 用于需求分析的软件工具
常用的需求分析软件工具包括:
Visio:用于绘制数据流图、实体联系图、状态转换图等各类图表。Axure RP:用于快速制作软件原型,支持交互设计。JIRA:用于需求管理,包括需求的收集、跟踪、评审等。Rational RequisitePro:功能强大的需求管理工具,支持需求的建模、追踪和分析。
3.9 小结
软件需求分析是软件开发过程中至关重要的一步,它的目的是确认系统做什么,明确系统的基本功能。在用户帮助下,通过面向数据流自顶向下逐步求精、应用规格说明技术、快速建立软件原型等方法获取需求。为了更好地理解问题,采用结构化分析进行建模,包括数据建模(实体联系图)、功能建模(数据流图)和行为建模(状态图),数据字典则将这三个模型紧密结合。
任何一个功能都是把输入数据变成输出数据,而算法定义了转变的规则。通过需求分析,我们能够明确系统的功能、数据、行为等方面的需求,为后续的设计、开发和测试工作提供清晰的指导。希望通过本文的讲解,能让想学习软件需求分析的读者全面掌握相关知识,在实际项目中运用自如。
还想看更多,来啦!!!
1,大数据比赛篇全国职业院校技能大赛-大数据比赛心得体会_全国职业职业技能比赛 大数据-CSDN博客
2,求职简历篇(超实用)大学生简历写作指南:让你的简历脱颖而出-CSDN博客
3,AIGC心得篇aigc时代,普通人需要知道的-CSDN博客
4,数据分析思维篇学习数据分析思维的共鸣-CSDN博客
5,中年危机篇“中年危机”如何转变为“中年机遇”-CSDN博客
其他需求,看主页哦!