先给有条件的结论:如果这个功能已经开发完成、上线后没有真实用户依赖,且保留它不会带来持续维护、安全或合规负担,那么留用的代价通常低于下线;反之,只要它涉及用户数据、对外承诺或后续每次改版都要跟着改,就应优先安排下线。判断的关键不是“已经花了多少工夫”,而是“继续留着,下一步会多出哪些必须做的事”。
需求取消后,功能留在代码里并不只有一种状态。一种是冻结式保留:入口隐藏或限制访问,代码不再改动,只作为历史资产存在。另一种是继续维护:入口仍在、用户还能用,出问题要修,改版要适配。两者的成本差一个量级。
可执行的区分动作:列出这个功能当前是否还有可访问入口、是否写入数据库、是否调用外部接口。三项都是“否”,才接近冻结式保留;只要有一项是“是”,它就会在后续每次发布中持续产生检查成本。
没有后台权限或访问日志时,不必等数据齐全再决定。可以观察:页面入口是否还被站内其他页面链接、表单是否还有提交记录、客服或业务侧是否收到过相关询问、代码里是否有其他模块直接依赖它。这些是可核对的事实,不需要完整报表。
但要明确不能推出的结论:入口没有点击、某段时间没有提交,不能单独证明功能无人使用。合理解释还包括入口本来就不显眼、链接已失效、访问被权限挡住、统计口径没覆盖到,或者使用者只在特定时段出现。现象归零只是线索,不是判决。
假设某益阳本地企业的网站做了一个“在线预约试听”功能,开发完成后业务方向调整,改为电话沟通。此时若预约入口仍挂在首页,表单仍写入数据库,那么每次改版都要测试它、每次数据备份都要包含它、每次隐私政策更新都要覆盖它——这就是继续维护型留用。
若把入口撤下、表单停止写入、保留代码但不对外暴露,它就转为冻结式保留,后续成本主要是代码体积和偶尔的依赖检查。这个对比说明:决定留用前,先决定它属于哪一种状态。
最典型的反例是功能牵涉用户数据或对外承诺。只要它收集过手机号、身份信息、支付信息,或者页面上曾写明“本功能长期提供”,留用就不再是省事,而是把一项持续义务留在系统里。此时即使没人使用,也应评估下线并处理存量数据。
另一个反例是它被其他功能隐式依赖。比如某个接口被另一处调用,表面看是废弃功能,实际一动就牵连别处。这种情况下先做依赖排查,再谈下线,不能直接删除。
在数据不全、权限不足时,最小可执行动作是隔离而非删除:撤下入口、关闭对外写入、在代码或配置中标注该功能的当前状态和负责人。做完这一步,观察一个发布周期,看是否出现依赖报错、业务询问或数据异常。
隔离后的结果直接决定下一步:如果没有异常,可以进入正式下线流程,清理代码、数据和相关文案;如果出现异常,说明它仍有隐性依赖,应转为继续维护并补齐文档。这个顺序的好处是,把不可逆的删除推迟到证据足够之后,同时又不让它继续占用每次发布的注意力。