先给结论:不要因为“已经花了开发时间”就默认留用,也不要因为“需求方说不要了”就立刻下线。判断标准应落在三件事上——这段功能是否仍在产生可观测的维护成本、是否与当前业务流程冲突、以及下线它需要付出多少一次性代价。三者中任何一项说不清,就先冻结入口、保留代码,而不是马上删除或强行上线。
留用成立的条件通常有两类。第一类是功能已经嵌入其他仍在使用的流程,例如后台某段统计逻辑被订单导出、对账或客服查询间接依赖,撤掉会连带影响正在跑的业务。第二类是它虽然当前没有明确需求方,但代码边界清楚、没有外部接口、不产生定时任务和存储增长,维护成本接近于零。此时留用的代价只是仓库里多一个目录,可以接受。
下线成立的条件同样具体:功能有独立入口但无人访问、依赖的第三方接口已经停用或需要额外授权、每次框架升级都要专门适配、或者它写入了主流程不认识的字段和状态,导致后续开发要反复绕开。满足其中两条以上,下线通常比继续挂着更省事。
真正需要警惕的是第三种情况:功能已开发但从未上线,也没有任何调用方。它既没有运行数据支撑留用,也没有历史包袱阻碍删除。这时决策依据应回到“未来半年内是否有明确排期”,而不是“删了可惜”。没有排期就归档,有排期就保留在独立分支,不要留在主分支里假装它是正式功能。
评估不能只靠回忆,要拿到可核对的材料。建议按下面顺序收集:
收集完以后做一个动作:把“留用”和“下线”各自需要的工作量写成两列,只填具体条目,不写感受。这个动作的结果会直接影响下一步——如果下线一列超过五条且涉及数据迁移,通常先冻结入口、保留功能,等有明确排期再处理;如果下线一列只有两三条且不涉及数据,直接进入下线流程更划算。
假设某邯郸企业站建设时开发了一套“经销商在线申请”模块,后来渠道政策调整,申请入口关闭,但后台仍保留审核列表。此时有两种做法。
做法一:留用但降级。把前台入口撤下,后台审核列表改为只读,停止发送通知邮件,代码保留。代价是每次升级后台框架时仍需保证该页面能编译通过。适合未来可能恢复申请、且数据仍有查询价值的场景。
做法二:完整下线。先导出历史申请数据到独立归档表,再移除路由、定时任务和相关权限项,最后删除代码。代价是一次性投入,收益是后续升级不再需要适配。适合政策已确定不再恢复、且归档数据可以脱离原系统保存的场景。
两种做法都成立,区别在于你对“未来是否恢复”的判断是否有依据。如果只是“说不定以后要用”,那属于没有依据,应按做法二处理,把恢复成本转移到归档数据上,而不是留在主代码里持续消耗维护注意力。
无论选哪种,第一步都是冻结入口:关闭前台可见入口、停止对外通知、在接口层返回明确的停用状态,而不是让页面报错。这一步的结果是:外部调用方会立刻暴露出来,接下来几天收到的反馈就是判断依赖范围的直接证据。如果没有任何反馈,再进入删除或归档。
例外情况有三种,需要单独处理。第一,功能涉及支付、合同或用户隐私数据,不能只删代码,必须先确认数据留存期限和导出方式。第二,功能被写进了对外接口文档或合作方对接说明,下线前要同步更新文档并留出过渡期。第三,功能虽然无人访问,但它是某个合规要求或历史审计的凭证,此时应保留只读查询,不做物理删除。
最后提醒一点:把“访问量为零”当成下线的充分理由并不稳妥。日志缺失、入口被隐藏、统计脚本未覆盖、调用方使用缓存,都会造成同样的零值。至少用两种独立证据交叉确认,再决定是归档还是删除。这样做的结果是,下一次面对类似取消需求时,你手里有可复用的判断依据,而不是重新争论一遍。