先别把它当成“要不要删代码”的技术题。更有效的做法是把需求取消这一事实拆成三类可核对项:谁还在依赖它、它给谁造成维护负担、保留或下线后由谁验收。三类项各自有证据,分歧就能从“我觉得该留”变成“按哪条记录决定”。
同一句“这个需求不做了”,在项目里可能指三种不同范围。第一种是业务目标取消,功能背后的运营动作不再发生;第二种是上线范围取消,功能不进入本次发布,但以后可能启用;第三种只是提出人离开或口头收回,没有留下正式记录。三种情况对应的处理完全不同。
核对时不要只问提出人。把需求最初对应的验收项、已合并的代码模块、依赖它的页面入口、以及仍在引用它的其他功能列出来。如果某个入口已经被移除,但后台任务、接口或数据表仍被调用,说明取消的只是前台展示,不是整条链路。
这一步的实际动作是:为每个已开发功能建一行记录,字段至少包含“原始目标、当前可见入口、被谁调用、最后一次变更时间”。填完后,如果“被谁调用”一栏只能填出提出人,说明依赖面很窄;如果填出其他模块或外部对接方,就不能按单人意愿直接下线。
三种取舍不是按功能新旧来选,而是按依赖是否真实、维护成本是否可摊薄、以及未来重启的代价来判断。
功能仍有真实使用方,且使用方不是“当初提需求的人”。更关键的是,它不产生持续的安全或数据维护负担。比如一个内部查询页,只有运营团队每周使用,代码不再变动,数据来源稳定,这种留用的代价主要是文档和权限维护,通常低于下线再重建的成本。
留用不等于原样放着。至少要补一条说明:谁负责、什么条件下重新评估。否则它会变成没人认领的遗留模块,下一次排查故障时又要重新理解一遍。
原始目标取消,但功能中有一部分被别的流程复用。这时不是保留整个功能,而是把被复用的部分抽出来,把只服务于原目标的部分去掉。判断依据是调用记录:如果某个函数或接口被两个以上不相关的模块引用,抽离比整体下线更稳。
改写的风险在于范围容易扩大。控制办法是先只做“去掉原目标专属逻辑”,不动被复用部分的接口签名。改完后跑一遍原有回归用例,观察是否有调用方报错,再决定下一步是否继续简化。
没有任何真实调用方,且保留它需要持续投入——例如定时任务在跑、数据在增长、权限在扩大。退出前要确认三件事:前台入口是否已移除、后台任务是否已停、数据是否需要归档。只删页面不删任务,是最常见的假下线。
如果功能涉及对外承诺或已产生的数据,退出前还要确认数据保留期限和可追溯要求。这部分不能靠开发单方面判断,应由业务和数据责任方共同确认。
多个角色对同一功能有不同理解时,争论往往停留在“重要不重要”。把它换成三组可查的事实,分歧会缩小到具体条目上。
一个注明假设的短例子:某后台导出功能的需求被取消,但代码仍在。假设日志显示近三个月只有两次调用,且都来自已离职账号;同时该功能每月产生一次失败告警。按上述证据,退出成立的前提是确认没有外部对接方引用该导出文件。若存在外部对接方,则应转为改写,只保留对接所需的最小字段。这个例子的数字仅用于说明比较方法,不代表任何真实项目。
决定留用、改写或退出之后,动作要落到具体角色和验收条件上,否则评估会停在会议记录里。
无论选哪一种,都要把决定和依据写在同一处,方便后来者理解为什么留或为什么删。评估的价值不在于一次判对,而在于下次遇到同类功能时,能直接沿用同一套核对项,而不是重新争论一遍。