先看这个功能是否已经进入生产环境、是否产生真实数据。如果只是代码写完还没上线,下线成本通常低于留用;如果已经上线并有人持续使用,留用的代价主要是长期维护和安全责任,下线的代价则包括数据迁移、用户通知和入口清理。判断的关键不是“开发花了多少钱”,而是“继续运行会带来什么可验证的负担”。
项目中途取消需求,开发人员往往已经把功能做到可运行状态。这时团队里会出现两种声音:一种认为沉没成本已经付出,删掉太浪费;另一种认为需求取消就该立即清理,避免以后变成无人认领的模块。两种说法都成立,但成立条件不同。
常见的两种解释是:解释一,功能虽然没需求,但底层能力以后会被别的模块复用,留用是为了减少重复开发。解释二,功能没有明确使用方,留着只会增加入口、权限和依赖,越早下线越省事。要区分这两种解释,不能靠开会表决,而要看证据。
第一类证据是调用记录。功能上线后有没有真实请求、有没有写入业务数据、有没有被其他模块直接引用。如果调用量长期为零,且代码搜索显示没有其他模块依赖它,那么“以后复用”缺少事实支撑。但要注意,调用为零也可能是入口没暴露、权限没配好或统计口径没覆盖,不能单独作为下线依据。
第二类证据是维护面。列出这个功能牵连的文件、接口、数据库表、定时任务、第三方依赖和权限配置。牵连越多,留用的隐性成本越高。假设一个功能只增加一个页面和一张独立表,留用成本相对可控;如果它改动了订单状态机或用户权限模型,即使需求取消,也要优先评估下线,因为后续每次改动都要绕开它。
第三类证据是数据责任。功能是否已经写入用户数据、订单数据或对外可见内容。如果只是测试数据,清理相对简单;如果已经写入生产数据,下线前要明确这些数据是保留、归档还是删除,以及谁有权决定。
留用不是默认选项,它需要至少满足以下条件之一:
如果选择留用,实际动作是给它加上“冻结标记”:在代码注释、任务系统和部署清单里标明该功能暂停迭代、无产品需求、仅维持运行。这样做的结果是后续开发遇到它时知道不要继续扩展,而不是误以为它仍在路线图里。
下线也不是点一下删除。需要先确认三件事:入口是否全部关闭、数据是否已归档或迁移、依赖方是否收到通知。假设一个功能只被内部后台菜单引用,下线动作可以是移除菜单、保留代码分支并停止任务;如果它对外提供了接口,就要先确认没有外部调用方,再决定是否保留一段过渡期。
下线的结果会直接影响下一步:如果清理后没有出现报错、数据缺失或用户反馈,说明功能确实处于孤立状态;如果出现调用失败,说明之前的依赖排查不完整,需要回滚并重新评估。这个验证过程比争论“该不该留”更有用。
这个顺序的核心是:不要用开发投入决定去留,而用运行责任决定去留。昭通网站开发项目里,需求取消后的功能处理往往比新功能开发更容易被拖延,因为它不紧急。但把它标记清楚或清理干净,能减少下一次迭代时的判断成本。无论选择哪条路,都要留下书面结论和负责人,否则几个月后同样的问题会再出现一次。