结论取决于三个可核对条件:这段代码是否仍在生产环境被调用、是否承担了未被注意的隐性职责、以及下线动作本身是否比留着更贵。只有在“无调用、无隐性职责、下线成本可控”三条同时成立时,直接下线才是明确正确的选择。任意一条不成立,就应该先留用并加标记,而不是因为需求取消就顺手删掉。
需求取消只说明业务目标变了,不说明代码没在跑。评估第一步是把功能当成一个独立单元,找出它的真实入口。对甘肃网站开发这类项目,入口往往比想象的多:页面模板里的条件判断、定时任务、后台菜单、对外接口、甚至另一段代码里的函数调用,都可能是它仍然活着的理由。
可核对的证据按可靠性排序:生产环境访问日志中该路由或接口的请求记录、应用层埋点或调用计数、任务调度平台的执行历史、代码静态检索出的引用位置。日志和调度记录反映实际发生的事,静态检索只反映可能性,两者不能互相替代。如果日志显示近一个观察周期内请求数为零,这只是一个信号,不是结论。
请求量归零至少有三种合理解释:功能确实没人用;入口被别的页面或流程替代,流量转移到了新路径;采集本身失效,比如日志被清理、埋点被某次发布覆盖、调度任务被停用但代码还在。把这三者区分开,才能判断归零的含义。动作上,可以先把该功能的调用计数单独保留一个观察周期,再决定是否进入下一步。
需求取消的功能常常在无意中承担了别的职责,删掉之后问题不会立刻出现,而是在某个特定时点暴露。常见的有:写入了某张被其他模块读取的数据表;生成了缓存或索引文件;参与了权限判断的默认分支;被当作兜底逻辑处理异常输入。
判断方法不是读一遍代码就够,而是反向追踪:搜索它写入的数据被谁读取,搜索它输出的字段出现在哪些下游逻辑里,检查它是否在异常分支中被当作默认返回值。假设一个已取消的“活动报名”功能,除了报名表单,还会在提交时给用户表打一个标记。如果另一个页面按这个标记判断用户身份,直接下线报名功能就会让那部分用户状态异常。这个例子是假设的,但排查顺序是通用的:先找写,再找读,最后才动删除。
隐性职责存在时,留用的成本通常低于下线。此时可以保留代码但切断入口,同时加注释说明它为什么还在。这样做的代价是仓库里多一段死代码,收益是避免一次难以定位的线上异常。反之,如果确认没有任何下游读取,留用就只剩下维护负担这一项成本。
留用和下线各有成立条件,把它们放在同一张成本清单上比才有效。
留用成立的条件是:功能仍有低频但真实的调用,或承担隐性职责,或下线所需验证工作量明显大于它带来的维护负担。下线成立的条件是:观察周期内无调用、无下游读取、无历史数据依赖,且删除后回归范围可控。
有一个反例会推翻“无调用即可下线”的判断:如果该功能只在特定条件下触发,比如每年一次的数据归档、某个合作方接口的备用回调、或仅在异常流程中才走到,那么常规观察周期内请求为零是正常的,不能作为删除依据。这时应改为按触发条件构造一次验证,而不是继续等日志。
这个顺序的关键在于,每一步的产出都会改变下一步的判断依据:观察记录决定是否进入反向检索,反向检索的结果决定是留用还是删除,删除后的验证结果决定是继续清理还是补充遗漏。跳过任何一步,都会让后面的结论失去支撑。对甘肃网站开发项目而言,需求取消是起点而不是结论,真正决定留用还是下线的,是这段功能在当前系统里是否还有别的路可走。