尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

嵌入式系统需求获取实战:从访谈、接口定义到量化指标

嵌入式系统需求获取实战:从访谈、接口定义到量化指标 做嵌入式系统的需求获取最怕的就是项目干到一半硬件工程师拿着一块板子问你“这个引脚当初不是你们说要留出来的吗现在怎么又改了”而你翻了半天文档发现那句话只在一次会后纪要的角落里提过一句最后大家都没当回事。这种场景我遇到过太多次了。本系列第一篇聊了什么是需求获取、为什么它在嵌入式开发里特别容易翻车这一篇直接进入正题讲清楚具体怎么做。我会把访谈策略、场景梳理、接口定义、非功能指标量化、工具落地这一整套流程拆开来讲中间穿插一个温控器项目的实操案例最后把我们经常踩的坑逐个排一遍。如果你正在负责一个软硬结合的产品或者刚转行做嵌入式需求分析这篇内容应该能帮你省下不少试错成本。1. 为什么嵌入式系统的需求获取不能照搬互联网那套打法很多人一开始做嵌入式需求习惯性地套用互联网产品的方法拉一群用户来访谈问“你想要什么”“你希望它长什么样”然后写一堆用户故事。这套方法在App上可能行得通但在嵌入式系统上照搬会直接翻车。原因有三个方面任何一个都能让项目拖期。1.1 嵌入式需求获取与普通软件需求获取的三个本质差异第一个差异是硬件的存在让需求有了物理边界。互联网产品改个按钮颜色第二天上线就行但嵌入式系统的需求一旦涉及到引脚分配、PCB改版、传感器选型改动代价是几何级数增长的。所以在需求获取阶段你不仅要问“用户想要什么功能”还必须同时确认“这个功能在现有硬件上能不能做”“有没有预留对应的接口”“信号质量够不够”。需求和硬件的耦合程度决定了你不能把软件需求单独拎出来获取。第二个差异是实时性和资源约束必须被当作一等公民对待。普通软件的性能问题通常被归结为“优化项”可以在后期慢慢调。但嵌入式系统里响应时间、中断延迟、内存占用、功耗指标这些在需求阶段如果没定清楚后面就不是优化问题而是整个架构要推翻重来的问题。第三个差异是利益相关者结构完全不同。互联网产品的利益相关者主要是用户、产品经理、设计师、开发。而嵌入式系统的利益相关者里还多出了硬件工程师、结构工程师、产线工程师、认证工程师、现场维护工程师甚至还有采购因为芯片选型直接关系到成本和供货周期。需求获取如果只盯着最终用户一定会漏掉大量隐藏需求。1.2 需求获取之前必须锁定的四个背景要素我在启动任何一个新项目的需求获取之前会先花半天到一天时间把下面四件事搞清楚。这四件事不锁定后面的访谈和会议基本都在打空转。第一产品定义的边界。这个产品是全新设计还是基于上一代产品的迭代如果是迭代那上一代产品有哪些已知缺陷、用户投诉、维护记录这些是最真实的需求来源。如果是全新设计那参考竞品和市场调研就要前置不能等需求访谈做完了再补。我见过一个团队做一款工业网关花了两周时间访谈客户问出的需求全是“能连上就行”“稳定就行”这类空话后来才发现市面上同类产品已经迭代了三代他们需要的不是访谈而是先拆一台竞品。第二系统架构的抽象层次。需求获取阶段没必要搞清楚每个寄存器怎么配置但你得知道这个系统大概分哪些子系统哪些是硬件主控、哪些是通信模块、哪些是执行机构。这样在访谈时才能有针对性的提问不会一上来就陷入某个技术细节拔不出来。我通常会在需求启动会上画一张系统模块图不用太细只要大家能确认“这几个模块是存在的”“数据大概是这样流动的”就够了。第三目标平台的资源基线。这里指的是主控芯片的算力、内存大小、Flash空间、外设资源、通信接口数量。这些信息即使只是初步的参考选型也能让你在记录需求条目时顺手标注“这项需求对内存的影响”“这项需求是否需要额外的串口”。如果连参考平台都没有那需求获取的范围就会失控因为你不知道哪些功能是现实可做的哪些是纯属想太多。第四利益相关者清单。把项目涉及的所有角色列出来标上他们对需求的影响力等级和参与深度。我常用一个简单的表格角色名称、核心关注点、参与形式访谈/评审/邮件确认、重要性评级。这样能确保在需求获取过程中不遗漏关键角色比如产线工程师他们的需求往往是“方便组装”“方便测试”这类没人主动提、但你不问他也不会说的事情。2. 核心需求获取方法从访谈、场景到接口建模背景锁定之后接下来就是动真格的需求获取了。这一节我讲三种最实用、在嵌入式领域尤其有效的方法分层访谈、场景驱动分析、接口为中心的定义。这三种方法可以独立使用也可以组合使用实践中我几乎每次都会把它们串起来。2.1 分角色实际访谈策略每个角色聊的天完全不同很多新手做访谈是把所有相关人员叫到一间大会议室然后开始提问。这个做法在嵌入式系统场景下效果非常差因为硬件工程师和营销人员关注的维度差太远营销人员说“客户要一个红色报警灯”硬件工程师立刻开始反驳“红色LED的驱动电压是1.8V我们的供电是3.3V需要加限流电阻”……会议能量全耗在这种无意义的对抗上了。我的做法是分层访谈每轮只聊一个角色的关注点产品经理和市场人员只聊产品定位、使用场景、目标客户、竞品差异、售卖价格区间。这些信息用来推导功能需求的上层逻辑。硬件工程师只聊接口资源、引脚冲突、电源轨、通信协议、传感器选型、已知硬件限制。这些信息用于给需求写约束条件。软件工程师可能在项目后期才加入聊他们上一代产品的代码维护问题、存储占用、任务调度方面的痛点以及他们对新功能的实现成本预估。现场维护和售后人员这是最容易被忽略、但信息价值最高的一批人。他们能告诉你设备在实际使用中“90%的问题都出现在接线端子松动”“客户经常因为看不懂指示灯状态而误报故障”。这些描述背后全是硬需求。访谈时有一个关键技巧不要问“你想要什么功能”而要问“你现在是怎么做这件事的”“这件事最让你头疼的是什么”。后者得到的是真实场景和痛点前者得到的是经过大脑加工和修饰过的答案并且往往会变成不切实际的愿望清单。2.2 场景驱动把使用场景转化为状态与事件嵌入式系统本质上是对外部事件的响应系统。所以需求获取时与其让用户描述“我要一个自动加热功能”不如让他具体描述“当环境温度低于5度的时候系统应该做什么继续下降到0度的时候又该做什么手动停止加热的时候设备会有什么反应”。我会把每个核心使用场景拆成这样的几个维度触发条件什么事件启动这个场景前置状态系统在这个事件发生前处于什么状态系统响应系统做什么输出什么信号或动作用户可见反馈用户/外部系统能看到或感知到什么异常分支如果某个环节失败了系统该怎么做时间约束多快必须完成响应收集完这些信息之后我会把它们整理成状态图或事件表。这里不需要用专门的建模工具一张Excel表就够用事件名称、触发条件、当前状态、目标状态、输出动作、时间要求、优先级。随着访谈的推进这张表会越来越完整最后它本身就是一份非常硬核的需求文档。2.3 接口为中心的需求获取方法接口定义表嵌入式系统躲不开接口。这个接口不单单指物理接口还包括设备之间、模块之间的数据接口。我强烈建议在需求获取阶段的早期就输出一份接口定义表哪怕刚开始是空壳也要先搭好框架。操作非常简单列出系统对外或模块之间需要交互的每个信号或数据项每一行记录这些字段字段说明信号/参数名称比如“风扇转速反馈”方向输入系统还是从系统输出数据类型/范围比如“0-3000 RPM整数”更新频率比如“每秒1次”电气接口条件比如“RS485, 波特率9600”可靠性要求比如“传输错误时需要重试3次”这张表的价值在于它会在需求获取过程中把模糊的功能描述强制转化为可验证的技术细节。当一个人说“设备要能检测环境温度”你拿着接口定义表问他“温度数据从哪个接口进来精度要求多少采样频率多高和之前哪个模块的数据冲突吗”他很快就会意识到自己还没想清楚于是回去和团队对齐这比事后在开发阶段被发现要好上一万倍。3. 把非功能需求从“模糊期望”变成“可验证指标”嵌入式系统需求里功能需求部分通常还好说大家描述起来有参照物难啃的是非功能需求。你问客户“这个设备要稳定”客户说“对一定要稳定”你问“多稳定”客户说“反正不能老坏”。这样的对话在需求评审会上毫无意义。真正的需求获取要把每一个模糊期望逼出可量化的数字。3.1 时序约束获取从感觉值到硬实时指标时序约束是嵌入式系统最常见的非功能需求。但“反应要快”“响应要及时”这种说法没有任何可验证性。在需求获取中我会通过具体场景把不同的时序要求逼出来采样率系统监测温度时要求多久采集一次“1秒一次”和“10毫秒一次”对主控的负载和滤波算法完全是两个量级。控制周期控制算法多久执行一次直接决定你能用多大阶数的算法。事件响应时间从外部事件发生到系统输出相应动作最坏情况下允许多少毫秒这个数据决定着中断优先级设计和看门狗策略。启动时间设备上电到进入正常工作状态允许多少秒这会影响你选择哪种初始化流程和自检策略。通信超时和上位机通信时多久没收到心跳包就算连接断开这个数字会影响协议设计。实战中我常用一个追问模板把“系统要在X毫秒内对Y事件做出Z动作”拆成三个子问题——你希望从物理事件发生到系统感知的延迟是多少从感知到软件判定完成的延迟是多少从判定到执行机构动作完成的延迟是多少很多客户一开始答不出来但当你追问几轮之后他会去翻旧项目的测试报告或者参考竞品指标最终给出一个可以签字的数字。这个过程本身就是需求获取的核心价值把感觉转化为共识。3.2 资源预算式需求获取嵌入式系统的资源是有限的CPU主频、RAM、Flash、通信带宽、电池电量每一个都是有限的。需求获取阶段如果你不主动做资源预算那么开发阶段一定会陷入无休止的“资源不够了谁的模块让一下”的冲突中。我习惯在需求获取收尾阶段组织一次资源预算对齐会。简单说就是让每个功能模块的负责人估计自己的需求占多少资源然后汇总看是否超出硬件选型的预算。比如一个工业数据采集器主控是Cortex-M4RAM 128KBFlash 512KB。通信模块说需要20KB RAM存储模块说需要30KB传感器驱动说需要15KBUI显示说需要40KB……加起来一看光RAM就超了。那要么换主控要么在需求阶段就砍功能而不是等代码写完了再发现。这个环节的关键在于资源预算不是精确的估算而是数量级的核对。它不是为了算准每行代码占几个字节而是为了尽早暴露“我们想要的比硬件能给的多”这个本质矛盾。3.3 安全与可靠性需求的获取让“万一”变得具体说到安全很多团队的第一反应是“我们不做航空航天不需要每行代码都做验证”。但嵌入式系统的安全需求远不止功能安全认证那一类还包括普通工业产品的故障自诊断、失效保护、数据完整性和异常恢复。需求获取阶段有一个方法特别适合套用就是FMEA失效模式与影响分析的简化版。做法是对每一个输入信号、输出执行器、通信链路逐一问四个问题——如果它失效了会发生什么如果它接收到错误值系统会怎么反应如果它在超时时间内没有反馈应该怎么样系统自身哪部分最可能先出故障这个追问方式会有奇效。比如一个温控器的温度传感器如果断路有些设计会认为“温度是0度”然后全力加热最后把设备烧了。如果在需求获取阶段有人问了“传感器断线了怎么办”你就能得到“进入故障保护状态停止加热上报错误码”这样一条硬需求。而没做这一步、直接开发的项目十有八九会在现场坏掉然后被售后团队骂到自闭。3.4 用原型和仿真验证需求可行性需求获取阶段不是说一定要把所有指标都文字化就完事了还需要快速判断这些指标在目标硬件上是否可行。对这里就要引入原型或仿真工具。这里的原型不是完整的工程样机而是“足以验证关键指标”的最小实现。比如你要验证一个电机控制算法是否能在10毫秒周期内跑完可以用一块开发板加一个简单的测试程序跑一跑看看最坏执行时间是多少。又比如你要确认某个WiFi模块的传输速率是否能满足需求直接买一块现成模块用厂商的Demo程序打一下吞吐量数据。原型验证的目的有两个一是给所有利益相关者一个共同的、可感知的参照物避免各方对需求的理解产生偏差二是给需求条目提供现实依据标注“已验证/未验证”状态。这条经验来自一次教训我曾在一个功能需求评审会上就“系统能否在1秒内完成数据上报”这个指标争论了两个小时谁也说服不了谁。后来我直接拿了一块开发板写了个最粗糙的测试程序实测出来是1.8秒。数据一摆谁也不再吵了需求立即调整为“3秒内”并且新增了一条“优化上报机制”的技术需求。4. 实操流程从第一次会议到需求基线案例拆解这一节我用一个虚拟但非常典型的项目来走一遍完整流程一款工业用智能温控器功能是控制加热设备温度在设定范围内支持本地按键设置参数和远程上位机通信。项目启动时团队只有产品经理和硬件主管两个人软件工程师还没到位。这种情况非常常见需求获取往往在软件团队组建之前就开始。4.1 需求获取整体流程规划我在项目启动后要做的第一件事就是规划需求获取的整体节奏然后发给所有参与者。时间规划大致是这样阶段时间输出项目背景梳理与利益相关者识别第1周背景资料包、干系人清单分层访谈第2-3周访谈记录、初步需求列表接口定义与场景建模第3-4周接口定义表、状态事件表非功能指标量化与资源预算第4周量化指标表、资源预算表需求条目撰写与评审第5周软件需求规格说明书SRS初稿需求确认与基线第6周评审通过的需求基线和追踪矩阵这个流程是可伸缩的。如果项目更小访谈可以压缩到3天需求评审可以合并成一次。如果项目更大每个阶段可以按子系统拆开平行推进。核心思想是需求获取不是一个一次性会议而是一个有起点、有中期产物、有验收节点的过程。4.2 实操记录一次温控器需求获取会议以温控器的第一次访谈为例。我约了产品经理和硬件主管一共聊了两个小时。刚开始产品经理说“这个温控器要能支持PID控制加热输出用继电器。”硬件主管紧接着说“继电器的响应速度太慢了PID肯定得用SSR固态继电器成本贵一些但控制效果好。”这两句话一出来我就知道这是一个典型的需求偏差产品经理关心的是功能逻辑硬件主管关心的是实现路径。如果让对话停留在“用继电器还是SSR”这个层面需求会变成一场方案争执。我的处理方式是先记录下来——【决策项加热输出采用SSR成本增加约X元】——然后继续追问“如果不考虑具体器件温控器在控制层面的需求是什么”产品经理想了想说“要把温度稳定在设定值±1度以内。”硬件主管补充说“纯继电器通断控制波动范围可能在±3度左右达不到±1度的要求。”这就是一个非常成功的需求获取瞬间。它把一个模糊的“支持PID控制”转化成了可验证的“温度控制精度±1度”和“输出执行器需支持PWM/调压”两条硬需求。会议结束后我把这类对话整理成“需求对话记录表”每一行都注明对话原话、潜在需求、推断依据、待确认事项。这个习惯能让需求追溯变得清晰——以后如果某个需求被质疑“哪里冒出来的”你可以翻出对应的原话记录而不是空口解释。4.3 需求条目编写的格式规范访谈和建模工作做完后最终的落脚点是一份高质量的需求规格说明书。这里有一个很关键的原则每条需求都必须包含6个要素否则这条需求就还不算完成。需求标识符唯一编号比如REQ-TEMP-001方便追踪和引用。需求描述独立的、可测试的、完整的自然语言描述。避免含糊词汇比如“系统应尽量快速响应”这句话没法测试。需求来源这条需求是谁在什么场景下提出的。这个字段很重要它让需求有据可查。优先级高/中/低决定了开发阶段实现顺序和资源倾斜。验收标准怎么验证这条需求是否实现可以是一组具体的输入/输出对也可以是一个可测量的指标。关联项关联的接口定义、硬件约束或场景编号。以温控器为例一条合格的需求长这样REQ-TEMP-005优先级高 系统应支持通过PT100传感器测量加热区温度温度测量范围为-50℃至300℃精度为±0.5℃采样更新周期不超过500ms。 来源产品经理访谈2024-05-12关于控制精度话题。 验收标准使用PT100模拟器输入-50℃、0℃、150℃、300℃时系统显示值误差在±0.5℃内。 关联项接口定义表IF-TEMP-01状态事件表EVT-TEMP-08。这个格式看起来简单但它能挡住大量需求模糊导致的返工。我见过不少团队用“备注”方式写需求结果评审会上没法逐条验收开发时凭感觉写代码最后交付时客户不认账。格式规范是把隐性知识实体化的重要一步。4.4 需求确认与验证评审会到底该怎么开需求确认不是把文档发给所有人回一句“收到”就算确认。正式的做法是组织需求评审会逐条过需求。这一步最容易被忽视也最容易走形式。我的评审会流程是会前把需求文档发给所有参与者请他们把不同意的地方提前标注会上不逐字念需求而是只讨论有分歧的条目每条有争议的需求都给一个明确的结论——接受、修改、还是拒绝所有修改在现场就同步到文档不做会后再补。实际操作中还有一个我个人的心得评审会上最有效的追问是“这条需求你能不能设计出一个测试用例来验证它”如果对方答不出来说明这条需求还不够具体需要继续细化。这个追问能把很多模糊的需求扼杀在评审阶段比后期测试发现要好太多。5. 需求从“纸面”到“追踪”工具和追踪矩阵落地需求获取完成之后如果只停留在文档层面那还只是一个静态的记录。真正决定需求管理质量的是后续的追踪和变更控制。这一节我聊聊工具选型和追踪矩阵的实际做法。5.1 工具选型重型平台还是轻量表格经常有人问我需求管理用什么工具。我的回答是根据团队规模和项目复杂程度来选择别为了工具而工具。大型团队、高安全等级项目比如汽车电子、医疗设备用IBM DOORS、Polarion或Jama这类专业的需求管理平台好处是自带完整的评审流、基线管理和变更追踪可以细到每条需求的每一次变更记录。代价是学习成本高、授权贵而且流程一旦建起来会让团队感到不轻便。中小型团队尤其是创业公司或内部工具类项目我强烈推荐先用轻量方案Excel或在线表格 Git/网盘版本管理。把需求表格作为唯一的事实来源每次变更走一次“修改-评审-归档”的流程。这个方案完全够用关键是把流程习惯立起来。只要你能坚持每一条新增需求都记录“来源、日期、修改原因”用Excel的效果绝不比专业平台差多少。5.2 需求追踪矩阵连接需求、设计、测试的桥梁需求追踪矩阵是需求管理里最实用、也最被低估的工具。它的核心是建立需求条目和后续设计/测试项之间的映射关系。我在项目中通常维护一张这样的矩阵表需求ID需求描述摘要设计模块/文档代码实现文件测试用例验证状态REQ-TEMP-005PT100测温范围/精度温度采集模块设计temp_sensor.cTC-001, TC-002通过REQ-CTRL-012温度控制精度±1℃控制算法模块设计pid_ctrl.cTC-101, TC-102待执行REQ-COMM-003支持Modbus RTU上报通信模块设计modbus_rtu.cTC-301, TC-302开发中矩阵的价值在项目后期会充分体现测试阶段你能拿它快速定位“哪些需求还没被测试覆盖”需求变更时能立刻评估“这个需求改了影响哪些设计和测试项”。没有矩阵变更影响分析只能靠拍脑袋这是需求管理中最危险的做法。5.3 需求变更控制的三个实操心得需求获取完成并基线化之后变更一定会来。关键是变更不能毫无章法地发生。第一个心得任何变更必须走正式申请。哪怕是口头说“这个很简单改一下就行”也必须有对应的变更申请记录。这个记录可以是邮件、工单、或者一张简单的审批表重点是要写明变更内容、变更理由、影响范围涉及哪些需求、设计、测试、预计工作量、风险等级。第二个心得评审变更时不要只评估“实现这个变更要多久”还要评估“接受了这个变更会推迟什么”。很多项目就是被一条条“很简单”的变更拖垮的因为每个人只看局部没人看整体。第三个心得每次发布新基线时把变更摘要写在版本说明里。这个习惯让所有团队成员都能感知到需求是在演化的而不是一潭死水。我见过多个项目因为需求文档更新了没有人通知开发还在按旧版本做最后交付对不上账。6. 常见问题与排查技巧实录需求获取做得多了会反复遇到一些差不多的坑。这里我挑四个最典型、也最隐蔽的问题来讲每一个都是我在项目里踩过之后总结出来的。6.1 利益相关者之间对名词理解不一致有一次做设备状态上报的需求产品经理想的是“设备状态包括运行、停止、故障三种”维护工程师想的是“状态还有待机、维护、升级中”硬件工程师理解的“故障”又是“硬故障和软故障分开上报”。开会时大家嘴上都在说“状态上报”实际上脑中的模型完全不一样。排查方法很简单在需求获取阶段凡是出现“状态”“模式”“正常”“异常”这类抽象名词必须让每个人说出自己心里的枚举值或定义。输出一张术语表列出每个术语的定义、允许值、使用场景。这本书在需求评审时能避免大量无意义的争吵。6.2 需求被“约定俗成”掩盖导致实现偏差有些需求从来不会被写下来因为项目里的人默认“这还用说吗”。一个典型例子设备断线重连的时间间隔。老团队成员都知道“我们一直用的是30秒重连一次”但新来的软件开发不知道他可能会把它设计成5秒重连结果功耗超标也可能设计成2分钟结果用户觉得设备反应迟钝。避免这个问题需要从一开始就主动寻找“不成文的规定”。我在每轮访谈结束前都会问一个问题“有什么事情是你们觉得理所当然、不需要特别说明但新来的人肯定会搞错的”这个问题每次都能挖出几条真正的暗需求。6.3 需求写成解决方案过度设计反而丢失原始目的需求文档里最常犯的错误是把“怎么做”写成了需求。比如“系统应采用卡尔曼滤波算法对温度数据进行处理”这句话它看起来像需求实际上已经指定了实现方案。如果后面发现卡尔曼滤波在这个资源受限的MCU上跑不动想换成简单的滑动平均滤波就会触发一次“需求变更”但实际上原始的需求只是“温度显示波动应小于0.3℃”。判断技巧是对每条需求问一个“为什么需要它”如果答案是某一种实现方式本身而不是一个外部可感知的目的那它就只是一个设计约束。设计约束可以附在需求后面作为注记但不应占据主需求的位置。6.4 克隆需求从旧项目复制粘贴引发的灾难嵌入式项目之间复用需求非常常见但直接复制旧项目的需求文档然后改几个字是灾难源头。老需求中经常带有对旧硬件的假设比如“使用UART0与GPS模块通信”的新项目里GPS模块可能换了接口UART0可能被别的外设占用了。我处理克隆需求的办法是任何复制过来的需求必须重新验证两个维度——硬件接口是否一致、性能指标是否需要重新评估。并在评审会上把每条克隆需求都标记为“复用”要求相关工程师确认它在新项目中依然成立。7. 一些想对同行说的话做嵌入式需求获取这几年我最大的感受是这份工作看起来入门门槛很低似乎会开会、会记笔记就能做但实际上它非常考验信息整合和沟通转化的能力。你面对的是不同背景的专业人士要能把市场营销的模糊描述转成硬件工程师认可的技术指标要能理解硬件工程师的约束并在软件层面寻求折中方案还要能让客户在验收时认可你写的验收标准就是当初他提的那个模糊想法。这里分享几个经过实战检验的小习惯每次访谈后24小时内写整理纪要因为拖过两天你的记忆就会开始美化当时听到的内容每一条需求都要能在30秒内讲清楚来源和验收方式接口定义表尽量在需求获取早期先搭出一个带空行的框架后面往里面填东西比从零建表容易得多。这些习惯不需要额外工具只需要在每次会议上多留一点整理时间但它能在项目后半段帮你挡掉大量返工和扯皮。需求获取的终极目标不是生成一份漂亮的文档存进共享盘吃灰而是让团队里每个人在开工之前对“我们要做什么、为什么做、做到什么程度”拥有靠谱的一致性认知。做到这一点后续的设计、编码、测试都会顺畅很多。
返回列表