JVS-Rules规则引擎视角:制造业的业务规则,为什么不该走“编译→发版“这条路
跟一个做MES开发的朋友聊天,他讲了一件让他很崩溃的事。
他们给一家电子厂做质检系统,质检判定规则写在代码里。客户每个月至少改两次判定标准——有时候是放宽一个参数,有时候是加一个新的缺陷类别。
每次改规则,流程是这样的:
- 客户邮件通知→品质部确认→提需求给IT
- IT评估影响范围→修改代码→本地测试
- 测试通过→发版到测试环境→品质部验收
- 验收通过→发版到生产环境→上线
一个参数修改,最快一周,慢了两周。
他跟我说:"最讽刺的是,改的内容可能就是决策表里的一个数字,从0.8改成1.0。但这个数字被编译在代码里,就得走完整的软件发布流程。"
一、规则编译进代码,技术上是"对"的
先说公平话。
把业务规则写成代码,在技术上是完全正确的做法。代码可以编译、可以优化、可以跟系统深度集成。对于变化不频繁的规则,硬编码是最简单、最高效的实现方式。
问题在于:制造业的业务规则,变化频率远超大多数人的预期。
前面说了,质检标准每个月改、报价逻辑每个季度调、预警阈值随着设备老化要动态更新、排产约束随着订单结构变化要重新配置。
这些规则的变化频率,跟软件发版的频率完全不在一个量级。
规则可能每天变一次,但发版可能每两周一次。中间的时间差,就是"系统规则跟实际业务脱节"的时间窗口。
二、编译架构的根本矛盾
从技术架构的角度看,"规则编译进代码"的根本矛盾是:规则的变更周期和系统的发布周期不匹配。
编译型架构的特点是什么?代码写完→编译器翻译成机器码→打包部署→运行。这个过程保证了执行效率和系统稳定性,但也意味着:每一次逻辑变更,都需要重新走一遍"编译→部署"的流程。
对于核心系统逻辑(比如数据模型、接口协议、权限框架),这种架构完全没问题。这些东西本来就不该频繁变动。
但对于业务规则(比如"这个缺陷在A级客户那里算致命缺陷,在C级客户那里算轻微缺陷"),编译型架构就太重了。这条规则可能下周就变了——因为客户更新了标准。
本质上,业务规则和系统逻辑是两种不同性质的东西,不该用同一种技术架构来管理。
系统逻辑是"基础设施",变化频率低,稳定性优先,适合编译型架构。
业务规则是"上层应用",变化频率高,灵活性优先,适合配置化架构。
三、"配置即生效"的技术实现
规则引擎要解决的核心技术问题,就是让业务规则从"编译型"变成"配置型"。
具体来说,就是实现一件事:规则的变更不经过编译环节,直接生效。
技术上怎么做到?
1. 规则和数据分离
传统的代码架构里,规则和数据混在一起。改规则就要改代码。
规则引擎的核心设计原则是:规则以"数据"的形式存在,而不是以"代码"的形式存在。规则存储在数据库或配置文件中,系统运行时动态加载规则,而不是在编译时把规则写死。
2. 规则的解释执行
规则不以编译后的机器码形式存在,而是以"可被解释执行"的结构化形式存在——决策表、决策树、评分卡。
系统在运行时读取这些结构化的规则定义,通过规则解释器来执行。规则变了,只需要更新规则定义,不需要重新编译。
3. 规则版本的热切换
规则引擎支持多版本规则并存。新版本规则配置好后,可以立即切换生效,也可以定时切换。切换过程不需要重启系统,不需要重新部署。
这就是所谓的"热部署"——规则变更实时生效,零停机。
4. 规则执行的审计追踪
每次规则执行时,引擎自动记录:输入了什么数据、命中了哪条规则、为什么得出这个结果。这些记录本身就是"规则执行日志",可以用于审计追溯和问题排查。
四、对制造业意味着什么
技术架构的选择,最终影响的是业务层面的能力。
响应速度——规则变更从"两周发一次版"变成"配置完即时生效"。业务变化多快,规则响应就有多快。
维护成本——规则不再是代码的一部分,不需要开发人员介入。业务人员自己就能配置和维护规则。
风险控制——规则配置完可以先模拟测试,用历史数据跑一遍验证没问题再上线。避免了"改一行代码,出了一个大Bug"的风险。
知识沉淀——规则以结构化的形式存在,而不是散落在代码注释和开发人员的脑子里。人可以走,规则还在。
五、结语
把业务规则编译进代码,技术上没有错。但对于变化频繁的制造业业务规则来说,这个技术架构太重了。
制造业需要的是一种"配置即生效"的技术架构——规则以数据形式存在,通过解释执行而非编译执行,变更即时生效,不经过软件发布流程。
这不是一个"功能"层面的需求,而是一个"技术架构"层面的选择。
选对了架构,业务灵活性是自然的结果。选错了架构,再多的功能也跟不上业务变化的节奏。
