
过去十年,企业软件领域有一条默认的“标准路径”:业务不顺,就上套件;套件不行,就换厂商。这套逻辑在信息化初期有效,因为企业流程相对固定,系统边界清晰。但今天,当业务场景被渠道碎片化、供应链波动和实时决策需求反复冲击时,越来越多企业发现,遗留系统真正的障碍不是“技术老旧”,而是当初的设计逻辑与今天的业务场景已经错位。于是,行业趋势正在从“替换系统”转向“治理债务”。而治理技术债,最核心的动作不是采购,而是定制——按业务场景定制度量口径、重构优先级、集成策略和数据迁移方案。
一、从“大爆炸”到“绞杀式”:重构策略的路线之争
处理遗留系统,最直观的冲动是“推倒重来”。这种思路背后的隐喻是:旧系统是茅草屋,拆掉建新楼。大爆炸式重写(Big Bang Rewrite)在行业里有过大量案例,成功者少,失败者多。原因不在于新系统不好,而在于旧系统承载的隐性知识无法被代码库替代——那些写在存储过程里的折扣规则、隐藏在报表公式中的业务口径、甚至某位离职主管口头约定的“潜规则”,都会在重写过程中丢失。
另一种做法是“绞杀式重构”(Strangler Fig Pattern),即在新旧系统之间建立过渡带,逐步把业务流量从旧系统“绞杀”到新系统。这种做法的优势是风险可控,每一次切片都能验证业务价值;劣势是周期长、协同成本高,要求团队同时维护两套逻辑。适用边界也很清晰:如果旧系统核心流程稳定,但周边功能频繁变化,绞杀式是最好的选择;如果旧系统已经无法支撑交易峰值,且团队已流失殆尽,那么渐进重构反而会延长痛苦。
这里的关键在于,重构策略本身不是选择题,而是定制题。企业需要根据自身业务场景决定重构的颗粒度——是按订单链路切,还是按客户群切,还是只重构报表模块?一位制造业CIO曾说过,他们花了三个月分析旧ERP中两千多个自定义字段,最终发现只有三百多个被真正使用,其余都是历年项目留下的“考古层”。这就是技术债的真实面目:不是代码差,而是“积累”差。定制化重构的第一原则,就是把无差异的部分交给标准能力,把有差异的部分做成定制服务,而不是一锅端地“升级”。
二、接口集成:从“买总线”到“定制适配层”
遗留系统重构绕不开接口集成。传统做法是引入企业服务总线(ESB),试图用一种统一架构把老系统、新系统、SaaS服务全部串联起来。ESB的初衷很好,但在实践中容易变成“中心化瓶颈”:老系统升级了字段,总线适配器就要跟着改;新业务要对接一套第三方API,总线团队排期三周。这个模式的本质是“用集成平台掩盖系统差异”,而不是“治理差异”。
行业趋势正在向“定制适配层”转移。所谓适配层,不是标准中间件,而是针对每个遗留系统的协议特征、数据模型和调用方式,编写轻量的定制化接口服务。比如某物流公司,其TMS系统是二十年前用PowerBuilder写的,数据库表结构混乱,没有对外开放API。他们并没有急着替换TMS,而是开发了一套定制适配服务,将TMS的核心运单状态实时抽取到消息队列,再以REST API供新搭建的订单中台调用。这个适配层只有不到两百行核心代码,但它精准地封装了TMS的“坏味道”,让新系统不必理解老系统的“历史包袱”。
横向比较两种做法,适用边界非常清楚:如果你要集成的系统数量庞大、且长期稳定,标准总线值得投入;如果你的核心痛点是两三个老系统与业务增长不匹配,那么定制适配层成本更低、见效更快。但要注意,定制不等于“写死”。优秀的定制适配层应该包含接口契约管理、字段映射配置和异常补偿机制,否则就会变成下一笔技术债。换句话说,定制的目标不是绕开问题,而是把问题缩小到可控制、可测试、可演进的范围内。
三、数据资产:迁移策略与技术债的隐性部分
技术债的很大一部分不是代码,而是数据。很多企业重构系统后,新系统运行流畅,但数据报表对不上,财务对账频频出错。原因在于,旧系统的数据模型往往是“按业务操作”设计的,而不是“按业务事实”设计的。例如,一个订单在旧系统里可能被拆成多条记录,分别存储在不同业务表中,状态字段还使用不同的枚举值。重构时如果只做简单的“复制粘贴式迁移”,等于把数据债原封不动搬进新家。
在迁移策略上,行业里有两种典型路线。一种是全量双写,新旧系统同时运行,数据同步写入,直到新系统稳定后切流。这种做法安全,但成本极高,且双写本身需要大量定制开发,来处理事务一致性、回滚冲突和补偿逻辑。另一种是按业务场景“热冷分离”:优先迁移高频交易数据和主数据,历史数据只做归档查询。很多企业低估了后者的价值,总希望一步到位把全部数据洗得干干净净。实际上,技术债治理追求的是“够用的正确性”,而不是“完美的历史”。
这里有一个容易被忽视的细节:数据迁移的成功标准,不应该是“迁移了多少张表”,而应该是“业务人员能否在新系统里复现旧系统的同一个业务结果”。例如,库存台账上的“在途库存”和“可用库存”,旧系统里的算法可能与新系统完全不同。如果迁移时不做定制化的口径映射,上线后库存数据就会“看起来差不多,但就是不对”。因此,数据模型治理必须由业务方深度参与,而不是IT团队单方面写ETL脚本。定制,在这里意味着为每一个关键业务口径建立新旧映射规则,并通过测试样例反复验证。
四、定制开发的克制:避免“二次负债”
谈到技术债治理,很容易陷入另一个极端:既然一切都要贴合业务场景,那就把所有功能都定制化。这种思维会造成新的问题——定制开发往往是点状需求驱动的,缺乏整体架构约束,项目交付后无人持续维护,很快变成比旧系统更难治理的“新遗留系统”。
行业内的成熟趋势是“平台化+定制化”的混合模式。底层技术平台(如云原生基础设施、DevOps流水线、安全框架)尽量标准化,避免团队各自为政;业务层则通过低代码工具、领域模型和微服务编排,实现面向场景的定制组装。例如,一家工程机械企业的售后服务系统,客户报修工单流程完全按业务场景定制开发,但工单引擎本身使用的是成熟开源组件。这样既保证了核心业务差异化的竞争力,又控制了基础组件的维护成本。
要避免二次负债,还需要建立技术债的量化反馈机制。不要只说“这个模块代码很乱”,而是用四个指标来衡量:变更前置时间、故障恢复时长、变更失败率、以及未注释接口数量。每一次定制开发,都应该明确记录它新增了哪些技术债,以及何时清偿。更务实的做法是,在项目立项时就把“债务预算”写入交付清单——允许团队为了上线速度而暂时绕开某些规范,但必须明确偿还节点。定制开发不是原罪,真正的原罪是“只借不还”。
常见问题 FAQ
遗留系统重构,一定要把旧代码全部重写吗?
不一定。全量重写通常只适合“业务价值高、系统耦合度低、团队能完全掌握新架构”的场景。对大多数企业来说,更稳妥的做法是采用绞杀式重构,先梳理出业务场景的优先级,再针对最痛的部分做定制化替换。旧代码不会因为重写而消失,只有当你理解了它背后的业务逻辑,才谈得上“重构”。
如何为技术债的治理确定优先级?
可以从两个维度评估:一是“业务影响”,即该模块的故障或变更对营收、履约、客户体验的直接冲击;二是“技术熵增”,即代码的可维护性、测试覆盖率和接口稳定性。高影响加高熵的模块应当首先处理。另外,不要试图一次性解决所有技术债,建议按季度设定债务偿还指标,把治理嵌入到日常开发节奏中。
定制开发会不会让技术债越积越多?
如果定制是无边界的、缺乏架构约束的,确实会。避免这种局面的关键是区分“面向业务的定制”和“面向实现的将就”。前者是为业务场景设计的差异化能力,属于必要投资;后者是绕开标准组件、临时拼凑出来的补丁,属于高息债务。每接受一笔定制需求前,先问自己:这个逻辑未来有多少变数?如果变数高,就不要把它做死,而是留出配置化、参数化的空间。
企智社