先给出可执行的判断:不要因为“需求已取消”就直接删代码,也不要因为“已经开发完”就默认保留。把这项功能当作一个待决策资产,分别核算它的运行成本、维护成本和潜在复用价值,再决定留用、隐藏入口或彻底下线。需求取消只说明当初的业务理由消失,不等于功能本身没有价值,也不等于它没有风险。
需求取消通常来自业务侧:预算调整、优先级变化、负责人更换、流程改走线下,或者关键前提不再成立。功能开发完成则是技术侧的事实:代码、配置、数据表、接口、页面入口都已经存在。两者不是同一个层面的事。
一种解释是:这项功能只是暂时失去业务出口,未来在别的场景里仍可能被复用,所以值得保留。另一种解释是:这项功能之所以被取消,是因为它依赖的前提已经永久消失,继续保留只会增加攻击面、维护负担和理解成本。两种解释都成立,但适用条件不同。
判断哪一种解释更接近现实,不能靠感觉,要看证据。
如果取消原因是预算、排期或临时流程变化,而目标用户、使用场景和业务规则仍然存在,那么功能恢复的可能性较高。如果取消原因是目标用户群消失、合作方终止、合规要求变化或业务模式整体转向,那么恢复的可能性很低。
这里要区分“需求方不再提”和“需求方明确说不要”。前者可能只是沉默,后者才是明确取消。评估时应找到当初提出需求的人或现在负责该业务的人,确认取消是主动决策还是被动搁置。
检查这个功能是否已经出现在线上入口、导航菜单、用户流程或对外接口中。如果只是代码合入但入口未开放、数据未接入、用户无法触达,它的暴露面较小。如果入口已经开放、有外部调用方,或者已经被搜索引擎或平台推荐抓取到,那么即使需求取消,也不能直接删除,要先处理对外承诺和访问路径。
一个假设例子:某功能上线前需求取消,但开发时已经写了对外接口文档并发给了合作方。此时直接删除接口会造成对方调用失败,留下或下线就不是内部技术选择,而需要先与合作方确认。
功能只要留在代码库里,就可能持续产生成本:依赖升级时要跟着改,安全扫描会报出问题,新成员要花时间理解它,部署配置要保留对应环境变量。如果这些成本每月都在发生,而功能恢复概率很低,保留就不划算。
反过来,如果功能是独立的、依赖很少、没有对外入口,维护成本接近于零,那么暂时保留、加注释说明状态,比仓促删除更稳妥。删除也有成本:需要确认没有其他模块引用,需要处理数据表和日志,需要更新文档。
不要停留在“留还是删”的二选一。可以先把功能标记为三种状态之一:活跃、冻结、待下线。
打标签这个动作本身就会影响下一步:如果标为冻结,下一步是写清楚恢复条件和责任人;如果标为待下线,下一步是检查引用关系和数据迁移方案,而不是直接删文件。
留用成立的条件通常包括:业务前提可能恢复;功能没有对外暴露或对外暴露可控;维护成本低或已有专人负责;未来复用的概率高于重新开发的成本。下线成立的条件通常包括:取消原因是永久性的;没有外部调用方;删除不会影响其他模块;保留带来的安全或维护负担已经超过复用价值。
如果两个条件都不完全满足,选择冻结比强行二选一更合理。冻结不是拖延,而是明确“现在不做决定”的条件和复查时间。
决定下线后,先做引用检查,而不是直接删代码。检查内容包括:其他模块是否引用该功能的函数或接口;数据库表是否被其他业务读取;定时任务、消息队列或第三方回调是否还在触发;前端路由或菜单是否还有入口;日志和监控是否还在采集相关指标。
可以用代码搜索、依赖分析工具和数据库查询来确认。如果发现仍有引用,先解耦再删除;如果没有引用,再按发布流程移除。删除后观察一段时间错误日志和访问日志,确认没有异常请求落到已删除路径。
这个顺序的关键在于:先确认业务前提,再确认技术暴露面,最后才做删除动作。跳过前两步直接删代码,容易把还能复用的功能误删;跳过引用检查直接下线,容易造成线上故障。需求取消只是起点,功能存废要看证据和成本,而不是看它是否已经开发完成。