4. 需求分类与建模:功能需求、非功能需求、业务规则、数据需求、接口需求
做架构设计这么多年,我见过太多项目栽在需求分析这个环节上。说白了,很多团队拿到需求就开始画架构图,结果做到一半发现漏了关键的非功能需求,或者业务规则没搞清楚,返工成本高得吓人。
我个人习惯,拿到需求后第一件事就是分类。把需求拆成五类:功能需求、非功能需求、业务规则、数据需求、接口需求。这五类就像盖房子的五张图纸,缺一张都容易出问题。
4.1 功能需求:系统要做什么
功能需求是最直观的。用户说「我要能登录」「我要能下单」,这就是功能需求。它描述的是系统对外提供的具体行为。
举个例子,一个电商系统的功能需求可能包括:
- 用户注册与登录
- 商品浏览与搜索
- 购物车管理
- 订单提交与支付
- 订单状态查询
嗯,这里要注意。功能需求一定要写清楚输入、处理、输出三个要素。我见过不少需求文档只写了「用户能下单」,但没说明下单需要哪些前置条件、支付失败怎么处理。这种模糊的需求,开发同学只能靠猜。
功能需求描述模板:
作为[角色],我希望[功能],以便[业务价值]。
验收标准:
- 输入:用户已登录,购物车中有商品
- 处理:系统校验库存、计算总价、生成订单
- 输出:订单创建成功,返回订单号
4.2 非功能需求:系统要做到什么程度
非功能需求,说白了就是系统的「质量属性」。用户不会直接说「我要高可用」,但他们会抱怨「系统怎么又崩了」。这就是非功能需求没满足。
常见的非功能需求包括:
| 类别 | 说明 | 示例指标 |
|---|---|---|
| 性能 | 响应时间、吞吐量 | 页面加载 < 2秒,支持1000并发 |
| 可用性 | 系统正常运行时间比例 | 99.9% 可用,全年停机 < 8.76小时 |
| 安全性 | 数据保护、访问控制 | 密码加密存储,接口鉴权 |
| 可扩展性 | 系统应对增长的能力 | 支持水平扩展,增加节点即可提升性能 |
| 可维护性 | 代码修改和测试的难易度 | 模块化设计,单元测试覆盖率 > 80% |
我在项目中遇到过最典型的非功能需求翻车案例:一个金融系统,功能都做完了,上线前压测才发现单机只能扛200并发,而业务预期是2000并发。结果架构师连夜改方案,从单体改成微服务,工期延误了两个月。
避坑指南:非功能需求一定要在架构设计阶段就明确量化指标。我曾经因为没写清楚「响应时间不超过2秒」,开发同学用了同步调用,结果接口响应时间到了5秒,用户投诉不断。
4.3 业务规则:系统要遵循什么约束
业务规则和功能需求不一样。功能需求说「能做什么」,业务规则说「必须怎么做」。它通常是业务领域的硬性约束,不能讨价还价。
举个例子:
- 「会员等级根据年度消费金额自动升降」—— 这是业务规则
- 「同一用户每天最多领取3张优惠券」—— 这也是业务规则
- 「订单金额超过1000元需要主管审批」—— 这还是业务规则
我个人习惯把业务规则单独列出来,用决策表或者规则引擎来表达。为什么?因为业务规则变化最频繁。你想想看,业务部门今天说满减规则要改,明天说会员权益要调整。如果这些规则硬编码在代码里,每次改都要发版,累不累?
我的建议:对于频繁变化的业务规则,考虑引入规则引擎(如Drools、EasyRules)。把规则从代码中抽离出来,业务人员甚至可以直接在界面上配置。我在一个电商项目中就是这么做的,后来规则改了十几次,开发同学基本没动过代码。
4.4 数据需求:系统要管理什么数据
数据需求,说白了就是搞清楚系统里有哪些数据、数据长什么样、数据之间怎么关联。很多架构师容易忽略这一步,直接上手画ER图,结果画到一半发现字段定义有歧义。
数据需求分析要回答三个问题:
- 数据实体有哪些? 比如用户、商品、订单、支付记录
- 每个实体有哪些属性? 比如用户有姓名、手机号、注册时间
- 实体之间什么关系? 比如一个用户有多个订单,一个订单包含多个商品
我记得有一次做医疗系统,数据需求没分析透,结果开发到一半发现「患者」和「就诊人」其实是两个不同的概念。患者是注册用户,就诊人是实际看病的人,两者可以是一对多的关系。这个坑踩得,数据模型推倒重来。
数据需求文档示例:
实体:订单
属性:
- 订单ID (主键,字符串,32位UUID)
- 用户ID (外键,关联用户表)
- 订单金额 (Decimal,精确到分)
- 订单状态 (枚举:待支付/已支付/已取消/已完成)
- 创建时间 (DateTime)
- 支付时间 (DateTime,可为空)
关系:
- 一个用户可以有多个订单 (1:N)
- 一个订单包含多个订单项 (1:N)
- 一个订单对应一个支付记录 (1:1)
4.5 接口需求:系统如何与外界交互
接口需求,就是系统对外提供的「门」。不管是系统之间的API调用,还是用户界面的交互方式,都属于接口需求的范畴。
接口需求要明确:
- 协议:RESTful、gRPC、WebSocket、消息队列
- 数据格式:JSON、XML、Protobuf
- 认证方式:Token、OAuth2、API Key
- 错误处理:异常码定义、重试策略、降级方案
嗯,这里有个常见的坑。很多团队只定义了正常流程的接口,没考虑异常情况。比如支付接口,正常返回支付成功,但超时了怎么办?重复回调怎么处理?这些都要在接口需求里写清楚。
我曾经踩过的坑:一个对接第三方物流的接口,对方文档只写了正常返回格式,没写错误码。结果上线后,物流接口返回了一个我们没见过的错误码,系统直接崩溃了。从那以后,我要求所有接口需求必须包含完整的错误码定义和异常处理策略。
4.6 五类需求的建模方法
需求分类完了,接下来就是建模。不同的需求类型,建模方法也不一样:
| 需求类型 | 建模方法 | 产出物 |
|---|---|---|
| 功能需求 | 用例图、用户故事 | 用例文档、用户故事卡片 |
| 非功能需求 | 质量属性场景、架构权衡分析 | 非功能需求清单、架构决策记录 |
| 业务规则 | 决策表、决策树、规则引擎 | 规则定义文档、规则配置 |
| 数据需求 | ER图、数据字典 | 数据模型、字段定义表 |
| 接口需求 | API文档、序列图 | 接口规范、交互流程图 |
你想想看,如果这五类需求都分析清楚了,架构设计还会难吗?功能需求决定了系统要拆成哪些模块,非功能需求决定了技术选型和部署方案,业务规则决定了核心逻辑怎么实现,数据需求决定了存储方案,接口需求决定了系统之间的通信方式。
我个人习惯,在需求分析阶段花的时间越多,后面架构设计和开发阶段就越顺畅。别急着动手画架构图,先把这五类需求梳理清楚。磨刀不误砍柴工,这个道理在架构设计里特别适用。
最后一个小技巧:每次需求评审会,我都会带一张「五类需求检查表」。逐项核对,看有没有遗漏。特别是非功能需求和业务规则,最容易被人忽略。养成这个习惯,能帮你避开至少一半的坑。