基本信息

阅读时间:约 12 分钟

字数:约 4601 字

摘要:同一个需求改第二次,成本常常是第一次的一点五到三倍,多出来的部分几乎全部来自没有提前评估的影响面。本文用一张六向影响面清单(ISC-6)把变更拆成用户面、依赖面、数据面、契约面、成本面、回滚面,结合 Google 站点可靠性工程与 DORA 的公开数据、骑士资本 2012 年的真实事故,给出四个度量指标、三档分流规则与十五分钟评估的落地节奏。

全文语音

中文

English

日本語

한국어

1

专业分析:变更的成本不是加法,是乘法

同一个需求改两次,团队通常按工作量结算:第一次两天,第二次看起来只要半天。真实账单往往相反,第二次的总成本是第一次的一点五到三倍。原因不在手速,而在第二次改动必须先弄明白第一次为什么那样写、必须重新确认谁在依赖它、必须把相邻场景再跑一遍。这三件事都不产生新功能,却吃掉最多的时间。

需求改一次成本翻一倍:把变更关进一张影响面清单 思维导图

先看量级。Google 的站点可靠性工程实践文档里有一句被反复引用的话:生产环境的事故里,大约七成由变更引起(来源:Google《Site Reliability Engineering》,2016,值班章节)。DevOps 研究计划 DORA 连续多年的行业问卷给出另一组对照:高效能团队的变更失败率在百分之零到十五之间,低效能团队在百分之四十六到六十之间;同一份调查里,高效能团队花在返工与计划外工作上的时间约占两成,低效能团队接近四成半(来源:DORA《Accelerate》系列年度报告,样本为自报告问卷)。这类问卷的抽样偏差一直被讨论,但多源交叉之后,变更失败率相差三到四倍这个量级是稳的。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

成本随阶段往后推移而放大的规律也早有记录。Boehm 在 1981 年的《Software Engineering Economics》里给出缺陷修复成本随阶段后移而上升的曲线,后续多项研究重复了方向,倍数从数倍到上百倍不等,差异来自项目类型与统计口径。常被引用的 IBM 系统科学研究所一百倍曲线,原始数据无法复核,只能当作量级提示,不能当作精确结论。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

一个可辨识的案例。2012 年 8 月 1 日,美国做市商骑士资本上线一段复用的交易代码,部署到了八台服务器中的七台,第八台仍是旧版本。开盘后四十五分钟,两个版本同时向市场发单,公司亏损约四点四亿美元,美国证监会对它处以一千二百万美元罚款,公司当年被收购。事后复盘的核心不是谁按错了按钮,而是上线前的影响面评估只覆盖了新功能能不能跑,没有覆盖旧代码被搬到新位置会发生什么。

所以我把变更前的评估做成一张六向清单,叫影响面清单(Impact Surface Checklist,简称 ISC-6)。六个方向依次是:用户面,谁看得见、谁在用、谁在等;依赖面,上下游谁会被牵动;数据面,哪些改动回不去;契约面,谁签过字、承诺过什么;成本面,钱、人、时要多花多少;回滚面,出事之后多快能退。它和常见的代码差异评审是正交的:差异评审回答这段代码写得对不对,六向清单回答这段代码动到了谁的什么。和 ITIL 的变更顾问委员会相比,六向清单不新增审批层级,只把评估动作压缩到十五分钟,用一张纸代替一次会。

度量四个指标就够。一是影响面覆盖率,每次变更六个方向是否都填了具体名字与数量,目标九成以上;二是变更失败率,按周统计需要回滚或紧急修复的变更占比;三是返工占比,统计因漏评估而二次返工的人时占变更总人时的比例;四是回滚时长,从决定回滚到服务恢复的中位数。执行清单五步:填六向、标不可逆点、点名必须知情的人、估最坏损失、跑一次十五分钟对齐。清单不改流程,只改顺序,把评估从出事之后挪到动手之前。

2

为什么第二次改同一样东西,比第一次贵一倍

第一次改,你只需要让主路径跑通。第二次改,你要先回答一个问题:上次为什么这么写。这个问题背后有四笔成本,都不出现在工时表上。

