先看功能是否已经进入真实数据流:如果它已写入生产库、被定时任务调用,或者有用户数据依赖它,就不能简单删除,应转为“冻结入口、保留数据、隔离维护”;如果它只停留在代码和测试环境、没有真实数据写入,也没有外部调用方,就应尽快下线,避免它继续占用权限、依赖和部署时间。判断的关键不是当初投入了多少,而是现在移除它会不会造成数据丢失、业务中断或安全风险。
当需求虽然取消,但功能已经上线并产生数据时,直接下线往往比保留更危险。此时应确认三件事:数据库里是否有该功能写入的表或字段;是否有定时任务、队列或第三方回调仍在调用它;是否有报表、导出或人工流程依赖这些数据。
如果以上任一为真,建议先做“入口冻结”:从导航、页面链接和推广物料中撤掉入口,让新用户无法进入,但保留后台访问权限和接口。这样做的结果是,旧数据仍可查询,历史流程不会中断,同时不再产生新的使用量。下一步再观察一段时间,确认没有新的数据写入或调用后,才考虑归档代码和清理依赖。
需要留意的例外是合规或安全要求:如果该功能收集了敏感信息,而需求取消后已无人负责维护,那么即使有数据也不能长期保留。此时应优先安排数据导出或脱敏,再关闭入口,而不是因为“还有数据”就无限期搁置。
如果功能从未接入生产数据,也没有外部系统调用,那么它保留在代码库里的成本通常高于收益。它会增加构建时间、扩大依赖范围,还可能让后续开发误以为它是有效功能而继续维护。
此时可以按以下顺序处理:
完成这些动作后,部署时间通常会缩短,后续排查问题时也不会再被这个已取消的功能干扰。如果删除后出现构建失败,说明仍有隐藏引用,应回退到上一步重新确认调用关系,而不是直接恢复整个功能。
不要只凭“需求取消了”就做决定,也不要只凭“已经开发了”就保留。可以用下面的证据表来区分:
这套判断不依赖功能大小,只看它现在是否还在真实链路中。假设一个功能只在测试环境生成过示例记录,从未写入生产库,那么它的“开发投入”不应成为保留理由;反之,一个功能虽然入口已隐藏,但每天仍有定时任务写入数据,就不能直接删除表结构。
无论选择留用还是下线,都建议先做一个动作:列出该功能涉及的数据表、接口、定时任务和前端入口,并标注每一项的当前状态。这个清单会让你看清移除的边界。
如果清单显示只有前端入口和测试数据,就执行下线,并观察下一次部署是否顺利;如果部署顺利且没有报错,说明清理完成,可以继续移除相关依赖。如果清单显示有生产数据或外部调用,就执行入口冻结,并设定一个复查时间点,到期后再次确认是否还有新数据写入。复查结果若显示没有新增,再进入归档流程;若仍有写入,则说明还有未发现的调用方,需要继续排查而不是强行删除。
最后要接受一种情况:有些功能既不能立刻删,也不值得继续投入。这时把它标记为“只读保留”是合理的中间状态,但必须指定谁负责在什么条件下重新评估,否则它会一直悬在代码库里,成为下一次开发的干扰项。