先给出判断顺序:不要因为“已经花了开发时间”就默认留用,也不要因为“需求方说不要了”就立刻删除。更稳妥的做法是把已开发功能当成一个待处置资产,分别核对它是否仍在被真实使用、是否影响当前主流程、以及下线会牵动哪些依赖,再决定保留、冻结还是移除。
下面用一个假设情境串联决策。假设某网站搭建项目原本计划做“供应商自助上传报价单”功能,开发完成后,业务方向调整,报价统一改由内部人员录入,需求被取消。此时功能代码、数据表、后台入口都已经存在,团队需要决定是否继续保留。
需求取消通常只说明目标变了,不等于功能对应的所有价值都消失。需要把取消拆成三层:业务目标是否还成立、操作入口是否还要开放、底层数据是否还需要保留。假设上例中,业务不再要求供应商自助上传,但历史报价单数据仍需用于对账,那么“前台入口下线”和“数据表保留”可以分开处理,而不是整包删除或整包留用。
可执行动作:让提出取消的人用一句话确认“不再需要的是哪一层”。如果只确认了“不再让供应商上传”,下一步就应检查内部录入流程是否复用了同一张表、同一套校验逻辑或同一个文件存储目录。这个动作的结果会直接决定下线范围:若内部流程复用底层能力,就不能按整功能删除。
第一个证据是访问与调用记录。如果功能入口已经没有任何真实访问,也不能单独证明可以删除,因为可能只是入口藏得深、权限没配好,或者统计本身没覆盖后台调用。第二个证据是依赖引用。搜索代码库中对该功能路由、服务类、数据表和定时任务的引用,若被其他已上线流程调用,留用或改造的成本通常低于直接移除。第三个证据是维护负担。若该功能依赖的第三方库已停止更新、或每次升级主框架都要额外适配,留用的隐性成本会持续增加。
假设上例中,后台入口每月只有零星内部测试访问,但数据表被财务报表引用。此时结论不是“有人访问所以留用”,而是“入口可下线,数据表保留并改为只读”。这个区分能避免把仍有价值的数据一起清掉。
留用适合仍可能恢复业务、且维护成本可控的功能。留用不等于原样放着,至少要补上负责人、使用说明和下次复核时间,否则它会变成无人认领的暗功能。
冻结适合当前不用、但未来可能重启、且删除会丢失关键上下文的功能。冻结的具体动作包括:关闭外部入口、保留代码分支或独立目录、停止定时任务、把数据置为只读、在项目文档中记录恢复条件。冻结的代价是仓库和数据库仍要承担一部分认知成本,所以应设定复核触发条件,例如业务方向再次变化时重新评估。
下线适合确认无业务价值、无数据保留义务、无其他模块依赖的功能。下线动作应包含:移除入口和路由、清理定时任务、处理关联数据、删除或归档代码、更新部署配置和文档。若只删了页面却留下定时任务,后续仍可能产生日志、告警或数据写入,这类残留比显性功能更难发现。
假设上例最终确认报价数据已迁移到新系统,旧表不再被任何流程引用,那么可以下线。若数据迁移尚未完成,则应先冻结,等迁移核对完成后再进入下线。
单个功能留用或下线的判断,放到多项目、多团队环境里常出现例外。比如在一个站点中,某功能只有一个人使用,判断为可下线;但当同一套代码被多个站点复用时,这个功能可能被另一个站点的少数用户依赖。此时“使用人数少”不再是充分的下线理由,需要先确认复用边界和依赖清单。
另一个例外是权限和审计要求。某些功能在普通站点可以删除,但在需要保留操作痕迹的场景中,入口可以关闭,日志和审批记录却不能随意清理。判断时应把“功能是否可见”和“记录是否需要留存”分开,而不是用同一个动作处理。
可执行动作:在下线前做一次依赖扫描,范围至少覆盖路由、模板、脚本、定时任务、数据库外键和部署配置。扫描结果若出现跨项目引用,就应把决策从“删除”改为“标记废弃并设定移除条件”。这个动作会影响下一步:有跨项目引用时,先通知相关维护者并约定统一移除时间,而不是单方面清理。
无论选择哪种处置,都建议留下简短记录:功能名称、原需求、取消原因、当前使用证据、依赖情况、处置方式、负责人、复核触发条件。记录不需要复杂模板,但要能回答“当时为什么这样决定”。这样当业务再次变化时,团队不必从零排查,也能避免把已经冻结的功能误当成仍在服务的主流程。
回到假设情境:若确认供应商入口不再开放、历史数据仍需对账、底层表被内部流程引用,合理动作是关闭外部入口、保留只读数据、冻结相关代码并记录复核条件;等对账周期结束、数据迁移核对完成后,再评估是否彻底下线。这个顺序把“需求取消”与“功能处置”分开,能减少误删和无效留用两种代价。