先别删代码,也别默认留着。拿一个已经开发完成、但业务方不再需要的功能作为对象,把它拆成“对外可见入口、数据依赖、维护触发点、替换成本”四项,逐项判断留用、隐藏还是下线。多数情况下,入口可以下线,底层代码和数据结构先冻结,等一个观察周期再决定是否物理删除。
需求取消不等于功能没有在用。你要先查清三件事:页面上是否还有入口链接,站内搜索或导航是否还能到达,外部是否有人直接收藏了地址。如果这三条路径都断了,它就是一个“死功能”,留着的唯一价值是将来可能复用。
具体动作:在该功能的模板或路由上加一段临时访问记录,观察两到四周。若访问量持续为零,可以进入隐藏流程;若仍有零星访问,先查来源——是爬虫、旧缓存页,还是真实用户收藏。爬虫或缓存造成的访问不能作为留用理由,真实用户访问才需要评估替代路径。
这一步的结果直接决定下一步:有真实访问的,先做跳转或替代入口,再谈下线;没有访问的,可以跳过用户沟通,直接进入依赖检查。
一个功能通常包含三层:对外入口、业务逻辑、数据表或接口依赖。三层不必一起留或一起删。
假设一个梧州本地企业的旧站有一个“在线预约看厂”表单,业务已改为电话联系,但表单代码和数据库表还在。合理做法是:入口层从页面移除,逻辑层停止提交后的通知任务,数据层保留历史记录并停止写入新数据。这样既不会继续产生无人处理的线索,也不会丢失已有记录。
留用的真实成本不在代码占多少空间,而在于它会不会被迫跟着系统一起改。判断标准是:当下一次框架升级、PHP版本更新、主题改版或安全补丁出现时,这个功能是否必须同步修改。
你可以列一张触发点清单:
四项里命中越多,留用成本越高。命中两项以上,建议进入下线流程;只命中一项且数据仍有价值,可以保留数据、停用逻辑。这个判断不需要精确到工时,只需要区分“下次升级会不会被它拖住”。
决定下线后,不要直接删表和删文件。按以下顺序操作:
这个周期的长度由业务方确认,而不是由开发单方面决定。周期结束后再物理删除文件和数据表。若中途业务方提出恢复,因为入口已移除但数据和代码仍在,恢复成本远低于重新开发。
如果功能涉及合规存档、财务对账或历史订单查询,留用是成立的。此时不要让它保持“半可用”状态,而要明确冻结:入口不对外,逻辑不主动触发,数据只读。对外如需查询,走后台权限控制,而不是保留前台页面。
冻结状态要写进交接说明:谁可以访问、通过什么路径访问、数据保留到什么时候。这样下一次有人问“这个功能还在不在”,答案是可查的,而不是靠记忆。需求取消后的功能处理,核心不是删或留的二选一,而是把入口、逻辑和数据分开对待,让每一步都可回退、可解释。