TMS BOOK · ACADEMY 讲义

软件定义热管理与 OTA 迭代

大纲的完整展开版——讲师授课蓝本 / 学员自学材料

K7-02 软件定义热管理与 OTA 迭代

课程代码 K7-02 · 板块 K 控制、软件与标定 / K7 智能与软件定义 时长 约 3.5 小时(8 讲 + 1 次 OTA 发布方案实操) 适合对象 控制 / 系统 / 软件工程师,尤其是做 OTA 平台、软件架构与发布管理的岗位(选修,建议先有嵌入式软件与版本管理基础) 前置 K2-04 网络安全与 OTA 安全基础 网络安全与 OTA 安全基础;K4-04 软件版本、配置与变量管理 软件版本、配置与变量管理 本讲义定位 讲师授课蓝本 / 学员自学讲义,是 K7-02 大纲的完整展开版


引言:能不能发,判据是「错了收不收得回来」;发出去了,「这一版更好」是要证的

一台车 SOP 半年之后,某个工况下压缩机启停过频,噪声投诉在一段时间里集中起来。硬件动不了——模具早已冻结、产线在跑、售后件的库存也在那儿摆着;能动的只有软件,而且只要改几个标定数值就够。包很小,改动看起来也小,方案在发布评审会上却卡住了。会上最常见的讨论方式,是围着「这个改动大不大」打转:改了几个标定量、动没动代码路径、包有多大、要刷多久。⛔ 这条线索从第一步就问错了——它问的是改动的体积,而发布这件事要问的是改动的属性。真正要答的是另外三问:这条改动如果错了,我按什么路径、多长时间、能把车恢复到改之前那个状态?这一版凭什么说它更好,那份证据现在还取得到吗?谁有权对这次下发说不,那几道闸有没有哪一道没过?大纲给的那个案例正是这么走完的:放量途中某一批因边界参数设置不当触发了过热保护误报,靠回滚及时止损,没有扩到全量车队。⚠ 而救了这一批的不是本次要改善的噪声指标,是保护动作的触发率——一个谁也没打算去改的量(第 6 讲会把这条决策链整条拆开)。这门课要建的,就是让上面那三问在评审会上能被当场答出来的判据链。

这是一门发布工程课。它的输入是一个已经开发完、已经过发布前回归的软件变更,形态可以是一组标定数值、一段可执行代码、一份配置件、一个学出来的模型,或者一段数据结构迁移逻辑;它的输出只有一样,就是一份可交付的发布方案,里面固定是四件:权限档位(这个下发项落哪一档、要谁批)· 灰度序列(分几批、每批看什么、观察窗多长)· 回滚门限(越过哪条线、持续多久、谁按什么权限执行)· 证据方案(用什么数据、多少台车、证到多大的效应量,以及为此要随包下发哪些采集配置)。射程要收得这么窄,是因为 OTA 这个词底下压着至少四个工种(安全、合规、算法、发布),把它们混在一门课里讲,结果必然是每一样都只讲到名词层;而发布工程恰恰是那个没有专门课、却每次上线都要做的一段。所以本课不做下面这些事,只给类型与去向:网络安全机制与威胁分析(K2-04 网络安全与 OTA 安全基础)· 合规准入判定与备案 / 召回办理(M4-08 车用软件更新的准入与合规(R155/R156·GB 44495/44496·OTA 备案与召回))· 数据驱动算法与影子模式评估(K7-03 数据驱动的能效自学习控制)· 车端采集实现与带宽存储预算(K7-04 车队数据回流的车端实现:信号表定义、事件抓帧与带宽/存储预算)· 回归基线与用例裁剪方法(K4-08 控制软件回归验证:基线与激励库、回归范围裁剪、自动执行与失败分诊)· 跨企业责任划分与联合签署(K4-09 热管理控制软件的跨企业交付边界:交付物形态、DIA/SEooC、权限分级与联合验证签署)· 控制器非易失存储设计本体(K4-06 控制器非易失存储设计:学习值、诊断数据与累计量的持久化)· 保护阈值该收紧还是放宽的判据(K5-07 诊断与保护阈值的整定、验证与复验)· 功能安全定级与条款(K2-03 功能安全(ISO 26262)在热管理中的应用)· 预期功能安全与 AI 件的安全论证方法(K2-05 预期功能安全(SOTIF/ISO 21448)与 AI 件安全论证在热管理的落法)· 工况与场景标志位定义(K3-13 模式表/场景表与仲裁规则的静态体检:可达性、死锁与切换质量)。⛔ 凡射程外的,本课一律不给限值、不给等级号、不给条款内容;引用到的标准也只写标准号与它管什么,⚠ 版次与年份以现行目录为准、引用前须核(第 4 讲逐个交代五个标准各自的用法边界)。⚠ 但「本课不讲」⛔ 不等于「不重要」——上面每一门都是硬前置或硬接口,一份发布方案缺了其中任何一条,签字那一栏就填不满。

软件定义这四个字在本课里有一个可检查的落点,不是口号:它指的是同一套硬件能不能只靠软件差异化出不同车型与工况的策略,而解耦真正发生在三层——硬件能力集 / 能力抽象与描述层 / 策略与标定层。判据一问:换一个变型(少一个电子水阀、风扇换供应商),上层策略要不要改代码?要改就是没解耦。解耦换来的是「改策略不必等下一次改款」,而它同时带来一条不对称把改动送到车上这件事变得极便宜,而证明这个改动是对的,成本几乎没变——该跑的回归还得跑,该做的变更评审还得做,该采的车队数据还得采(⛔ 两侧的周期都是平台相关量,本课不给数,因而也⛔ 不做「快多少倍」这类比较)。本课所有的闸——回归门禁、权限分级、灰度门限、证据前置——都是在人为地把送达那一侧的成本加回来。⚠ 结论⛔ 不是「所以要少发版」,而是「要把验证做成流水线上的机制」(第 6 讲)。

