基本信息
阅读时间:约 16 分钟
字数:约 6565 字
摘要:一条自动化真正的成本不在搭建那天,而在之后三年的值守、失效与退役。本文用 A-TCO 四账本模型,把搭建、值守、沉默失效与退役拆成可计算的小时数,给出六项度量指标、四道结果闸门与四条退役判据。
全文语音
中文
English
日本語
한국어
凌晨两点的一条告警,让我开始记这本账
2024 年 11 月的一个周二,凌晨两点零七分,我在杭州的出租屋里被手机震醒。屏幕上是运营群里的九条未读,第一条是财务同事发的一句:「今天的对账表,是不是少了一个店铺?」我当时 34 岁,在一家做跨境零售的公司带运营中台,白天管着六个人,晚上管着二十多条自己搭的自动化工作流。那一刻我还没意识到,这句问话会让我把过去三年里搭的所有东西,重新算一遍账。

「我当时以为两小时能修完,结果修了整整三天。」我后来在复盘会上是这么说的。三天里我不是在写新代码,而是在翻旧账:哪些字段是哪一年加的,哪一个判断条件是为什么写的,哪一条分支已经两年没被走过。那三天的人工成本,比我当初搭这条工作流花的时间,多出大约十一倍。

那条工作流是三年前一个下午的产物。它每天凌晨一点半把六个店铺的订单数据拉下来,做去重和币种换算,写进一张对账表,再把金额偏差超过阈值的行推到群里。它跑了大约一千一百天,我以为它是资产,是我从重复劳动里赎回来的时间。直到那天我才知道,我没赎回来,我只是把一笔一次性支出,换成了一笔没有到期日的分期。

真正让我难受的不是它出错,而是它没错。它没有报错,没有中断,每天照常跑完,日志里全是绿色的成功标记。它只是从某天开始,安静地跳过了其中一家店铺——对方把接口里的字段名从 order_id 改成了 orderId。十九天里,那家店铺的订单一条都没进对账表,累计三十七万元的对账缺口,是被财务用肉眼发现的,不是被我的工作流发现的。

从那个周开始,我给自己定了一条规矩:每一条自动化,都要有一本账。不是记它省了多少时间,而是记它三年总共要花掉我多少时间。本文讲的,就是这本账怎么记——搭建账、值守账、失效账、退役账,四本账加在一起,才是一条工作流真实的总拥有成本。

先算错的那笔账:为什么搭建时间是成本口径里最不准的一项
大多数人对一条自动化的成本印象,停留在它出生那天的样子。「这个我花了两小时搭的」「那个一下午就搞定了」。这种记忆有个共同的问题:它只记录了一次性支出,而且是一次性支出里最容易记的那部分。心理学上叫可得性偏差——最鲜活的记忆占据判断权重,而搭建那天确实是最鲜活的一天:你在主动创造,有明确的起点和终点,有完成感。值守没有完成感,只有无穷无尽的「还在跑」。

软件工程里有一条被反复引用的经验:维护,而不是开发,才是系统生命周期里花钱最多的部分。Lientz 与 Swanson 在 1980 年对 487 个组织的应用系统做过一次调研,被广泛复述的结论是维护占到系统全生命周期成本的六到八成(来源类型:软件工程经典调研文献,此处仅作量级参考)。另一条常被引用的规律来自 Barry Boehm 的缺陷成本曲线:同一个缺陷,越晚被发现,修复成本越高,跨阶段的差距量级可达数十倍(来源类型:软件工程经典文献)。

这两条规律的适用对象是大型软件系统,直接平移到个人搭的二十行脚本上,显然会放大失真。但它们方向性的结论是稳的:一次性投入与持有成本的比例,从来不是我们直觉里的九比一。对一条五步以上的工作流来说,搭建占三年总成本的比例低于一半,是常态而不是意外。

