先看一个假设情境:某企业站已上线一年,访客量稳定但注册转化很低。产品团队曾计划做“会员积分兑换”,开发完成了积分累计、兑换记录和后台审核三个模块,后来运营策略调整,积分兑换需求被取消,代码已经合并到主分支。此时要决定这三个模块是留用、隐藏入口还是彻底下线。核心判断不是“代码已经写了别浪费”,而是看它是否仍承担可验证的用户任务、是否带来持续成本、以及移除时会不会破坏其他功能。
需求取消只说明当初的业务目标不成立,不等于功能没有任何访问。要先区分三种状态:入口仍可见且有访问、入口已隐藏但接口仍被调用、入口和调用都为零。这三种状态对应完全不同的处理方式。
可执行的动作是查两类日志:一类是页面或入口的访问记录,另一类是后端接口的调用记录。假设积分兑换入口已经从前台导航移除,但接口每天仍有少量调用,这时不能直接判定“没人用”,因为调用可能来自旧版缓存页面、移动端未更新版本,或者后台审核人员的手工操作。访问量或调用量归零也不能单独证明功能可以删除,还要排除统计埋点失效、日志保留周期过短、灰度环境未纳入统计这些合理解释。
如果确认入口已隐藏、接口连续一个完整业务周期没有非测试调用,并且没有其他模块依赖它的数据表,那么下线是成本最低的选择。反之,只要存在真实用户路径依赖,就先进入留用评估,而不是直接删除。
留用不是零成本。对已开发但需求取消的功能,至少要把成本拆成维护、安全和认知三项,分别判断。
三项里只要有两项偏高,留用的理由就必须足够强,例如它仍支撑某个不能中断的对外承诺。否则更合理的顺序是先下线对外入口,再评估是否保留数据表和后台只读能力。
继续前面的假设情境。积分累计、兑换记录、后台审核三个模块中,积分累计被订单流程调用,兑换记录和审核后台只服务于已取消的兑换需求。此时不应该把三个模块一起处理。
第一步,先确认订单流程对积分累计的调用是否只用于展示历史积分。如果只是展示,可以把调用改为读取快照字段,解除对积分模块运行时的依赖。第二步,对兑换记录做数据归档,保留只读查询能力,关闭写入接口。第三步,后台审核入口从菜单移除,但保留管理员角色权限,避免历史记录无法追溯。
这个顺序的结果是:对外功能不再暴露,历史数据仍可查,主流程不再被已取消需求拖住。下一步动作是把这次处理写成变更记录,注明哪些接口已关闭、哪些数据表转为只读、哪些权限被保留,供后续升级时核对。
决定下线后,不能只删页面入口。至少要做四项检查,任何一项不通过都先暂停删除动作。
这四项检查的作用不是追求零风险,而是把“删了会不会出事”变成可回答的问题。如果第三项无法完成,说明数据保留策略还不成熟,此时更适合先隐藏入口、冻结写入,而不是彻底删除。
三种处理方式没有绝对优劣,只看条件是否成立。
回到积分兑换的例子:积分累计因被订单流程调用而留用,兑换记录因需要追溯而隐藏并冻结写入,审核后台因无写入需求且入口可移除而下线。这个划分不是按模块名称决定的,而是按调用关系和数据用途决定的。
处理完成后,至少要记录三件事:该功能当前处于留用、隐藏还是下线状态;判断依据是哪次调用记录或哪项依赖检查;如果业务需求再次出现,恢复需要哪些步骤。这样做的直接结果是,下一次有人问“这个功能还要不要”时,不需要重新翻代码和日志。
如果需求取消后功能仍在被调用,优先查清调用来源,再决定是否关闭;如果调用确实为零且依赖已解除,就按归档、冻结写入、移除入口的顺序推进。把每一步的结果写下来,下一步该留还是该删就有据可依。