结论先给:默认应下线,除非这个功能同时满足“有独立用户价值”“维护成本可被现有资源覆盖”“不干扰主流程”三个条件。若只满足其中一个,留用通常只是把沉没成本拖成长期负担。反例是:功能虽已取消需求,却已成为其他功能的必要依赖,此时下线会连带破坏正常路径,必须改为“冻结入口、保留接口”而不是直接删除。
需求取消后,功能可能处于三种状态。第一种是孤儿功能:没有任何页面、流程或接口再调用它,入口只存在于旧链接或后台菜单。第二种是隐性依赖:主流程已经不再宣传它,但某个结算步骤、导出任务或权限校验仍在调用。第三种是影子使用:需求方说取消,但已有用户通过收藏、历史记录或直接访问继续使用。
区分方法不是问需求方“还要不要”,而是查三组证据:访问日志中该功能路径是否仍有稳定请求;代码中是否有其他模块引用它的接口、数据表或配置;客服与运营是否收到过与它相关的求助。三组证据都不支持留用时,下线理由最充分。若只有访问日志归零,不能单独证明可以删除,因为入口可能已被隐藏、跳转可能已被改掉,或者统计口径本身发生了变化。
假设某站点在建设阶段开发了一个“活动报名附加问卷”功能,活动取消后问卷入口从首页移除。现在要决定是否保留代码与数据表。
这里的数字只用于说明比较方法,不代表真实项目耗时。关键结论是:留用成本不是零,而是分散在每次变更里;下线成本集中在一次确认和一次清理。若功能仍有稳定用户或已成为依赖,集中清理的成本会高于分散维护,结论才会反转。
留用适用于:有可识别的持续使用,且该使用与站点核心目标一致;有明确负责人愿意承担后续维护;不会在导航、搜索或推荐中造成困惑。三者缺一,就不应进入常规留用状态。
冻结适用于:需求已取消,但依赖关系尚未理清,或数据仍有合规保留要求。冻结的具体动作是关闭新入口、保留只读访问、停止写入、在代码中标注废弃状态,并设定复查时间。这样既避免继续扩大维护面,也不会因仓促删除破坏其他流程。
下线适用于:无有效访问、无外部依赖、无数据保留义务,且移除后不会改变任何主流程结果。此时应把删除范围写清楚:前端入口、后端路由、定时任务、数据表、配置项、权限角色、监控告警,遗漏任何一项都会留下新的隐性依赖。
下一步动作不是直接删代码,而是先做一次依赖确认。可以从调用关系入手:搜索该功能的路由名、接口路径、数据表名和配置键,记录每一处引用及其所属模块。若引用只出现在该功能自身,删除粒度可以到整块;若被其他模块引用,先改造调用方,再处理被调用方。
确认完成后,按“先停写入、再关入口、最后清代码”的顺序推进。停写入后观察一个完整业务周期,确认没有异常请求或数据缺口,再关闭入口;入口关闭后仍要保留一段时间的只读数据,用于应对历史查询。这个顺序的结果会直接影响下一步:如果停写入后出现大量失败请求,说明存在未识别的调用方,应回到依赖确认而不是继续删除;如果一切平稳,才进入代码清理。
最后要接受一个判断:需求取消并不自动等于功能应删除,功能已开发也不自动等于应该留用。真正决定去留的是依赖关系、使用证据和维护责任,而不是开发时投入了多少。