学完这门课,你要能对手上任意一个「想远程改一改」的对象当场答出三件事。第一件是判它该不该走这条路:本课自建一组入口三问(★ 本课归纳,⛔ 不是既有判据)——能不能靠软件解决 / 错了能不能收回来 / 收益能不能证明;三问任何一问为否,OTA 就不是这个问题的答案。⚠ 它是不是:⛔ 不许给三问打分再加权求和,那会把「有一问为否」这个否决关系稀释成「总分够高就行」。第二件是判它该怎么发:先认清这次下发的到底是哪一类对象,再定它落在可逆性的哪一层,由此推出走哪一档权限、过哪几道闸、分几批放量、门限写成什么样;⚠ 参数锁定分级表的每一行至少三列(权限等级 / 变更审批级别 / 回滚可逆性),而第三列是实践中最常被整列漏掉的一列。第三件是判凭什么说它更好:用配对还是两独立组、标准差取哪一个、要检出的最小差异由谁定、要多少台,以及为了让这些数真算得出来,哪些信号必须随灰度包一起装上车。三件事分别落在第 1 讲、第 2~6 讲与第 7 讲,第 8 讲把它们放回组织协同与版本管理的现实里收口。

钉子 1:OTA 的准入判据是可逆性,不是改动大小。而「可逆」在车上不是一件事,是逐层变弱的三层第一层是可执行代码:A/B 双分区能把它整体回退,秒级、可自动、可无人值守——这是三层里唯一一层,「回滚」这个词的日常含义完全成立。第二层是车端持久化数据(标定的非易失存储、自适应与学习值、诊断历史与累计量):它不随分区切换回退,只有两条必须专门写出来的路径能救——反向迁移(要专门开发、要单独验证)与清除重学(要停机或接受一段重新学习期);两条都没有,就等于这次下发实际上不可回滚。第三层是已经发生的物理与用户侧后果:一次过热保护误报导致的停机、一次投诉、一次里程损失——任何机制都收不回来。三层的强弱顺序是确定的,⛔ 但每一层各自要花多少时间、多少代价是平台相关量,本课不给数。★ 这三层只是骨架,第 3 讲会把它补成本课归纳的五层全集(另两格是:随包下发的标定数值一旦被车端自适应改写过,回的只是初值、实际生效值掉进第二层;以及已下发但尚未收回的对外授权)。由钉子 1 直接推出本课两件强制交付物:分级表里必须有「回滚可逆性」这一列(第 4 讲),灰度放量的比例本质上是最外那一层(已经发生的物理与用户侧后果,即五层全集的第⑤层)敞口的上限而不是「试试看」的比例(第 6 讲)。⚠ 反过来说同样成立:一条落在第一层、值域可枚举、错了几秒内能整体回的改动,哪怕它重构了几千行,也不该被当成大事拖到下一次改款——把可逆的东西按不可逆的流程办,是软件定义白做了。

钉子 2:「这一版更好」是要证的,不是要看的;而证据能力必须在下发之前就装上车。一次 OTA 迭代的交付物有两个,缺一个这次迭代就不成立:一个是改了什么(升级包),一个是凭什么说它更好(证据)。证据这一侧有一个物理性质——它不可追补:车一旦升上去,这台车升级前那一段基线数据不会再有第二次;采集配置没随包下发,这一批灰度车上就永远没有那路信号。三个落点少一个,这一版的结论就永远补不回来。① 样本量的计数单位是「车」,不是「行程」——车队数据是聚类 / 重复测量结构,同一台车的多次行程之间强相关,车间差异与驾驶员、路线差异通常远大于车内差异;把行程数直接当样本量会把有效样本量虚高,⚠ 虚高的倍数是设计效应 DEFF = 1 + (m − 1)·ICC(m 为每台车的行程数、ICC 为组内相关系数)。★ 设计效应是抽样统计学的既有关系式,本课把它引入进来把那句断言换成一个能算的数,⛔ 它不是本课发明;而它的取值要由本项目自己的回流数据算,⛔ 不是一个固定倍数。② 样本量公式必须含功效项 z_β——流传很广的那条单组区间估计写法漏掉了它,在两独立组设计下(显著性水平取 0.05 双侧)会把所需样本量低估 2.0 / 4.1 / 5.5 倍(分别对应功效 50% / 80% / 90%,纯数学结果,第 7 讲逐点复算给出);⚠ 这三个数只对两独立组成立,同车前后配对设计对应的是 1.0 / 2.0 / 2.7(本课复算补出),⛔ 两组不得互套。③ 要证的结论所需信号、采样率与触发条件,必须随灰度包一起下发采集配置——样本量公式决定的是「要多少台车」,采集口径决定的是「每台车上到底算不算得出这个指标」,两者缺一都证不出结论。

两根钉子合起来是一句话:OTA 的准入判据是「错了收不收得回来」,而「这一版更好」是要证的——证据能力必须在下发之前就装上车。钉子 1 管的是敢不敢发,钉子 2 管的是发完之后这次迭代算不算数。全课每一讲的收口都要回到这两句上。

★ 还有一句话是本课最容易被读反的,先在这里点破:「A/B 双分区把回滚做成了原子操作,所以回滚执行成功,就等于这台车回到了升级前的状态。」这句话听起来完全正确,而且它的来源是一个真正正确的机制——A/B 双分区刷写(写备用分区 → 校验 → 切换启动分区,失败则留在原分区)在可执行代码这一侧确实是原子的:中间任何时刻断电、丢信号,车要么是完整的新版、要么是完整的旧版,不会变砖。危险恰恰来自这里:正因为这一层设计得足够干净、足够可信,读者会不假思索地把它的语义外推到整台车。这不是不懂,是把一个在某一层上成立的保证,搬到了它管不到的层上。在整车这一层它不成立:分区切换搬运的只有可执行代码映像,而标定的非易失存储、自适应与学习值、诊断历史与累计量按地址持久化在同一片存储上,还可能已经被新版本执行过一次数据块布局迁移——它们不随分区切换回退。于是回滚之后的典型现场是:版本号已经显示回到旧版,行为却仍然是新版的

