资讯动态

工控的祖传代码,为什么谁也不敢删?(以及怎么安全地动它)

发布时间:2026/10/17 14:42:23 来源:尧图企业网站定制
工控的祖传代码为什么谁也不敢删以及怎么安全地动它【摘要】每个工控公司都有一段没人敢碰的代码写它的人早就不在了没人说得清那些魔数是什么意思但它养活着一整条产品线。这篇讲三件事——祖传代码长什么样、为什么删不得、以及真要改的时候怎么安全地动它附一套我自己在用的六步流程。上一篇聊了工控软件这行的处境做了 20 年工业控制 C说几句得罪人的实话这篇接着聊里面提过的一件事祖传代码。每个做工业软件的公司都有那么几段代码写它的人离职五六年了联系方式早就没了注释要么是空的要么写着此处勿动里面一堆魔数没人知道哪来的但它是核心流程一天跑几千次从来没出过事。新人来了想重构老人只会说一句它活着就别碰它。一、祖传代码长什么样见得多了你会发现它们有共同的相貌。第一种魔数遍地。if(abs(delta)0.037){/* 某种补偿 */}那个 0.037 是调参调出来的是某台设备的实测值还是当年某次批量事故之后加上去的没人记得。删掉它可能明天就有客户投诉精度不达标。第二种条件层层叠叠。if(typeA){...}elseif(typeBversion3){...}elseif(typeBversion3flag){...}每一层分支背后都是一个具体客户的特殊需求或者某一代硬件的兼容性处理。每一条看起来多余的判断都对应着一次已经发生过的现场问题。第三种复制粘贴的函数。三个函数名不同、内容 90% 相同差别只在中间两三行。你不知道那两三行是不是有意为之所以不敢合并。第四种全局状态和时序假设。某个全局变量被三个模块读写注释写着必须在 init 之后调用——但没人验证过顺序错了会怎样。我自己就遇到过一个函数里十几个变量来回算没有一行注释。得逐个梳理它到底用了什么公式公式是怎么来的完全不知道。以前只能自己猜、自己反推——现在好一点可以先丢给 AI 扫一遍AI 怎么用在后面细说。二、为什么它真的删不得不是保守是四个现实问题叠在一起。1. 没有文档。不是作者偷懒——现场节奏根本不允许写文档。设备明天要出货客户后天要验收代码能跑就是交付。二十年下来知识全在人脑和代码里文档是奢侈品。2. 没有测试。不少团队的测试长期等同于现场跑一遍没问题。没有自动化回归你改任何一行验证手段只能是上机试——而试的成本是占用设备、占用产线、占用客户的时间。3. 没有原作者。他能说清的每个魔数都随着离职变成了谜。而接手的人只看到一个数字不知道背后是一次赔了几十万的返工还是某个客户的工艺要求。4. 验证成本不对称。这是最要命的。软件改错了能回滚物理世界不能。你换了运行库过了所有测试发到现场 200 台设备上——万一有一台在某个特定温度下行为异常呢软件的回归测试好做物理世界的回归测试做不起。说个我碰到过的魔数来历。那是一个倍数关系的数值大概是 1.5 上下接近但不等于两倍用在激光调焦上。激光加工要找焦点一般先找到激光作用在晶圆上表面、线宽最小时的 Z 轴位置记为表面焦点。但很多时候需要让焦点落在晶圆内部——内部焦距并不是你设多少就是多少因为有折射率在里面起作用实际加工出来的焦点位置和你想的对不上。以前写的那个魔数就是这么来的一个靠实测凑出来的折射修正系数。但没有注释接手的人完全不知道这个 1.5 哪来的。这就是魔数的典型形态它不是随便写的是物理规律加现场实测压缩出来的一个数。删掉它等于删掉一次没人记录过的实验。三、真要改怎么安全地动它说完不能删再说能怎么办。下面这套流程是我在项目里实际用的核心思路是不追求改对追求可控地改随时能退回。第 1 步先做行为快照别急着读代码。改动之前先把现有系统的行为录下来关键输入是什么、输出是什么、时序是什么、异常情况下怎么表现。能加日志就加日志能录数据就录数据。这份快照是你唯一的真相基准——改完之后拿它对照而不是靠记忆判断是不是和以前一样。第 2 步从外部包一层别动内部。不要一上来就重构函数内部。先在调用处包一层校验输入合法性、输出范围、耗时上限。这一层的作用是把原本隐式的假设变成显式的断言。跑一段时间没报警说明你的理解大概率是对的。第 3 步新旧并存留开关。新逻辑和旧逻辑同时存在用配置开关切换。默认走旧路径验证通过后逐台设备切到新路径。一旦现场出问题改个配置就回退不用重新发版本。第 4 步灰度到具体设备。先在内部测试机上跑再选一台关系好的客户设备跑最后才全量。别一次性铺开——工控系统的异常往往和具体硬件状态强相关你在一台机器上验证通过不代表另一台也一样。第 5 步一次只改一处。祖传代码最忌讳顺手一起优化。你改了三处出问题不知道是哪处的锅又得全退回去。一次一个提交一次一个变量。第 6 步验收标准要量化。跑起来没问题不是验收标准。要写清楚加工精度达到多少、连续运行多少小时无异常、覆盖哪几种工况。量化标准既是验收依据也是将来再改时的新快照。四、AI 时代祖传代码有了新解法这几年最大的变化是大模型能帮我们做代码考古了。以前接手一段没人懂的代码只能一行行读、一遍遍试、厚着脸皮问可能已经离职的前同事。现在可以把整段代码丢给模型问它这段逻辑在做什么这个魔数可能是什么含义这几个分支分别对应什么场景有没有明显的边界问题它的回答要当线索不当结论——它没见过你的设备不知道那台机器的脾气。但作为第一遍扫读效率提升是实打实的以前两天才能摸清的模块现在半小时能有个大概判断。但有一条红线不要让 AI 直接改祖传代码。它没有后果感不知道删掉那一行会不会让某台设备在夏天下午三点飞车。它可以当考古学家不能当外科医生——主刀的还是得是那个手放在急停上的人。我自己就翻过车。让 AI 做裸指针到智能指针的替换还顺带了数组到 vector 的变更——生成的代码看着很漂亮我就直接导进去用了。结果跑到那一段软件直接崩了查了小半天才定位到是这次替换引入的问题最后还是靠人工一行行复检才找出来。教训就一条AI 给的代码当参考不当交付。五、说到底祖传代码不是技术债那么简单。它是行业知识的一种退化形态的存储——那些没人写下来的经验、没人记录的事故、没人解释的妥协最后都以魔数和分支的形式沉淀在代码里。所以对待它的正确态度不是消灭是理解之后再决定。能不动就不动必须动的时候按流程动留好退路。真正该做的是从今天开始新写的代码尽量别让它变成下一代人的祖传代码。哪怕只写三行注释说清楚这个数字为什么是这个值二十年后那个接手的人会感谢你。本系列做了 20 年工业控制 C说几句得罪人的实话工控的祖传代码为什么谁也不敢删本篇待更新视觉定位的精度是怎么一层层骗回来的评论区聊聊你手上最不敢动的那段代码是什么来头

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