需求改一次成本翻一倍:把变更关进一张影响面清单 框架图

第一笔是考古成本。改一个三个月前的分支,先要读提交记录、翻工单、找当时的人确认。经验值:一个小模块的追溯时间通常是改动本身的两到三倍(示例量级,来自团队内部估算,非统计结论)。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

第二笔是对齐成本。第一次改动通常只有一个人参与,第二次往往牵动设计、客服、运营、法务。一次跨四个角色的对齐,光约时间就是半天。第三笔是回归成本,改动越靠近公共部分,要重跑的场景越多,跑一遍从十几个到上百个不等。第四笔是信任成本,客户和同事对又改了这件事的容忍度是消耗品。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

把这四笔加起来,就得到一条简单的不等式:变更总成本约等于实施成本加理解成本加对齐成本加回归成本加风险期望值。只算第一项,等于只看到账单的封面。清单的作用不是让流程变长,而是把这四笔隐性成本在动手前摊在桌面上,让要不要现在改变成一个可以讨论的问题。

还有一个副作用值得说清楚:改动越不透明,下一次的追溯成本越高,形成正反馈。所以清单上除了影响谁,还要写为什么现在改、改完谁负责记录。这两栏填不满,通常意味着这次变更不该立刻开工。

这也是为什么改动债这个词比技术债更贴切。技术债说的是代码质量,改动债说的是信息丢失:谁改过、为什么改、改完谁验证过。每丢失一次,下一次的利息就高一分。清单是这个账本的记账动作,单次成本极低,但必须每次都记。

3

用户面:谁看得见,谁在用,谁在等

用户面要回答的不是影响所有用户这种正确但无用的话,而是三个具体清单:谁直接操作、谁间接承受、谁在旁边解释。

需求改一次成本翻一倍:把变更关进一张影响面清单 对比图

直接操作者是点下按钮的人;间接承受者是被结果影响但不操作的人,比如收到通知的客户、看报表的管理层;旁边解释者是客服、销售、实施顾问,他们不写代码,却要在第一时间替你解释变化。三类人里,最容易被漏掉的是第三类。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

做法是把场景按频次乘金额排一遍。一周用五次的入口和一季度用一次的入口,同样改坏,代价差一个数量级。列三个最高频场景、两个最高金额场景,就覆盖了八成的真实影响。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

还有一个常被当成杂事的项:告知。帮助文档、客服话术、公告、培训材料,都属于用户面的一部分。改完不告知,等于把解释成本转嫁给一线,而一线的解释往往比改动本身更贵。

量化写法:本次变更触达几个角色、几个渠道、几份需要同步的文档。数字写不出来,说明这一向还没评估完。

4

依赖面:它连着谁,看两跳不看一跳

依赖面是最容易自我安慰的一向。开发者看一眼代码,觉得只改了一个字段,就默认没有下游。字段是契约,契约的下游往往不在同一个仓库里。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

要把依赖分成三类清点:调用依赖,谁在调这个接口;数据依赖,谁在读这张表、这个字段、这份导出;行为依赖,谁在依赖某个默认值、某个排序、某个时区。前两类能靠搜索找到,第三类只能靠问人。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

一条实用规则是看两跳,不看一跳。改字段的人知道直接调用方,但直接调用方的下游往往没人提。问三个问题:这个值还被谁转发过、还有哪份报表在用它、还有哪个定时任务在夜里读它。

示例量级:一个内部系统把订单状态字段从五个枚举改成七个,代码层面只动了两个文件,实际上牵动了七个下游,包括两个报表、一个对账脚本、一个客服工作台、一个消息模板、一个第三方回调、一个数据仓库同步任务。漏掉任何一个,都会在上线后第三天才暴露。

量化写法:本次变更的直接依赖几个、间接依赖几个、其中几个不由本团队维护。最后一个数字最重要,它决定了你要提前几天打招呼。

还有一个容易漏的时间依赖。很多系统在月初、季末、跨年、夏令时切换那几天行为不同,代码里看不出来,只有跑过一次的人知道。改动前问一句最近一次踩到这类边界是什么时候,往往能省下一整轮返工。