我把这两种看成本的方式,分别叫「搭建视角」和「持有视角」。搭建视角问的是:把它做出来要多久?持有视角问的是:让它继续正确地跑着,一年要花我多少小时,出错时我要赔进去多少?前者按投入决策,后者按年化决策。同一个人用两种视角看同一批工作流,得出的优先级排序几乎是反的。

这个反转是本文最想交付的东西。在搭建视角下,最值得做的是那些搭起来最快的流程;在持有视角下,最值得做的是那些跑得最稳、上游最少变的流程。前者带来的是完成感,后者带来的才是时间。下面这一章,把持有视角拆成一个可以拿笔算的模型。

专业分析:一条工作流的三年总拥有成本模型
我把这个模型叫 A-TCO(Automation Total Cost of Ownership,自动化总拥有成本)。它把一条工作流的三年成本拆成四本账:B 搭建账、W 值守账、F 失效账、Rt 退役账。四本账的单位统一折算成小时,再按你自己的小时成本换算成钱。之所以统一成小时,是因为绝大多数人的自动化不产生直接收入,时间是最诚实的通用货币。

三年的总成本可以写成这个式子:C = B + 3×(Wm×12) + 3×(F×R + F×Eh) + Rt。其中 B 是搭建投入小时数,Wm 是每月值守小时数,F 是年均失效次数,R 是单次失效的处置小时数,Eh 是单次失效造成的错账折算小时,包含返工与对外沟通,Rt 是退役处置小时数。变量看起来多,但每个都能从日志和聊天记录里估出来,不需要精确,量级对就够了。

给一个示范算例(以下为示意数据,用于演示口径,非实测统计):一条六步的对账工作流,B = 8 小时;每月值守 1.5 小时,含看告警和偶尔改配置;每年失效 3 次,其中 1 次是沉默失效,平均发现时延 12 天;单次处置 R = 2 小时;单次错账返工折算 Eh = 6 小时。代入后:搭建 8 小时、值守 54 小时、失效处置 18 小时、错账返工 54 小时、退役 2 小时,合计 136 小时。搭建只占其中的 5.9%,而失效相关的两本账加起来占了 53%。

真实世界里的极端样本更能说明失效账的量级。2012 年 8 月,美国做市商 Knight Capital 在一次交易系统更新中,因为部署流程漏掉了八台服务器中的一台,那台机器上残留的旧代码被重新激活,在开盘后的四十五分钟里产生了约 4.4 亿美元的账面损失(来源类型:监管机构处罚文件与公开事后复盘报道)。事故的源头不是算法复杂,不是模型错误,而是变更漂移——自动化部署流程本身,成了失效的传导通道。

在我自己的工作流里,也做过一次为期一年的统计(个人记录,样本 14 条,非严格实验):全年共记录 41 次中断或异常,其中凭证到期 17 次、上游接口或字段变更 14 次、数据量超阈值 6 次、其它 4 次。沉默失效 9 次,占 22%,但这 9 次贡献了全年错账返工工时的 71%。这个分布几乎复制了大型系统里的规律:少数沉默事件,吃掉大部分代价。

模型要能落地,得配上可度量的指标。我给自己定的六项指标是:年值守工时 W(健康区间示意:单条不超过 12 小时)、年均失效次数 F(示意:不超过 2 次)、平均发现时延 D(示意:不超过 24 小时)、单次处置工时 R(示意:不超过 2 小时)、沉默失效占比 S(示意:不超过 20%)、上游变更响应时延 U(示意:不超过 72 小时)。六项里,D 和 S 是最容易常年超标、也最容易被忽略的两项。
执行清单,拿到就能做:一、给每条工作流建一行台账,字段为 B、Wm、F、R、Eh、D、S;二、翻过去一年的聊天记录和日志,把 F 与 R 估出来,先填个量级;三、把小时价写死在表头,避免每次重新换算;四、按年化成本从高到低排序,取前三条先处理;五、对 D 大于 24 小时的工作流,优先补断言而不是补功能;六、对 S 大于 20% 的工作流,补一道结果校验闸门;七、每季度末重算一次,把退役判据跑一遍。
沉默失效:账单上最贵的一行,从来不报警
失效有两种。第一种是响亮的:任务报错、接口返回 5xx、超时、被限流,日志里红成一片,告警立刻把你叫醒。第二种是沉默的:任务成功返回,退出码是 0,日志里写着「成功写入 1284 行」,但那 1284 行里有一半是错的,或者少了一半。前者让你花两小时,后者让你花十九天。