说不出「读者会做错的那个具体动作」就不算点破,所以把三个方向写清楚。方向 A(回滚预案只写「切回原分区」,最常见):预案写到「刷写失败或指标越线则回滚到原分区」就收工,⛔ 不定义数据块的反向迁移路径,也⛔ 不定义自适应与学习值的清除与重学策略;现场表现是回滚执行成功、故障依旧。这一条最坏的地方在于它看起来是做过预案的,评审会上过得去。方向 B(排查方向整类做反,代价最大):因为版本号显示的是旧版,工程师判定「这不是这一版的问题」,于是把排查方向转向硬件、工况、单车差异——真因(数据侧)整类不在搜索范围内;它不是让排查变慢,是让搜索空间里根本没有正确答案。方向 C(分级表漏掉「回滚可逆性」这一列):表里只填了权限等级与审批级别,默认「反正能回滚」,于是把一个实际上只能清除重学、甚至不可回退的下发项,按可回退项放行进了快速灰度;等灰度出问题要止损时才发现止损路径不存在当场自检只有一问(第 3 讲与第 4 讲会各出现一次,写方案时逐次代进去):这次下发有没有改到任何持久化数据的结构、含义或取值?只要有,回滚预案就必须另有一条数据侧路径,⛔ 不许只写切分区。⚠ 本课另有三处同型的读反,不做钉子,但会在各自那一讲被点破:差分包的大小与源码改动量之间到底是什么关系(第 2 讲)· 灰度在发布链上究竟算验证手段还是敞口控制手段(第 6 讲)· 显著性检验不显著时到底能读出什么结论(第 7 讲)——三处的正解都留在那一讲里给,⛔ 这里不预先塞一个顺口的说法进你脑子。

最后是全课的读法约定,先立后用:本课有三组同名不同义的量,⛔ 正文与图上一律不裸写。「A/B」有两义——A/B 双分区是车端两个存储分区,属刷写与回滚机制(第 3 讲);A/B 对照评估是灰度组与对照组的对照实验,属统计判断(第 7 讲)。两者毫无关系,全课一律写全称,⛔ 禁止出现裸的「A/B」。② 「p」有两义——放量比例 p_ramp(无量纲,第 6 讲)与显著性 p 值(无量纲,第 7 讲),全课分别写「放量比例」与「p 值」,⛔ 禁止裸写;⚠ 它们真的会在同一份发布方案里相邻出现,那时读者会按同一列去比大小。③ 「σ」有三义——σ_total(总标准差,含车间差异,★ 代进样本量公式是错误用法)· σ_within(组内标准差=车级聚合成一个值之后、同一组内各台车之间的标准差,两独立组设计要用的)· σ_d(同车配对差的标准差,配对设计要用的);三者全课带下标写,⛔ 正文禁止裸写。⚠ 有车间差异时 σ_total 大于 σ_within 是恒成立的方向性结论(方差分解),⛔ 但两者的比值是平台相关量,本课不给数。这三组不是「名字像」而已:它们在同一门课里相隔一到两讲出现,代错一个,样本量会整体算错,而且错的方向不定——你甚至不知道自己是算多了还是算少了。

全课八讲就按这条主干排。第 1 讲把地基立起来:解耦到底解在哪一层、从「固化标定表」到「可迭代软件资产」真正变的是责任与证据的持续性、解耦换来的四项代价各自在后面哪一讲被对付(其中现场版本离散是稳态不是过渡态),并把入口三问与上面三组撞名的量钉死。第 2 讲讲链路与包形态:云端下发 → 车端接收 → 刷写 → 生效四个环节各自的失败形态与责任段,「生效」为什么不等于「刷完」以及「部分生效」这个真实存在的中间状态,本课归纳的下发对象五类全集(流行的「标定还是代码」二分法会一次漏掉配置件、学到的模型、数据迁移逻辑三整类,而这三类的回滚恰恰最难),限幅式 K_new = clip(K_old + ΔK_ota, K_min, K_max) 挡得住什么、⛔ 挡不住什么,以及差分包的大小到底由什么决定。第 3 讲是钉子 1 的主场:A/B 双分区的时序与它唯一的那个原子点、上面那条反钉子、数据侧回滚的两条路径、可逆性随时间单调衰减,以及刷写窗口必须写成准入条件的那一整套热安全约束——刷写期间压缩机、水泵、风扇按什么状态运行,阀停在哪个默认位,尤其是热监控由谁接管这一行(域控自己正在刷写,写不出接管方就等于这段时间降级到硬件保护,而这句话必须显式成表的一行,⛔ 不许留成默认)。第 4 讲把授权收口:分级表三列怎么填、权限定档的两问判据、功能安全变更评审为什么与快速灰度天然冲突、网络安全在这里只管「这个包是不是我发的」而⛔ 不管「这个包该不该发」、防回滚与要求回退这对方向相反的要求怎么靠授权回退共存、留痕的最小字段集与它的两个消费者、监管三档怎么挂进发布流程,最后合成本课归纳的七道「说不」——它们是串联的合取,任一不过就不下发。第 5 讲换一类下发对象:当发出去的是学到的模型而不是一组数值,它既不像标定那样值域可枚举、也不像代码那样路径可审查,于是验收要多三项,其中「只回代码不回模型」会留下悬空可信域这个全程不报错的失效。第 6 讲讲灰度:门禁链怎么做成机制而不是靠人记得别点发布、放量比例怎么被两侧夹逼出来、观察窗按暴露机制定、回滚门限的四要素为什么必须在放量之前写死,以及本课归纳的六类观察指标全集(其中数据回流健康度衡量的不是车,是证据链),最后用开头那个压缩机启停的案例走完一遍决策链。第 7 讲是钉子 2 的主场:台架与实验室给不出的四类差异、车队数据的真实结构、样本量公式的完整形式与一次可手算的算例、采集配置为什么必须随包先行,收在本课归纳的七类假结论全集上——结论是从哪一步开始变假的,比统计方法本身更值得逐条核。第 8 讲回到现实:软件迭代节奏与硬件冻结点的错配、本课把三维兼容矩阵补到五维、OTA 与诊断和标定版本管理的三处联动、责任分段与签署点。最后收在动手做上——你要交出三件东西:红线判断依据表 · 分批比例与门限表 · 证据方案(含采集配置清单);这三件凑齐了,才叫一份能签字的 OTA 发布方案,而它们正好把两根钉子各验一遍。


