需求分析:功能需求 vs 非功能需求
很多人以为系统设计是从画架构图开始的。但实际上,真正的起点是需求分析。
我见过太多架构评审会,团队花了两周画出了精美的架构图,结果上线后发现:性能不达标、扩展性不足、安全漏洞频出。事后复盘,根源往往是一个问题——需求没有分析清楚。
需求分析是整个系统设计流程中最重要、也是最容易被跳过的一步。因为需求分析是「软」的,不像代码那样能产出可见的东西。但恰恰是这一步,决定了后续所有工作的方向。
什么是需求
需求是对系统应该「做什么」和「做到什么程度」的描述。但「做什么」和「做到什么程度」是两个完全不同的维度:
- 功能需求:系统要做什么(What)—— 用户能发消息、能搜索、能支付
- 非功能需求:系统要做到什么程度(How Well)—— 消息要在 1 秒内送达、搜索要在 100ms 内返回
功能需求回答的是「有没有」,非功能需求回答的是「好不好」。只满足功能需求的系统可能是「能用」,同时满足两者才是「好用」。
功能需求分析
功能需求的来源
功能需求不是架构师拍脑袋想出来的,它来源于:
- 用户调研:用户告诉你他们需要什么
- 业务方需求:产品经理、业务负责人提出的业务目标
- 竞品分析:别人有,我们也要有
- 监管要求:合规、法律、安全强制要求
- 技术驱动:技术团队发现某些功能能带来显著的业务价值
功能需求的三层结构
业务需求是最高层,描述的是业务目标(如「提升用户留存率」)。用户需求是中间层,描述的是用户的痛点和期望(如「快速找到想看的内容」)。系统功能是最底层,描述的是具体的技术实现(如「关键词搜索」「推荐搜索」)。
功能需求的陷阱
陷阱一:堆砌功能清单
拿到 100 条功能需求,就设计 100 个功能。这种做法的问题在于:没有优先级、无法聚焦核心价值。
正确做法:先理解业务目标,再推导核心功能,区分「必须有」和「可以有」。
陷阱二:忽略边界条件
「用户可以登录」—— 这句话听起来很简单,但要真正设计好,需要考虑:
- 用户名密码错误怎么办?
- 账号被锁定怎么办?
- 异地登录怎么检测?
- 登录超时怎么处理?
- 并发登录怎么处理?
边界条件往往比正常流程更重要,因为线上问题往往出在边界。
陷阱三:功能需求和非功能需求混淆
「系统要支持 100 万用户」是功能需求还是非功能需求?
很多人会把它当作功能需求,但实际上是非功能需求——它描述的是系统的承载能力,而非具体功能。
非功能需求分析
非功能需求通常用「-ilities」来表示,也叫「系统品质属性」:
- Scalability:可扩展性
- Availability:可用性
- Reliability:可靠性
- Performance:性能
- Security:安全性
- Maintainability:可维护性
非功能需求是架构设计的约束条件。它们决定了技术选型的边界,决定了哪些方案可选、哪些方案不可选。
性能(Performance)
性能需求通常关注以下几个方面:
性能需求必须量化。「系统要快」不是需求,「p99 延迟 < 100ms」才是需求。量化才能验收,验收才能确认设计是否满足。
可用性(Availability)
可用性通常用「几个 9」来表示:
可用性每提升一个 9,成本可能增加 5~10 倍。选择多少个 9,要根据业务的实际需求和代价来决定。
不是所有系统都需要 99.999% 的可用性。一个内部工具宕机 1 小时,可能损失不大;但支付系统宕机 1 分钟,就是重大事故。要根据业务价值来确定可用性目标。
可扩展性(Scalability)
可扩展性描述的是系统应对增长的能力:
- 水平扩展:通过增加节点来提升容量(如增加服务器)
- 垂直扩展:通过升级单节点的配置来提升容量(如升级 CPU)
现代系统通常采用水平扩展架构,因为业务增长往往超预期,垂直扩展很快就会碰到天花板。
安全性(Security)
安全性需求覆盖多个层面:
安全性需求往往被忽视,直到出事才后悔。安全应该是设计时考虑,而不是「后面再加」。
一致性(Consistency)
分布式系统中,一致性和可用性往往不可兼得(CAP 理论)。根据业务场景选择合适的一致性级别:
可维护性(Maintainability)
可维护性描述的是系统被维护、修改、扩展的难易程度:
- 模块化:修改一个模块不影响其他模块
- 可测试性:能否方便地写单元测试和集成测试
- 可观测性:出了问题能否快速定位
- 部署频率:一次部署能否快速完成
需求优先级:MoSCoW 方法
当需求太多、时间有限时,需要对需求进行优先级排序。MoSCoW 是最常用的方法:
典型的分配比例是:Must have 60%,Should have 20%,Could have 20%。注意 Won't have 不是「不要做」,而是「这次不做」。
从用户故事推导功能需求
用户故事(User Story)是从用户视角描述需求的格式:
例如,设计一个电商搜索功能:
从用户故事可以推导出功能需求清单:
量化非功能需求
非功能需求必须量化,否则无法验收。以下是一些常见场景的量化标准:
性能量化
可用性量化
可扩展性量化
需求文档模板
一个完整的 PRD(产品需求文档)应该包含:
总结
需求分析是系统设计的第一步,也是最重要的一步。
功能需求回答的是「做什么」,需要从业务目标出发,区分核心功能和扩展功能。
非功能需求回答的是「做到什么程度」,需要量化每个指标,让验收有标准。
两者缺一不可。没有功能需求,系统不知道做什么;没有非功能需求,系统不知道做到什么程度。
下次开始系统设计之前,先问问自己:需求真的清楚了吗?