沉默失效之所以贵,是因为它攻击的是发现时延 D 这个变量。成本与 D 的关系近似线性:错账量约等于日错账率乘以 D,而返工工时又随错账量增长。响亮失效的 D 通常在分钟到小时量级,沉默失效的 D 常常以天、周甚至月计。把 D 从 12 天压到 12 小时,在其它变量不变的情况下,失效账这一项就能下降一个数量级。所以在自动化上投入的每一小时,优先顺序应该是:先买「响」,再买「快」,最后才买「多」。

我那条对账工作流的 D 是 19 天。它每天照常跑,每天照常生成文件,文件大小也维持在合理区间——因为那家被跳过的店铺本来订单量就小,少了它,文件从 1.4 MB 变成 1.3 MB,肉眼看不出差别。如果当时我在流程末尾加了一道最笨的闸门——「六个数据源,每个都必须出现非空结果」——这个失效会在第一天凌晨就被拦下来。

沉默失效的触发器高度集中,我把它归纳成三类。第一类是上游结构变更:字段名改了大小写、枚举值新增了一项、日期格式从字符串换成时间戳。第二类是阈值类变化:分页上限从 100 变成 50、限流从每分钟 60 次收紧到 30 次、免费额度调整。第三类是语义漂移:金额单位从分变成元、时区从 UTC 变成本地时间、数字从小数变成整数。三类的共同点是:它们都不会让程序崩溃,只会让程序安静地答错。

针对性的解法是加断言,我把它叫「四道闸门」:行数闸门(结果行数落在历史区间的 70% 到 130%)、合计闸门(关键金额字段的合计值落在区间内)、空值闸门(关键字段空值率低于 1%)、唯一键闸门(唯一键重复率低于 0.1%)。四道闸门写起来不到三十行,但它把沉默失效转化成响亮失效——这正是你要的:让错误在凌晨两点把你叫醒,而不是在十九天后让财务叫醒你。
有一个指标值得单独看:沉默失效占比 S,等于沉默失效次数除以总失效次数。S 高说明你的工作流只有流程校验,没有结果校验——你校验了跑没跑完,没校验跑得对不对。给自己定一条硬规矩:任何一条会写入外部系统或影响对账的工作流,必须有至少一道结果闸门;没有闸门的,降级为草稿,不允许自动写入。
值守成本的三副面孔:告警疲劳、依赖漂移、凭证轮转
值守不是盯着,它由三件具体的事组成:判断告警是真是假、跟随上游的变化做适配、维持凭证与权限的有效性。三件事的共同特点是永远不会结束,而且随着工作流数量增加,它们不是线性增长,而是超线性增长——因为你的人只有一个,注意力只有一份。

第一副面孔是告警疲劳。当一个月里的告警数超过你能处理的量,你会开始默认忽略它们,这时真正重要的告警也被一起忽略。衡量它的指标是告警有效率,等于有效告警数除以总告警数。我的经验区间(示意数据)是:低于 30% 时人已经开始麻木,高于 60% 才算健康的信噪比。提升它的方法是阈值化——不要有异常就报,而是连续两次异常才报、偏差超过历史波动带才报。

第二副面孔是依赖漂移。你搭的每一条工作流,都站在别人的接口、别人的字段命名、别人的页面结构之上。上游一年改一次,你有二十条工作流,就是一年二十次适配。降低它的办法是缩小依赖面:能用官方接口就不用页面解析,能用一个聚合接口就不用五个分散接口。每减少一个依赖点,就少一条未来的值守线索。