5

数据面:什么改了就回不去

数据面只需要回答一个问题:这一步做完,能不能原样退回去。能退的叫可逆改动,不能退的叫不可逆点。清单上唯一必须标红的就是不可逆点。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

常见的不可逆点有六类:删列删表、改字段类型、改枚举含义、改精度与单位、改时区与默认值、把计算逻辑写进历史数据。前五类还能靠备份救,最后一类最难,因为历史数据已经被新逻辑重新解释过。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

一个真实的量级:有团队把金额单位从元改成以分为单位存储,代码改了两处,报表口径没跟着改,第二天对账差了整整一百倍。修复本身只要半小时,但追溯三天的历史数据、逐条核对、给财务出说明,用掉了两个人一周。

可逆设计的三个动作:改之前先备份并对备份做一次恢复演练;把迁移写成可以重复执行的脚本,而不是一次性的手工命令;准备一份回滚脚本,并且在上线前真的跑一遍。没跑过的回滚脚本等于没有。

量化写法:本次变更包含几个不可逆点、每个不可逆点的恢复路径是什么、恢复需要多久。写不出恢复时间的,按不可逆处理。

如果改动确实不可逆,还有一个折中做法:双写。新旧两套口径同时写一段时间,读仍走旧的,等两边核对一致再把读切过去。代价是存储与代码复杂度上升,收益是随时可以切回来,用空间换时间。

6

契约面:谁签过字,承诺过什么

契约面和用户面的区别在于,用户面关心谁受影响,契约面关心谁有权说不。有些改动技术上完全可行,但它动了一份已经签过字的承诺。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

对外契约包括价格与优惠规则、服务等级承诺、隐私政策与数据用途、合同里的交付条款、监管要求的报送口径。对内契约包括跨团队接口、考核指标的统计规则、上下游约定的时间窗。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

这一向最容易低估时间。文案层面改一句价格表述,看起来是十分钟的活,实际要走完法务确认、区域口径核对、历史订单兼容三个环节。示例量级:一次定价页表述调整,技术改动四十分钟,跨部门确认用了三天。

清单上这一向不写需要审批,而写谁必须知道、谁必须签字、签完多久生效。审批是流程,知情是责任。很多事故不是没人批,而是该知道的人不知道。

量化写法:本次变更涉及几份对外承诺、几个签字人、最长的一个确认周期是多少天。

7

成本面:钱、人、时怎么被牵动

成本面不是让你做一份精确预算,而是让你在动手前知道最坏情况有多大。写法很土:给六个方向各填一个最坏要花多少。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

直接成本好算:人力人时、外部服务费、云资源增量。间接成本难算但更贵:协调成本,一次跨团队对齐按半天到一天计;支持成本,客服在一周内多接的咨询量;机会成本,同一批人这段时间本来要做的另一件事。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

把风险也算进去。用最简单的期望值写法:某个影响面出问题的概率乘以出问题后的损失,几项相加,得到这次变更的风险敞口。数字不必精确,量级对就够了。

示例:一次看似普通的结算规则调整,实施八人时、验证六人时、跨三个团队对齐十二人时、客服预估增加五十次咨询、风险敞口按千分之五概率乘以二十万元损失计一千元。真正的大头是那十二人时的对齐,而不是八人时的实现。

量化写法:本次变更的总人时、跨团队人时、最坏损失金额。三项里如果有任何一项超过团队月度可承受额度,就该考虑拆成两次做。

还有一类成本常被记在别人账上:支持成本。客服每多接五十次咨询,按每次八分钟计,就是六到七个小时的人力。这笔钱不会出现在研发排期里,但它真实发生,并且会在下一次预算会上以另一种名义回来。

8

回滚面:出事之后,多快能退

回滚面是所有清单里最不受欢迎的一向,因为它默认了会出事。但它的价值恰恰在这里:它把出事从意外变成预案。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

回滚要写清楚四件事:退到什么状态、用什么手段退、谁有权决定退、退的过程中用户看到什么。四件事缺一件,回滚就会在关键时刻变成讨论会。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

