3、需求管理:从产品需求到技术规格,如何编写清晰的嵌入式软件需求文档
说实话,我见过太多嵌入式项目死在需求阶段。
产品经理说「我要一个智能温控器」,开发团队闷头干了两周,结果发现连传感器选型都没定。这种事,我职业生涯里至少碰到过五六回。后来我总结了一句话:需求文档写不清楚,后面全是坑。
3.1 为什么嵌入式需求文档特别难写?
嵌入式软件和纯软件不一样。你想想看,纯软件跑在通用操作系统上,输入输出都是屏幕和键盘。嵌入式呢?要跟硬件打交道,要管中断、管时序、管功耗、管内存。
我个人的习惯是,把嵌入式需求分成三层:
- 业务需求:产品要解决什么问题?比如「实现一个智能门锁」
- 系统需求:软硬件怎么分工?比如「指纹识别由硬件模块完成,MCU负责通信和逻辑」
- 软件需求:代码具体要做什么?比如「当指纹匹配成功时,在200ms内输出高电平驱动电机」
很多团队只写了第一层,然后直接跳到写代码。嗯,这就是灾难的开始。
3.2 需求文档的核心结构
我在团队里推行过一套模板,用了三年,效果还不错。分享给你:
| 章节 | 内容 | 示例 |
|---|---|---|
| 1. 范围 | 文档覆盖哪些功能、不覆盖哪些 | 本需求涵盖温控器的PID控制逻辑,不涉及云端通信 |
| 2. 术语表 | 关键缩写和定义 | ADC:模数转换器;PWM:脉宽调制 |
| 3. 功能需求 | 每个功能的具体行为 | 当温度超过阈值时,风扇以80%占空比启动 |
| 4. 非功能需求 | 性能、功耗、实时性等 | 中断响应时间不超过50μs |
| 5. 接口定义 | 硬件引脚、通信协议、API | UART1:115200bps,8N1 |
| 6. 约束条件 | 硬件限制、成本、法规 | RAM使用不超过32KB |
这个结构的好处是,每个角色都能找到自己关心的部分。硬件工程师看接口定义,测试工程师看功能需求,项目经理看范围。
3.3 如何把模糊的产品需求变成清晰的技术规格?
这是最考验功力的地方。产品经理说「响应要快」,你不能直接写「响应要快」。快是多少?100ms?10ms?1ms?
我一般用「五问法」来拆解:
- 问场景:这个功能在什么情况下触发?
- 问边界:最坏情况是什么?
- 问时序:从触发到完成,允许多久?
- 问资源:能用多少CPU、内存、功耗?
- 问异常:出错时怎么办?
举个例子。产品需求是「设备检测到震动时报警」。
经过五问法后,变成:
- 场景:加速度传感器检测到超过2g的加速度,持续10ms以上
- 边界:最多同时处理3个传感器通道
- 时序:从检测到触发到蜂鸣器响起,不超过100ms
- 资源:传感器采样率100Hz,CPU占用不超过5%
- 异常:传感器通信失败时,每1秒重试一次,连续3次失败则上报错误码0xE1
你看,这样写出来,开发人员就知道代码该怎么写了。测试人员也知道怎么测了。
3.4 需求文档的避坑指南
我曾经踩过这些坑,你千万别再踩:
- 坑1:需求写得太笼统。比如「系统应稳定运行」——什么叫稳定?MTBF多少?
- 坑2:忽略硬件依赖。比如「通过I2C读取传感器数据」——但没写I2C地址、速率、上拉电阻要求。
- 坑3:没有异常处理。只写了正常流程,没写传感器断线、通信超时、内存不足怎么办。
- 坑4:需求前后矛盾。前面说「功耗低于10mW」,后面又说「LED常亮指示状态」——LED常亮可能就吃掉5mW。
我记得有一次,一个项目因为需求文档里没写「看门狗超时时间」,结果测试时发现系统每隔3秒就复位一次。查了两天才发现,是看门狗配置和任务执行时间不匹配。如果当初在需求里写清楚「看门狗超时设为5秒,且喂狗任务优先级最高」,这问题根本不会出现。
3.5 需求文档的评审与版本管理
文档写完了,不是就完事了。我建议做两件事:
- 交叉评审:让硬件工程师审软件需求,让测试工程师审功能需求。不同视角能发现很多盲区。
- 版本号管理:每次修改都要更新版本号,并在文档开头写明变更记录。我见过最惨的案例,是开发人员拿着旧版需求写了三个月,最后发现需求早就改了。
一个小技巧:在需求文档里给每个需求项加一个唯一ID,比如 REQ-001、REQ-002。这样在代码注释、测试用例、Bug报告里都可以直接引用。后期追溯起来,效率翻倍。
3.6 一个完整的示例片段
最后,给你看一段我实际项目中用过的需求描述。这是关于一个电池供电的温湿度采集器:
REQ-101:温湿度采集
描述:系统每10秒通过SHT30传感器采集一次温湿度数据。
精度:温度±0.3°C,湿度±2%RH。
接口:I2C,地址0x44,速率100kHz。
异常处理:
- 若连续3次读取失败,标记传感器故障,上报错误码0xA1。
- 故障恢复后,自动恢复正常采集。
功耗约束:单次采集(含传感器上电、读取、下电)总电流不超过2mA,持续时间不超过50ms。
你看,这个需求写出来,硬件工程师知道要配什么传感器,软件工程师知道怎么写驱动,测试工程师知道怎么设计用例。每个人拿到文档,都能直接干活。
说白了,需求管理就是把模糊变成清晰,把抽象变成具体。这件事做得好,后面开发、测试、维护都能省下大量时间。做不好,那就是「需求一时爽,开发火葬场」。
嗯,今天就聊到这儿。下一章我们讲讲如何用看板和每日站会,让团队协作真正跑起来。