资讯详情

资讯详情

软件需求规格说明书实战:以438C网关为例写出可评审、可验证的SRS

简介《438C软件需求规格说明书》是一份面向军用软件项目团队、系统设计与测试人员的SRS标准文档遵循GJB 438B-2009等军用软件开发文档通用要求解决需求分析阶段文档结构不规范、需求追踪性弱等问题。资源为单个docx文件压缩包67KB包含范围、引用文档、功能与性能需求、外部接口、安全保密、设计约束、验收交付等完备章节并预留了需求追踪性与合格性规定框架便于直接套用或裁剪。文档还覆盖了软件名称标识、初始版本号、开发任务书引用、功能列表与接口信号表等落地细节方便直接补全项目信息后形成正式交付物。目前已有204人学习适合软件工程学习者掌握军用软件文档规范也适合项目成员参考撰写。通过该模板可快速建立需求基线、减少后期需求变更风险并满足军用软件在密级管理、安全保密与验收交付上的硬性要求。1. 438C软件需求规格说明书写清这一份文档开发、测试、验收才不用互相猜接手 438C 这个数据采集网关项目时前任留下的话是“需求都在脑子里”。结果开发按自己的理解写协议测试按自己的理解造数据联调时一个报文格式能吵两天。软件需求规格说明书SRS就是把“脑子里的需求”变成白纸黑字、可评审、可测试的契约。438C 是一台面向工业现场的嵌入式网关要采集总线设备数据、上传到监控平台、支持本地配置和远程升级。本文想讲的不是怎么填模板而是怎么把这份 SRS 写到开发、测试、验收都能照着干活少返工、少扯皮。适合正在做嵌入式或物联网项目负责需求分析、开发或测试的工程师。2. 从系统需求到软件需求438C需求分解的两层映射与编号规范2.1 系统需求与软件需求的边界哪些不该写进438C的SRS很多团队把硬件指标、机械结构甚至项目章程都塞进 SRS导致文档像黑匣子什么都有但又什么都无法验证。438C 的 SRS 只回答一个问题软件子系统必须做什么。系统需求描述的是“整个产品要达成什么”比如“438C 能采集 32 路总线设备的数据并上传”这是产品级目标。而软件需求要落到“采集模块如何配置通信参数、如何解析报文、异常时如何重试”这些才是软件能独立实现和验证的条目。我一般会用两步法来切边界先列出系统需求清单再逐个询问“这项功能如果离开硬件电路或机械结构软件是否还有可定义的逻辑行为”。如果答案是“完全没有”比如“外壳防护等级达到 IP65”这不是软件需求而是系统/硬件需求写进 SRS 只会让评审会吵架。如果答案是“有一部分”比如“设备掉电后配置参数不丢失”软件需要负责把配置存入非易失存储并做掉电保护这才拆出软件需求条目。落到 438C 项目上系统需求里有一条“支持远程升级固件”。软件需求拆出来就至少有三条升级文件的分区存储与校验、升级过程中的断点续传策略、升级失败后自动回滚的机制。只有拆到这一步开发才知道要写哪几段代码测试才知道要造哪几种异常包。拆不出来的部分要么是硬件功能要么是需求根本没想清楚后者需要回到干系人那边去澄清而不是硬写进 SRS。另外SRS 里不要出现“高效”“稳定”“友好”这类形容词除非后面跟着可测量的定义。例如“升级过程要稳定”无法验证必须改成“升级过程中出现一次断电重启后设备仍能运行旧版本固件并可重新发起升级”。这样测试才能构造断电场景验收才有依据。2.2 需求追溯矩阵每条软件需求都能找到系统依据追溯矩阵是 SRS 的骨架它把系统需求、软件需求、设计模块和测试用例串成一条链。438C 的追溯矩阵我习惯用表格维护每一列是系统需求编号、软件需求编号、对应设计模块、对应测试用例。这张表在需求评审时放在第一页评审委员一眼就能看出哪个软件需求没有系统依据或者哪条系统需求没有被软件覆盖。构造追溯矩阵时先从系统需求出发为每条系统需求分配一个或多个软件需求编号。比如系统需求 SYS-003 “支持通过以太网远程配置参数”对应软件需求 SW-003-001配置通道建立、SW-003-002配置报文校验、SW-003-003配置生效与回读。然后在设计阶段补充模块列在测试计划阶段补充用例列。如果某条软件需求找不到对应模块或用例说明它要么是多余的要么是测试没规划需要立刻处理。追溯矩阵还要在需求变更时更新。438C 中途有一次客户要求增加“按周定时重启设备”的功能如果我当时只改需求文档而不更新矩阵后续测试用例和设计都不同步这条需求就会变成“存在但没人做”的空条目。我的经验是矩阵更新与需求变更同步完成并且把矩阵放在 SRS 的附录而不是单独一个文件这样版本管理更省心。2.3 需求编号规则让438C的每条需求有唯一“ID”需求编号是 SRS 最容易忽视但最关键的一环。没有编号评审时只能说“第三页那段话有问题”没法精确管理。438C 的需求编号我采用“前缀-模块-序号”的结构。前缀固定为 SW模块用两位字母缩写序号从三位数开始比如 SW-COMM-001 代表通信模块第一条需求SW-CFG-002 代表配置模块第二条需求。模块划分要提前定好。438C 我分了五个模块COMM通信、CFG配置、DATA数据处理与存储、UPGRADE升级、LOG日志与诊断。模块划分稳定后新增需求只增加序号不改变既有编号。这样 Git 提交、缺陷跟踪、测试用例里都可以直接引用需求编号比如“用例 TC-COMM-001 验证 SW-COMM-001”所有人都能快速定位。编号规则也要约定删除策略。438C 项目初期我为了省事把删掉的需求编号空着结果后续编号混乱有人引用空号有人重新用了旧号。正确的做法是需求一旦编号即便被删除也要在文档中保留编号并标记“废弃”原因写进变更记录。这样追溯矩阵才不会出现断链。编号规范不需要很长两三段就能说清但必须在项目启动第一天定下来而且所有人必须遵守。3. 功能需求怎么写才不算废话438C通信模块的五个要素3.1 需求句式模板谁、什么条件、做什么、结果是什么功能需求最常见的废话是“系统应支持总线数据采集”。支持什么协议采集多少点周期多少失败怎么办全是问号。我写 438C 功能需求时习惯套用一个句式在[触发条件]下[角色或模块]应完成[动作]使得[可观察结果]。这个句式强制写清楚输入、处理、输出和异常避免含糊。拿 438C 的轮询功能举例。初稿是“采集模块应轮询总线设备”。修改后是“当采集任务被启动且通信链路正常时采集模块应以配置的轮询周期依次向每个活动设备地址发送请求报文并在超时时间内收到对应响应报文后将数据写入循环缓存区。” 这一条需求里触发条件任务启动链路正常、动作发请求、结果写入缓存都有了开发者可以直接对应到任务调度和报文收发代码。五个要素我总结为触发条件、输入数据、处理逻辑、输出结果、异常行为。任何一条功能需求都可以用这五项自检缺一项就回去补。438C 的传感器断线检测初稿写“采集模块应能检测设备断线”缺少异常行为。补全后变成“当连续 N 个轮询周期未收到某设备响应时采集模块应将该设备标记为断线并主动上报一条告警记录”。这样测试才知道要模拟几个周期没响应验证告警是否出现。需要承认不是所有需求都适合五要素全写满比如一些纯配置界面需求动作不复杂但触发条件和输入输出一定要有。我的原则是宁可写得啰嗦不可写得模糊。需求文档被诟病“太厚”通常不是因为内容多而是因为废话多。五要素写进去以后废话自然没有位置。3.2 把状态机行为写进需求438C的通信状态切换通信类功能往往有状态变化比如初始化、在线、重连、离线。如果 SRS 只用文字描述“设备应能重连”开发可能用双重 for 循环实现测试则不知道什么状态该触发重连。一个更好的做法是把状态机画成表在需求里用表格或文本列出状态、事件、动作和下一状态。注意不要用流程图代码块和表格在 SRS 里更容易评审和索引。438C 的通信模块状态机我定义四个状态已停止、启动中、运行中、故障。触发事件包括启动指令、配置变更、通信超时、管理员强制停止。下面给出一个简化的状态迁移表当前状态事件动作下一状态已停止收到启动指令初始化端口启动定时器启动中启动中初始化成功开始第一轮轮询运行中启动中初始化失败日志记录失败原因尝试重启启动中运行中轮询超时达到阈值断开链路记录告警故障运行中收到停止指令停止定时器关闭端口已停止故障定时器触发重连重新建立物理链路启动中这张表写进 SRS 后开发只需要按表实现状态迁移函数测试也可以按表构造用例。状态机表的关键是不要遗漏“事件与动作不匹配”的情况比如运行中收到启动指令是忽略还是报错需求里也要写一句“未列出的状态事件组合应保持当前状态不变并记录调试日志”。这句话能省掉大量边界争吵。我还会给状态迁移表加一列“超时值建议”比如“运行中轮询超时阈值默认 3 秒可配置”。为什么建议因为需求文档不该固定死某个数值但必须给出一个可配置项以及默认值和范围。438C 的通信超时范围我写在需求里是 1 到 60 秒默认 3 秒。这样开发有依据测试有范围客户也能理解。3.3 异常与边界条件超时、重试、丢包在需求里的表达异常处理是功能需求里最容易被漏掉的部分。很多 SRS 写到“设备应能正常通信”就收笔但现场通信没有“正常”这回事只有“在各类异常下还能按预期工作”。438C 的考量是总线设备可能掉电、模块可能收到半包、网络可能拥塞。每条正常流程我都要追问一句“如果这一步失败怎么办”。用轮询数据为例。正常流程是发请求、等响应、收数据。异常至少四种无响应、响应超时、响应校验错误、响应长度不符合规范。每种异常在 SRS 里都要有对应行为。比如“无响应”对应结果“连续 3 次轮询无响应标记该设备断线并跳过本轮连续 3 个轮询周期中累计 10 次无响应通信模块进入故障状态”。重试参数必须明确重试次数、间隔、是否退避。这里有一个我踩过坑的地方重试次数写进需求后开发在常量里定义了“3”测试用“4 次失败”去验证结果因为从 0 开始计数而行为不一致。后来我们规定所有重试计数的定义必须写明“首次失败算第 1 次”还是“首次失败算第 0 次”并且给出示例。438C 的 SRS 里我写的是“连续 3 次轮询无响应”也就是失败第 3 次时触发断线标记这个语义不需要数数直接按自然次数理解。丢包和乱序也要写。438C 的链路层基于 TCP但业务层仍可能收到重复包或顺序错乱需求里必须定义“接收方应按报文序号去除重复并缓存乱序报文等待前序报文到达后依序处理”。这听起来像设计细节但实际上是在约束开发者必须做序号的校验否则后续数据拼接会出问题。SRS 写到这里开发就知道这不是一个简单的 recv 循环。4. 非功能与接口需求438C在性能、协议、可靠性上的三个翻车点4.1 性能需求吞吐量、延迟、CPU占用如何量化非功能需求写不好438C 就会在测试阶段翻车。我见过最典型的写法是“系统应具有较高性能”这等于没写。性能需求必须与可测量的场景绑定。比如“在 32 路总线设备、每路每秒 10 条报文、全部在线的情况下采集模块从收到报文到写入缓存区的延迟平均值小于 50 毫秒峰值小于 200 毫秒”。这里的数据量、设备数、延迟上界都明确测试可以直接构造压力场景。CPU 占用需求我一般写成“在上述场景下CPU 平均占用率不超过 30%峰值不超过 60%基于某处理器平台”。为什么要加平台说明因为性能数值在不同主控上有不同含义438C 的主控在项目早期定过两版如果需求不锁定平台性能验收就是一场争吵。SRS 中我还会补充一句“该指标在需求评审时确认的硬件平台上验证若平台变更需重新评估”。内存占用也要量化。嵌入式设备的 RAM 有限438C 的循环缓存区大小、报文队列长度、日志缓冲区大小都应该在需求中给范围。比如“数据循环缓存区容量不小于 4096 条完整报文且缓存满时采用覆盖最旧策略并记录覆盖次数”。这条既约束内存也约束行为还方便测试检查覆盖计数。性能需求的另一个要点是“持续时间”。很多设备跑 5 分钟数据正常跑 72 小时就内存泄漏。438C 的性能需求里我加了一条“在上述满负荷场景下连续运行 72 小时内存占用增量不超过 5%”。这条能逼着开发在 SRS 评审阶段就考虑资源释放而不是等测试用长时间老化来发现问题。工程上这是血泪经验测出来再修定位和复现代价都很大。4.2 接口需求协议版本、字节序、报文格式必须锁死接口需求是 SRS 里最不能含糊的部分。438C 对外通信涉及总线协议、平台上传协议和本地配置协议。每种协议都要在 SRS 中明确协议名称与版本、传输层、字节序、帧格式、字段定义、帧类型列表、错误码。不要写“遵循标准协议”然后不写版本因为标准协议也有修订版不同版本字段可能不同。举个例子438C 上传平台的数据帧我在 SRS 中用一个表来定格式字段名偏移长度类型值域/说明帧头02uint16固定 0xAA55大端序长度22uint16从版本字段到校验字段的总长度版本41uint8协议版本当前为 0x01报文类型51uint80x01 数据上报0x02 告警上报设备号64uint32全局唯一设备编号数据体10N自定义类型决定结构CRC32...4uint32对帧头之后数据计算这还不够还要说明数组和字符串的编码方式。比如“字符串使用 UTF-8 编码无结尾空字符长度由长度字段决定”。字节序统一规定为“多字节数值按大端序传输”避免不同平台解析出来数值不对。这些细节不写开发按本地小端序打包平台按大端解包联调必然翻车。另外接口需求要定义“版本兼容策略”。比如“平台端低于 V1.2 的协议版本不再支持若收到旧版本帧头则回复错误码并断开链路”。这样当协议升级时新老设备并存才有明确规则。438C 在项目中期曾经发生过一次协议字段追加如果没有兼容策略现场旧设备全部连不上那个星期我基本都在处理投诉。4.3 可靠性与安全需求看门狗、日志、故障恢复的写法可靠性需求不是写“系统应可靠”而是把故障模型和恢复动作写清楚。438C 的可靠性需求我分成三类硬件异常联动、软件自恢复、数据保全。硬件异常联动比如“当主控检测到外部看门狗超时信号时软件应在 100 毫秒内完成挂起状态记录并重启应用任务”。这句话让驱动程序知道该什么时候喂狗也让测试知道可以挂起任务来模拟超时。软件自恢复包括任务栈溢出检测、内存分配失败处理、死循环看门狗。438C 的 SRS 里有一条“每个周期任务的最长执行时间不得超过 200 毫秒若超过则任务调度器应记录超时日志并强制进入安全模式”。安全模式的定义也要写清楚是停止数据上报还是降级采集不能只写“进入安全模式”四个字。数据保全方面配置参数和缓存数据的掉电保护是常见坑。438C 的 SRS 写了“配置参数在修改后应立即写入外部存储写入失败时回滚到上一个有效配置并产生告警”。这里的关键是“回滚”和“告警”没有这两项写入失败时设备会带着半新的配置运行行为不可预测。日志需求也不能含糊日志级别、存储容量、循环覆盖规则、时间戳格式、远程读取方式都要写。安全需求在 438C 上主要是访问控制。比如“仅允许管理员通过本地配置口修改网络参数远程升级指令必须携带令牌令牌连续验证失败 5 次后锁定升级通道 15 分钟”。这些需求能防止现场误操作和恶意攻击。安全需求不一定要多高深但必须有边界否则测试不知道反复输错密码会怎样。5. 438C的SRS评审与变更控制我踩过的坑和避坑清单5.1 评审前必查的10个问题让需求瑕疵当场现形SRS 写完之后不能直接发给开发要先自查和评审。我在 438C 项目里总结了一个评审 Checklist每次评审前逐条过筛。下面这十个问题基本覆盖了最容易出问题的区域每条需求是否都有可验证的验收标准没有验收标准的条目直接打回。是否存在“等于没说”的形容词“比如稳定、及时、合理”有就改。触发条件是否明确比如“当设备离线时”没有定义离线判定改成分辨“连续 N 次无响应”。异常路径是否覆盖正常流程之外重试、超时、丢包、断电、内存不足是否有行为定义。接口格式是否锁死版本号、字节序、CRC 算法、字段长度是否都说清了。性能指标是否可测量有没有负载模型、时间窗口、硬件平台。是否与硬件边界清晰有没有要求软件去做器件的电气保护。追溯矩阵是否完整每条软件需求都能映射到系统需求和测试用例。优先级是否标注哪些是必须有哪些是可以延后没有优先级则排期会乱。需求变更记录是否留痕每个历史版本改了什么、为什么改新成员能不能看懂。这十问不是我在评审会上临时提问而是提前写在 SRS 文档的自查表里。评审时大家对照着打勾比漫无目的地读文档效率高得多。438C 项目里有一个功能需求当时写的是“支持本地日志导出”因为没有定义导出格式和媒介开发做到一半停下来问“导出到哪”。后来我把这个需求改成“通过本地调试串口导出格式为 UTF-8 文本每行一条日志导出期间暂停数据上报”问题当场消失。评审还有一个习惯请测试工程师和硬件工程师一起来而不是只有开发。测试工程师会问“这个场景怎么造数据”硬件工程师会问“这个超时时间是否和电路设计匹配”。这些跨角色的问题很容易暴露需求里的漏洞。我自己写 SRS 时很自信但每次评审都被挑出至少两三个“没想到”的地方所以后来我宁可评审多开几轮也不愿等到编码后返工。5.2 需求变更流程从变更申请到追溯矩阵更新的闭环需求变更是项目常态438C 也不例外。开发中途客户提了三次变更第一次是增加每周重启第二次是修改告警上报格式第三次是要求支持某新总线协议。如果每次变更都只口头通知SRS 很快就会和代码、测试用例脱节。我定了一套固定的变更流程看起来麻烦但后面省的是几倍的返工时间。流程分四步。第一步变更申请任何干系人提交书面变更申请写明变更理由、影响范围、期望完成时间。第二步变更评估我组织开发、测试和硬件工程师评估该变更对既有需求、设计、测试用例、项目进度的影响。评估结果写进变更记录包括是否接受、部分接受或拒绝。第三步实施变更修改 SRS 中对应的需求条目和追溯矩阵给变更后的需求更新版本号并在需求条目中注明变更记录索引。第四步通知与验证将更新后的 SRS 发给所有人测试补充新的用例开发调整编码计划。这里有一个关键动作在 SRS 中增加“变更记录”章节每次变更记录一行包含变更编号、日期、提出人用角色代替、变更内容摘要、影响的需求编号。为什么用角色而不用人名因为人员可能变动但角色固定文档更容易维护。438C 有一次人走了之后我们仍然能从变更记录里看出当时的决策原因这对后来维护非常重要。我还要求每次变更必须更新需求追溯矩阵。如果某条系统需求不变但软件需求改了一部分矩阵里对应的映射关系是否变化要重新核对。如果测试用例需要新增没有矩阵参照测试可能漏掉新需求。这个闭环在 438C 后期体现得很明显三次变更都及时同步到了矩阵中测试在最终验证时直接按矩阵逐条跑没有出现“需求改了但没人测”的情况。5.3 三个典型踩坑记录现象、原因、解决第一个坑需求里写了“支持断线重连”但没写重连间隔。现象是开发实现了一个无限快速重连的循环导致通信模块 CPU 占用 100%设备发热严重现场被投诉。原因是需求没有定义“重连等待时间”开发为了“尽快恢复连接”就采用了最直观的自旋循环。解决方法是在 SRS 中明确“断线后等待 5 秒进行第一次重连此后每次重连间隔加倍最大间隔 300 秒手动触发除外”。并添加了 CPU 占用指标测试用长时间断网场景验证。第二个坑协议字节序没有统一。现象是 438C 上报平台后平台解析出的设备号和时间戳数据异常数字忽大忽小。原因是 SRS 只写了“数据帧格式”没规定字节序开发按小端序打包平台按大端序解析。解决方法是在接口需求中增加“所有多字节字段均采用大端序示例设备号 0x00000001 在线路上的字节顺序为 00 00 00 01”。这一步雷在文档里只是一句话但避免了一次需要现场升级的尴尬。第三个坑配置参数的掉电保护需求没有提写入失败回滚。现象是某次客户现场配置新 IP 地址设备刚好在写入过程中断电重启后参数处于半旧半新的状态导致通信混乱。原因是 SRS 只关注了“保存参数”没有关注“保存失败怎么办”。解决方法是补充“配置写入失败必须回滚到上一个有效配置并在日志中记录失败原因”的需求。这个坑让我意识到需求编写时不能只写理想路径必须强行问自己“如果这一步失败了系统会怎样”。6. 把验收测试前置写进SRS一个让需求不再扯皮的习惯6.1 每条需求配一条可执行的验证标准SRS 写得再细如果没有验证标准评审时说多了都是空谈。我的习惯是给每条需求最后加一行“验证方法”不需要写完整测试用例但必须写上可以执行的验证动作和预期结果。比如 SW-COMM-001 的验证方法是“配置 1 路模拟设备设定轮询周期 1 秒观察 10 秒内上报次数在 9 到 11 次之间且报文格式与协议定义一致”。测试看到这个条目就知道怎么造环境不用再回头猜需求意图。438C 的每个功能需求我都至少写一条验证标准。对于非功能需求这条标准就是可测量的指标比如“在满负荷场景下连续运行 72 小时内存增量不超过 5%通过执行内存统计指令 3 次取平均值”。这样做有一个明显的好处需求评审时开发会当场提出“这个验证标准太苛刻”或“这个环境不好搭”如果验证标准本来就写不清楚连讨论的依据都没有。有时候验证标准会反过来暴露需求本身的漏洞。有一次我写“采集模块应能处理最长 512 字节的报文”验证标准是“发送 512 字节报文并检查缓存区完整接收”但开发指出报文长度字段只有 8 位最大值是 255。这说明需求与接口定义冲突验证标准把它逼了出来。所以我把验证标准视为 SRS 的一部分而不是测试文档的事。6.2 用“需求-用例-结果”三列模板收尾为了让验证标准不散落我在 SRS 最后一章放了一个“需求验证对照表”只有三列需求编号、验证方法、测试用例索引。这不是完整测试用例而是给测试团队的一张导引图。比如需求编号验证方法测试用例索引SW-COMM-0011 路模拟设备1 秒周期10 秒内 9-11 次上报TC-COMM-001SW-COMM-002断网 60 秒观察重连间隔符合倍增规则TC-COMM-008SW-CFG-002写入非法 IP检查回滚和告警TC-CFG-003这张表让任何人在拿到 SRS 时都能快速回答“这个需求测了没有”。测试工程师可以在计划阶段就把用例索引填上开发也能在自测时对照验证方法逐条执行。438C 项目在最终验收时第三方测试机构就是按照这张表逐条抽检的没有再发生测试和开发对着需求吵“这个需求没写过”的情况。我的一个习惯是写完所有需求后自己假装是一个刚入行的测试工程师用验证方法去推演执行步骤如果发现自己还得去猜前置条件或预期数据那这条验证方法就是不合格的必须重写。这个习惯帮我删掉了不少“看似具体、实则含糊”的句子。比如一开始我写“验证上报是否正常”后来改成“用串口监听工具抓包确认帧头、长度、CRC 均正确且平台收到后回 ACK”。后者才叫可执行。另一个收尾技巧是给整个 SRS 做一次纯文本扫描搜索“等等”“各种”“相关”这类占位词。如果找到说明有需求没写到位。438C 的 SRS 初稿里有一句“支持各种告警通知方式”后来我改成了“支持短信通知网关内置 4G 模块的 SIM 卡欠费时不阻塞现场告警”。这个改动看着小却让整个告警模块的设计和测试范围变得非常清楚。最后说一个所有需求工程师都躲不掉的现实SRS 永远不可能在启动前达到 100% 完美但落到纸面、可评审、可追踪、可验证的 SRS至少能让 438C 这类项目从“靠口头传说”变成“靠文档协作”。我吃过太多次因为一句话没说清导致返工的后悔药所以现在宁愿多花一周在设计需求上也不愿多花一个月在联调时救火。希望这个习惯也能帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →