简介:面向软件工程学习者与需求分析从业者的案例文档,以教学管理系统JXGL为主线,完整演示如何运用用例驱动方法开展需求获取、系统边界划分、参与者定义、数据库设计与需求规格说明编写,可作为课程设计或项目实践的参考模板。文档系统梳理了选课管理与成绩管理两大业务域,从需求描述、系统范围、用户定义到技术架构与数据表设计均有详细阐述,还说明了与财务系统的交互边界,并对用例识别与事件流描述给出了明确示例,适合需要撰写需求规格说明书的读者对照模仿。另一案例广东省水利厅办公业务资源系统,则展示了大型组织在功能与性能需求分析上的调研思路。资源为单个doc文档,压缩包约1.36MB,内容结构清晰,兼顾理论与落地。已有619人学习下载,适合正在学习需求工程或准备软件工程相关报告的学生、教师及初入行的产品与开发人员快速建立需求分析的整体思路。
1. 软件需求分析:为什么八成项目返工,源头都在这一环
做了这么多年软件交付,我见过最典型的翻车现场不是代码写崩,而是上线当天用户问了一句:“这界面怎么跟我想的不一样?”需求分析看起来只是在纸上写写画画,实际上它决定了一个项目是顺产还是难产。很多团队把需求分析等同于“开会聊需求”,聊完就开写,结果需求文档变成了开发日志的备份——没人看、没条目、没法验收。
软件需求分析这件事,本质上是在回答两个问题:系统到底要做什么,做到什么程度算完成。它把用户脑子里的“我想要个选课系统”翻译成开发能落地的“学生提交选课、校验时间冲突、写入选课表”。这篇笔记从需求获取、建模、写SRS到变更控制,按一条完整链路拆开讲,适合产品经理、需求分析师、开发转岗做项目的同学照着复现。案例部分用一个某高校的选课模块贯穿全文,你只要跟着走一遍,就能在自己的项目里套用。
2. 需求获取的实操套路:访谈问题怎么问,用户原话怎么变成需求条目
2.1 需求获取的第一站:别急着问功能,先问业务现状
很多人做需求访谈时上来就打开空白的“功能清单”开始问:“你要不要导入导出?要不要审批?”这种问法有两个致命问题:用户不是系统设计师,被问功能时只能对着模糊印象回答;你得到的是用户想象中的功能列表,而不是他真实的工作流程。
我一般会把访谈问题分成三类,形成一套固定的提问模板。第一类是业务现状类:“现在这个流程是怎么走的?卡在最久的环节是什么?”第二类是目标预期类:“这个系统上线后,你希望哪件事变得不一样?怎么衡量它变好了?”第三类是约束条件类:“有没有哪些条件是必须遵守的——比如数据要跟现有的某套系统对接,或者操作时间窗口固定死在某个时段。”
以某高校的选课模块为例,教务老师提到“每到学期末就有一堆学生打电话问能不能退课,电话接不过来”,这里隐含的需求不是“做一个电话系统”,而是“学期末学生能自助提交退课申请,教务在系统里审批”。访谈时把这句话记成业务现状,回到办公室再转成候选需求,比现场逼着用户说“是不是需要退课功能”效果更好。
2.2 把用户原话翻译成需求条目:记录模板与三个转换规则
用户原话是不能直接进需求文档的。比如老师说“导出名单的时候能不能顺手把成绩也带上?”如果你只记这句话,开发会把它实现成“名单导出带成绩列”,但用户真实场景可能是“要按成绩筛选不及格学生来通知补考”——这是两个完全不同的功能。转换规则我总结下来有三条。
第一条,去掉“能不能”“顺便”“应该”这类口语词,改成“系统应支持……”的陈述句式。第二条,补全触发角色和前置条件,说清楚谁在什么场景下发起这个操作。第三条,把模糊的形容词换成可量化指标,“名单带成绩”要明确成绩列包含哪些字段、是否需要按分数筛选、导出的格式是Excel还是PDF。
下面给一个可以直接抄的记录模板,我自己一直在用:
| 用户原话(原始记录) | 场景/触发条件 | 需求条目(转换后) | 优先级 |
|---|---|---|---|
| “到期末老是有人打电话问能不能退课” | 选课开放期结束后,学生发起 | 系统应支持学生在规定时间内在线提交退课申请,教务可审批,结果通过站内消息通知学生 | 高 |
| “导名单的时候把成绩也带上” | 教务导出某课程名单时 | 系统应支持按课程导出选课名单及成绩,支持按成绩区间筛选,输出格式为Excel | 中 |
| “别让学生选课选到一半卡住就行” | 选课高峰期 | 系统在200人并发选课下,课程查询响应时间不超过3秒 | 高 |
注意第三行这种描述——用户不会直接说并发和响应时间,这句是访谈后我自己补的量化目标,然后在评审时让用户确认“这个数字是否符合你的预期”。需求分析师的价值就在于替用户把“别卡”翻译成可验证的技术指标,再回到用户面前求确认,而不是把“别卡”原样丢给开发。
2.3 需求优先级怎么排:用MoSCoW区分“必须有”和“锦上添花”
需求条目一多,就会面临“都说自己是刚需”的局面。我常用的排序法是MoSCoW四象限,它不强调计算评分,而是让干系人对每个需求表态,逼出真实权衡。Must have 是缺失就不可用的;Should have 是重要但不做也能以简化版上线;Could have 是锦上添花,时间和预算够就做;Won't have 是明确这期不做,但记入待定池。
以选课模块为例的排序结果:
| 优先级 | 需求条目举例 | 判断依据 |
|---|---|---|
| Must have | 课程发布、在线选课、时间冲突校验、选课结果通知 | 缺失则核心业务无法闭环 |
| Should have | 退课审批、名单导出、选课人数上限 | 缺失则效率低但可用替代流程 |
| Could have | 选课热度提醒、课表日历同步 | 有更好,没有不影响主流程 |
| Won't have | 学生互评、教师评价 | 与选课主流程关联弱,下期再议 |
排序过程中最常见的矛盾是“退课审批”被用户列为最高优先级,但开发认为它只是简单CRUD。这时候要回到业务视角看成本:不做退课审批,开学季教务电话被打爆,人工处理成本远大于开发成本,那它就该进Must have。优先级不是纯技术判断,而是对业务代价的换算。
3. 需求建模:用例图怎么画,用例规约怎么填到开发能直接干活
3.1 从需求条目到用例图:三件套画法,十分钟出第一版
需求条目整理完,下一步是把它变成可视化的建模产物。这里不是说要画整套UML图,而是用用例图把“谁”和“系统做什么”一次性看清楚。画用例图我习惯固定用三件套:参与者、用例、系统边界。参与者是站在系统外部、直接发起操作的角色或外部系统;用例是一条完整的、对参与者有可感知价值的系统功能;系统边界是一个大矩形,里面放用例,外面放参与者。
以选课模块为例。参与者有三个:学生、教务管理员、系统时钟。学生发起在线选课、退课申请、查询选课结果;教务管理员发布课程、审批退课、导出名单;系统时钟是一个特殊的参与者,它触发“自动关闭选课通道”和“自动发送选课截止提醒”。把这三个参与者和他们的用例画出来,加上系统边界,就是一张能拿去评审的用例图。
画图时有几个判断标准可以自检。第一,每个用例必须有明确的参与者,找不到发起者的用例多半是伪需求;第二,用例名字用“动词+宾语”,不要用“处理数据”“信息管理”这种空泛词;第三,一个用例要能回答“做完这个动作,参与者获得了什么价值”,回答不上来就先砍掉。第一版用例图尽量在会议上当场画,让用户看着图调整,比回去自己改完再发邮件高效得多。
3.2 用例规约六要素:让用例从“看图”变成“可执行”的模板
用例图只是骨架,开发真正要看的血肉是用例规约。一个用例规约至少要写清楚六个要素:用例编号与名称、参与者、前置条件、主成功场景、扩展场景、业务规则与验收标准。前置条件描述进入该用例前系统必须处于的状态;主成功场景是用户操作能走通的那一条路径,按序号排列每一步;扩展场景是每一步可能出现的分支和系统响应。
下面是一个可以直接复用结构化的用例规约模板:
用例编号: UC-001 用例名称: 在线选课 参与者: 学生 前置条件: - 学生已登录系统 - 当前处于选课开放期 主成功场景: - 1. 学生查询可选的课程列表 - 2. 系统按培养方案过滤课程并返回结果 - 3. 学生选择课程并提交选课 - 4. 系统校验课程容量与时间冲突 - 5. 系统保存选课记录并返回选课成功 扩展场景: - 3a. 课程容量已满: 系统提示选课失败,返回课程列表 - 4a. 时间冲突: 系统提示冲突课程名称,阻止提交 业务规则: - BR-01 每学期选课学分上限为30学分 - BR-02 同一时间段只能选择1门课程 验收标准: - 在200人并发选课场景下,提交选课接口P95响应时间小于3秒 - 选课失败时必须返回明确的中文错误原因这里重点说一下扩展场景的编号规则:数字前缀对应主成功场景的步骤号,“3a”表示主流程第3步“学生选择课程并提交选课”的分支。这样开发读代码时能立刻定位到某个分支对应业务里的哪一步,写测试用例的人也能按“主场景一条、扩展场景逐条”的方式覆盖边界。业务规则要独立编号,比如BR-01、BR-02,方便后续追踪矩阵把规则映射到具体代码模块。
写完规约后做一次自检:把主成功场景从头读一遍,看是否每步都有明确的输入、处理和输出;再检查扩展场景是否覆盖了容量、时间冲突、权限不足、网络超时这几类典型情况,漏掉的补上。
3.3 从用例推导功能清单和数据字典:批量产出比一个个脑补靠谱
用例图画好、规约填完,功能清单其实就已经成型了。主成功场景里的每一步,加上扩展场景里的每一步系统响应,横向展开就是开发要实现的接口或页面动作。比如UC-001的主场景有5步,其中“查询可选课程列表”“提交选课”“校验课程容量”就是三个待开发的函数入口,“返回选课成功”是一个结果通知动作。
更关键的一步是顺手整理数据字典。数据字典描述系统里要存的业务数据,每条数据包含:字段名、类型、是否必填、取值范围。选课模块的数据字典至少包括学生信息、课程信息、选课记录、退课申请、审批记录。数据字典不用一步到位,先从用例的参与者动作里把“操作对象”找出来,再逐条补充字段。
常见做法是把功能清单和数据字典放在一个Excel的两个sheet里,功能清单按“所属模块、用例编号、功能名、关联接口、优先级”五列整理;数据字典按“数据实体、字段名、类型、必填、说明”五列整理。这样开发看功能清单知道做什么,看数据字典知道数据长什么样,测试看两者能写出覆盖场景的用例。我这个习惯帮团队省掉了大量“这功能数据哪来的”的确认邮件。
4. 写一份能指导开发的SRS:章节结构、需求编号与非功能需求量化
4.1 SRS的目录结构:怎么编排让开发、测试、验收各取所需
需求规格说明书(SRS)不是给项目经理充门面的,它是要被开发当输入、被测试当依据、被验收当标准的。因此章节结构必须能让人快速定位。我推荐的目录如下,按“谁在什么条件下操作什么功能,做到什么标准”这条逻辑编排:
| 章节 | 内容 | 主要读者 |
|---|---|---|
| 1. 引言 | 目的、范围、术语定义、参考文档 | 所有角色 |
| 2. 总体描述 | 产品视角、用户特征、运行环境、设计与实现约束 | 架构师、开发 |
| 3. 功能需求 | 按模块或用例编号组织,引用用例规约 | 开发、测试 |
| 4. 非功能需求 | 性能、安全、可用性、兼容性、可维护性 | 架构师、运维 |
| 5. 接口需求 | 用户界面接口、外部系统接口、数据接口 | 开发 |
| 6. 附录 | 数据字典、追踪矩阵、待定问题清单 | 项目经理、测试 |
章节编排的关键是“功能需求与非功能需求分开写”。我见过很多SRS把“系统要快”“页面要好看”揉在功能描述里,结果开发只实现了功能、忽略了性能,测试也找不到验收依据。
4.2 需求编号与可验证性:每条需求都能回答“怎么算完成”
SRS最容易出现的问题,是需求条目写得像散文。开头写上“学生选课要方便快捷”,这种需求开发没法落地,测试也没法验收。让需求可验证要满足三个条件:可量化、有验收动作、边界清晰。
先建立编号规范。我统一用“SRS-模块缩写-类型缩写-三位序号”的格式。例如:SRS-REG-FN-001,表示选课注册模块的第1条功能需求;SRS-REG-NF-001,表示选课注册模块的第1条非功能需求。编号在评审、变更、测试用例引用中反复出现,没有编号,追踪矩阵就是空的。
可验证性差距用两个例子对照说明:
| 类型 | 不可验证写法 | 可验证写法 |
|---|---|---|
| 性能需求 | 系统响应要快 | 在千兆局域网环境、200人在线并发条件下,选课查询接口P95响应时间小于3秒,成功率不低于99.5% |
| 功能需求 | 系统支持退课 | 学生在选课截止日前可提交退课申请,教务审批后系统更新选课记录并向学生发送站内通知,退课结果实时可查 |
| 安全需求 | 权限控制要严格 | 学生角色只能查看和修改本人选课数据;教务角色可查看全部学生选课数据但不可修改学生个人信息,操作记录留痕 |
写每条需求时都问一句“验收时怎么看这条达成了”,答不上来就继续补细节。这个习惯能同时约束需求分析的质量和开发的实现范围。
4.3 非功能需求量化:性能、安全、兼容性指标怎么写
非功能需求是SRS里最容易被抄模板的部分,但也有最不起眼的坑——照搬性能指标。我见过一个面向内部的考勤系统把SRS里的并发指标写成了“支持十万级并发”,开发为了达到这个指标选了重负载方案,结果上线根本用不上,项目交付推了一个月。量化指标的前提是贴合真实使用场景。
性能需求至少要覆盖两个场景:正常场景和峰值场景。选课模块的正常场景是工作日平均选课人数在线几百人,峰值场景是开放选课通道前五分钟涌入几千人。指标可以拆成响应时间、吞吐量、成功率三类分别量化:查询接口P95响应时间3秒内;提交选课接口峰值吞吐量每分钟不少于500次;峰值场景接口成功率不低于99%。写清楚测试环境(局域网还是公网、并发工具),避免验收时扯皮。
安全需求最容易被忽略的是审计日志。很多团队写了“系统具备权限管理”,却没写“关键操作留痕”。补充一句“学生提交退课、教务审批退课、管理员修改课程信息三类操作必须记录操作人、操作时间、操作内容和操作前值”,验收时测试就能按这条写用例。兼容性需求也要写具体对象,比如“支持Chrome 100以上版本、Edge 110以上版本,不支持IE”比“兼容主流浏览器”可用得多。
5. 需求分析与评审中的五个坑:现象、原因与对策
5.1 坑一:用户说“就按某某系统那样做”,结果做出来完全不对
现象:需求访谈时用户指着一个现有系统说,“就按它的样子做”,团队照着做完,用户反馈说“我要的不是这个”。原因:用户以为界面一致就等于功能一致,实际上他只看到了表层交互,没看到现有系统的业务规则和异常处理。
解决:遇到这种描述时,把用户指的系统和当前项目做一个差异分析表,逐模块列三列:现有系统的行为、本项目要保留什么、要改什么。然后拿着差异表问用户“这个模块的规则你确认吗”,而不是直接去模仿界面。差异表里写不清楚的部分,回到业务现状问题继续追问。
5.2 坑二:原型已经确认,开发期用户说“当时我没看到这个”
现象:原型评审通过了,进入开发后用户拿着某个页面说“这里不该是这样的”,查记录发现原型里确实有对应内容,但评审时没人提出异议。原因:原型确认流于形式,参与评审的人只看演示、没验证业务细节,也没对确认结果签字。
解决:把原型评审改成交付式确认。每个原型页面旁挂一个需求条目编号的清单,评审结束前逐条打钩,并由关键用户在确认单上签字。原型版本要显式标注,封面写明版本号、确认日期、确认人,开发期间以某个固定版本为准,后期任何改动走变更流程,不接受口头修改。
5.3 坑三:用例图画得很漂亮,开发却说看不懂
现象:用例图画了几十张,评审会上讲得头头是道,开发开工后抱怨“用例图对编码没帮助”,转头按自己的理解做。原因:用例图只是概览,开发需要的是用例规约里的场景步骤和业务规则,图本身无法承载异常分支的细节。
解决:画完用例图后,把时间花在用例规约上而不是继续美化图。给每个用例规约补全主成功场景、扩展场景和业务规则。评审时只允许讨论规约里的具体步骤,不许停留在“图上画的对不对”这个层面。开发真正看的是文字场景,不是图形。
5.4 坑四:需求蔓延,每次评审都有人“顺便加个小功能”
现象:需求评审会开了三四轮,每轮都加一个“很小的功能”,最后整体工作量比预期超出30%。原因:没有变更控制机制,参会者默认“加上也没多少钱”,但实际上每个小功能都要走设计、开发、测试、文档四道工序。
解决:需求基线建立后,任何新增条目都必须走变更申请审批流程。定义一个阈值,比如单个功能预估工作量超过0.5人天或会影响已有需求条目验收标准的,必须书面变更;小于阈值且不改变已有行为的小修正,记入“待定清单”,累积到一定数量再统一评审。
5.5 坑五:非功能需求没人填,上线前被运维打个措手不及
现象:SRS写完了,开发编码时没人关注性能,联调阶段测试一压测就超时,运维说服务器配置达不到要求,双方互相甩锅。原因:非功能需求没有在需求阶段由业务方和开发共同确认,导致性能目标成了“上线后才发现的惊喜”。
解决:非功能需求要在需求评审时逐条过完,并标注验收环境。性能指标写清楚测试环境规格、并发工具和阈值。安全指标要和运维确认日志保留周期、审计字段范围。兼容性指标要和前端确认最低支持版本,并写进测试计划,而不是默认“现代浏览器都支持”。
6. 需求变更管理的一个实用技巧:先审后改,别让“再次确认”变成空话
最后一章我想落到一个我反复踩过坑才养成的习惯:先审后改。需求变更最忌讳的是开发觉得“改起来很快,直接动手吧”,等你发现需要连带改数据库表结构和联调两个外部系统时,改动已经悄悄写进去了。我现在制定了一套固定的变更处理流程:变更提出方提交申请,写明变更内容、原因和期望完成时间;需求分析师做影响分析,列出关联的需求条目、用例、数据实体和接口;开发估算工作量变化;项目经理根据阈值决定批准、拒绝或排期延后。
影响分析的目标是把“用户说加个字段”变成一张清单。我常用的影响分析表有五个列:受影响的需求编号、影响的用例或页面、影响的数据实体、影响的接口、影响的验收标准。比如用户提出“退课需要填写退课原因并上传附件”,查追踪矩阵发现影响SRS-REG-FN-001、用例UC-003、数据实体退课申请、restful接口一份,还影响验收标准里“退课信息字段”的描述。这张表贴到变更申请单上,项目经理就能判断这个改动值不值得做、要花多少成本。关键动作是改完SRS后同步更新用例规约和需求追踪矩阵,不做完这两步,变更就等于没有发生。
“先审后改”还有一层含义是给需求分析过程本身留一个复盘节点。每个迭代结束,花半小时回看这轮变更记录,找出哪些需求是可以在获取阶段问得更细的。我做过的一个消息中心项目,连续三个迭代都在改通知触达规则,复盘才发现是访谈时漏了一个约束条件“某些通知要避开非工作时间发送”,如果第一次访谈就问这个,后面这些变更大部分不会发生。需求分析不是一次性的雷,它是反复打磨出来的矿。这趟流程你亲手走一遍,会比看十篇笔记都管用,希望帮到你。
本文还有配套的精品资源,点击获取