回滚时间分三段:发现时间、决策时间、执行时间。多数团队只优化执行时间,实际上最长的是决策时间,因为没人愿意当那个按下回滚的人。提前指定一个回滚负责人,能把决策时间从小时级压到分钟级。

还要区分回滚和止损。回滚是把系统退回旧状态,止损是先把影响面收窄,比如关掉一个入口、降级一个功能。有些不可逆的数据改动根本退不回去,这时候唯一能做的是止损。清单上应该同时写这两条路径。

量化写法:本次变更的目标恢复时间、回滚负责人姓名、回滚脚本上次演练日期。三个字段填不出来,这次变更就不具备上线条件。

9

把清单跑起来:十五分钟评估与三档分流

清单最大的风险是被填成形式。避免形式化的办法只有一个:把填写时间压到十五分钟以内,并且只在一件事上较真,就是不可逆点有没有标出来。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

三档分流:轻变更,一个人填完六向里的三项,直接做,事后记录;标准变更,十五分钟两人对齐,重点看依赖面和契约面;重变更,涉及不可逆点或对外承诺的,必须走签字与演练。分档标准写死,避免每次重新讨论。

需求改一次成本翻一倍:把变更关进一张影响面清单 配图

节奏上,把它挂在已有的动作上,而不是新开一个会。提交前填清单,评审时用清单当议程,复盘时回填实际影响。三次复用之后,团队会自然记住哪一向最常漏。

度量按周看四个数:覆盖率、失败率、返工占比、回滚时长。前两个看趋势,后两个看改进。别追求一次到位,先把漏项从十个降到三个,收益就已经很明显。

最后一句提醒:清单是给做决定的人用的,不是给流程审计用的。如果一张清单填完之后,没有任何一个决定因为它的内容发生改变,那这张清单就该重新设计,而不是继续填。

至于谁填:谁动手谁填,不设专职。专职填表的人不了解细节,填出来的必然笼统,而笼统正是这张清单最想避免的状态。

FAQ

常见问题

1.问:小团队也需要这么重的清单吗?答:不需要重,但需要一致。轻变更可以只填三项,关键是不可逆点必须标出来,因为它是唯一无法用时间弥补的漏项。

2.问:十五分钟的评估够用吗?答:够用来发现明显漏项,不够用来给出精确预算。清单的目标是筛出那两成需要深入评估的变更,剩下的按常规走即可。

3.问:业务要求今天必须上线,清单会不会变成阻碍?答:清单不阻断上线。它只做两件事:把这次是带着已知风险上线记录下来,并指定一个回滚负责人。

4.问:怎么判断一个改动是不是不可逆?答:问一句,如果现在退回上一版,用户看到的数据会和昨天一样吗。答案是否,就按不可逆处理。

5.问:清单填完还是出事了,说明什么?答:先看漏的是哪一向,再看那一向是不是只写了名词没写数量。多数失败不是没填,而是填得太笼统。


图片来源:图1 PublicDomainPictures / Pixabay (CC0) · 图2 AS_Photography / Pixabay (CC0) · 图3 Matias_Luge / Pixabay (CC0) · 图4 makabera / Pixabay (CC0) · 图5 Couleur / Pixabay (CC0) · 图6 Pexels / Pixabay (CC0) · 图7 PIRO4D / Pixabay (CC0) · 图8 alisonupdyke / Pixabay (CC0) · 图9 affzm / Pixabay (CC0) · 图10 192635 / Pixabay (CC0) · 图11 Andrys / Pixabay (CC0) · 图12 kinkate / Pixabay (CC0) · 图13 Pexels / Pixabay (CC0) · 图14 20252177 / Pixabay (CC0) · 图15 affzm / Pixabay (CC0) · 图16 pen_ash / Pixabay (CC0) · 图17 lecreusois / Pixabay (CC0) · 图18 Derks24 / Pixabay (CC0) · 图19 reallywellmadedesks / Pixabay (CC0) · 图20 reallywellmadedesks / Pixabay (CC0)


本文为信息分享与方法论科普,不构成任何专业建议,请结合自身情况判断。

本文由 AI 生成,经人类主编终审。