免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

接手烂尾系统,续写还是重构?三维度量化评估决策框架

接手烂尾系统,续写还是重构?三维度量化评估决策框架 接手一个烂尾系统第一反应通常是打开编辑器就干。但真正决定你是续写还是重构的从来不是代码本身而是三个东西可维护性、技术债和历史数据。我见过太多人接手后就急着补功能结果发现代码根本跑不动想起来改两行忘了哪个模块还在报错也见过上来就喊重构结果业务数据搬不过去老板看到交付时间直接炸毛。这两种情况的根本问题都是同一个没在动手前想清楚现状和边界。这篇文章想聊的就是这件事。我会从可维护性评估、技术债盘点和历史数据判断三个维度给你一套判断框架和实操方法。适合刚接手别人留下的系统的开发、被迫维护老旧项目的技术负责人以及要给老板或客户拿出一份明确方案的人。看完你会知道续写和重构不是拍脑袋选出来的而是可以从代码、环境和数据三个层面量化推出来的结论。1. 先别动手用一张评估清单摸清家底1.1 接手烂尾系统最容易犯的错我先说说最常见的翻车现场。很多人接到一个烂尾系统第一件事是打开代码找入口或者跑起来点两下觉得“好像还行”于是直接在现有代码里加功能。加了两周之后发现原来系统里有个隐藏的定时任务每天晚上会覆盖你新写的数据或者你改一个工具类结果三个模块同时报错而这三个模块连测试都没有。这时候你再想回头做重构已经晚了因为你在错误的基础上又叠了一层自己的改动。另外一个极端是代码还没看明白就拿着架构图去老板那里说“必须全重写”理由一堆但老板问“数据怎么办、什么时候能上线、这期间业务怎么跑”的时候一句话答不上来。类型不同但结果相同项目继续烂下去最后背锅的还是你自己。所以接手后的第一步不是写需求分析也不是拉着团队开技术选型会而是先花一到两天把系统“底细”摸清楚。我给这种摸底起了一个名字烂尾系统体检。它核心回答三个问题系统现在能不能跑数据重不重要代码坏到什么程度这三个问题的答案基本决定了续写和重构的走向。1.2 从三个维度搭建判断框架我习惯用一个三维度模型来评估接手系统分别对应可维护性、技术债和历史数据。第一个维度是可维护性回答“代码和工程能不能被继续维护下去”。它看的是代码结构、模块划分、命名规范、测试覆盖、文档完整度、以及现有团队对它的熟悉程度。可维护性好你就能在上面平稳续写可维护性差哪怕功能看起来很完整后续每一步都会很痛苦。第二个维度是技术债回答“现有实现欠了多少账还债的成本是多少”。这里不止是代码质量问题还包括依赖的第三方库是否还维护、使用的框架是否到了生命周期末尾、部署方式是不是已经没人会配了、中间件版本是不是改一次就要踩一遍坑。技术债多的系统往往改动一个点要连带处理好几个历史包袱续写的边际成本会越来越高。第三个维度是历史数据回答“系统后面有没有值得保留的东西”。这里的“数据”不单指数据库里的记录还包括业务流程、权限配置、历史单据、报表逻辑、甚至是某些算不清楚但业务上必须迁移的隐性规则。如果历史数据很重、迁移很复杂那么重构的成本和风险都会显著上升对应的决策就会偏向续写或渐进式改造。把三个维度分开看你会得到一个不太一样的判断可维护性决定“敢不敢改”技术债决定“改哪里划不划算”历史数据决定“重来一次代价有多大”。三者组合才构成完整的决策依据。1.3 明确续写和重构的边界在继续之前先把定义说清楚。我这里的“续写”不表示完全不动原有代码而是在现有系统基础上做扩展、修复和局部优化。续写也允许重构只是范围集中在某个模块内部比如重写一个服务、替换一个库但整体架构和核心数据模型保持不变。“重构”则分两种情况。一种是在保留系统外部行为和数据结构的前提下重写内部实现这种重构是可以分批推进的比如按模块替换、按接口重写另一种是推倒重来重新设计数据库表、重新搭项目结构、重新梳理业务逻辑原有的数据得做一次迁移甚至人工清洗。我的经验是在决策阶段不要用二元对立去思考把选项拆成“全部续写”“局部续写局部重写”“核心重写数据迁移”“彻底重来”四档。大多数真实情况落在中间两档真正需要完全重来的是极少数。判断的方法就是接下去这套评估操作。2. 可维护性评估这套代码到底能不能拿得起来2.1 代码层面的体检方法开始体检时我建议先打开工程目录看三样东西入口文件、模块划分、依赖清单。不要急着看每个文件的内容先看结构。如果整个项目堆了上千个文件没有清晰的目录分层工具函数和业务逻辑混在一起没有或者只有一份可读性很差的 README这属于可维护性偏差。如果目录分层清楚能看出 controller、service、dao 或者 component、feature 这样的模块边界那说明写代码的人还有基本章法可以从业务入口逐步往深处看。具体可以做一个操作把项目跑起来在主流程里加日志或者直接点开业务页面挨个看核心链路对应的代码位置。花半天时间把系统的核心功能对应到代码文件能做一张“功能-文件”映射清单。如果做这张清单的过程中频繁迷路、找不到逻辑、跳了好几个来回才能定位一个功能的实现那这个系统的可维护性就要打低分。还要检查代码里的重复程度和连接度。我常用一个笨办法搜索有没有大量复制粘贴的代码块比如同样的条件判断出现在多个类里、同一种字段转换逻辑被写了五六遍。这种重复意味着每一次修改都要做“全局搜索-逐个替换-小心测试”维护成本会随功能数量指数上升。另一个重点是测试。烂尾系统通常没有测试或者只有那种写着“Test 但是没断言”的假测试。你可以检查一下测试目录看看测试数量和代码量的比例。如果完全没有测试那你在续写时每改动一个地方都得靠手工回归风险极大。这种情况下如果没有预算补测试需要非常谨慎地评估改动范围尽量做小步修改。2.2 运行环境与部署方式代码可读性是一回事能不能真正跑起来是另一回事。我遇到过不少“看起来还凑合但实际上没人能部署”的项目。体检时必须把运行环境和部署方式纳入评估。具体操作上我会重点确认五点系统依赖哪些中间件比如数据库版本、缓存、消息队列、对象存储等。配置项在哪里管理是写死在代码里、放在配置文件里还是已经有配置中心。部署是手工操作还是已经有 CI/CD构建脚本是否完整。有没有 Dockerfile 或类似的环境描述文档能不能在新机器上从零还原一套环境。日志怎么查看线上出问题时有没有办法定位到对应的代码行。这五点做下来你对“续写”的难度会有更直观的感觉。如果系统只能跑在某个同事的电脑上、数据库账号密码在某个离职员工的聊天记录里、部署要手动登上服务器改一堆配置那就算代码本身再好直接续写也等于带着镣铐跳舞。这种情况下哪怕你最终决定续写也应该安排一个“环境标准化”的前置任务先补上可重复部署的能力再做业务功能。2.3 文档与知识传递现状烂尾项目还有一个显著特点文档和现实严重脱节。我经常遇到的情况是有完整的《系统设计说明书》和《接口文档》但跟实际代码一对接口改了名、表结构换了字段、业务流程已经走完另一个方向。这种文档不但没有帮助反而会误导。评估文档状况时不要只看有无要看“文档-代码-业务”三者是否一致。我会做一个简单验证挑一个核心业务流程比如下单、审批或者数据同步先把文档里描述的步骤读一遍然后再去代码里追踪一遍如果两者对不上说明文档失真。对不上的地方记录下来作为技术债的一部分。同时还要摸摸“人”的维度写过这个系统的人还在不在还在公司那就多拉着问几次把关键疑点一次问清如果已经离职就看聊天记录、代码注释和个人文档里有没有留下线索。代码注释也很关键但不要只看解释性的注释要看那种“为什么这么写”的注释。烂尾系统里偶尔会有非常关键的经验沉淀比如某个硬编码的数值原来是跟外部系统对齐过的不能乱改。2.4 给可维护性打一个分三项都摸完之后我给可维护性打一个粗略的分范围 0 到 10。不需要太精确但评估时要有明确依据。比如代码结构清晰、有测试、模块边界明确可以打 7 分以上结构乱但是有入口文档、依赖简单可以打 5 分左右代码乱、部署靠手工、文档失真、测试为零基本就打 2 分。这个分数只用于内部判断但它会给后面的决策框定一个范围可维护性在 6 分以上续写占优3 到 5 分之间要看技术债和数据的综合情况3 分以下除非数据迁移成本极高否则都应该认真考虑重构。我说一下为什么不用代码规范类的工具来打分。像 lint、静态分析这些工具对大型组织的持续维护有作用但对一个烂尾系统做接手评估它们往往给出的是“总行数”“复杂度分布”这种抽象指标不能帮你直接回答“要不要重写”。我更喜欢用人肉遍历的方式因为评估过程中你能积累大量业务背景这对后续续写或重构都是必不可少的信息。3. 技术债盘点哪些债必须还哪些可以继续背3.1 用“债务类型”而不是“错误清单”来分类技术债这个词被说烂了但真正实操时很多人会把技术债等同于 code smell。我的经验是技术债应该按“债务类型”来分因为不同类型的债还债方式、代价和影响范围完全不同。我把它分成四类代码债包括坏味道、重复代码、命名混乱、函数过长、模块耦合等。这类债适合在续写过程中随改随清。架构债包括系统分层不合理、模块之间循环依赖、数据库表设计不合理、业务逻辑分散在多个服务里等。这类债伤筋动骨通常需要动架构或大规模重写。基础设施债包括依赖的库版本过老、中间件没有高可用、部署缺少自动化、系统还是在单机上跑着等。这类债会影响生存能力但不一定需要重写可以先补基建。测试债包括完全没有自动化测试、测试覆盖率极低、测试环境缺失等。这类债不直接体现在功能上但会在你改代码时放大风险。这样分类的好处是你在盘点时不会因为看到代码乱就笼统地建议重写也不会因为逻辑清晰就忽视基础设施里的隐患。每一类债都对应不同的处置优先级和方式。3.2 技术债的修复成本怎么估算技术债怎么算“量”老实说没有特别科学的公式我一般用“改动一个普通需求的综合成本”来反推。比如在一个健康项目中加一个列表页字段也许需要半天但在烂尾系统里因为要改数据库表、改查询SQL、改接口、改前端页面、还要提心吊胆地确认定时任务不会覆盖数据可能要花两天甚至更久。这个时间差就是技术债带来的额外成本。做预算时我会把系统里“最核心的业务链路”拆出来挑三到五个典型改动场景比如修改订单状态、增加一个导入导出、调整权限配置等估算每个场景在现有系统上的改动时间。再把同样几个场景假设在一个干净结构上需要的时间对比一下。如果平均时间差在 3 倍以上那说明技术债已经很高续写短期可以走但长期一定越来越慢。还要把“升级依赖”当做一个固定项来评估。检查一下项目用的框架和中间件版本跟它们当前的主流版本比一比。如果已经落后三四个大版本或者官方已经停止维护那就必须把升级成本写进决策里。注意框架升级表面上是改几个版本号实际上是连锁反应老 API 没了、配置格式变了、第三方库不兼容了、性能行为也不一样了。这种连带成本经常被低估我见过一个项目因为把 Java 版本从 8 升到 17光适配一个老消息队列就用了一个星期。3.3 识别“杀伤力最强”的高息债务有些技术债可以放一放但有些债是“高息债务”每多拖一天都在增加利息。接手评估时要特别标记这一类。高息债务有几个典型特征。一是没有测试保护的核心链路你每次改动都像在雷区里跑步二是数据一致性靠人工补偿比如某个模块如果运行出错了需要有人手动改库才能恢复凡是出现这类设计都是在持续消耗人工三是硬编码的耦合比如某些业务开关靠改代码重启生效某些外部配置散落在多台服务器上那每上线一次都是夜间危险作业四是数据库表设计跟现实业务已经对不上了比如原来单品业务后来变成多规格但表还是单品逻辑业务在代码层面疯狂打补丁。对于这类高息债务即使最后决定续写也要规划一个“优先偿还”名单。不要一次性还清而是每迭代解决一两项。比如当前迭代先给核心链路补测试下个迭代再把硬编码配置迁移到配置中心。分期还债的思路会让续写的风险逐渐降低也更容易得到老板和客户的支持。4. 历史数据是关键变量先算清楚迁移成本再说重构4.1 数据本身可能比代码更值钱很多技术人讨论续写重构眼睛只盯着代码但我接手过几个系统后发现真正束缚决策的往往是数据。代码可以推倒重写但运行几年积累的订单、客户、财务单据、配置信息这些没法凭空造出来。丢了、错了、迁移不完整都是事故。所以在拍板之前一定要摸清数据家底。具体来说看看有几个数据库、多少张表、每张表大概多少行、哪些表是核心业务表、哪些是日志或临时表、数据年龄跨度多大。还有一个关键点数据库里有没有外键约束如果没有外键表之间靠代码维持关联那数据迁移时就要额外小心不能指望数据库帮你检查引用完整性。另一个容易忽略的点是数据里的“隐性状态”。比如订单表里有个状态字段但实际业务中状态不只等于这个字段的值还要结合售后表、物流表一起判断。这种“状态是推断出来的”情况在烂尾系统里很常见。如果决定重构你不仅要迁移原始数据还要把状态计算逻辑一起迁移否则新系统看到的数据会跟旧系统不一致。4.2 业务价值和迁移成本怎么对账对历史数据的判断核心是做一次“价值-成本”对账。价值维度包括这些数据还有没有人用是不是有财务、合规、历史追溯的需求有没有客户在依赖这个系统查历史记录成本维度包括数据量大小、表结构复杂度、数据质量、以及是否存在一条能自动跑的迁移脚本。举个例子。我在评估一个考勤系统时发现代码非常老框架停止维护几乎所有人都建议重写。但是我打开数据库一看里面有过去五年上百万条的考勤流水还关联着各家客户的排班规则和薪酬计算结果。这些数据如果重写后对不上账客户马上会有意见。最后我们决定不推倒重来而是把考勤计算模块单独拆出来重写历史流水继续保留在原库新模块通过接口读取存量数据。这就是数据价值改变了技术决策方向。做对账时我习惯画一张简单的表核心业务对象类型、数据量级、数据年龄、业务重要性、迁移难度、缺数据影响。不用特别精确但要把高价值、高迁移难度的数据标出来。只要这份清单里出现两三项“重量级”数据那么彻底重来的方案基本就不成立了更现实的做法是“老库继续服务新系统逐步接管”。4.3 业务连续性会限制重构节奏历史数据带来的另一个问题是业务连续性。系统虽然烂尾但只要还在被使用就有用户在依赖。需要想清楚如果重构期间旧系统要下线业务能不能接受空窗期如果不能那新系统就必须和旧系统并行运行一段时间数据要持续同步。这种“并行期”的持续时间和工作量经常超过构建新系统本身的时间。并行期最短的路径通常是使用“双写”策略新系统上线后新旧系统同时写入由后台任务或消息队列做双向或单向同步等新系统稳定了再停掉旧系统。但双写有一个前提就是新老系统的数据模型要能映射得清楚。如果表结构完全不一样、业务规则也改了那同步逻辑会非常复杂几乎等于你在做一套数据迁移中间件。如果业务连续性要求高技术上又不支持平稳迁移那就应该果断放弃“推倒重来”型重构改为“绞杀者模式”逐个模块替换。每替换一个模块只迁移这个模块相关的数据和流程保证整个系统始终处于可用状态。虽然总工期可能比“一次性重构”更长但风险和失控概率都要低得多。5. 什么情况选续写识别能救的系统而不是硬救5.1 适合续写的三个典型信号不是所有烂尾系统都该重写。我总结了几个适合续写的典型信号命中越多越应该偏向续写。第一个信号是系统核心流程可以跑通即使有 bug 也集中在边缘功能上。比如下单、支付、审核这些主链路能走完只是导出报表偶尔格式不对、某类特殊配置没生效。这种系统表明最初设计的人对业务流程有清晰理解主线是对的续写时只需要补断层。第二个信号是代码结构虽然乱但还能看懂模块之间的依赖关系基本有迹可循。你花半天能把核心链路对应到代码文件改一个字段能大致猜到影响范围这就值得在现有基础上梳理优化而不是从零开始重新理解业务。第三个信号是历史数据复杂而且高度关联。数据库里有大量表表之间外键关系复杂多年积累的线下补录数据、历史版本遗留数据混在一起根本不可能清洗干净。这种情况下重写意味着数据迁移风险巨大而续写只要保留数据模型不做大拆大动反而能把风险控制住。5.2 续写之前先做三件清理事确定续写后也不要直接开工先做三件清理可以让后续开发舒服很多。第一件是建立基线把当前代码打一个干净的标签确保你之后改坏了可以回退。同时把系统跑一遍记录现有功能和已知问题整理成一份基线文档。这份基线在后续测试和回归时都会用到。第二件是补基础测试。不用追求高覆盖率但至少把核心链路每一条路径测一遍比如登录、创建订单、发起审批、数据回滚等。没有自动化的条件就做一份详细的手工测试用例保证每次改动后能快速回归关键功能。第三件是环境标准化。把部署流程、配置管理、依赖安装这些基础事项修正做到任何一台新机器能按照文档从零部署成功。这一步看起来不直接产出业务价值却是后续所有工作的加速器。我见过一个项目团队花了两天标准化环境结果原来需要一上午的部署测试变成十分钟整体效率明显提升。5.3 续写阶段的策略小步走、勤重构续写不是“不管三七二十一把功能往上堆”。相反续写阶段更需要克制。我给自己定的原则是每次只改一个点改完立刻验证验证过了再继续下一个点。不要试图在一个版本里既加新功能又改老结构又升级框架那样只会引入大量不确定性。在这期间随时做“局部重构”。比如你发现某个函数被调用很多次而它的实现已经明显不合理可以先把它单独重写写完备注和测试后替换掉所有调用点。这种局部重构是续写阶段的常态操作它能让你在处理需求的同时一点一点把旧代码改干净。做完三四个局部重构后系统的可维护性分数会明显上升后续的改动会越来越顺手。我会特别注意记录“改动历史账本”每一次因旧代码限制带来的额外工时都记下来。记一段时间之后这份账本就变成跟老板讨论“是否需要重构”的最有力证据不是凭感觉说系统烂而是有具体数字说明哪里拖累了效率。6. 什么情况选重构什么时候别心疼旧代码6.1 必须重构的危险信号有些系统确实到了不重构不行的地步。我判断标准不是“代码烂”而是以下几个信号同时出现。第一个信号是核心链路逻辑已经不可维护。比如订单状态字段被十几个地方改动没人能说清楚哪一处是最终生效的或者一个“创建订单”的接口里塞了三百行顺序执行逻辑中间穿插着各种 if 和 for每加一个新需求都担心影响老逻辑。这种代码已经从“凌乱”恶化到“危险”续写的成本已经高于重写。第二个信号是技术栈依赖已经走死。比如项目依赖的一个基础框架是公司内部淘汰多年的、网上找不到资料、没有新版本、修复 bug 需要自己改框架源码。如果整个系统建立在这种地基上越往后越寸步难行。在这个时候即使数据迁移有成本也要考虑对系统做一次框架层面的大升级或模块替代。第三个信号是业务模式已经发生了根本变化老系统是为旧业务设计的而新业务需要的数据和流程跟旧模型完全不匹配。比如一个商品管理模块原来是单商品现在要做多规格、多 SKU、以及组合商品数据库表结构完全没办法平滑扩展。这种场景下硬续写等于每天在扭曲的老模型上打补丁不如对相关模块做彻底重写。6.2 推荐的重构切入方式绞杀者模式如果你已经决定重构我强烈建议不要用“关门重写”的方式。除非这是一个内部工具或者业务已经暂停只要系统还有真实用户在跑就应该考虑用“绞杀者模式”来做替换。绞杀者模式的核心思路是不重写整个系统而是把系统拆成多个边界清晰的模块一次只重写一个模块重写完成后用新模块替换旧模块并在这一小块上把数据迁移、接口切换、回归验证做完再推进下一个模块。用这种模式有几个好处。第一每个阶段的交付物都是可运行的业务方始终能看到进度而不是等几个月拿到一堆“还没好”的代码。第二风险被切碎了一次只冒一小块风险出了问题影响面可控。第三重写过程中能从老系统里的实际行为学习到真实的业务规则而不是靠想象设计新系统做出来的东西更贴近真实需求。当然绞杀者模式也有前提老系统必须能被拆解成较独立的模块模块之间的接口要能稳定定义。如果老系统是一个没有边界的大泥球模块之间疯狂互相调用那么绞杀者模式第一步就很难切入。这种情况下可能需要在老系统外层先加一层防腐层把外部依赖切到可控接口上再逐步从核心业务往里拆。6.3 重构时保留数据的核心技巧重构中最容易出问题的环节就是数据迁移这里分享几个实战技巧。首先永远不要在生产环境直接对原表做迁移。正确的做法是先把生产数据做一份完整备份恢复到预发环境在预发环境跑迁移脚本校验无误后再在正式切换窗口里执行第二遍。正式切换前要再做一次增量备份或复制确保没有丢数据。其次迁移脚本要写成可重跑的。每一条迁移操作最好幂等即重复执行结果一致这样中途出错、修复脚本后可以安全重跑不用纠结哪一条已经执行过。实现幂等可以靠唯一键约束、条件判断只在字段为空时写入或者在脚本里自动记录执行进度。最后迁移完成后不要立刻删掉老库。至少要保留 30 天到一个季度期间一旦发现新系统的数据有问题还能回老库追溯。我见过不少项目省这一步结果上线两周后客户说某条历史单据金额不对新库查不出来老库又删了最后只能全量翻日志去证明旧账。7. 实操三天时间产出一份“续写还是重构”评估报告7.1 第一天代码与环境摸底第一天不要碰业务访谈先自己在代码里待上一整天。建议按这个顺序走一遍打开工程结构记下模块划分和主要目录把项目跑起来记录启动时需要哪些依赖、配置从哪来、有没有报错定位核心业务链路把主流程对应的代码文件列出来检查测试目录统计测试数量和覆盖率检查部署脚本和 CI/CD 配置确认能不能一键发布顺手记录所有依赖框架和中间件的版本。白天摸完这些晚上回去整理成一张结构化表格。这个表格最后会变成评估报告的核心部分每一项后面最好附上证据比如关键文件路径、启动报错截图、依赖列表等。证据比描述有说服力得多。7.2 第二天数据、历史和业务访谈第二天上午打开数据库逐个数据库、逐个表过一遍。重点记录表数量、核心表行数、有无外键、有没有明显的数据质量坑比如空值率极高的字段、重复记录、状态不一致的数据。同时看一下有没有定时任务、批处理脚本它们往往藏着大量业务逻辑也是最容易在重构时被遗忘的部分。下午开始访谈业务方。不要问“你们需要什么新功能”而要先问“当前系统哪些功能你们每天都在用”“哪些功能你们已经不用了但还挂在菜单上”“哪些问题让业务最痛苦”。这些回答会直接影响重构的范围判断那些没人用的页面重构时可以直接砍掉评估的工作量能瞬间降下来。访谈时还要问清楚“历史数据的使用频率”。比如财务报表是按月看的三个月前的数据就很热门但也有系统里存着十年前的老数据业务根本没人在查。低频、低价值的历史数据完全可以考虑归档不用背负迁移全部数据的包袱。7.3 第三天输出结论与路线图第三天上午把前两天的信息汇总对照可维护性、技术债、历史数据三个维度打分填表。下午写结论结论不建议只有“续写”或“重构”两个字而应该是一份决策路线图。路线图里至少包含这几项整体结论续写为主、局部重构为主、还是要推倒重来核心依据从评估结果中挑出最能支撑结论的三个关键点分期计划把工作拆成几个阶段每阶段目标是什么、交付物是什么、预计多久存量数据处置方案是保留老库、迁移还是归档风险提示哪些地方最容易出问题需要谁配合。跟老板或客户汇报的时候也建议用这张路线图不要用一叠代码分析PPT。对方更关心的是“要用多久、要多少人、有什么风险、老数据怎么办”这些在路线图里直接能回答。同时要把“数据迁移成本”作为单独一个重点页面来讲很多决策到最后都卡在这一块。8. 常见问题与排查技巧实录8.1 五个高频决策问题我把自己和同行踩过的几个典型问题整理了一下放到这里供你对照参考。第一个问题代码很烂但业务方坚持要快速加新功能怎么办这种场景我建议先做一个“最小改动计划”找出一条路径让新功能能在不动老架构的前提下先上比如加独立模块、单独建表、通过接口跟老系统通信。先让业务跑起来再回头规划重构。抵制住“顺手把老代码改漂亮”的冲动因为那会让交付延期。第二个问题技术债很重但没有专人负责重构只有我一个人维护怎么选一个人维护的重系统尽量别选“一次重构”。更像样的路线是先做环境标准化和补测试把系统稳定住然后挑最影响你日常工作的模块用绞杀者模式局部重写。目标不是“没有技术债”而是“每个改动都变得可控”。一个人做重构容易陷入泥潭小步替换更适合。第三个问题历史数据多但质量很差迁移价值不高怎么权衡如果数据质量差到已经影响使用那这本身就是一个业务问题。可以先只迁移“仍在使用的活跃数据”和“有财务或合规要求的数据”其他历史数据打包归档放到只读存储里备查。这样可以大大降低迁移量同时还能满足“历史不能丢”的诉求。第四个问题系统已经在线上跑着重构期间不能停机怎么做这个问题答案基本就是并行期双写灰度切换。先让新系统在老系统旁边并行跑一段时间新老数据同步验证稳定后逐步把流量从老系统切到新系统切完后老系统继续留一段时间备查。不要指望一步步做成“节假日零点切库”这种惊险动作那是对用户不负责。第五个问题老板说“重构吧但下个月要上线”这种要求接不接我的原则是绝不承诺这种上线时间。重构和新增功能不一样它面对大量不确定性你永远不知道迁移脚本会在哪张表上报错。比较稳妥的做法是把方案拆成多个阶段确保第一阶段“最优先替换的模块”能在近期上线然后以迭代方式持续推进让业务先看到增量效果后面才愿意给足够的时间。8.2 决策速查表判断维度偏向续写的信号偏向重构的信号代码可读性核心链路可以追踪、模块边界基本清晰核心逻辑混乱、改动一个点影响一片测试保护有部分关键路径测试或可快速补测试完全没有测试也无法快速搭建测试环境运行环境可以标准化部署配置可管理依赖个人电脑环境部署靠手工搏命框架依赖主流框架、社区活跃、升级可控框架老死、依赖停更、升级成本无法估算数据模型与当前业务匹配可继续扩展与业务方向严重脱节表结构无法演进历史数据数据量庞大、价值高、清洗难度大数据量小、质量堪忧、可归档清除业务连续性系统始终有人用不能停机重建使用方可以接受一段时间功能冻结这张表不用逐项严格对照但它能帮你快速抓到一个结论方向。我曾经在一家传统企业做过一次判断代码可维护性极差几乎每个信号都指向重构但数据库是十多年积累的订单和客户记录且业务要求全年无休运行所以最终方案是“数据留在原库应用层分模块替换”。表格里两个维度的信号打架时就以历史数据和业务连续性为最高优先级这是我在多个项目里验证过的原则。8.3 一条务必记住的底线最后分享一条我的个人体会接手烂尾系统判断“续写还是重构”最忌讳的是在没摸清数据的情况下谈技术方案。代码烂可以重写但数据乱了就真的很难收拾了。我在实际工作中养成了一个习惯做任何大决策前先把数据库逛一遍把核心表的数据量和状态分布截图存下来后续不管是续写还是重构这些截图都能帮你快速回忆起当时的判断依据。另外一个小技巧把评估过程中的所有疑问记成一个“未知清单”不要边评估边猜测。比如“这个字段为什么总是空”“那个状态什么时候置为已完成”这些问题先收集起来再找机会去业务人员那里确认或者看旧代码找线索。干净利落地承认“我现在还不知道”比假装看懂要好得多这份清单最后往往就是续写或重构时最宝贵的需求素材。接手烂尾系统从来不是什么光鲜的事但一个判断准确、节奏稳定、过程透明的接手方案通常能让这个看起来一团糟的项目变成团队里最有价值的资产。判断清楚了续写是在治病重构是在换器官两者都是好选择怕就怕判断不清楚最后既没续好书也没重构好还白白搭进去时间和信任。
返回列表