先给判断:不要因为“需求取消”就立刻删代码,也不要因为“已经开发完”就默认保留。决定留用还是下线的核心,是看这个功能是否仍在承载真实访问、是否被其他模块依赖、以及保留它每年要付出多少可预见的维护代价。三者中只要有一项说不清,就应该先隔离观察,而不是直接做取舍。
这个矛盾在本地项目里很常见:业务方口头说“这个功能先不做了”,但开发早已合并进主干,页面入口可能还挂在导航或旧链接里。此时团队往往分成两派,一派主张删掉以免留垃圾,一派主张留着反正不占地方。两种直觉都可能出错,因为“需求取消”描述的是业务意图,而“功能已开发”描述的是代码现状,这两件事并不在同一个维度上。
第一种解释:功能确实已经死了,只是没人负责清理。需求取消后,入口被撤下,链接不再对外露出,但代码、路由、模板和数据库字段都还在。这种情况下,功能是“技术债”,留着只会让后续改动的人多一层判断成本。
第二种解释:功能名义上取消,实际上仍在使用,只是没人正式承认。典型表现是旧链接还在被外部引用、内部人员仍在访问、或者某个后台流程悄悄依赖它。此时贸然下线,会打断真实使用,甚至引发投诉,而投诉对象往往找不到需求方,只能落到技术团队头上。
这两种解释对应的动作完全相反:前者倾向下线,后者倾向保留并转正。所以第一步不是争论,而是找到能区分二者的证据。
访问证据。看功能对应的路由或页面在一段观察期内是否还有请求。这里要注意:请求量归零不能单独证明功能已死,因为可能只是入口被撤、外部链接失效,或者访问被重定向到了别处。反过来,有请求也不一定代表业务需要,可能只是爬虫、监控探针或内部误点。更可靠的做法是同时看请求来源和请求后的行为,比如是否触发了后续提交或数据写入。
依赖证据。在代码层面搜索该功能的函数、组件、接口和数据库字段被哪些地方引用。如果只有自身入口引用它,下线成本低;如果被订单、权限、报表等模块引用,删除会连带影响其他流程。依赖关系是客观的,比“我觉得没人用”更值得采信。
成本证据。估算保留它需要持续付出什么:是否要跟着框架升级改兼容、是否要为其维护独立的测试用例、是否在每次安全排查时都要单独确认。如果这些成本很低且访问证据模糊,可以先保留;如果成本高且访问证据也弱,下线理由就充分。
假设某马鞍山建站项目里,一个“在线预约试听”表单在需求取消后仍留在代码中。观察四周后发现:页面入口已从导航移除,但旧版宣传页仍链向它,每周约有零星提交,且提交数据写入了同一张线索表,而销售团队并未被告知该来源。此时可以推断:功能未被正式使用,但数据仍在流入,直接删除表单会丢失线索,直接保留又会让来源不明的数据混入。更稳妥的动作是先给该表单加来源标记并通知销售确认,再根据确认结果决定是转正为正式入口还是彻底下线。这个例子的数字只是说明比较方法,不代表真实项目的统计结论。
无论最终倾向哪边,先执行一个可逆动作:把功能从公开入口撤下,但保留代码和开关,同时记录观察期内的访问与依赖情况。这一步的结果会直接影响下一步——如果观察期内仍有稳定且合理的访问,说明功能有隐性需求,应转入正式维护并补上需求说明;如果访问主要来自爬虫或失效跳转,且依赖检查显示无其他模块引用,就可以进入下线流程;如果依赖复杂但访问为零,则应先解耦再下线,避免一次性删除引发连锁问题。
把“需求取消”当成一个待验证的信号,而不是最终结论,才能避免在留用和下线之间反复摇摆。