第 1 讲 软件定义只把「送达」变便宜了,⛔ 没把「证明」变便宜

这一讲不讲任何一段 OTA 的技术实现——云端怎么下发、车端怎么刷写、包怎么切分、失败了怎么回,全部是第 2 讲往后的事。这一讲做的是动手之前的六件事:把本课的输入、输出与射程画死把「软件定义」这句口号拆成一条可当场执行的解耦判据,并落到究竟是哪三层在解耦把「SOP 不再是终点」推到它真正的后果上——变的不是技术能力,是责任与证据的持续性把 OTA 相对传统改款的差别还原成一处成本不对称,本课后面每一道闸都是从这处不对称里长出来的;把解耦换来的四项代价点名,尤其是最容易被整项漏掉的第四项;最后立两样全课都要用的东西——三组同名不同义的量的读法约定,和一张三问的入口卡片。

这些看起来像开场白,其实后面七讲吃的全是这一讲钉下来的口径。射程一旦画不清,写发布方案的人就会在签名算法与备案流程上耗掉大半篇幅,而真正要交的四样东西一样都没出来;解耦停在「把常数抽成标定量」这一层,第 8 讲的兼容矩阵就注定要按变型逐个铺开;三组撞名的量不在第一讲分开,读者到第 6、第 7 讲会把两个 p 放进同一列比大小、把 σ_total 代进样本量式子——那是本课最贵的一个错,因为它不报错,只是安静地把结论算歪。所以顺序是先立口径,再谈链路。

1.1 这门课交付的是四样具体东西:权限档、灰度序列、回滚门限、证据方案

是什么。本课的输入是一个已经开发完、已经过回归的软件变更——它可能是一组标定数值、一份可执行代码、一个配置件,也可能是一个学出来的模型。它此刻在开发环境里是好的,问题只剩一个:它该不该发到车上去,怎么发。本课的输出是一份可交付的发布方案,里面恰好四样东西:

  • 权限档位——这次下发的每一项落在哪一档(可远程改 / 需授权工具 / 产线锁定),审批走到哪一级,回滚可逆性是哪一类(第 4 讲);
  • 灰度序列——分几批、每批的比例按什么夹逼出来、每批观察什么、观察多久(第 6 讲);
  • 回滚门限——哪个指标、越过哪条线、持续多久、谁有权按下(第 6 讲);
  • 证据方案——用什么设计、多少台车、要检出多小的差异、以及随包一起下发的采集配置清单(第 7 讲)。

⇒ 一句话:这是一门发布工程课,⛔ 不是 OTA 安全课、⛔ 不是合规准入课、⛔ 不是数据驱动算法课。

为什么这句要写在第一句。「OTA」这个词底下压着至少四个工种:网络安全、法规准入、数据驱动算法、发布工程。把它们混在一门课里讲,结果是每一样都只讲到名词层——签名讲到「要签名」、备案讲到「要备案」、统计讲到「要有显著性」,读者听完仍然写不出一份能签字的发布方案。而发布工程恰恰是每次上线都要做、却最容易没有专人负责的那一段:安全有安全的人,法规有法规的人,算法有算法的人,而「这一版到底能不能发、怎么止损」经常是发布当天临时拉会决定的。

射程外的十一件事,本课只给去向,⛔ 不给限值、不给等级号、不给条款内容。它们是:网络安全机制与 TARA(K2-04 网络安全与 OTA 安全基础)· 合规准入判定与备案/召回办理(M4-08 车用软件更新的准入与合规(R155/R156·GB 44495/44496·OTA 备案与召回))· 数据驱动算法与影子模式评估(K7-03 数据驱动的能效自学习控制)· 车端采集实现与带宽存储预算(K7-04 车队数据回流的车端实现:信号表定义、事件抓帧与带宽/存储预算)· 回归基线与用例裁剪方法(K4-08 控制软件回归验证:基线与激励库、回归范围裁剪、自动执行与失败分诊)· 跨企业 DIA 与责任划分(K4-09 热管理控制软件的跨企业交付边界:交付物形态、DIA/SEooC、权限分级与联合验证签署)· 非易失存储持久化设计本体(K4-06 控制器非易失存储设计:学习值、诊断数据与累计量的持久化)· 阈值该收紧还是放宽的判据(K5-07 诊断与保护阈值的整定、验证与复验)· 功能安全定级与条款(K2-03 功能安全(ISO 26262)在热管理中的应用)· 预期功能安全与 AI 件安全论证方法(K2-05 预期功能安全(SOTIF/ISO 21448)与 AI 件安全论证在热管理的落法)· 工况与场景标志位定义(K3-13 模式表/场景表与仲裁规则的静态体检:可达性、死锁与切换质量)。

图1 本课射程与十一门邻课的接口关系。中央一个主蓝实心框,标题为本课:发布工程,框内四行独立文字标签:判权限档、排灰度序列、定回滚门限、设证据方案。主蓝框外围一圈灰底虚线框,每框一个独立文字标签与去向课号:网络安全机制与 TARA 去 K2-04;合规准入判定与备案召回去 M4-08;数据驱动算法与影子模式评估去 K7-03;车端采集实现与带宽存储预算去 K7-04;回归基线与用例裁剪去 K4-08;跨企业 DIA 与责任划分去 K4-09;非易失存储持久化设计本体去 K4-06;阈值收紧放宽的判据去 K5-07;功能安全定级与条款去 K2-03;预期功能安全与 AI 安全论证去 K2-05;场景标志位定义去 K3-13。每条从中央框到外围框的连线上标一个词,写明本课与它交换的是什么,例如包的真实性由它保证、三档判定结论、可信域声明。左下角一个橙色小框写本课的入口三问。本图为定性结构示意,不代表任何平台的实际值,框的大小、位置与距离不代表任何重要性、工作量或先后顺序,⛔ 不得据图读取任何数值、尺寸或位置关系。
图1 该从图上读出的判断有三条:① 本课的交付物是四样具体东西(权限档 / 灰度序列 / 回滚门限 / 证据方案),⛔ 不是「讲一讲 OTA」;② 外围十一个框不是「不重要」,是判据源在别处——图上只给去向,⛔ 没有给任何限值、等级号与条款内容;③ 连线上的那个词说明本课与每门邻课交换的是什么,写发布方案时据此知道该去哪一门取输入、把哪一段的结论当作外部输入原样收下。⚠ 本图画的是课程射程的划分,⛔ 不是系统架构图也不是流程图。本图为定性结构示意,不代表任何平台的实际值,框的大小、位置与距离不代表任何重要性、工作量或先后顺序,⛔ 不得据图读取任何数值、尺寸或位置关系。

