ELEC5620 Week 03 需求建模讲课总结
ELEC5620 Week 03 讲课总结:Requirements Modelling
课程:ELEC5620 — Model Based Software Engineering,Semester 2 2026 讲师:Dong Yuan 来源:讲义 PDF
3 Requirement Model.pdf(48 页)+ELEC5620-TUT-03.pdf(30 页)+ELEC5620-Lab-Note-3.pdf(1 页)。本周无转录稿。本周覆盖: 1. 需求工程是什么、为什么难、好需求有什么用 2. 三种需求建模方法:Ad hoc → Feature-Oriented → Use Case 3. 功能需求 vs 非功能需求 4. 面向 agentic 软件的 use case 建模(有界自治) 5. Tutorial 3:特征图符号、use case 图组件与关系;Lab 3:三种方法应用到项目
相关笔记:Week 02 MBSE 导论|Stage 1 评分标准与 Lab 3|需求范例(Healthcare)
一、需求工程导论
1.1 软件成功的定义
Software success ⇒ 软件满足其预期目的的程度。 需求建模/需求工程 就是发现这个目的的过程: - 识别利益相关者及其需要 - 以便于分析、沟通和实现的形式记录下来
内在困难:
- 利益相关者的目标可能不明确、难以表达
- 目标的满足可能受到他们控制之外的因素约束
Scott W. Ambler:“提供需求是项目利益相关者的职责,理解和实现需求是开发者的职责。”
讲义还提到 Human Centered Design(把被设计的人放在过程中心),以及 Canvas 上提供的 domain user simulator(Canvas → Pages → View all pages)可以用来模拟领域用户做需求访谈。
利益相关者关注点图(P. Kruchten)与 Week 1 相同,见 Week 01 4.1。这里的问题是:“Where do we start?” —— 答案就是从需求开始。
1.2 好需求的收益 vs 需求陈述的问题
| Benefits of Good Requirement | Issues with Requirement Statement |
|---|---|
| 清晰的期望(客户更易接受) | Ambiguity(歧义) |
| 消除不必要的开发 | Incompleteness(不完整) |
| 降低项目风险 | Conflict(冲突) |
| 更早发现真实缺陷 | Difference in priority(优先级不同) |
| 更快开发、更好维护 | Perceived stakeholders urgency(利益相关者感知的紧迫性) |
| 测试策略更容易制定、设计更健壮 | |
| Iron triangle:time、effort (quality)、money |
1.3 需求工程的定义与五项活动
(Software) Requirements Engineering:通过识别利益相关者及其需要,并以便于分析、沟通和后续实现的形式记录下来,从而发现软件系统目的的过程。(Nuseibeh & Easterbrook)
| 活动 | 关键问题 |
|---|---|
| Eliciting(获取) | 要解决什么问题?系统边界在哪里? 利益相关者是谁、目标是什么? |
| Modelling and analysing(建模与分析) | 用模型表示、检查冲突与遗漏 |
| Communicating(沟通) | 让各方理解 |
| Agreeing(达成一致) | 验证并确认 |
| Evolving(演化) | 需求随时间变化 |
捕获的东西需要沟通、验证并与利益相关者达成一致;建模是支持这些目标的常用技术(但不是唯一的)。
Henry Ford:“If I had asked people what they wanted, they would have said faster horses.” —— 用户说出的是解决方案,需求工程要挖出背后的目的。
1.4 例子:AI-native healthcare agency
讲义用一个“AI 原生医疗代理”贯穿本讲:
| 角色 | 职责 |
|---|---|
| Clinical director(人) | 拥有判断、安全和审批 |
| Intake agent | 收集症状和上下文 |
| Evidence agent | 检索已批准的临床指南 |
| Care agent | 起草下一步并准备转诊 |
| Operations agent | 更新记录、排期和随访队列 |
Running goal:分诊患者咨询、协调照护,但不移除临床医生的问责。
Agent 如何选择下一步行动:
- 模型解读目标和当前状态;工具让它读数据、在外部系统中行动
- 指令和策略约束它的选择
- 循环:plan → act → observe → adjust
- 在条件要求时必须停止、询问或移交
对需求的含义:需求描述的是结果(outcome);允许的决策权必须显式写出。
二、三种需求规格方法总览
| 方法 | 视角 | 特点 |
|---|---|---|
| “Ad hoc” analysis | 混合视角 | 混合了 what / how / how well 等各种需求;不系统、非正式、易出错(遗漏、冲突、不一致、歧义);但通常是最常见的起点 |
| Feature analysis | capability-based view(能力视角) | 系统被看作一组期望属性(features) |
| Use case analysis | operational view(操作视角) | 系统被看作一组实现利益相关者目标的功能能力 |
三者务实地结合通常是最好的方法。
三、Ad hoc 方法:Secure Access Room 例子
3.1 场景
一个只允许授权人员停留的房间。设备:Fingerprint scanner、Fingerprint database、Access Control Software、Door、Motion detector、Horn、Panic button、Enable button、连接 Police Station 的电话线。
3.2 非正式规格(三段)
- 上电即启用。房间内的人任何时候可以按 panic 按钮呼叫警察(如遇抢劫):通过电话线给警察发消息,不响警报。
- 系统启用时有人开门,必须在开门后 30 秒内扫描食指来解除系统。30 秒内无有效指纹 → 警报响 + 给警察发消息,消息包含安装时向警方登记的 8 位系统 ID。
- 系统未启用时,最后离开的人按 Enable 按钮,有 45 秒离开后系统启用。启用状态下运动传感器检测到从窗户进入 → 警报响 + 通知警察。
3.3 为什么非正式规格不够(重点)
文本的非正式性使得以下事情很难做到:
- 识别需求之间潜在的冲突和不一致
- 确定单个需求之间的相互依赖
- 确保覆盖所有需求
- 准确理解需要实现什么
- 把需求追溯到实现(以及反向)
- 为全面测试提供基础
因此需要更系统、更精确的规格方法;需求还需要是电子形式的,方便检索、链接和追溯。
练习:在上面的规格里找问题(解答思路):
| 类型 | 例子 |
|---|---|
| 不完整 | 指纹扫描失败几次算失败?30 秒内扫了错误指纹怎么办?Panic 之后系统状态如何恢复? |
| 歧义 | “last person leaving the room” 系统怎么知道是最后一个人?“entry through a window” 和 “person inside moving” 如何区分? |
| 潜在冲突 | 45 秒离开窗口内有人开门进来,是否要求扫描?Panic 不响警报 vs 窗户入侵响警报,同时发生时如何处理? |
| 混合了 how | “message is sent over the telephone line” 规定了实现手段 |
Tutorial 3 补充:Ad hoc 图是临时性的图,主要用于快速表达想法和讨论——灵活、快速、沟通高效,但缺乏结构,不适合正式文档、难以追踪、难以识别冲突与依赖、可能遗漏需求、实现和测试基础不清晰。Tutorial 建议画 Ad hoc 图时按 What / How / How well 三类去标注需求。
四、Feature-Oriented 方法
4.1 FODA
- Feature-Oriented Domain Analysis,由 SEI 于 1990 年提出,用于分析领域(概念及其关系)
- 和类建模有些相似,但更一般
- 需求分析只是领域分析的一种:被构建系统的领域
Feature:软件系统突出的、用户可见的方面、质量或特征。 更严格的定义(Czarnecki & Eisenecker):领域概念的一个属性,与某些领域利益相关者相关,并用于区分该概念的不同实例。
4.2 特征图符号
| 关系 | 含义 | 常见画法 |
|---|---|---|
| Mandatory | 子特征必须选 | 实心圆点 |
| Optional | 子特征可选可不选 | 空心圆点 |
| Or | 子特征中至少选一个 | 实心扇形 |
| Alternative (xor) | 子特征中恰好选一个 | 空心扇形 |
| Cross-tree constraint | 跨分支的依赖/互斥 | requires /
excludes 或逻辑式 |
4.3 Secure Room 的特征图
Secure Room Software |
(● = mandatory,○ = optional;讲义图中 Manual Control 为可选分支。)
4.4 Agent 配置的特征图(讲义第二个例子)
Agent Product |
这个例子把 agent 的“自治程度”和“控制措施”建成可变点:有写权限的工具,就必须有审批门——这是典型的 cross-tree constraint。
4.5 Tutorial 3 的 E-Shop 例子
- 根特征 E-Shop 标识一条软件产品线(SPL)
- 实现 Catalogue、Payment、Security,以及可选的 Search
- Security:High 或 Standard 二选一(xor)
- Payment:Bank Transfer、Credit Card 或两者(or)
- 跨树约束:包含 Credit Card 的系统必须采用 High security
E-Shop |
可以把合法配置数一下:Payment 有
Feature model 是一条产品线所有产品的紧凑表示,常作为生成文档、schema、代码片段的输入。
4.6 Feature 建模小结
- 关注期望的产品能力
- 静态方法:没有说明特征如何被使用/实现 ⇒ 不容易发现特征之间的潜在冲突
- 特别适合:需求工作的起点;存在大量可变性的情况 ⇒ 产品族,对架构师非常重要
五、功能需求 vs 非功能需求
| 功能需求(FR) | 非功能需求(NFR) | |
|---|---|---|
| 回答 | 系统做什么(what) | 系统做得多好(how well),对“怎么做”加约束 |
| 关注 | 系统功能 | 性能特征:可访问性、可靠性、延迟等 |
但对很多系统来说,两者并不总是可分的。 “Compute the optimal route for a data packet” 与 “Compute the optimal route for a data packet in 4 μsec” 可能是两个完全不同的系统——时间约束改变了算法和架构选择。
Agentic 软件的需求例子:
| FR | NFR |
|---|---|
| Agent shall check reported symptoms for emergency warning signs | Low latency |
| 根据自然语言生成内容 | 高准确率的 LLM 模型(NLP 与 CV) |
| 与人对话 | 用户友好的人机交互(CHI) |
六、Use Case 方法
6.1 概念框架
Use case:为了达成一个明确定义的目标而与系统进行的交互——这个目标对 actor 有价值。
- Actor:有目标;与系统交互以达成一个或多个目标的实体(人或系统)
- System under consideration:有职责支持 actor 的目标;也可能与其他系统交互
- Use case 处于非正式(用户想要什么)与正式(工程师实现什么)之间的边界上
- 作用:给出需求的上下文、促进达成一致、是一组可能的场景
UML 的 use case
图只是一个速记表示——重要(也是困难)的部分是把
use case 本身写清楚。讲义里的元模型多重性:Actor 1
— 0..* Use case 0..* — 1..* Other
system。
6.2 Cockburn 方法的关键要素
- Use case 由 actor 的目标驱动并围绕它定义
- Use case 以 actor 的一个动作开始(trigger)
- Use case 总是以明确结果结束:目标达成或未达成
- Success scenarios(通常一个 main success scenario)
- Failure scenarios(complications)
- 每一步都可能成功或失败;导致失败的条件作为对应失败场景的开头;失败场景从失败点分叉
flowchart TD
P[Precondition] --> S1[STEP 1]
S1 -- success --> S2[STEP 2]
S1 -- failure cond 1 --> F11[STEP F1.1] --> F12[STEP F1.2] --> G2[Goal achieved: SUCCESS]
S2 -- success --> S3[STEP 3] --> G1[Goal achieved: SUCCESS]
S2 -- failure cond 2 --> F21[STEP F2.1] --> X[Goal not achieved: FAILURE]
注意:失败分支不一定以失败告终——恢复后也可能达成目标。
6.3 Use case 模板(ATM 例子)
| Name | Goal | Level | Precondition | Success | Failure | Trigger |
|---|---|---|---|---|---|---|
| Withdraw cash from ATM | Obtain cash | User(System 层面) | User has ATM-readable card | Cash dispensed to user | Cash not dispensed despite valid request | Insertion of card in ATM |
Main scenario:1. 登录 ATM → 2. 选择取款 → 3. 指定金额 → 4. ATM 出钞 → 5. 登出
Extension
scenario(当某一步失败条件成立时启动):在第 4 步
{Insufficient cash on hand} → 1. 通知用户 → 2.
用户登出。
6.4 «extend»、«include»、泛化
| 关系 | 含义 | 箭头方向 | 例子 |
|---|---|---|---|
| «extend» | 给 use case 加一个可选步骤,且不影响原 use case 的规格;需要 extension point | 从扩展用例指向基用例(虚线箭头) | Update Branch Balance --«extend»--> Withdraw Cash,扩展点
X1(第 4 步之后),条件 [service successful] |
| «include» | 场景中某一步本身是一个子 use case(有自己的目标、actor);主用例依赖子用例的功能 | 从基用例指向被包含用例(虚线箭头) | Withdraw Cash --«include»--> Login(Login:询问
PIN → 输入 PIN → 验证 PIN …) |
| Generalization | 父子关系,子用例是父用例的增强 | 实线 + 空心三角指向父用例 | Pay by Card →
Pay |
flowchart LR
W((Withdraw Cash<br/>ext. point: X1))
L((Login))
U((Update Branch Balance))
W -. "«include»" .-> L
U -. "«extend» [service successful]" .-> W
讲义特别提醒:“Note the direction of the arrow!” —— extend 指向基用例,include 指向被包含用例。 这是考试和作业最常见的错误。
记忆:include 是“我必须用到它”(基用例知道子用例);extend 是“它可以插进我”(基用例不知道扩展的存在,只暴露扩展点)。
6.5 保持简单和敏捷
- Use case 应该让利益相关者容易理解,以便他们能推理
- 避免实现细节、保持非正式(不是所有利益相关者都是技术专家)
- 用易读的文本形式
6.6 例子一:Patient Consults AI Health Agent
| 字段 | 内容 |
|---|---|
| Goal | 患者得到症状的解决方案 |
| Level | User-goal |
| Primary Actor | Patient |
| Preconditions | 患者可访问 AI Health Agent;Agent 可访问诊所排期系统 |
| Success postcondition | 患者获得治疗建议(轻症)或确认的医生预约(严重/不确定) |
| Failure postcondition | Agent 未能给出方案 |
| Trigger | 用户启动 AI Agent |
Main success scenario:1 发起对话 → 2 Agent 问候并询问症状 → 3 描述症状 → 4 Agent 追问(严重度、持续时间、病史、过敏)→ 5 患者回答 → 6 Agent 对照医学指南分析 → 7 判断 (a) 轻症可居家/自我用药,或 (b) 需专业评估 → 8 若 7a:给出治疗建议 → 9 若 7b:预约医生 → 10 结束对话。
Extensions:
- 5.a {描述不清或不完整} → 反复澄清直到信息足够
- 7.c {症状危急} → 立即呼叫急救,而不是预约
- 8.a {患者不理解建议} → 换种说法并提供教育资源
Nested use case(第 9 步):查询医生空闲时段 → 患者确认时间 → 预约并提供确认信息。
6.7 面向 agentic 软件的 use case 模型(本讲最新的部分)
对 agentic 软件,use case 模型应该强调“有界自治(bounded autonomy)”和“可观察的结果”——而不只是固定的交互序列。
| 要素 | 写法 |
|---|---|
| Actor goal | 写业务结果,如 “deliver an evidence-backed weekly brief”,而不是 “run the research agent” |
| Authority | 明确 agent 可以读、写、发送、购买或修改什么。把能力(capability)和权限(permission)分开 |
| Success conditions | 定义可观察的成功证据,而不是精确的推理路径 |
| Failure and uncertainty | 把缺数据、证据冲突、工具不可用、低置信度结果建模为正常分支 |
| Human checkpoints | 标出 agent 何时必须询问、获得批准、移交或停止 |
6.8 例子二:Assess and coordinate patient care(有界自治版)
| 字段 | 内容 |
|---|---|
| Goal | 安全的下一步被及时准备好 |
| Level | User goal |
| Primary actor | Patient |
| Preconditions | 患者身份与同意已确认;已批准的指南与排期工具可用 |
| Success postcondition | 经临床医生批准的指导已发送;记录已更新 |
| Failure postcondition | 未发送任何建议;已向临床医生报警并说明原因 |
| Trigger | 患者提交新的健康咨询 |
Main success scenario(bounded autonomy): 0. 患者确认身份、同意和当前症状 1. Intake agent 检查急症警示信号 2. Agent 结构化症状、病史和上下文 3. Evidence agent 检索已批准的临床指南 4. Care agent 起草分诊摘要和下一步 5. Checker 验证依据(grounding)、隐私和安全约束 6. Agent 准备回复(但不发送) 7. 临床医生审核、修改并批准 8. Agent 发送指导并更新健康记录
显式建模失败与移交:
- Emergency red flag → 停止自动化,立即通知医生
- 5.a {指南冲突} → 询问医生
- Clinical context missing → 请求一次,然后移交
- 7.a {未获批准} → 保存草稿,不发送建议
对比 6.6 与 6.8:前者 agent 直接给建议、直接预约;后者 agent 只起草,人类审批后才发送,失败后置条件是“什么都没发”。这就是“Requirements describe the outcome; permitted decision-making is explicit”的具体体现,也是项目 Stage 1 写 use case 时应该采用的写法。
6.9 Use case 小结
- 流行且经过验证的需求规格方法,变体很多;本课采用略作修改的 Cockburn 变体
- 是一种操作性方法,适合作为设计阶段的前端
- 通常用 UML 交互建模(如顺序图) 来补充——但两者不同:use case 更抽象
七、需求规格总结
- 不充分的需求规格可能是软件项目失败的最大来源
- 正确获取需求很难,最好通过与利益相关者持续互动来完成(敏捷/演化式开发);架构师在需求获取中起关键作用
- feature-based + use-case based 结合通常是系统化定义需求的最佳选择
- 需求建模是需求工程中一小步但关键的一步:使需求与设计等其他制品之间的可追溯性可以被自动支持
- 前沿:用 LLM 自动生成需求模型(讲义列了三篇论文链接)
八、Tutorial 3 要点与解答思路
8.1 Use case 图组件
| 组件 | 规则 |
|---|---|
| Actor | 与系统交互的用户:可以是人、组织、外部系统;必须是产生或消费数据的外部对象;用名词命名;是业务中的角色(一个用户可扮演多个角色,如教授既是 instructor 又是 researcher);actor 触发 use case;对系统有职责(输入)和期望(输出) |
| Use case | 椭圆;系统功能(自动或手工过程);动词 + 名词命名(Do Something);每个 actor 必须连到某个 use case,但有些 use case 可以不连 actor(如被 include/extend 的子用例);可被扩展 |
| Communication link | actor 与 use case 之间的实线,表示双方通过消息通信 |
| System boundary | 由需求文档定义,代表整个系统范围;大型系统(如 ERP)中每个模块(人事、工资、会计)可以各自是边界,整体边界包含所有模块 |
8.2 Use case 模板(Tutorial 版)
| Name | Goal | Level | Precondition | Success Condition | Failure Condition | Trigger |
|---|---|---|---|---|---|---|
| User Login | User successfully logs in | User goal level | User is registered | 登录并跳转主页 | 密码错误时显示错误信息 | 用户点击登录按钮 |
8.3 关系画法速查
| 关系 | 线型 | 箭头指向 |
|---|---|---|
| «extend» | 虚线 + 开放箭头,标
<<extend>> |
基用例(扩展用例在箭尾) |
| «include» | 虚线 + 开放箭头,标
<<include>> |
子用例(被包含者) |
| Generalization | 实线 + 空心三角 | 父用例(子用例在箭尾) |
Tutorial 给了 E-Shop、Vehicle Sales System 等示例图(PDF 中为图片,文本未提取)。
8.4 解题模板:给定场景写三种需求模型
- Ad hoc:先自由列出所有需求,按 What / How / How well 标注;找出歧义、遗漏、冲突
- Feature model:把 What 类需求归成能力树,标 mandatory/optional/or/xor;把 How well 中涉及可选配置的写成跨树约束
- Use case:从每个 actor 的目标出发画 use case 图;为核心 use case 写模板 + main scenario + extensions;agentic 功能要写 authority 与 human checkpoint
- 一致性检查:每个 use case 能映射回某个 feature;每个 mandatory feature 至少被一个 use case 覆盖
九、Lab 3 要点
ELEC5620-Lab-Note-3.pdf(文件头标注 “Week 4: Laboratory
3”)要求把本周三种方法应用到自己的项目:
| Part | 方法 | 作用 |
|---|---|---|
| 1 | Ad-Hoc | 非正式、灵活地描述和分析需求——初始定义 |
| 2 | Feature-Oriented | 把需求系统地精化为具体特征 |
| 3 | Use Case | 确保特征满足用户的期望与交互 |
三种方法互补:Ad-Hoc 给初步定义,Feature 系统化精化,Use Case 检验用户交互。
它与 Stage 1 评分表的一一对应关系见 Stage 1 评分标准与 Lab 3;三种模型之间的对应检查见 Lab 1–6 总结 第四节。
十、本周考点速记 / 易错点
- 需求工程五活动:elicit、model & analyse、communicate、agree、evolve;elicitation 三问:问题、系统边界、利益相关者与目标。
- 需求陈述五问题:ambiguity、incompleteness、conflict、priority 差异、感知的紧迫性。
- 三种方法的视角:Ad hoc(混合、最常见起点)、Feature(capability view、静态)、Use case(operational view);结合使用最好。
- 非正式规格不够的六个原因:冲突、依赖、覆盖、精确理解、追溯、测试基础。
- Feature 定义:突出的、用户可见的特征;用于区分概念实例。特征图四种关系:mandatory、optional、or(≥1)、xor(=1)+ 跨树约束。
- Feature 模型缺点:静态,看不出特征如何使用 → 难发现冲突;优点:适合起点和产品族/可变性。
- FR vs NFR:what vs how well;并非总可分(4 μs 例子)。
- Cockburn:目标驱动、trigger 开始、明确结果结束、失败从失败点分叉。
- 箭头方向:«extend» 指向基用例;«include» 指向被包含用例;泛化指向父。
- Agentic use case 五要素:业务结果目标、权限(能力 ≠ 许可)、可观察成功证据、失败与不确定性作为正常分支、人工检查点。
- 易错:use case 命名用“动词 + 名词”;actor 用名词且是角色;不要把 UI 步骤画成 use case;agent 本身一般在系统内部,不画成外部 actor(除非是外部系统)。