第三副面孔是凭证轮转。这是最容易被忽略、也最容易根治的一类:访问令牌三个月过期、密码策略要求半年改一次、密钥轮换周期到了。它属于预约式失效——你知道它一定会来,只是不知道具体哪天。根治办法非常朴素:建一张凭证台账,列出每条工作流用的凭证、发放方、有效期、负责人,把到期日提前两周写进日历。这一件事,能消灭我那 41 次中断里的 17 次。

「我把凭证台账做出来之后,第一年最贵的那本账,直接少了一半。」这是我在那次复盘后写在文档里的一句话。听起来像个笑话——解决自动化维护问题最有效的手段,居然是一张手动维护的表格。但实情就是这样:自动化的脆弱性大多集中在少数几个高度可预测的环节上,而这些环节用不了自动化,只能靠清单。
降值守成本还有「降噪三件套」:阈值化,用波动带代替固定值以减少误报;聚合化,把同类告警合并成一条日报而不是一条一推;静默窗口,设明确的免打扰时段,只保留能让流程中断的严重级别。三件套做完后,我的告警数量下降了约七成,而有效告警的捕获率没有下降——因为降的是噪声,不是信号。
三类载体的成本结构:托管型、自托管型、脚本直连型
讲成本就绕不开载体选择。这里不做任何产品推荐,只按部署形态做中性三分:托管型自动化平台,服务由第三方运行,你只配置流程;自托管型,服务装在你自己的机器上,你自己运维;脚本直连型,用脚本直接调用接口,靠定时任务触发。三种形态不是高低之分,而是把同一笔成本放进了不同的账本。

托管型把搭建成本压到最低:不用管服务器,不用管升级,可观测性开箱就有,失效通常是响亮的。代价有三件事:订阅费是按月或按调用量持续发生的现金支出;配额天花板意味着业务量涨到某一档,成本会跳变;流程逻辑锁在平台上,迁移成本落在退役账里。它适合依赖面广、需要多人查看流程状态的场景。

自托管型把搭建成本抬到最高:部署、监控、备份、升级、故障恢复,全是你的。值守成本也是三者中最高的,因为你不只要值守工作流,还要值守运行工作流的基础设施。换来的是可控与可迁移:数据留在自己的边界内,逻辑用代码表达,换环境时能整体搬走。它适合流程数量多、调用量大、或者对数据边界有要求的场景。

脚本直连型的成本曲线最两极分化。写得好的——带日志、带断言、带重试与幂等——值守成本可以低到接近零;写得随意的——没有断言、错误直接吞掉、日志只有一句 done——失效账会高得离谱,而且几乎全是沉默失效。也就是说,这一类的成本不取决于形态,取决于你有没有把四道闸门写进去。

用 A-TCO 的口径做三年定性对照(示意结论,用于说明结构差异而非产品评价):托管型是低 B、中 W、低 F、有持续现金支出、中 Rt;自托管型是高 B、高 W、中 F、低现金支出、低 Rt;脚本直连型是中 B,W 与 F 两极分化,无现金支出,低 Rt。看清这个结构之后,选择问题就从哪个更强,变成了你愿意为哪一种成本付钱、愿意在哪一年付。
我自己最后采用的组合是这样的:依赖面广、需要多人查看的六条放托管型;数据量大、有明确计算逻辑的四条放自托管型;简单的一次性搬运用脚本直连型,并且强制要求带断言。这个组合不是最优解,只是把成本放到了我更付得起的账本上。
什么时候该拆掉一条自动化:四条退役判据
Rt 退役账是四本账里最容易被写成零的一本,也是最不该写成零的一本。拆掉一条自动化要花的时间包括:找出所有下游依赖它的地方、导出配置留档、通知还在看它产出的人、处理历史数据。不做这些,你得到的不是退役,是又一个沉默失效源——一条没人知道还在不在跑的流程。

