先给结论:把“已开发”当作沉没成本,只比较留用与下线在未来一年内的总代价。若该功能没有持续数据输入、没有用户路径入口、也没有合规或架构上的牵连,优先下线;若它已被其他模块引用、或去掉后会造成可感知的体验断裂,则先隔离留用,设定观察期再决定。
假设某站群系统在半年前排期开发了“地区分站自动切换”功能:根据访问者IP归属展示不同城市页面。开发完成后,业务侧取消了分站运营计划,功能却已经合并进主干。此时团队面对两个看似都合理的做法:直接删除代码,或原样保留。下面按这个假设情境展开,不涉及任何真实项目结论。
第一步不是看代码量,而是查三件事:这个功能有没有被其他模块调用;它有没有产生持续写入的数据;它是否出现在任何对外可访问的路径上。这三项决定了删除的爆炸半径,也决定了保留的维护成本。
很多人把留用理解为零成本,实际并非如此。一个已开发但无需求的功能,仍会持续消耗以下资源:
因此留用的判断标准应是:它是否仍在为某条真实用户路径服务。如果答案是否定的,留用只是在把一次开发成本转化为长期维护成本。
下线同样有代价,而且往往被低估。删除代码只是第一步,还需要处理:
其中引用层最容易出问题。一个实际动作是:在代码仓库中搜索该功能的入口函数名和配置键名,统计被引用次数。如果引用只出现在它自身的文件和测试中,删除风险低;如果被三个以上其他模块引用,应先做依赖解耦,再谈删除。
下面这组信号可以帮助区分“该留”和“该下线”,它们指向不同的原因,而不是简单的数量对比:
注意,访问量或抓取量归零不能单独证明该功能无用。可能的原因包括:入口本来就没开放、爬虫被其他规则拦截、或者统计口径未覆盖该路径。需要结合入口可达性和调用关系一起看。
综合以上,建议按以下顺序操作,每一步的结果决定下一步:
这个顺序的核心是:先缩小影响范围,再决定去留。直接删除或原样保留都跳过了影响评估,容易在后续升级或排查中付出更高代价。
回到最初的问题:需求取消后,功能是否留用,取决于它是否仍在被引用、是否仍在产生数据、是否仍在对外暴露。三者皆为否,下线是更干净的选择;任一为是,先隔离并设定复查条件,比仓促删除更稳妥。已投入的开发成本不应成为留用的理由,未来的维护和排查成本才是。