两个易错点。① 把这门课当成「怎么把包推到车上」的技术实现课——链路只占第 2 讲一讲,本课的重量全在第 3~7 讲的判据上;② 以为射程外就等于不重要,恰恰相反:那十一门课里有几门是硬前置或硬接口,写方案时缺任何一条,方案都签不下来。本课不重讲它们,是因为在那边讲得更准,⛔ 不是因为可以不管。

1.2 解耦真正发生在中间那一层,⛔ 不是「把常数抽成标定量」

是什么。「软件定义热管理」这句话有一条可当场执行的判据:同一套硬件,能不能只靠软件差异化出不同车型与不同工况下的策略?能,才叫软件定义;不能,那只是「有个能远程改参数的接口」。而这件事真正发生在三层上(★ 这三层的划分是本课归纳的,⛔ 不是某项标准或某份既有规程里的既有分层):

  • 硬件能力集——压缩机排量与转速范围、泵与风扇的特性、阀型与开度分辨率、加热器功率、传感器配置。这一层只能靠改款或换件改变。
  • 能力抽象与描述层——把上面每一样翻译成「能做到什么、多快、边界在哪」的接口描述:转速可用区间、开度分辨率、响应时间、保护边界。上层只按这个描述下达意图。
  • 策略与标定层——模式仲裁、目标值生成、标定表。这一层是最常被改的一层。

判据一问,可以当场执行:换一个变型(少一个电子水阀、风扇换了供应商、加热器功率变了一档),上层策略要不要改代码?要改,就是没解耦。

为什么这一层是分界。没有中间那层抽象,OTA 就只能改「参数」不能改「策略」——因为策略里写死了具体硬件的假设(这个阀有几个位、这个泵最低能转到多少)。一旦硬件变型多起来,每个变型就要一套代码,兼容矩阵按乘法长(第 8 讲会看到这条不对称:变型按乘法增长,验证资源按加法增长)。⚠ 这里要格外注意逻辑分层与软件架构分层不是一回事——本讲说的是「谁描述能力、谁下达意图」这条逻辑分界,⛔ 不要与基础软件/运行时环境/应用软件那套架构分层对号入座,两者的切法不同。

图2 硬件能力与控制逻辑解耦的三层结构。自下而上三条横带,各带独立文字标签。最下一带为硬件能力集,内含压缩机排量与转速范围、泵与风扇特性、阀型与开度分辨率、加热器功率、传感器配置。中间一带为能力抽象与描述层,内容是把下层每一样翻译成能做到什么、多快、边界在哪的接口描述。最上一带为策略与标定层,内含模式仲裁、目标值生成、标定表。右侧一条竖向色带标注每层的可改方式:硬件能力集为改款或换件,用灰色;能力抽象层为代码 OTA,用主蓝;策略与标定层为标定 OTA 或代码 OTA,用青绿。左侧一支橙色箭头从上层指向下层,标注策略只下达意图;一支反向箭头标注下层只上报能力与实际值。图右下角一个判据框写着:换一个变型,上层策略要不要改代码,要改就是没解耦。图上以青绿虚框与图例标明三层划分与该判据为本课归纳。本图为定性结构示意,不代表任何平台的实际分层与实际值,⛔ 不得据图读取任何数值或层厚。
图2 该从图上读出的判断有三条:① 解耦不是「把常数抽成标定量」——那只动了最上面一层,真正的分界在中间那条能力抽象带;② 三层各自的「可改方式」不同(改款换件 / 代码 OTA / 标定或代码 OTA),这正是第 4 讲参数锁定分级的物理基础,⛔ 分级不是按重要性拍的,是按这三层落位来的;③ 右下角那一问是可以当场执行的判据,⛔ 不是定性形容——拿手上任何一个变型代进去,答案是唯一的。⚠ 本图画的是逻辑分层,⛔ 不是软件架构分层,两者⛔ 不得互相对号入座;也⛔ 不是任务调度层次。三层划分与那一问的判据为本课归纳。本图为定性结构示意,不代表任何平台的实际分层与实际值,⛔ 不得据图读取任何数值或层厚。

工程量级。解耦的收益体现在变型数与软件版本数的比值上——一套软件覆盖越多变型,收益越大。⛔ 这个比值是平台相关量,本课不给数,须由本项目自己统计。

两个易错点。① 把「参数化」当成「解耦」——把几个常数抽成标定量,确实让它们可以远程改了,但硬件假设仍然写在策略里,换个变型照样要改代码;② 以为解耦是软件一侧的事——它真正的前提是硬件侧先给出稳定的能力描述,这是一份硬件与软件要一起签的接口,谁给、什么时候给、变更怎么走,去向 K4-09 热管理控制软件的跨企业交付边界:交付物形态、DIA/SEooC、权限分级与联合验证签署

1.3 SOP 不再是终点:变的不是技术能力,是责任与证据的持续性

是什么。过去一台车出厂,软件就冻结了;出厂那一刻的验证证据,就是这台车终身的证据。现在不是了——每一次 OTA 都在重新定义这台车是什么。于是每一次都要重新出一份证据,而且这份证据要能追溯到具体哪些车、什么时候生效。「控制策略从固化标定表变成可迭代软件资产」这句话,真正变掉的不是技术能力(远程改一个数在技术上从来不难),而是责任与证据的持续性:产品在整个生命周期里都处于「可被改变」的状态,那么它在整个生命周期里也就都处于「需要被证明」的状态。