判据一,年化成本已经高于人工成本。算一个替代比:年化成本小时数除以手动完成同样工作的年小时数。替代比大于 1,说明这条自动化在亏。很多人不愿意承认,因为它是自己亲手搭的,有沉没成本。但账本不认感情:三年花了 136 小时的工作流,如果手动做一年只要 20 小时,它就是一项负资产。

判据二,上游已经提供了原生能力。这是最容易被漏掉的一条:你两年前为了绕过某个限制搭的流程,那个限制可能早就被上游自己解决了。做法很简单,每年把每条工作流的存在理由重新写一遍,写不出来的那几条就是候选退役对象。我第一次做这件事时,十四条里写不出理由的有三条。

判据三,触发频率已经下降到每月不足一次。自动化是为高频动作准备的:频率越高,摊薄搭建与值守成本的能力越强。一条每月只跑一次的流程,值守成本是刚性的——上游变了你还是得改,凭证过期你还是得换——但收益被摊薄到几乎看不见。这类流程应当降级为手动加清单,而不是继续挂着自动运行。

判据四,已经没有人能读懂它。这是最危险的一条,也是知识单点在自动化上的投影。如果一条工作流的逻辑只存在于一个人的记忆里,那么这个人请假、换岗、离职的那一刻,这条工作流就进入了事实上的无人值守状态。判断方法很直接:让第二个人花十分钟读一遍,读完说不出它在干什么,就该重写或者拆掉。
退役处置清单,五步缺一不可:一、导出完整配置存进版本库,命名带上退役日期;二、保留最近九十天的运行日志,用于事后追溯;三、写一段三百字的说明,讲清楚它为什么存在、为什么不再需要;四、逐一通知下游依赖方,确认无人再引用它的产出;五、先改成手动触发观察两周,确认真的没人找它,再彻底关闭。
把维护账单写进日历:季度巡检与成本看板
从搭完就忘到每季度看一次账,中间只隔着一个日历提醒。我把它设在每季度最后一个周五的下午,一次九十分钟,二十多条工作流走一遍。这九十分钟是我一年里回报率最高的时间投入。

季度巡检六项:一、把台账里的 Wm、F、R、D、S 五个数字更新一遍;二、检查凭证台账,把两个月内到期的先换掉;三、抽查三条工作流的产出,用人工方式核对一遍结果;四、检查所有闸门是否还在生效,有没有被人临时关掉;五、跑一遍退役四判据;六、把年化成本最高的三条,写进下个季度要处理的事项。

成本看板不需要复杂,我用的是三个字段加一个结论:年值守工时、年均失效次数、沉默失效占比,结论栏只写一句话——本季度该处理的是哪一条。看板的作用是让成本可见。成本一旦可见,很多决定会自己浮现:你会自然地不再搭那些上游每周都在变的东西,也会自然地把断言写进每一条新流程。

「我把十四条砍到九条之后,值守时间从每月十一小时降到了四小时,而对账的准确率反而上去了。」这件事我到现在还觉得反直觉。我们习惯把更多自动化等同于更少人工,但真实的等式是:自动化数量乘以单条持有成本,等于你要付的账单。减少数量,和减少单条成本一样有效,而且通常更快。

