先给结论:如果这个功能已经开发完成、代码可维护、且不会给当前用户任务增加干扰,可以留用;但只要它带来持续维护负担、安全暴露面或与现行需求冲突,就应下线。判断的关键不是“已经花了多少开发时间”,而是“留用和下线各自在接下来一年里产生什么成本”。下面按可操作的条件展开,并指出一个会让结论失效的反例。
已开发不等于已上线。评估时先确认功能当前处于哪种状态:已经对用户开放、只在后台或测试环境存在、还是代码已合并但入口未接入。状态不同,处置方式完全不同。
一个实际动作是:先查该功能是否有独立的数据库表、定时任务或外部回调地址。如果有,把它归入“必须下线”或“能藏但需隔离”,而不是简单保留。这个动作的结果会直接决定下一步是做入口关闭,还是做数据清理和依赖解耦。
已经投入的开发时间属于沉没成本,不能作为留用理由。更可靠的比较方式是列出留用和下线各自在未来一段时间内的持续成本。假设一个功能已经开发完成,留用一年需要每次框架升级时回归测试、每次权限调整时同步检查;下线则需要一次性删除代码、清理数据、通知相关方。两者比较的是“一次性清理成本”与“持续维护成本”,而不是“已经花了多少”。
可以按下面的顺序判断:
这个顺序的作用是:先切断用户可见面,再处理数据和依赖,最后决定代码去留。每一步的结果都会缩小下一步的范围。
假设某个已开发功能是“用户提交预约后自动发送短信提醒”,需求取消后,团队认为它独立、无用户入口,于是保留代码。这个判断在单个样本上成立:代码不运行,似乎没有成本。但规模化后会出问题——只要其他功能复用了同一个短信发送模块,或者定时任务扫描到历史数据,该功能就可能被意外触发,继续产生短信费用和用户打扰。此时“留用”不再成立,必须下线或至少切断触发条件。
这说明:判断能否留用,不能只看功能本身是否被调用,还要看它是否共享了会被其他流程触发的组件、队列或数据表。边界在于:独立且无副作用的代码可以保留;共享基础设施、有外部副作用或涉及用户数据的功能,即使需求取消,也应优先下线。
如果决定下线,动作顺序会影响风险。先关闭用户入口和后台菜单,观察一个发布周期,确认没有用户反馈或监控告警;再删除定时任务和外部回调;最后清理代码和数据。反过来先删代码,可能让仍依赖它的页面报错,反而增加排查成本。
如果决定留用,至少要做三件事:从导航、搜索、站点地图和接口文档中移除引用;在代码中标注保留原因和复查条件;确保它不会被定时任务、队列或默认配置意外激活。完成这些后,再进入下一次需求评审时重新判断,而不是默认永久保留。
下一步动作可以很小:打开代码仓库,搜索该功能名称,列出所有引用位置,标注哪些是用户入口、哪些是内部依赖。这份清单就是留用或下线的直接依据。