上周三凌晨三点,我盯着屏幕上那个膨胀到2GB的Unity项目,突然意识到自己成了代码仓库的「垃圾收藏家」。那些五年前写的碰撞检测算法、三年前废弃的成就系统、去年临时添加的节日特效,像旧家具一样堆满了整个工程。那一刻我明白了——是时候学会给代码做减法了。
一、识别代码垃圾的三种嗅觉
就像闻到冰箱里的过期牛奶,程序员需要培养对废弃代码的敏锐嗅觉。我的师父老张曾教我用「三不原则」判断代码是否该删:
- 不记得:看到代码时完全想不起当初为什么写
- 不敢动:改任何地方都可能引发连锁崩溃
- 不想读:每次Review都下意识跳过这段
最近在重构我们的2D平台游戏时,我发现物理引擎模块有20多个未使用的变量,就像衣柜里永远不穿的衣服。用ReSharper的代码分析功能扫描后,系统提示这些「幽灵代码」每年要多消耗团队38小时的维护时间。
1.1 版本控制考古学
Git日志是最好的时光机。某天我注意到某个UI动画脚本的修改记录定格在2019年,顺着提交记录挖下去,发现它关联的功能早被新的系统替代。这种「代码化石」往往藏在:
Assets/Scenes | 未启用的场景文件 |
Scripts/Legacy | 祖传代码目录 |
Plugins/Experimental | 永远处于测试阶段的插件 |
二、安全删除的拆弹手册
删除代码就像拆炸弹,剪错线就会炸毁整个项目。去年我们团队因为误删某个看似无用的事件监听器,导致成就系统集体失灵。现在我们的操作流程是:
- 给要删除的代码打上「停尸房」标签
- 在CI服务器创建隔离分支
- 运行全套自动化测试
- 观察性能监控仪表盘24小时
记得那次删除旧版存档系统时,我们留了个心眼没有立即清空Git记录。果然两周后美术组突然需要还原某个被删除的纹理压缩算法,版本回滚五分钟就搞定了。
2.1 依赖关系拓扑图
用NDepend生成的依赖关系图,看起来就像地铁线路图。某个被五个系统调用的工具类,我们给它做了「换乘站改造」——先创建适配层接口,再逐步迁移调用方,最后才安心让老代码退休。
三、让代码自然消亡的智慧
好的代码删除不是外科手术,而是自然选择。我们给所有新功能代码设置「保质期」,
- 节日特效自动失效机制
- 实验性功能三个月强制Review
- 临时解决方案必须包含自毁倒计时
就像小区里的旧衣物回收箱,我们在工程里建立了CodeGraveyard目录。被标记删除的代码先在这里沉睡一个版本周期,确认没有模块哭喊着要找回时,才会真正消失。
四、删除的艺术与哲学
有次看到实习生对着自己写了三天的算法犹豫不决,我递给他《程序员修炼之道》。书里夹着便签纸写着我的删除守则:
能注释不删除 | 重要历史决策保留 |
能重构不保留 | 重复代码必须消灭 |
能模块化不分散 | 独立功能打包成Package |
现在我们的ECS架构里,每个系统都像乐高积木般独立。上周删除整个动画模块时,就像从火车车厢卸下一节货柜——其他系统照样跑得欢快。
窗外天色渐亮,保存好这篇文档,我点开工程目录里的「SpringCleaning」分支。手指悬在删除键上时,突然想起《Clean Code》里的话:优秀的程序员不是能写出多少代码,而是能优雅地删除多少代码。