记这本账的最终目的,不是让你不敢再搭自动化,而是让你搭得下那条最该搭的。当你手里没有一本清晰的账,你会对所有自动化一视同仁地恐惧,或者一视同仁地信任;有了账,你才知道哪一条值得再投入两小时加固,哪一条应该在周五下午安静地关掉。
常见问题
1.问:我只有三到五条自动化,有必要算得这么细吗?答:不必一开始就填满六个指标。做法是先给每条工作流出三件事——搭建花了多久、过去一年中断过几次、每次大概花多久修。三个数字填进一张表,十分钟就能填完。数量少的时候,真正值得做的只有一步:给会写入外部系统的那条加一道结果闸门。规模不是门槛,写入才是门槛。
2.问:没有日志,怎么快速估算一条工作流的年值守工时?答:用回溯估算。翻过去一年的聊天记录与邮件,搜工作流名称或它产出物的名字,数一下提到它的次数,每次按 0.5 到 1 小时计;再数凭证更换的次数,每次 0.5 小时。两者相加,量级基本够用。误差会有,但你要的是排序,不是精确值;对决定先处理哪一条来说,排序已经足够。
3.问:托管型平台的订阅费,要不要算进总拥有成本?答:要,但要单列一行,不要和小时混在一起。原因是两者性质不同:小时是你自己的时间,可以在不同事情之间挪;订阅费是现金,是刚性支出。建议口径是时间成本按小时价折算成钱,与订阅费并排放两列,看年度合计的同时也看结构占比。结构占比会告诉你,这条流程到底是在花你的时间,还是在花你的钱。
4.问:沉默失效已经发生了,发现得太晚,第一步该做什么?答:按顺序做四件事。先止损,把受影响的数据区间标出来,通知所有下游使用者,不要先去修流程;再定损,把错账量与影响范围写成数字;然后回溯,找出第一次出现偏差的那一天,反推上游在那一天前后改了什么;最后才是加固,补上对应的那道闸门。很多人第一步就去改代码,结果在没搞清楚影响范围的情况下,把证据改没了。
5.问:一条自动化做到什么程度就该停止优化?答:用边际判断——当最近一次优化带来的年化成本下降小于它本身的投入时,就停。举例示意:花 4 小时把某条流程的处置工时从 2 小时降到 1.5 小时,而它一年只失效 2 次,年收益是 1 小时,四年才回本,这笔投入就不值得。反过来,花 1 小时加一道闸门把发现时延从 12 天压到 1 天,几乎总是值得。判断标准不是还能不能更好,而是下一小时投在哪里最划算。
图片来源:图1 congerdesign / Pixabay (CC0) · 图2 congerdesign / Pixabay (CC0) · 图3 garten-gg / Pixabay (CC0) · 图4 Oldiefan / Pixabay (CC0) · 图5 stuffwithkids / Pixabay (CC0) · 图6 stuffwithkids / Pixabay (CC0) · 图7 stuffwithkids / Pixabay (CC0) · 图8 stuffwithkids / Pixabay (CC0) · 图9 jarmoluk / Pixabay (CC0) · 图10 MonicaVolpin / Pixabay (CC0) · 图11 geralt / Pixabay (CC0) · 图12 romansolar / Pixabay (CC0) · 图13 modernseoul / Pixabay (CC0) · 图14 Kranich17 / Pixabay (CC0) · 图15 stevepb / Pixabay (CC0) · 图16 truthseeker08 / Pixabay (CC0) · 图17 OlgaVolkovitskaia / Pixabay (CC0) · 图18 LisaRedfern / Pixabay (CC0) · 图19 12019 / Pixabay (CC0) · 图20 Aviavlad / Pixabay (CC0) · 图21 Gabriela-Motta / Pixabay (CC0) · 图22 congerdesign / Pixabay (CC0) · 图23 Gabriela-Motta / Pixabay (CC0) · 图24 lecreusois / Pixabay (CC0) · 图25 brenkee / Pixabay (CC0) · 图26 김경복 / Pixabay (CC0) · 图27 Tama66 / Pixabay (CC0) · 图28 andreas160578 / Pixabay (CC0) · 图29 alisonupdyke / Pixabay (CC0) · 图30 timmossholder / Pixabay (CC0) · 图31 652234 / Pixabay (CC0) · 图32 jcx516 / Pixabay (CC0) · 图33 MiraCosic / Pixabay (CC0) · 图34 Dimhou / Pixabay (CC0) · 图35 MiraCosic / Pixabay (CC0) · 图36 focusonpc / Pixabay (CC0)
本文为认知与方法论科普,不构成任何投资建议。

评论(0)