先把“谁认为需求取消”和“代码是否真的在运行”分开核对。需求取消只说明业务目标变了,不等于功能已经下线;功能已开发也不等于必须留用。实际决策要看三个可核对的事实:这个功能是否仍在被访问或调用、它是否与其他在用功能存在依赖、继续保留会带来多少可验证的维护动作。三者都指向“无访问、无依赖、维护动作可省”,才适合下线;只要有一项指向活跃使用或强依赖,就应保留或改写,而不是按需求状态直接删掉。
多个角色对同一事实理解不同,通常不是谁记错了,而是各自看的是不同层面。产品角色说“需求取消”,依据可能是排期表或需求文档状态;开发角色说“功能已开发”,依据是代码已经合并;运维角色说“还在跑”,依据是日志里仍有请求。这三句话可以同时为真。
把分歧转成可核对项目,可以按下面顺序各查一遍:
这里要特别注意一个反常现象:访问日志归零,不能单独证明功能可以下线。日志缺失还可能来自换空间后日志未开启、访问路径改变、缓存层拦截了请求、或者统计口径换了。要先把这些合理解释排除,再谈取舍。
保留不是保守,而是在证据支持下的选择。符合以下任一条件时,优先保留:
保留时要做一个实际动作:给这个功能标注“保留原因”和“复核条件”,例如“因表单历史数据入口保留,待数据导出完成后再评估”。这个动作的结果会直接影响下一步——如果复核条件一直无法满足,说明它不是临时保留,而是长期依赖,就应转入正常维护清单,而不是继续挂在待删列表里。
有些功能的需求确实取消了,但代码里的某部分仍有价值,例如数据校验逻辑、已积累的历史数据、或与其他模块共用的处理流程。这时下线整个功能会误伤,改写更合适。
判断能否改写,看两点:一是去掉已取消的业务目标后,剩下的部分是否还有明确使用方;二是改写后是否能减少维护面,而不是把一套逻辑拆成两套。假设某个已取消的报名功能,其表单提交逻辑还被另一个在用表单复用,那么直接删除会破坏在用表单,改写为共用处理模块则更稳。这个例子只用于说明比较方法,不代表任何具体项目结果。
下线需要同时满足:功能对应路径在合理观察期内没有真实访问;没有其他在用功能引用它;删除后不需要额外保留兼容代码。只满足其中一两条时,先不要删。
决定下线后,动作要分步,而不是一次性删除:
每一步的结果决定下一步:如果停用入口后出现其他页面报错,说明依赖判断有遗漏,应回到保留或改写路径,而不是继续删代码。
与其争论“该不该留”,不如把每个功能写成一行可核对记录:功能名称、需求状态、代码位置、换空间后访问记录、被谁引用、保留或改写的具体原因、复核条件、负责人。这张表的作用不是流程好看,而是让不同角色的判断落在同一组事实上。
当访问记录、依赖关系和维护动作三项都指向可省时,下线是合理选择;当其中任何一项指向活跃使用或强依赖时,保留或改写更稳妥。需求取消只是起点,不是删除指令,最终取舍应由可核对的事实决定。