为什么这条要在第 1 讲就说。因为它直接决定了后面两件事的性质:第 4 讲的留痕字段集与第 7 讲的证据方案——这两样常被当成官僚要求,实际上它们是「产品可变」这个前提的必然结果。产品可变,就必须回答得出「此刻这台车是哪一版、那一版是谁批的、影响了哪些车」;答不出来,就等于承认这台车已经没有一个说得清的技术状态。

工程量级。一次发布要留的最小字段集是可枚举的——改了什么、谁批准的、影响范围、发给了哪些车、何时生效、回滚记录,第 4 讲给全。⛔ 而留痕的保存期限与向外报送的口径是平台与法规相关量,本课不给数、也不给判定规则,去向 M4-08 车用软件更新的准入与合规(R155/R156·GB 44495/44496·OTA 备案与召回)

两个易错点。① 只把 OTA 当成「省下一次召回」的省钱手段,于是不给它配证据体系——省下的那笔钱是一次性的,而证据体系是持续的,前者不能买断后者;② 把「软件资产」理解成代码仓库里的东西。车队上真正的资产是「哪台车此刻跑的是哪一版」这张表——它不在仓库里,它在云端与车端两处,而且两处会不一致(第 8 讲会把不一致的来路一条条列出来)。

1.4 那处不对称:送达成本塌了下来,证明成本几乎没动

是什么。OTA 与传统改款的真正差别,不是「能不能改」——传统改款也能改,只是慢。差别是这一句:

把改动送到车上的成本,从改款周期降到了发布周期;而证明这个改动是对的的成本,几乎没有同比例下降。

送达那一侧塌了:不用等模具、不用等产线切换、不用等售后进厂。证明那一侧没有:该跑的回归还得跑,该做的功能安全变更评审还得做,该采的车队数据还得采,该等的观察窗还得等。⚠ 改款周期与发布周期都是平台相关量,本课⛔ 不给数;两个都不给单点值的量之间,⛔ 也不做倍数比较——所以这里给的只有方向性结论:送达成本大幅下降,验证成本基本不变。

为什么这处不对称是一切失控的入口。当送达变得极便宜,而验证仍然贵,人的默认动作就会漂到「先发出去试试」那一侧——不是因为谁不专业,是因为两侧的成本差距在推着人走。⇒ 本课后面所有的闸(发布前回归门禁、参数锁定分级、灰度门限、证据前置),本质上都是在做同一件事:人为地把送达那一侧的成本加回来,让它重新贵到与证明相称。理解了这一点,后面每一道闸就不再是「流程麻烦」,而是这处不对称的对价。

两个易错点,方向相反,都要拦。① 把这句话读成「所以要少发版」——不对。结论是把验证做成流水线上的机制(第 6 讲的门禁链:构建、签名、回归套件执行与灰度批次下发串成一条可审计的链,回归没过的包根本进不了下发队列),⛔ 不是减少发布频次;② 反过来读成「反正随时能改,先发再说」——那正是本课要拦的默认动作,也是这处不对称最自然的下坡方向。

1.5 解耦换来的四项代价,第四项是稳态不是过渡态

是什么。解耦与可迭代不是白拿的,代价有四项,每一项在本课后面都有专门的一讲对付它:

  1. 软件复杂度——一套软件覆盖多变型,配置组合数随维度相乘;落点是第 8 讲的兼容矩阵。
  2. 测试覆盖面——全量回归跑不完,必须裁剪,而裁剪本身要有判据;⛔ 判据本体不在本课,去向 K4-08 控制软件回归验证:基线与激励库、回归范围裁剪、自动执行与失败分诊,本课只把「发布前回归通过」当成一道否决闸用(第 6 讲)。
  3. 责任边界——整车厂写上层策略、Tier1 供基础软件与驱动、云平台管下发,出了问题谁验证、谁签字要事先定;本课只给分段与接口(第 8 讲),条款与责任划分去向 K4-09 热管理控制软件的跨企业交付边界:交付物形态、DIA/SEooC、权限分级与联合验证签署
  4. 现场版本离散——★ 这一项是本课补的第四项(⛔ 不是既有的三项之一),也是最容易被整项漏掉的一项:车队上永远同时跑着 N 个版本。

为什么第四项要单独拎出来。因为它是 OTA 独有的——传统改款没有这个问题(同一批车软件相同,改款前后按批次切开就行)。灰度一开始,车队上就同时存在四种车:还在旧版的、已升到新版的、升级失败留在旧版的、升级后又回滚过的。任何一个后续版本,都必须能从这四种状态中的任意一种升上来并且成立。它直接推出两件事:第 8 讲的兼容矩阵为什么必须逐格校验;第 2 讲的差分包为什么有一个绕不过去的前提——差分依赖车端那份原版镜像与生成差分时用的那份完全一致

工程量级。同时在网的版本数与各版本占比,⛔ 是平台相关量,本课不给数、也不给「一般有几个在网版本」这类经验值。给的是一条结构结论N 个在网源版本,就要 N 份差分包,或者退回全量包兜底——差分方案必须配全量兜底路径,⛔ 不许只做差分。

一个易错点,代价很大。把版本离散当成「灰度期间的临时现象、过完这一阵就好了」。⛔ 不对:只要还在做 OTA,版本离散就是稳态,不是过渡态。按「过渡态」设计的系统,会把兼容矩阵、差分包生成、回流数据的版本分组全部按「很快就统一」来简化,而那一天永远不会到。

1.6 全课的读法约定:三组同名不同义的量,⛔ 一律不裸写

