3. 需求分析与建模:功能需求与非功能需求、需求优先级排序、需求建模语言(SysML/UML)基础

好,我们进入第三章。这一章可以说是整个课程的分水岭。前面我们讲了需求获取,那是收集原材料。现在我们要做的,是把这些原材料加工成可用的产品——也就是需求模型。

我个人习惯把需求分析比作「剥洋葱」。你一层层剥开,每一层都有新的发现,有时候还会辣得你流眼泪。但剥到最后,你会看到一个清晰的核心。这个核心,就是我们要交付的系统。

3.1 功能需求与非功能需求:硬币的两面

很多刚入行的朋友容易犯一个错误:只盯着功能需求看。觉得系统能做什么才是关键。其实不然。你想想看,一个能跑但跑不快的车,你会买吗?一个能存数据但动不动就丢数据的数据库,你敢用吗?

这就是功能需求和非功能需求的关系。它们就像硬币的两面,缺一不可。

功能需求:系统「做什么」

功能需求描述的是系统对外提供的服务或行为。说白了,就是用户能用系统完成什么任务。

举个例子:

  • 用户登录系统
  • 系统生成月度报表
  • 系统发送邮件通知

这些都是功能需求。它们通常可以用「系统应能够...」这样的句式来描述。我在项目中遇到过最典型的案例是某电商平台的需求文档,光登录功能就写了十几条——什么密码登录、短信登录、扫码登录、第三方登录...功能是够全了,但性能呢?没人提。

非功能需求:系统「做得怎么样」

非功能需求描述的是系统在运行时的质量属性或约束条件。它们不直接回答「系统做什么」,而是回答「系统做得好不好」。

常见的非功能需求包括:

  • 性能:响应时间不超过2秒
  • 可用性:系统全年可用率99.9%
  • 安全性:用户密码必须加密存储
  • 可维护性:代码模块化,便于后续扩展
  • 可移植性:支持跨平台部署

重要提醒:非功能需求往往比功能需求更难定义,也更容易被忽视。但系统上线后的成败,往往取决于非功能需求是否被满足。

我记得有一次做某银行的核心系统改造,客户把所有功能需求都列得清清楚楚,唯独对性能只字未提。结果上线第一天,并发量一上来,系统直接挂了。后来我们花了整整两周做性能调优,才勉强达到可用水平。从那以后,我每次做需求分析,都会专门留出时间跟客户聊非功能需求。

3.2 需求优先级排序:别什么都想要

需求是无限的,但资源和时间是有限的。这是一个残酷的现实。你不可能把所有需求都塞进第一个版本。所以,排序就成了必修课。

我个人比较喜欢用 MoSCoW 方法。这个方法简单粗暴,但非常实用。

优先级 含义 说明
M (Must have) 必须有 没有这个功能,系统无法交付或无法运行
S (Should have) 应该有 很重要,但可以找到临时替代方案
C (Could have) 可以有 锦上添花,没有也不影响核心功能
W (Won't have) 这次不做 明确排除在当前版本之外

你可能会问:怎么判断一个需求是 Must 还是 Should?我的经验是,问三个问题:

  1. 没有这个功能,用户能完成核心任务吗?
  2. 这个功能如果延期,会造成业务损失吗?
  3. 这个功能是否影响其他 Must 需求的实现?

如果三个问题的答案都是「是」,那它就是 Must。否则,降级处理。

小技巧:排序的时候,别忘了把非功能需求也排进去。我曾经见过一个项目,把所有功能需求都排成了 Must,结果非功能需求全被挤到了 Won't have 里。上线后,系统慢得像蜗牛,用户骂声一片。

3.3 需求建模语言基础:SysML 与 UML

好,接下来我们聊聊建模语言。为什么要建模?因为文字描述有天然的局限性。你写一千字描述一个流程,不如画一张图来得直观。而且,图比文字更容易发现逻辑漏洞。

UML(统一建模语言)和 SysML(系统建模语言)是目前最主流的两种建模语言。UML 偏向软件系统,SysML 则是在 UML 基础上扩展,支持更复杂的系统——比如软硬件混合系统、嵌入式系统等。

UML 的核心图

UML 有 14 种图,但常用的其实就几种:

  • 用例图:描述系统与外部角色之间的交互。说白了,就是谁用系统做什么。
  • 类图:描述系统的静态结构。包括类、属性、方法以及类之间的关系。
  • 序列图:描述对象之间的交互顺序。特别适合展示一个用例的完整流程。
  • 活动图:描述业务流程或工作流。有点像流程图,但更规范。

举个例子,一个简单的登录用例,用序列图表示:

用户 -> 登录界面: 输入用户名和密码
登录界面 -> 认证服务: 提交认证请求
认证服务 -> 数据库: 查询用户信息
数据库 --> 认证服务: 返回用户信息
认证服务 --> 登录界面: 认证结果
登录界面 --> 用户: 显示登录成功/失败

你看,这样一画,整个流程就清晰了。谁先谁后,谁依赖谁,一目了然。

SysML 的扩展

SysML 在 UML 的基础上增加了几个重要的图:

  • 需求图:专门用来建模需求之间的关系。比如需求之间的派生、细化、验证等。
  • 块定义图:类似于 UML 的类图,但更强调系统的层次结构和物理组成。
  • 内部块图:描述块内部的连接和交互。
  • 参数图:描述系统参数之间的约束关系。比如速度、加速度、时间之间的关系。

我记得有一次做某航天项目的需求建模,客户要求用 SysML 的需求图来管理上千条需求。刚开始我觉得有点小题大做,但真正用起来才发现,需求图能自动追踪需求之间的派生关系,还能标记哪些需求已经被验证、哪些还没验证。这比用 Excel 管理需求强太多了。

避坑指南:我曾经见过一个团队,把 UML 和 SysML 的所有图都用上了,结果模型比代码还复杂。记住,建模的目的是简化沟通,不是增加复杂度。能用一张图说清楚的事,绝不用两张。

3.4 建模的实践建议

最后,我给大家几个实践中的小建议:

  1. 先画草图,再画正式图。我习惯在白板上先画,跟团队讨论确认后再用工具画正式的。
  2. 保持图的一致性。同一个概念在不同图中要保持名称一致。否则会引发混乱。
  3. 不要追求完美。模型是沟通的工具,不是艺术品。够用就好。
  4. 版本控制。模型文件也要纳入版本管理,跟代码一样。

嗯,这一章的内容就到这里。下一章我们会深入讲解 SysML 的需求图,以及如何用它来管理复杂的需求结构。到时候我会分享一个真实的项目案例,保证让你大开眼界。