ELEC5620 Week 02 模型驱动软件工程导论讲课总结
ELEC5620 Week 02 讲课总结:Introduction to Model Based Software Engineering
课程:ELEC5620 — Model Based Software Engineering,Semester 2 2026 讲师:Dong Yuan(School of Electrical and Information Engineering) 来源:讲义 PDF
2 Introduction to MBSE.pdf(43 页)+ELEC5620-TUT-02.pdf(30 页)+ELEC5620-Lab-Note-2.pdf(1 页)。本周没有转录稿,以下内容以讲义和 tutorial 为准,不包含课堂口述。本周覆盖: 1. 项目主题背景:从 LLM 到 Agentic AI,One-Person AI Company 2. MBSE 导论:The Problem(复杂度)→ The Premise(模型与 MBE)→ The Results(工业案例) 3. Vibe coding 与模型驱动的关系 4. Tutorial 2:抽象 vs 自动化、智能鞋店 Use Case 示例、UML 工具
相关笔记:Week 01 软件架构导论|项目指南|需求范例(Healthcare)|Lab 1–6 总结
一、项目主题背景:从 LLM 到 Agentic AI
1.1 AI 概念的层级
讲义第 3 页用一组同心圆说明概念的包含关系:
近几十年 IT 的发展路线:Cloud → Big Data → AI/5G → IoT/Edge Computing,并且 XaaS(Everything as a Service) 成为交付和使用应用的主要方式。
| 概念 | 讲义定义 |
|---|---|
| Generative AI | LLM 生成文本、图像等内容 |
| Agentic AI | 高度自主的系统,在大多数有经济价值的工作上超过人类;拥有类人的认知能力(相对于只做特定任务的 Narrow AI) |
Agentic AI 的应用领域:个人效率助手、自主研究 agent、客服、智能家居编排、金融与市场分析、供应链管理、医疗助手、教育培训、软件开发自动化等。
1.2 一个 Agent 的五个组成部分(重点)
| 组成 | 含义 |
|---|---|
| Perception(感知) | 解释环境中的数据,理解目标 |
| Reasoning & Planning(推理与规划) | 决定朝目标前进的下一步 |
| Action & Executing Tasks(行动与执行) | 在数字或物理世界里与其他系统/agent 交互 |
| Feedback Loops(反馈回路) | 自我评估与调整 |
| Memory(记忆) | 存储知识、状态和过往经验 |
做项目时,每一个“AI 角色”都可以按这五项去检查:它从哪里获得输入(perception)、怎么决定下一步(planning)、能调用哪些工具/服务(action)、怎么校验自己的输出(feedback)、记住什么(memory)。这五项很自然地对应到后面的类图属性和组件接口。
1.3 编程范式:从面向对象到面向 Agent
讲义标题是 From Object-oriented to Agent-oriented,列出三个好处:
| 好处 | 说明 |
|---|---|
| Useful Interface | 与人自然交互 |
| Strong Capability | 在极少人工干预下运行 |
| Useful Architecture | 直观的编程范式 |
讲义在这一页特别标注了 “Abstraction of Agent! Modelling!”:agent 本身就是一种抽象,而这门课要做的就是对它建模。
1.4 Agentic AI 框架
| 框架 | 特点 | 适用场景 |
|---|---|---|
| LangGraph | 基于图的 agent 执行控制流 | 高复杂度的 agent 工作流 |
| AutoGen(Microsoft) | 多 agent 对话编程 | 需要反复消息交换的系统;可与 OpenAI Assistant、LlamaIndex、LangChain 集成 |
| Llama-Index | 开源数据框架,把私有/领域数据接到 LLM | RAG、知识库类应用 |
1.5 One-Person AI Company 与风险
定义与 Week 1 相同:一位创始人拥有并主导公司,AI agent、软件和专业外包在创始人控制下完成可重复的工作;创始人负责判断、关系和问责。(详见 Week 01 第六节。)
讲义提醒项目中要注意的 伦理、安全、隐私 问题:
- 负责任地使用,防止虚假信息(misinformation)
- 处理敏感数据和个人信息:防止生成文本中意外泄露;对敏感信息做脱敏(masking)
- 确保 LLM 应用公平、无偏见
“Be careful if these happen in your project!” —— 在需求里把这些写成非功能需求 / guardrail,后面的架构和 Stage 1 报告都会用到。
二、The Problem:复杂度
2.1 软件工程的基本图景
软件工程就是把问题域里的需求实现到解决方案域里,再回到问题域去验证。
2.2 敌人:复杂度
- 现代软件系统的复杂度接近生物系统,形成 system of systems
- 复杂度在系统规划、架构设计和开发中都会造成问题和错误 → 项目失败、延期、超预算
- 构建复杂系统总是伴随犯错和遗漏需求的风险
- 人类在处理过多细节时天生容易出错
2.3 Fred Brooks:本质复杂度 vs 偶然复杂度
出处:F. Brooks, The Mythical Man-Month(1995)。
| Essential complexity(本质复杂度) | Accidental complexity(偶然复杂度) | |
|---|---|---|
| 来源 | 问题本身固有 | 实现技术或方法带来 |
| 能否消除 | 不能被技术或技巧消除;简单方案无法充分解决问题 | 可以避免/减少 |
| 例子 | 医疗诊断流程本身的规则多、例外多 | 计划和项目管理无效、实现技术不匹配或不成熟 |
软件工程的主要任务之一:想办法把偶然复杂度降到最低。 基本手段:提高开发所用技术的抽象层次(raising the level of abstraction)。
讲义在这里放了 Margaret Hamilton(“软件工程之母”)站在 Apollo 软件打印稿旁边的照片(1969),说明“软件工程”这个学科的由来就是为了应对这种规模的复杂度。
2.4 SystemC 例子:代码 vs 模型
讲义给出一段 SystemC 代码(producer 模块循环 10 次写
out1,consumer 模块累加 in1
并打印 Sum),问:“Can you see what this program is
about?” —— 读代码很难一眼看出结构。
对应的 UML 模型只有:
flowchart LR
A["«sc_method»<br/>a1:Producer"] -- "out1 → link1 «sc_link_mp» → in1" --> B["«sc_slave»<br/>b1:Consumer"]
S((start)) --> A
一个生产者对象通过一条链接把数据推给一个消费者对象,start
端口触发生产。“Can you see it now?” ——
这就是抽象的价值:同样的信息,模型让人立即理解结构。
三、The Premise:抽象与模型
3.1 抽象 ⇒ 模型
Abstraction is forgetting (some) details.(抽象就是忘掉(部分)细节。)
3.2 抽象层次
在高级语言(HLL)之上再加一层模型,让问题域到实现之间的“跨度”变小。讲义引用 Alan J. Perlis:
“A programming language is low level when its programs require attention to the irrelevant.”(当程序要求你关注无关的东西时,这门语言就是低级的。)
3.3 什么是模型
一个模型:
| 特征 | 关键词 |
|---|---|
| 是系统某部分功能、结构、行为的表示 | representation |
| 是系统的简化 | information, abstraction, specification |
| 能代替真实系统回答问题 | inference, prediction |
| 为某个目的而用 | planning, design, risk analysis, testing |
3.4 工程师为什么要建模(四个目的,必背)
| 目的 | 说明 |
|---|---|
| To understand | 理解现有或期望的(复杂)系统及其环境的关键特征 |
| To predict | 通过分析模型来预测系统的关键特征 |
| To communicate | 把理解和设计意图传达给别人(以及自己) |
| To specify | 规定系统的实现(模型作为蓝图) |
3.5 工程模型与视图
Engineering model:对某个系统的选择性表示,针对一组给定的关注点(concerns),准确而简洁地捕获其所有本质属性。
讲义用建筑类比:建筑师视图、施工方视图、设计师视图、电工视图、水管工视图——我们不会一次看到全部;我们看到的东西被调整成人能理解的样子。这就是后面 Week 4 viewpoint / view 概念的雏形。
3.6 软件模型:设计时视图与运行时视图
Software model:用某种建模语言描述的、关于某个软件的工程模型,表示: 1. Design-time views:软件规格说明的结构和内容(例如类图里 A、B、C 的关联与多重性
0..*、0..1、«import») 2. Run-time views:软件执行时的结构和行为(例如 Left/Right 两个对象之间 m1–m4 的消息序列)
讲义强调:很多建模语言的首要动机,就是更清晰地表示执行中的软件。
3.7 现代 MBSE 开发风格:模型逐步精化成系统
模型可以持续精化直到应用被完全规定 ⇒ 模型本身变成了它所建模的系统。
讲义例子:producer 先是一个带
start/out1 端口的构件 → 精化出状态机
NotStarted --start / generate_data()--> Started →
Started 再细化为子状态 St1 → St2 → 最终动作
generate_data() 对应到
for (i=0;i<10;i++) out1 = i;。
stateDiagram-v2
[*] --> NotStarted
NotStarted --> Started : start / generate_data()
state Started {
[*] --> St1
St1 --> St2
}
3.8 软件的独特之处
软件模型和被建模的软件共享同一种介质——计算机,而计算机恰好是我们最先进、最通用的自动化技术。 因此软件有一个独特性质:可以把模型直接演化成实现,而不需要在专业知识、工具或方法上出现根本性的断层。
对比:建筑的图纸和真实的楼是两种介质,图纸永远不会“变成”楼;软件模型却可以被生成为代码。
四、Model-Based Engineering(MBE)方法
4.1 定义与两大支柱
MBE:一种系统与软件开发方法,其中软件模型扮演不可或缺的角色。 基于两个经过时间检验的思想:(1) ABSTRACTION(抽象) 和 (2) AUTOMATION(自动化)。
讲义的图:左边是“建模语言的领域”——一个三状态状态机
S1 --e1/action1--> S2 --e2/action2--> S3 --e3/action3--> S1;右边是“工具的领域”——自动生成的
switch (state) { case '1': action1; newState('2'); ... }
代码。
Tutorial 2 把这张图解释得更直白:
| Abstraction | Automation | |
|---|---|---|
| 方向 | 细节 → 更清晰的模型 | 精确的模型 → 工具产出 |
| 输入 | 大量实现细节(code、data、system behaviour) | 重要的状态、角色和关系 |
| 输出 | 一个“什么才重要”的清晰视图 | 代码、测试、仿真、检查 |
| 服务对象 | 帮人理解 | 帮工具执行 |
Tutorial 原话:Abstraction helps people understand; automation helps tools act. 本周的 Use Case 图主要支持抽象和沟通,而不是直接生成代码。
4.2 Platform Independence(平台无关)
- 非常理想的目标:关注点分离(专注系统的功能与行为)+ 可移植性
- 一个“平台无关”的应用可以
«deploy»到 Platform 1…N - 讲义抛出的思考题:“平台无关”是否意味着设计应用时可以忽略平台问题? —— 答案是否定的:性能、并发、资源、部署约束都和平台有关;平台无关是把平台相关的决策分离出来、在合适的层次处理,而不是假装它们不存在。(这与 Week 4 的 deployment view 呼应。)
4.3 MBE 的四类机会
| 机会 | 要点 |
|---|---|
| Code Generation(代码生成) | 用计算机自动化大幅降低当前编程语言的偶然复杂度;讲义提到可以用先进
AI 模型来生成;状态机 → switch 代码。图中特意标了一个
BUG:如果状态机本身更复杂(嵌套状态
Started{St1,St2}),简单的 switch 生成就不够了 →
“更高级的建模语言怎么办?” |
| Exploiting Formal Methods(形式化方法) | 建模语言的构造可以设计得比编程语言行为更规整(better behaved),所以能用形式化方法(状态机、Petri 网;model checking、theorem proving);对编程语言做不到,因为其语义复杂度太高。前提:建模语言需要形式化语义 |
| Model Execution(模型执行) | D. Harel:“Models that are not executable are like cars without engines.” 关键能力:Controllability(启动/停止/减速/加速/驱动执行)、Observability(以模型形式查看执行和状态)、Partial model execution(执行抽象和不完整的模型)。目标是可执行规格说明,克服纸面规格的局限 |
| Model Transformations(模型转换) | 用途:模型视图(抽象与精化)、域到域转换(如 UML → 排队网络模型)、模型到代码(代码生成)。标准:OMG QVT(Queries, Views, and Transformations);需要一套类似编译原理的模型转换理论 |
Tutorial 2 还列出了“已成熟能力 vs 新兴机会”:
| Established capabilities | Emerging opportunities |
|---|---|
| 代码与测试生成 | AI 辅助建模 |
| 仿真与可执行模型 | 生成式架构探索 |
| 模型转换 | Digital threads 与 digital twins |
| 需求可追溯 | 跨工具互操作 |
| 一致性检查与验证 | 持续的模型—运行时反馈 |
The shift:模型正在变得互联、自适应、AI 支持,覆盖整个系统生命周期;既有方法仍是基础。
五、Vibe Coding vs MBSE(本周与 AI 时代最相关的部分)
5.1 自然语言 vs 建模语言
| Natural Language(Vibe coding) | Model-based software engineering | |
|---|---|---|
| 意图存在哪里 | 对话式 prompt 里 | 结构化、有版本的模型里 |
| Agent 产出 | 代码(控制较少) | 代码(受显式的结构与行为约束) |
| 最适合 | 小范围、快速学习、低后果 | 会演化、要集成、带风险的大系统 |
两种方式用的是同样的 agent。区别在于 agent 收到的是“短暂的对话”还是“持久的工程意图”。
5.2 Vibe coding 的两个问题
| 问题 | 描述 |
|---|---|
| Intent drift(意图漂移) | Vibe coding 能在几小时内把粗略想法变成原型或用户流程;但需求和假设会在会话之间消失 |
| Architecture decay(架构腐化) | Agent 能快速试探陌生的 API/框架/集成;但时间一长,agent 会做出局部看起来合理、却违反全局边界、接口和数据规则的修改 |
(architecture decay 的定义见 Week 01 4.3。)
5.3 MBSE 的答案:模型是 agent 的“控制平面”
- Vibe coding 优化的是下一个输出,MBSE 优化的是整个生命周期——在全生命周期里减少歧义和失控的变更
- 模型给编码 agent 一个持久的控制平面(durable control
plane)
- 模型约束“做什么”,agent 仍然决定“怎么做”
- 模型捕获:能力、接口、数据 schema、状态、策略、非功能需求、验收标准
- 模型不是放进文档档案的图片,而是 agent 可以读取、转换和验证的控制面
Keep the vibe for discovery. Engineer the system for delivery.(探索阶段保留 vibe;交付阶段要工程化。)
六、MBSE 的五种风格
横轴是时间(发展方向),纵轴是抽象层次与自动化程度:
| 风格 | 模型与代码的关系 | 口号 |
|---|---|---|
| Code only | 只有代码 | “What's a model?” |
| Code Visualization | 从代码可视化出模型 | “The code is the model” |
| Round Trip Engineering | 模型与代码双向同步 | “Manage code and model” |
| Model-centric | 从模型生成代码 | “The model is the code” |
| Model only | 只有模型 | “Who cares about the code?” |
flowchart LR
A[Code only] --> B[Code Visualization<br/>model ← visualize ← code]
B --> C[Round Trip<br/>model ⇄ synchronize ⇄ code]
C --> D[Model-centric<br/>model → generate → code]
D --> E[Model only]
记忆方法:箭头方向从“代码 → 模型”(visualize)到“双向”(synchronize)再到“模型 → 代码”(generate)。越往右,抽象和自动化越高。
七、The Results:工业案例
某大型电信设备厂商使用 UML + Rational Technical Developer + Rational Unified Process:
| 系统 | 代码规模 | 工具生成比例 |
|---|---|---|
| Radio Base Station | 200 万行 C++ | 87% |
| Network Controller | 450 万行 C++ | 80% |
这是 “The Results” 部分唯一的证据:大规模工业系统中,绝大部分代码可以由模型生成。
八、Tutorial 2 要点与解答思路
8.1 回顾结构
Tutorial 2 把 lecture 归纳为 The Problem → The Premise → The Results 三段,与上文一致。然后用两个样例项目演示如何“从想法抽象到模型”。
8.2 样例一:Intelligent Healthcare Service Application
用“传统方式”写需求:Primary User Groups → Key Capabilities → Core Features → Optional Features,按 Patients / Doctors / Technical Team 三类用户分别列。完整拆解见 需求范例(Healthcare),这里不重复。
8.3 样例二:AI-Assisted Smart Shoe Store(本周重点例子)
问题:网购时很难选到合适的鞋——用户难以匹配用途、合脚偏好、风格和预算;通用描述和筛选器提供的指导太少。
服务:① 收集偏好 → ② 推荐合适的鞋 → ③ 解释每条推荐 → ④ 支持比较和购买。AI 支持决策,顾客做最终选择。
三步:从场景到模型到产出
| 步骤 | 内容 |
|---|---|
| 1. Detailed scenario | 顾客需求:Size 7、Running、Neutral 风格、预算 $150……很多细节 |
| 2. Use case model(抽象) | 只保留 actor、目标和系统边界 |
| 3. Tool-supported outputs(自动化) | 需求清单、基础测试用例、原型流程、代码骨架——前提是模型足够清晰精确 |
Actor 识别
| Actor | 目标 | 相关活动 |
|---|---|---|
| Customer | 找到合适的鞋 | 输入偏好、比较选项、选择并下单 |
| Store Adviser | AI 不够用时提供帮助 | 审核困难请求、支持顾客 |
| Store Admin | 保持服务准确 | 管理商品、库存、已批准信息 |
| Payment / Delivery Service | 完成外部操作 | 处理支付、确认配送 |
Actor ≠ 人名。Actor = 相对于系统所扮演的角色。 Actor 在系统外部,与系统交互以达成目标。
系统边界
- Inside:收集偏好、生成推荐、解释与比较、管理商品信息、创建订单请求
- Outside:Customer(选择)、Store Adviser(审核)、Store Admin(维护)、Payment/Delivery(处理)
- 边界规则:AI 可以推荐和解释,但不做最终购买决定。
MVP 划分
| Build first | Add later |
|---|---|
| 1 输入购物偏好 | 3D 虚拟试穿 |
| 2 获得鞋子推荐 | 社交购物 feed |
| 3 查看理由与权衡 | 语音助手 |
| 4 比较推荐商品 | 高级会员计划 |
| 5 把选中的鞋加入购物车 | 自动购买 |
MVP 问题:这个助手能否帮助顾客做出更好的选鞋决定?只保留检验这一价值所需的功能。
Use Case 图(文字版)
flowchart LR
C([Customer])
SA([Store Admin])
PS([Payment Service])
subgraph S [AI-Assisted Smart Shoe Store]
U1((Enter Preferences))
U2((View Recommendations))
U3((View Explanations))
U4((Compare Products))
U5((Add Shoe to Cart))
U6((Manage Products & Stock))
U7((Process Payment))
end
C --- U1
C --- U2
C --- U3
C --- U4
C --- U5
SA --- U6
PS --- U7
每条线表示一个 actor 参与一个系统目标。
解题思路(给定场景画 Use Case 图的通用步骤):
- 读场景,圈出所有“谁”——区分系统内部的功能和外部的角色/服务
- 外部服务(支付、配送、第三方 API)也是 actor
- 画系统边界框,框里只放目标(动宾短语),不放 UI 步骤
- 用 MVP 问题筛掉非核心功能
- 写清楚 AI 的决策边界(推荐 vs 决定)
8.4 UML 工具对比
| 工具 | 优点 | 局限 |
|---|---|---|
| UMLet | 开源、简单、轻量、插件兼容 | 缺少代码生成、逆向工程等高级功能 |
| draw.io | 免费开源、云端/本地存储、通用、跨平台 | 不如专业工具精细 |
| StarUML | 专业级、代码生成与逆向工程、插件系统 | 收费(30 天试用,学生 7 折) |
UMLet 操作:选模板 → 双击/拖拽插入元素 → 右键设置颜色/图层;多选后
Ctrl+G 分组、Ctrl+U 取消分组、对齐。draw.io
直接用 app.diagrams.net,可存云端。
九、Lab 2 要点
ELEC5620-Lab-Note-2.pdf 文件头写的是 “Week 3: Laboratory
2”,放在 Week 2 文件夹里。内容:
- Part One:尽快组队;和 tutor 讨论选题可行性;每组 3 分钟 向其他组介绍选题,回答两个问题:解决什么真实问题?公司里哪些角色由 AI agent 执行或替代?
- Part Two:参照需求范例思考自己的应用;至少 3 个不同的 AI 角色承担主要利益相关者或业务功能;每个组员至少独立实现 2 个核心功能 + 1 个可选功能。
详细的规模约束和 pitch 写法见 Lab 1–6 总结 第三节。
十、本周考点速记 / 易错点
- Agent 五要素:Perception、Reasoning & Planning、Action、Feedback Loops、Memory。
- 本质复杂度 vs 偶然复杂度:前者来自问题本身、不能消除;后者来自技术/方法、可以减少。降低偶然复杂度的基本手段 = 提高抽象层次。
- 抽象 = 忘掉部分细节;模型 = 系统的简化表示,可代替系统回答问题,为特定目的服务。
- 建模四目的:understand、predict、communicate、specify。
- Engineering model 是“针对一组关注点的选择性表示”——不是把所有东西画出来。
- Design-time view vs Run-time view:前者是规格的结构(类、关联),后者是执行中的结构和行为(对象、消息)。
- 软件独特性:模型与软件同介质 ⇒ 模型可直接演化为实现。
- MBE 两大支柱:Abstraction(帮人理解)+ Automation(帮工具执行)。
- MBE 四机会:代码生成、形式化方法(需要形式化语义)、模型执行(可控、可观察、可部分执行)、模型转换(QVT)。
- Platform independence ≠ 忽略平台。
- Vibe coding vs MBSE:短暂对话 vs 持久工程意图;intent drift 与 architecture decay;模型约束 what,agent 决定 how。
- 五种风格:Code only → Code Visualization → Round Trip → Model-centric → Model only。
- 易错:Actor 是角色而不是具体人名;外部支付/配送服务也算 actor;Use Case 是目标,不是界面操作步骤。