是什么。本课有三组撞名的量。它们不是「名字有点像」,而是在同一门课里、相隔一到两讲、且很可能出现在同一份发布方案里——读者极易把它们互算或比大小。全课的写法在这里一次定死:

  • 「A/B」有两义。A/B 双分区——车端两个存储分区,是刷写与回滚机制(第 3 讲);② A/B 对照评估——灰度组与对照组的对照实验(第 7 讲)。两者毫无关系。⇒ 全课一律写全称,⛔ 禁止出现裸的「A/B」,图上也一样。
  • 「p」有两义。放量比例 p_ramp——灰度分批的比例序列,无量纲(第 6 讲);② p 值——统计显著性,无量纲(第 7 讲)。两者同为无量纲,因而在表里长得一模一样。⇒ 全课分别写「放量比例」与「p 值」,⛔ 禁止裸写 p
  • 「σ」有三义。σ_total——总标准差,含车间差异,★ 这是错误用法,它在本课只以被点破的形式出现;② σ_within——组内标准差,即车级聚合成一个值之后、同一组内各台车之间的标准差(⚠ 这里的「within」指组内,⛔ 不是「车内」,⛔ 它不是车内残差标准差),两独立组设计的样本量式子要用的;③ σ_d——同车升级前后配对差的标准差,配对设计要用的。三者同单位、不同分母来源。⇒ 全课一律带下标写,⛔ 正文禁止裸写 σ
图3 本课三组同名不同义的量的对照。三行,每行并列两到三个框,框与框之间画一个警示红的禁止符号,禁止符号下方一行小字写互套后果。第一行左框为 A/B 双分区,说明是车端两个存储分区、刷写与回滚机制、第 3 讲;右框为 A/B 对照评估,说明是灰度组与对照组的对照实验、第 7 讲;后果一行写:把回滚机制当成对照实验,或反过来把对照实验当成有两个分区所以安全。第二行左框为放量比例 p_ramp,无量纲,第 6 讲;右框为 p 值,统计显著性,无量纲,第 7 讲;后果一行写:在同一张表里两个 p 相邻出现,读者按同一列比大小。第三行三栏:左栏为 σ_total 总标准差含车间差异,框用警示红描边并标注错误用法;中栏为 σ_within 组内标准差,注明它是车级聚合成一个值之后同一组内各台车之间的标准差、不是车内残差,标注两独立组式用;右栏为 σ_d 配对差标准差,标注配对式用;后果一行写:代错一个,样本量整体算错且方向不定。每个框下方一行写它的单位与量纲,三个 σ 同单位但不同分母来源,这一句单列。本图为定性对照示意,框的大小与位置不代表任何量的大小,⛔ 不得据图读取或比较任何数值。
图3 该从图上读出的判断有三条:① 本课出现「A/B」「p」「σ」时必须看限定词,全课⛔ 不裸写,图上也不用它们当图例标签;② 三个 σ 虽然同单位,但来自不同的方差分解,⛔ 不可互相代入、⛔ 不可比大小——唯一可给的方向性关系是 σ_total ≥ σ_within(等号只在退化情形下成立——车内方差为零,或每台车只有一次行程),⚠ 而两者的比值是平台相关量,本课不给数;③ 红框那一个(σ_total)是明确的错误用法,它在本课只以被点破的形式出现在这里与第 7 讲。⚠ 本图是符号与术语的对照表,⛔ 不是概念关系图——并列的两栏之间没有任何因果或包含关系,中间那个禁止符号正是用来切断这种误读的。本图为定性对照示意,框的大小与位置不代表任何量的大小,⛔ 不得据图读取或比较任何数值。

工程量级。可给的只有一条方向性关系:σ_total ≥ σ_within(由方差分解直接得出,可判真假;等号只在退化情形下成立——车内方差为零,或每台车只有一次行程)。⛔ 而两者的比值是平台相关量,随车队构成与指标定义变,本课不给数。

两个易错点。① 把 σ_total 代进样本量公式——这是第 7 讲最贵的一个错,它不会报错,只是把所需台车数算歪,而且歪的方向还不固定;② 在图上用「A/B」当图例标签——图上每一个要读的量都必须有独立且写全称的文字标签,缩写省下的那几个字符,换来的是读者读错一整张图。

1.7 入口三问:这个改动值不值得走 OTA

是什么。在投入之前,一个热管理改动值不值得走 OTA,问三问就能判。★ 这三问是本课自建的判据(⛔ 不是某项标准或某份既有规程里的既有判据,也⛔ 不是既有的行业通行卡片):

  • 问① 能不能靠软件解决?如果瓶颈是换热面积、管径、压缩机排量这类物理天花板,OTA 改的只是「在天花板底下怎么分配」,⛔ 改不掉天花板本身。这一支的出路是硬件改款,去向 N5-02 软件定义热管理与整车 OTA 演进
  • 问② 错了能不能收回来?先按可逆性层级把这次改动定位——落在「车端持久化数据」那一层,就必须先有一条数据侧的回滚路径(反向迁移或清除重学),两条都没有则不予放行;落在「已经发生的物理与用户侧后果」那一层,就只能靠灰度比例限敞口,且若属安全相关则不走快速灰度。
  • 问③ 收益能不能证明?要证的那个指标,所需信号在灰度车上采不采得到、采样率与触发条件够不够、样本量够不够。答不上来,先补采集配置与样本量方案,⛔ 不是「发完再说」。

三问是合取的门:任一为否,OTA 就不是这个问题的答案。

图4 一个热管理改动值不值得走 OTA 的三问决策树。入口框写着手上有一个热管理改动的想法。问一为能不能靠软件解决,括注瓶颈是不是换热面积、管径、排量这类物理天花板;否分支引到终点框,写着不是 OTA 的问题,走硬件改款,去向 N5-02 的物理天花板一节。问一为是则进入问二,能不能收回来,按可逆性三层定位;落第三层持久化数据引到分支框,写着先补数据侧回滚路径,反向迁移或清除重学,两条都没有则不予放行;落第五层不可逆物理后果引到分支框,写着只能靠灰度比例限敞口,且若属安全相关则不走快速灰度;落第一层与第二层则直接进问三。问三为收益能不能证明,括注目标指标所需信号在灰度车上采得到吗、样本量够吗;否分支引到终点框,写着先补采集配置与样本量方案,不是发完再说;是分支引到终点框,写着可进入发布流程,去查参数锁定分级表定档。每个终点框下方挂一行写这一支的下一步交付物是什么。图上以青绿虚线框与图例标明三问为本课自建判据。图上没有任何分数与权重。本图为定性流程示意,分支的位置与框的大小不代表概率或频次,⛔ 不得据图读取任何数值。
图4 该从图上读出的判断有三条:① 三问是合取的门——任一为否就不进入发布流程,⛔ 不是打分卡,所以图上没有任何分数与权重;② 问②不是「能不能回滚」的是非题,它是定位到可逆性的哪一层,不同的层通向不同的补救动作,这一点是全图最容易被简化掉的地方;③ 问③ 把「证明」提前到了发布之前——图上「先补采集配置」那一支,就是本课第二根钉子的入口。⚠ 本图是入口分流的决策树,⛔ 不是完整的发布流程:每个终点之后各自还有一整条链(分级表、灰度设计、证据方案),本图只到分流为止。三问为本课自建判据。本图为定性流程示意,分支的位置与框的大小不代表概率或频次,⛔ 不得据图读取任何数值。

