在软件工程中,尤其是在用例驱动的开发方法中,识别参与者是基础且关键的一步。参与者充当正在开发的系统与外部交互实体之间的桥梁。正确识别和理解参与者,使团队能够设计出以用户为中心、功能完整且符合现实需求的系统。

本文全面探讨了识别参与者的目的,以及参与者类型(人类与非人类),以及他们的角色与职责,该过程如何支持软件开发的各个领域,并提供关键概念、指导原则和实用技巧以取得成功。
识别参与者不仅仅是一项初步任务——它是一项战略性活动,影响整个开发生命周期。其主要目的包括:
参与者有助于明确系统内部(软件)与外部的内容。这种清晰性可防止范围蔓延,确保团队专注于正确的领域。
示例:在银行系统中,客户是系统外部的参与者,而交易处理模块则是系统的一部分。
参与者代表与软件交互的真实用户或系统。通过识别他们,团队可以建立反映系统实际使用方式的用例模型。
每个用例通常涉及一个或多个参与者。了解参与者有助于发现全部的功能需求。如果你不知道谁在使用系统,就无法确定他们需要做什么。
参与者为利益相关者、开发人员、测试人员和业务分析师提供了一种通用语言。这使得讨论功能、验证需求和统一期望变得更加容易。
测试人员可以使用角色来设计测试场景。例如,“客户”角色可能需要执行“登录”、“转账”和“查看账单”——每个操作都成为一个测试用例。
角色大致可分为两类:人类角色和非人类角色.
这些是直接与系统交互的个人。
客户
管理员
员工
经理
支持人员
患者(在医疗系统中)
有目标和意图。
通过用户界面、表单或语音命令进行交互。
可能具有不同权限的角色(例如,管理员与普通用户)。
✅ 提示:使用基于角色的命名(例如,“注册客户”而非“用户”)以避免歧义。
这些是与软件交互的外部系统、设备或自动化流程。
ATM 机
支付网关(例如,Stripe、PayPal)
电子邮件服务器
天气服务API
物联网传感器
遗留系统(例如旧数据库)
并非人员,但他们可以发起或响应系统动作。
通常代表集成点或外部服务。
可能会自动触发用例。
✅ 示例:在电子商务系统中,“支付网关”是一个处理支付并将确认信息发送回系统的参与者。
⚠️ 常见错误:将系统组件视为系统内部部分而非外部参与者。始终要问:“这个实体是否发起用例?”
理解参与者的角色和职责有助于深入理解他们如何使用系统以及他们的期望。
描述了在特定情境下的人员或系统。
通常与工作职能或系统类型相关。
示例:“贷款专员”与“客户”
参与者在系统中执行的操作。
他们希望达成的目标。
他们提供的或接收的数据。
| 职责 | 描述 |
|---|---|
| 浏览产品 | 查看产品列表和详细信息 |
| 添加到购物车 | 选择商品并添加到购物车 |
| 结账 | 输入配送和支付信息 |
| 跟踪订单 | 查看订单状态和配送更新 |
✅ 最佳实践:在表格或用例图图例中记录参与者职责,以提高清晰度。
正确的参与者识别会影响软件开发生命周期的多个阶段:
有助于识别所有用户群体和外部系统。
防止遗漏关键用户需求。
鼓励利益相关者尽早参与。
每个用例由参与者触发。
有助于系统性地发现功能需求。
有助于避免冗余或重叠的用例。
指导界面设计(UI/UX)。
影响安全性和访问控制(例如,管理员与访客)。
确定集成点(例如,第三方API)。
测试人员使用角色来创建测试场景。
确保覆盖所有用户路径。
支持自动化测试脚本的创建。
清晰的角色定义有助于编写用户手册和培训材料。
说明系统中谁可以执行什么操作。
在敏捷开发中,角色有助于定义用户故事(例如:“作为一个客户,我想要重置我的密码”)。
根据用户需求促进待办事项列表的优先级排序。
用户是使用系统的人员。
角色是与系统交互的任何实体。
一个用户可以扮演多个角色(例如,既是经理又是客户)。
❌ 错误:“用户”作为唯一角色。
✅ 正确:“客户”、“经理”、“系统管理员”
角色位于系统边界之外。
不要包含内部组件(例如,“数据库”不是角色——除非它是外部系统)。
一个角色可以参与多个用例。
示例:一个“客户”可以“浏览”、“添加到购物车”、“结账”和“评价产品”。
用例描述了一个动作或目标。
参与者触发或参与用例。
✅ 用例:“处理支付”
✅ 参与者:“客户”和“支付网关”
遵循以下最佳实践,以确保准确且有意义的参与者识别:
与业务分析师、最终用户和系统所有者交谈。
提问:“谁使用这个系统?谁向它发送数据?谁接收输出?”
对于每个潜在的用例,询问:“谁启动了这次交互?”
答案很可能是参与者。
不要使用“用户”、“系统”或“人员”之类的模糊术语。
要具体:如“注册客户”、“第三方API”、“移动设备”。
不要只考虑直接用户:传感器、定时任务、外部服务。
示例:一个天气传感器可能会触发“发送警报”用例。
如果不是人,就问:“它是否向系统发送或接收消息?”
如果是 → 它是非人类参与者。
绘制用例图,并检查所有参与者是否都被表示。
确保没有用例是“无参与者”的。
| 提示 | 解释 |
|---|---|
| 使用基于角色的名称 | 不要使用“用户”,而应使用“客户”、“管理员”、“供应商”——更清晰且更具可操作性。 |
| 按角色对参与者进行分组 | 创建一个“参与者列表”,包含描述、职责和权限。 |
| 利用人物角色 | 为关键参与者构建人物角色,以共情他们的目标和痛点。 |
| 检查是否有遗漏的参与者 | 提问:“如果系统失效会发生什么?谁会收到通知?”→ 通常能揭示隐藏的参与者。 |
| 使用“系统之外”规则 | 如果某事物在系统内部,它就不是参与者。 |
| 迭代并优化 | 在每个开发阶段重新审视参与者。新功能可能会引入新的参与者。 |
| 在参考表格中记录参与者 | 维护一份包含参与者详细信息的动态文档,以备将来参考。 |
客户 – 查看账户,转账
银行柜员 – 处理贷款申请
自动取款机 – 发送取款请求
欺诈检测系统 – 监控交易并标记可疑行为
支付网关 – 处理信用卡支付
参与者:客户与ATM机
交互:客户插入卡片 → ATM发送请求 → 系统验证 → 释放资金
✅ ATM是参与者,因为它发起了交互。
| 陷阱 | 为何不好 | 如何解决 |
|---|---|---|
| 将内部模块视为参与者 | 违反了系统边界概念 | 问:‘这在系统内部还是外部?’ |
| 使用“用户”之类的模糊术语 | 导致模糊不清和需求缺失 | 使用具体角色:‘客户’、‘供应商’ |
| 忘记非人类参与者 | 遗漏了集成和自动化 | 考虑API、传感器、定时任务 |
| 假设每个用例只有一个参与者 | 忽略了复杂的交互 | 允许每个用例有多个参与者 |
| 开发过程中未重新审视参与者 | 参与者可能随着新功能而演变 | 在冲刺计划和回顾会议中审查参与者 |
在用例驱动的方法中识别参与者远不止是一种形式——它是成功软件开发的战略基石成功软件开发的基石。通过明确界定与系统交互的各方(无论是人还是非人),团队可以获得:
对用户需求的更深入理解
更完整且准确的需求
更优的系统设计与架构
改进的测试与文档
更强的利益相关者协同
当正确执行时,角色识别将抽象概念转化为具体且可操作的洞察。它确保软件不仅能够运行——而且真正解决真实人物与系统面临的问题.
书籍:
用例建模 作者:Alistair Cockburn
编写有效的用例 作者:Alistair Cockburn
工具:
Visual Paradigm(用于用例图)
Lucidchart / Draw.io(绘图)
Jira + Confluence(用于角色与用例文档)
方法论:
敏捷开发(用户故事源自角色)
领域驱动设计(DDD)——角色作为领域模型的一部分
🌟 最后思考:
“你不是为系统开发软件,而是为人们以及服务于他们的系统开发。角色是理解这些人员与系统是谁的第一步。”
通过掌握角色识别,你为一个不仅功能完备,而且真正有价值的系统奠定了基础。