先给结论:不要按“谁说得对”来投票,而要把功能拆成可核对的事实——它是否已进入生产环境、是否有真实入口、是否产生可观察的数据、维护它需要谁持续投入。需求取消只说明原始目标失效,不等于代码必须删除;功能已开发也只说明沉没成本存在,不等于应该保留。把分歧转成一张可逐项勾选的核对表,留用或下线才有共同依据。
项目里常见这样的局面:业务方说这个需求早就取消了,开发方说功能已经做完并合进了主干,运维方说线上没看到入口。三方都没有说谎,只是各自描述的是不同层面。业务方说的是目标层,开发方说的是代码层,运维方说的是访问层。把这三层混在一起讨论,就会变成立场之争。
可以先把分歧拆成两个解释。解释一:功能确实已上线,只是入口隐藏或无人使用,所以业务方感知不到。解释二:功能只存在于代码仓库或测试环境,从未对真实访问者开放,所以它不构成线上负担。这两种解释对应的处理完全不同:前者要评估下线影响,后者只需评估代码清理成本。
要判断属于哪种情况,先查功能是否有可达路径。具体动作是:从站点首页出发,按普通访问者可能的点击路径尝试到达该功能;同时检查导航、页脚、站内搜索和已知的直达地址。如果任何路径都到不了,且没有外部链接指向它,那么它更接近“未开放”而非“已上线”。这一步的结果会直接决定下一步:到不了,就转入代码层评估;到得了,就转入影响层评估。
接着看访问数据。这里要谨慎:请求量或抓取量归零,不能单独证明功能无用。归零还有几种合理解释——入口被撤下、地址从未公开、统计代码未覆盖该页面、访问集中在登录后区域而统计不记录。因此访问数据只能作为佐证,不能作为唯一判决。
无论倾向哪种结论,都建议用同一组问题核对,避免各角色各说各话。下面每一项都要求给出可验证的答案,而不是印象。
其中“依赖”和“数据”两项最容易制造意外。假设一个功能没有入口、没有访问,但它的数据表被另一个仍在使用的报表读取。此时直接删除代码会导致报表出错。这个例子是假设的,用来说明核对顺序:先确认下游依赖,再决定删除范围。动作上,可以先在测试环境停用该功能并观察依赖方是否报错,根据观察结果决定是整体下线还是只移除入口。
分歧往往不是判断不同,而是各自掌握的证据不同。业务方记得需求取消的会议结论,开发方记得任务已完成,运维方记得没有收到上线通知。把这三条记录放在一起,就能看出缺口在哪:是取消结论没有传达到开发,还是完成状态没有同步到运维。
实际操作中,可以让每个角色只回答自己掌握的部分:业务方确认原始目标是否仍然成立;开发方列出代码位置与依赖;运维方给出入口与访问的核对结果。三方各自的可核对事实拼起来,留用或下线的依据就完整了。如果某一项无人能给出答案,这一项就是需要先补的空白,而不是可以跳过的细节。
选择留用,就应明确由谁负责后续维护,以及在下一次需求评审时是否需要重新评估。选择下线,就应记录删除范围、依赖处理方式和验证结果。两种选择都不是一次性动作:留用意味着持续投入,下线意味着确认没有下游受损。
最后提醒一点:需求取消是目标层的变化,功能存废是资产层的决定。把两者分开核对,比争论“当初该不该做”更有用,也更容易让不同角色在同一张清单上达成一致。