工程量级。三问都是定性判据,⛔ 不给分数、⛔ 不给权重——本课刻意不做打分卡。理由很具体:打分卡会把「有一条为否」这个否决关系,稀释成「总分够高就行」,于是一个连回滚路径都没有的改动,可以靠「收益大、技术成熟」两项高分被放行。

两个易错点。① 把它当成排序工具,去比较几个候选改动谁先做——它是门,不是尺;② 漏掉问③,把「证明」当成上线之后的事。后面会看到,那正是本课第二根钉子要拦的动作,而且它是补不回来的。

1.8 两根钉子:可逆性是准入判据,证据能力必须在下发之前装车

全课反复敲两根钉子。合起来是一句话:OTA 的准入判据是「错了收不收得回来」,而「这一版更好」是要证的——证据能力必须在下发之前就装上车。

钉子 1:OTA 的准入判据是可逆性,不是改动大小。判据只有一问——这条改动如果错了,我按什么路径、多长时间、能把车恢复到改之前那个状态?答不出来就不许发。而「可逆」在车上不是一件事,是逐层变弱的三层:① 可执行代码——能整体回,秒级、可自动、可无人值守;② 车端持久化数据(标定非易失存储、自适应与学习值、诊断历史与累计量)——它不随分区切换回退,只有反向迁移与清除重学这两条专门写出来的路径能救;③ 已经发生的物理与用户侧后果(一次过热保护误报导致的停机、一次投诉、一次里程损失)——任何机制都收不回

★ 这三层的完整骨架是一张五行的表(本课归纳,第 3 讲逐行展开):可执行代码 / 随包下发的标定数值(⚠ 若该量在车端被自适应改写过,回的只是初值,实际生效值落到下一层)/ 车端持久化数据 / 已下发但未收回的授权(靠撤销流程,去向 K4-09 热管理控制软件的跨企业交付边界:交付物形态、DIA/SEooC、权限分级与联合验证签署)/ 已经发生的物理与用户侧后果。⚠ 只沿「技术上能不能回滚」这条线索去数,会整类漏掉后两行——它们不是技术问题,但它们才是「错了要付多少钱」的那一层。

钉子 1 直接推出本课的两件强制交付物:参数锁定分级表里必须有「回滚可逆性」这一列(第 4 讲),灰度放量的比例本质上是最外那一层(已经发生的物理与用户侧后果,即五层全集的第⑤层)敞口的上限而不是「试试看」的比例(第 6 讲)。⚠ 反过来说也成立,而且同样重要:一个落在第①层、值域可枚举、错了几秒内能整体回的改动,不该被当成大事拖到下一次改款——把可逆的东西按不可逆的流程办,是软件定义白做了。

钉子 2:「这一版更好」是要证的,不是要看的;而证据能力必须在下发之前装车。一次 OTA 迭代的交付物有两个,缺一个这次迭代就不成立:一个是改了什么(升级包),一个是凭什么说它更好(证据)。证据这一侧的三个落点是:

  • 样本量的计数单位是「车」,⛔ 不是「行程」——车队数据是聚类/重复测量结构,同一台车的多次行程之间强相关,把行程数直接当样本量会把有效样本量虚高(虚高的倍数怎么算,第 7 讲给式子,⛔ 不给固定倍数);
  • 样本量公式必须含功效项——漏掉它的那个式子在两独立组设计下会把所需样本量低估 2.0~5.5 倍(随所要的检验功效而变,逐档的数以及配对设计对应的那一组,第 7 讲给;⚠ 这三个数只对两独立组成立,⛔ 不得当成通用低估倍数);
  • 要证的结论所需信号、采样率与触发条件,必须随灰度包一起下发采集配置——样本量公式决定「要多少台车」,采集口径决定「每台车上到底算不算得出这个指标」,两者缺一都证不出结论。

为什么必须提前。因为证据这一侧有一个物理性质:它是不可追补的。车一旦升上去,这台车升级前那一段基线数据不会再有第二次;采集配置没随包下发,这一批灰度车上就永远没有那一路信号。⇒ 「统计」因此不是一个上线后的分析动作,它是发布方案的一部分:方案评审当场就要答得出「你打算用什么数据、多少台车、证到多小的差异」。⛔ 具体台数与采样率是平台相关量,本课不给数。

两根钉子怎么合起来。钉子 1 管「错了以后收不收得回来」,钉子 2 管「对了能不能证明得出来」。⚠ 两者⛔ 不可互相推导——回滚预案做得再全,也不构成收益的证据;收益再显著,也不减免任何一层可逆性要求。把「我们有 A/B 双分区」写进收益论证,或者把「灰度期间指标很好看」写进可逆性论证,是发布评审上最常见的一种混线,而且两侧听起来都很有道理。全课每一讲的收口都回到这两句。

两个易错点。① 只做第①层的预案就宣布「有回滚机制」——回滚执行成功、故障依旧,这是本课最贵的一处读反,第 3 讲整讲在拆它;② 把「证明」推给数据团队上线后再说,或者只准备了目标指标的数据,而没准备「不得退化项」与「保护触发率」的数据——结果是能说「噪声改善了」,说不出「没有别的东西变差」。

后面还有 7 讲正文 · 关键公式 · 案例拆解 · 常见误区 · 动手做

会员专属

后续为会员深水区内容——四库数据与深度拆解。

查看会员方案