ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MSDV与RNM实践:从需求建模到验证闭环的系统设计工作流

MSDV与RNM实践:从需求建模到验证闭环的系统设计工作流 前阵子帮一个做智能制造的朋友评审设计方案对方团队把几百页的Word需求文档发给各个部门评审结果软件、硬件、测试三个组对同一条需求的解读完全不一致后来在联调阶段才发现问题返工成本非常高。这个场景我想很多做系统设计的人都遇到过。需求文档写得再厚歧义和漏洞还是会在后期集中爆发。后来我接触到了MSDVModel-Based System Design Verification基于模型的系统设计与验证和RNMRequirement Notation Model需求符号模型这套建模验证思路简单说就是——把写文档描述需求变成建模型定义需求再把测试环节才验证提前到设计阶段就验证。这篇文章就来聊一聊我对MSDV与RNM组合使用的一套工作流包括建模的核心思路、验证的具体路径、落地时容易踩的坑以及可以直接参考的执行模板。无论你是系统架构师、需求工程师、测试负责人还是正在做复杂产品研发的项目经理只要团队还在被需求歧义、验证滞后、跨部门扯皮这些问题困扰这套思路都能给你一个看得见摸得着的解法。1. 为什么是MSDV与RNM需求与验证之间那道隐形的鸿沟1.1 传统开发流程中的三张脸问题做过大型系统交付的人都懂一个痛点需求分析、系统设计、测试验证三个阶段往往像是三个不同的人在用三种不同的语言描述同一个系统。需求分析师用自然语言写着系统应能在异常情况下快速恢复架构师在设计中把这个需求理解成了主备切换时间小于5秒测试工程师到了测试阶段又把快速恢复自己定义成了重启服务后1分钟内可用。三个指标完全不同但文档上看起来涵盖的都是同一条需求。这就是典型的三张脸问题——同一件事三个阶段各说各话。这种偏差在传统文档驱动模式下几乎无法避免原因是自然语言本身的多义性。一个快速可以有十种理解一个支持并发到底支持多少并发、什么类型的并发不落到模型上根本说不清楚。1.2 把验证提前才是降本增效的真正杠杆传统流程里验证被放到了开发完成之后。这个顺序在软件领域已经被DevOps的测试左移理念改掉了但在系统级设计领域涉及硬件、逻辑、接口、可靠性多个维度仍然大量存在。MSDV的核心思想就是打破这个顺序既然需求是系统的源头那就从需求阶段开始建模型让验证同步发生。需求模型、系统模型、验证模型形成一条链任何一个设计决策的变更都能立刻传导到验证环节看它是不是破坏了原有的系统属性。这个改变看起来只是流程调整实际效果却是数量级的——很多问题从测试阶段发现后返工变成了设计阶段推演中排除。1.3 RNM到底建模的是什么RNMRequirement Notation Model是这套工作流里我认为最值得琢磨的部分。它不是把自然语言需求简单地翻译成形式化符号而是在需求层面上建立一套结构化的、可计算的表达方式。RNM解决的是三个核心问题需求的结构化把一段段自然语言拆成有唯一标识、有属性、有约束的需求条目。需求之间的关系化需求不是孤立的点它们之间有依赖、冲突、分解、细化等关系。RNM把这些关系显式化形成一张需求网络。需求的可验证性每一条需求都应当能被映射为验证活动或验证指标。如果你的需求连验证方法都定义不出来那这条需求本身就有问题。如果说自然语言需求是给人看的说明书那RNM就是既能给人看又能给工具推演的模型。它直接为后续的系统建模和验证设计提供了可计算输入。2. MSDV整体工作流从需求捕获到验证闭环的五个阶段2.1 阶段一需求捕获与结构化第一步我想强调的不是怎么用工具而是怎么建立团队统一的需求条目意识。我建议的做法是所有需求先进入一个统一的需求条目库每条需求具备以下基本属性唯一标识ID、来源客户原始需求、法规要求、内部标准、优先级必须/应该/可选、状态草稿/已评审/已批准/已实现/已验证、验证方法测试/分析/检查/演示。表格式的需求管理表格在这个阶段非常有效属性说明示例REQ_ID唯一编号全周期不变REQ-SYS-001来源需求出处可追溯客户合同3.2节优先级实现与验证的排序依据必须MUST验证方法规划验证路线提前设计仿真验证当前状态生命周期可追踪已批准这一阶段最容易犯的错误是急着写解决方案。比如系统需采用双机热备方案这句话看似是需求实际已经把设计决策定死了真正应该写的是系统应具备故障自动恢复能力且恢复时间不超过30秒。需求的表述要聚焦系统应该做什么而把怎么做留给设计阶段。RNM建模也是从这个原则开始的。2.2 阶段二RNM需求建模需求条目库就绪后进入RNM建模环节。这是整套工作流中最需要专业判断的一步。我对RNM建模的操作理解可以拆成四个动作需求节点化每条需求都是模型中的一个节点节点挂载属性优先级、类别、来源、验证方法。关系显式化需求之间建立语义关系主要包括分解refine、依赖depend on、冲突conflict、约束constrain四类。这一步把需求文档变成一张有向网络。属性量化对时间、数量、可靠性等指标性需求用范围表达式或阈值约束来表达。验证规划在价值链路中每条叶子需求必须对应一个可执行的验证方法或验证指标。举个例子。原始需求原文是当通信链路中断时系统应在规定时间内恢复这句话没法直接验证需要建模重写为两条结构化需求REQ-SYS-021 类别: 可靠性-恢复性 描述: 当主通信链路中断超过500ms时系统应自动切换到备用通信链路 验证方法: 故障注入仿真中断时长设置500ms/1s/5s三个梯度 验收指标: 切换动作完成时间≤1s业务数据零丢失 REQ-SYS-022 类别: 可靠性-恢复性 描述: 备用链路接管后系统应对外输出与主链路一致的功能接口 依赖: REQ-SYS-021 验证方法: 接口一致性测试 验收指标: 所有接口响应时间偏差10ms经过这样的建模处理需求从一段文字变成了可验证的约束网络。更重要的是如果有人中途改了链路切换的触发阈值依赖这条需求的下游节点在模型里会立刻高亮显示提醒团队评估影响面。2.3 阶段三系统设计与模型集成需求模型建好后进入系统设计模型环节。这个阶段常用的语言是SysMLSystem Modeling Language也可以用基于模型的设计工具如Simulink、Dymola等搭建物理与逻辑模型。我个人体会是这个阶段的核心不是画图而是建立模型元素与需求元素的映射关系。每一级设计模块都应当明确它实现了哪些REQ_ID这样需求-RNM模型-设计模型-验证用例-验证结果整条链才是贯通的。如果发现某个设计模块找不到对应的需求通常有两种解释一是设计人员自作了主张加了多余功能二是需求建模有遗漏。无论哪种情况都是建模验证工作流里值得停下来核查的信号。2.4 阶段四验证设计验证设计在传统流程里是测试团队的工作在MSDV工作流中则需要提前到建模阶段并行开展。验证设计要回答四个问题验证的对象是什么哪个模块哪个属性用什么方法验证模型检查、仿真、测试、分析评审验证的判据是什么阈值、时序、状态转换条件验证的环境怎么搭模型在环、软件在环、硬件在环这些答案直接来源于RNM模型中每条需求的验证方法和验收指标属性。需求建模做得好验证设计的输入就是现成的而不是等到开发完再重新分析。2.5 阶段五验证执行与闭环追踪最后一个阶段是验证执行但我更想说它背后的闭环追踪机制。闭环追踪就是让每条需求都能找到它的验证证据。一张简单的追踪矩阵就能实现需求ID验证用例ID验证结果缺陷/偏差处置状态REQ-SYS-021TC-SIM-013通过-已闭环REQ-SYS-022TC-SIM-014不通过接口抖动超限已返修设计我见过不少团队建模阶段热情高涨到了验证阶段就松懈了结果模型做得再漂亮最后验证结果和模型之间对不上账。这不叫闭环这叫白做模型。闭环追踪必须在项目启动时就设计好而不是最后补填。3. RNM建模的核心操作把一个模糊的需求变成一个可计算的模型3.1 需求拆解与编号模型的骨架RNM建模表面上是在画图做关系实际上第一步是极费耐心的需求拆解。我常用的拆解原则有三个原子性一条需求只表达一个意图不要把系统应支持A功能并兼容B协议这种复合需求放在一起。可测性无论功能需求还是非功能需求都必须给出可测量的指标或可操作的验证方法。非功能需求性能、可靠性、可用性尤其需要量化不能写系统应足够稳定这种话。层次性高层需求下挂分解出的低层需求层次不超过四级超过说明建模粒度失控了。我见过一个项目组把一条系统应具备可扩展性的需求硬生生挂在模型里两年没人处理因为谁也说不清可扩展性到底怎么验证。后来我们把它重构成两条系统应支持在不重启核心服务的前提下增加新的数据采集模块系统新增数据采集模块后原有接口兼容性不降低。建模拆解到这个程度验证设计才有抓手。3.2 需求关系建模从散点图到依赖网络需求条目一旦增多上百条甚至上千条孤立的条目列表其实没有太大意义价值在于条目之间的关系。RNM把关系类型归纳为四种主关系REFINE细化/分解父需求被具体化为子需求。DEPENDS_ON依赖本条需求实现需要等待另一条需求先实现或运行时依赖另一个功能先就绪。CONFLICTS_WITH冲突两条需求在资源、时序或语义上存在冲突需要在设计阶段专门解决。CONSTRAINS约束一条需求限制了另一条需求的实现空间比如系统总功耗不超过50W约束了所有硬件模块的选型。把四种关系建完后模型会自然呈现出一些特征结构一个有向无环图从顶层需求发散到叶子需求再从叶子需求聚合到实现模块。我经常建议团队用拓扑排序的方式检查依赖网络中是否存在循环依赖——真的出现过A依赖B、B依赖C、C依赖A这种在文档里完全发现不了的逻辑死锁。3.3 需求属性的形式化表达RNM与普通需求列表的本质区别在于属性表达的可计算性。这一步需要用形式化语言或结构化约束来描述需求。常用的做法有用OCLObject Constraint Language来描述对象约束用带范围定义的自然语言数值表达定义性能包络用时序逻辑表达定义状态切换规则用正则表达式、协议状态机来定义通信与交互行为举个简单例子描述系统在任何时刻不能同时处于发送和接收冲突状态这一安全约束RNM中的表达可以写成context CommModule inv: not (self.state SendState and self.state ReceiveState)写成这样验证工具就能直接对它做自动化检查而不用等人去读文档再理解一遍再手写测试用例。这也是RNM模式省时省力的根本原因——需求和验证共用了同一份形式化描述。3.4 建模中常见的反模式做了几个项目后我总结了几类RNM建模的常见反模式给各位做参考需求与设计混写模型里既有需求描述又掺了具体实现方案这会让后续变更管理非常痛苦。区分标准很简单——如果这条内容描述的是系统做什么就是需求如果描述的是用什么方式做就是设计。过度建模恨不得把每个细节都形式化结果模型维护成本远超收益。我的建议是对于安全攸关属性安全、可靠性、可用性、跨模块接口和关键时序需求严格执行形式化建模普通功能需求做到结构化描述即可。只建模不复用RNM模型一旦建立就成为团队的核心资产后续迭代应该基于已有模型增量修改而不是每来一个新项目就推倒重来。建模前先查复用库能节省大量时间。4. 验证环节的三条技术路径模型检查、仿真验证与场景测试4.1 模型检查穷举状态空间的数学证明模型检查Model Checking是这三条路径里数学味道最浓的。它的基本原理是把系统模型看作有限状态机把需要验证的属性用时序逻辑如CTL、LTL表达然后用工具去穷举搜索状态空间看是否有违背属性的路径。我记得第一次用一个开源模型检查工具去验证一条安全属性时工具在几秒内遍历了数十万个状态发现了一条极端条件下才会触发的中断响应竞态——这种场景靠人工测试几乎不可能构造出来。模型检查的适用条件是系统的状态空间有限或可抽象为有限且验证属性能够明确表达。它特别适合验证安全属性safety坏事情永远不发生和活性属性liveness好事情最终会发生。缺点是会遇到状态爆炸问题当系统规模增大状态空间指数级膨胀工具内存与耗时都扛不住。实操中需要大量使用抽象技术和化简策略这比较考验验证工程师的功力。4.2 仿真验证带时间属性的动态推演如果说模型检查是数学证明那仿真验证就是带时间轴的实验。RNM建模完成后可以在仿真工具里搭建连续时间/离散事件模型观察系统在不同输入激励下的行为响应并对照需求指标检查是否符合预期。仿真验证我最推荐的做法是参数扫描和边界探测。比如一个指标是以太网通信延迟不超过5ms那么仿真时就要把网络负载从10%逐步加压到90%观察延迟曲线是否始终在5ms包络内。这种逐点逼近边界的方法能高效发现性能劣化拐点。仿真验证和模型检查是互补关系模型检查擅长验证逻辑层面的确定性属性仿真验证擅长评估参数变化下的动态表现。实际项目中对安全攸关属性两种手段我都会用先模型检查排除逻辑死角再仿真验证性能边界。4.3 场景测试把需求翻译成可执行用例场景测试是最接近传统测试的工作但在MSDV体系里它的特点是场景来自于RNM模型而不是来自于测试工程师的灵感。RNM模型里的需求关系网络本身就是场景生成的宝藏。顶层需求下的每一条叶子路径都对应一条可执行的正常场景需求节点上挂的约束属性则是构造异常场景和极限场景的天然材料。团队在建模时就会为每个叶子需求挂好验证场景模板包括前置条件、操作步骤、预期结果、和环境配置。这样到了验证阶段测试工程师不再需要从零分析需求而是从模型里直接抽取用例既快覆盖面又全。4.4 三种路径的适用选择与组合策略我把三种验证路径的适用场景整理成了一张表方便团队快速决策验证路径擅长验证的属性类型主要工具/手段典型适用阶段模型检查逻辑安全、时序逻辑、状态可达性NuSMV、SPIN、UPPAAL设计早期模型还未完全定型仿真验证性能指标、动态行为、参数依赖、边界确认Simulink、Modelica、xSim设计中期参数与架构已基本确认场景测试功能正确性、接口兼容、端到端流程测试框架、测试自动化平台实现后期与回归验证组合策略上我个人的经验法则是安全攸关属性必做模型检查和仿真双保险关键性能指标至少两种验证路径交叉验证普通功能需求场景测试即可。验证的强度要和需求的重要性成比例避免平均用力。5. 工作流落地从建模到验证的完整工具链与协作方式5.1 角色分工与协作方式MSDV|RNM工作流要真正跑起来光靠一两个人掌握建模工具是不够的还需要重新定义团队角色需求建模师负责把原始需求转化为RNM模型维护需求关系网络。这个人不仅要懂业务还要有很强的逻辑抽象能力。系统建模工程师负责搭建系统设计模型维护设计元素与需求元素的映射关系。验证工程师提前介入设计阶段负责编写验证计划、配置验证工具链、执行验证活动。工具链管理员负责维护建模和验证工具的版本一致性、模型库的权限管理、验证环境的持续集成。这四类角色在传统项目里往往散落在各团队甚至一个人要兼任多角。我的建议是中小团队至少要有两个人全职负责建模与验证的闭环管理一个人专门维护模型与需求的映射关系另一个人专职验证执行。这个投入就能有效避免建模与验证两张皮。5.2 工具链选型从开源到商业化的取舍工具链的选择直接决定了工作流能不能真正落地。基于个人经验我推荐以下几套方案工具用途开源方案商业方案选型建议需求管理Polarion、Jama ConnectDOORS Next制式法规项目用DOORS一般项目用PolarionRNM建模draw.io 自定义元模型Enterprise Architect、MagicDrawEA的BP modeling功能比较适合关系建模系统设计PapyrusEclipse开源SysML建模Rhapsody、MagicDraw团队Cameo使用较多模型检查NuSMV、SPIN、UPPAAL-属性验证主力仿真OpenModelicaSimulink、Modelica商业版机电控一体化建议Simulink测试管理TestLink、XrayJIRA Xray、TestRail环境自动化程度不高的用TestLink选型时最重要的是看工具链之间有没有集成缺口。我吃过最惨的亏是需求建模在Polarion里做了系统设计在MagicDraw里做了验证用例在JIRA里写了但三个工具之间的数据没法自动同步每次变更都要人工核对效率反而低于纯文档流程。落地建议是先选定一个主数据源通常是以需求管理工具为权威源其他工具通过插件或接口方式做同步保住需求追溯链不断裂。5.3 管理模型版本与变更控制模型文件不像文档无法简单地通过Word的修订模式来管理。我所在的团队最终形成了这样一套约定模型文件的版本号与需求基线版本绑定每次需求基线变更模型目录打一次标签。任何人在改模型之前必须先从需求管理工具拉最新需求基线确认需求无冲突后再动模型。模型提交时备注信息必须写明改动的REQ_ID范围方便后续追溯。每周执行一次模型-需求-验证用例三项一致性检查做成自动化脚本有断链马上报警。这些东西听着琐碎但恰恰是它们保证了建模工作流在长周期项目里的可持续性。模型一旦乱了所有后续验证的可信度都成问题。6. 我在实际项目中踩过的五个坑与应对方式6.1 坑一建模粒度失控把设计决策混进需求模型我刚开始做RNM建模时总忍不住往模型里塞设计细节。模型里既有系统应支持故障切换这种需求级描述又有采用keepalived实现VIP漂移这种设计级实现。当时觉得都写上更完整后来需求变更直接把模型改崩了——每次设计调整都要牵连需求模型团队反复返工。应对方式很简单在建模工具里把需求模型和设计模型分成两个独立视图两者之间用实现realize关系连接而不是混在一个模型里。需求模型只负责描述系统应该做什么怎么实现是设计模型的事。这个原则坚持住后需求变更和设计变更就能并行维护互不干扰。6.2 坑二验证覆盖率虚高数字好看但质量没保障覆盖率是验证工作最核心的度量之一但也是最容易自欺欺人的数字。行业里最典型的做法是只追求需求覆盖率——所有REQ_ID都有对应用例矩阵好看但一个安全隐患都没排查出来。我现在的观点是必须看多层覆盖率需求覆盖率之外还要看RNM模型中的关系覆盖率每条依赖/约束关系至少被一个用例覆盖、仿真中的分支/路径覆盖率自动仿真工具可以统计、异常场景覆盖率每个边界条件至少有一个反例验证。这几个维度全部对齐后验证质量才有参考价值。6.3 坑三模型检查工具的输出看不懂验证结果悬空模型检查器报Property is not satisfied时往往会输出一条违反属性的反例路径但反例路径往往长达几十个状态人很难直接看懂问题出在哪一步。我花了很久才意识到问题并不在工具而在建模抽象系统模型状态粒度太细反例路径才显得冗长难懂。后来学了一招适当降低状态模型的细节层级——把不相关模块合并为一个抽象节点只保留验证属性涉及的关键变量——反例路径一下子就短了定位问题也快了一个数量级。建模抽象是模型检查里最考功夫的环节值得花时间打磨。6.4 坑四需求回溯关系断裂变更影响分析失效项目中期有一次客户改变了某条顶层需求团队按流程在需求模型里改了需求描述但没及时推送关联的系统设计模块和验证用例。后来测试阶段测出来的结果跟新需求对不上团队浪费了整整两周去排查是代码问题还是用例问题还是需求问题。那次之后我把需求变更影响分析做成了强制的流程节点任何REQ_ID的状态变为已变更时工作流引擎自动向所有与该REQ_ID存在映射关系的模块负责人推送影响分析任务必须在24小时内回复是否受影响、是否需要修改设计或验证用例。这个机制能有效防止回溯断链。6.5 坑五团队对模型的抵触情绪工作流推进受阻最后这个坑不是技术问题而是人的问题。建模和验证流程初期团队很多成员觉得以前写文档也挺好现在学新工具还要改流程太累了。强行推进的结果是模型维护流于形式实际工作还是老一套。我的应对经验是不要一开始就追求全量建模而是挑一个试点模块完整跑一遍MSDV|RNM流程让团队亲眼看到模型检查发现了一个隐藏很久的安全隐患或者在需求变更时几分钟就完成了影响分析。有了这么一次看得见的好处抵触情绪自然就消退了。改变工作流是一场组织变革技术的合理性只是必要条件让团队感受到实际收益才是充分条件。7. 可以直接抄走的落地模板一份MSDV-RNM工作流的启动检查清单如果你所在团队正准备引入这套工作流可以先按下面这份检查清单评估现状需求基础准备[ ] 是否已建立需求条目库每条需求有唯一ID和属性字段[ ] 是否已定义需求优先级规则必须/应该/可选[ ] 每条需求是否已指定验证方法测试/分析/演示/检查建模启动条件[ ] 是否已完成顶层需求的分解至少到达原子可测粒度[ ] 需求之间的四种关系细化/依赖/冲突/约束是否已显式建模[ ] 是否已有需求模型与设计模型的独立视图划分验证设计准备[ ] 每条叶子需求是否已确定验收指标量化数值或可判定的逻辑条件[ ] 安全攸关属性是否已设计模型检查方案[ ] 关键性能指标是否已设计仿真参数边界方案工具链与协作[ ] 需求管理、RNM建模、系统建模、验证执行四类工具是否已打通数据链路[ ] 是否指定了建模与验证的负责人[ ] 是否配置了模型-需求-验证用例一致性自动检查脚本[ ] 是否定义了需求变更时的影响分析触发机制追溯管理[ ] 是否建立了需求追踪矩阵模板[ ] 是否每个REQ_ID在验证执行后都能查找到对应的验证证据这份清单不是我坐在书桌前空想出来的而是几个项目反复磨合后收敛出来的核心节点。从我的经验看这十几项如果能在项目启动的第一周全部就位后面整个建模与验证周期的运行就会顺畅很多反之任何一项缺失都会在项目后期以各种形式找补回来而且找补成本往往令人痛苦。很多团队一听说MSDV和RNM就觉得门槛高、工具贵、周期长但真正落地之后其实会发现它最大的价值并不是一步到位地把所有需求都形式化而是在需求和验证之间建立一条贯穿始终的追溯链。有了这条链需求变更不再像炸弹一样每次都在测试阶段引爆设计决策有了可验证的依据团队跨部门协作也能聚焦在具体的REQ_ID上而不是争论你那句话到底是什么意思。这套工作流本质上是在为团队的共识管理建一条工程化的高速公路一旦跑起来生产的效率不是线性提升而是跨一个台阶。
返回列表