“脏代码进化史”其实是一部人类开发行为的真实缩影——不是我们天生想写烂代码,而是时间、压力、认知局限和上下文变化共同催生了“脏”的诞生。下面以一种略带幽默但真实的视角,为你梳理这段“进化史”:
🧬 阶段一:原始时代 —— “能跑就行”
- 特征:所有逻辑塞进一个
.vue 文件,500 行 methods,100 个 data 变量。 - 代码风格:
handleClick1, getData2, tempVar3。 - 心态:
“先跑起来再说,明天再重构。”(但明天永远不会来)
🏺 阶段二:工具觉醒 —— “我用了框架,所以很干净”
- 特征:开始用 Vue、React,但把业务逻辑全塞进生命周期钩子里。
- 典型操作:
mounted() { this.fetchUser() this.initMap() this.bindEvents() this.checkPermission() this.logAnalytics()}
- 误区:认为“用了组件化 = 代码干净”,实则只是把脏代码打包得更整齐。
⚔️ 阶段三:抽象幻觉 —— “我封装了一个万能 Utils”
- 特征:
utils.js 长达 2000 行,包含格式化时间、请求封装、防抖、校验、DOM 操作…… - 名言:
“这个函数以后肯定还会用!”(结果只用了一次)
- 问题:无边界抽象,反而增加认知负担——没人敢删,因为“可能有用”。
🏰 阶段四:架构膨胀 —— “微前端 + DDD + 状态机”
- 特征:项目 3 人维护,却引入了 5 层架构、自定义 DSL、事件总线 + RxJS。
- 动机:害怕“未来扩展性不够”。
- 现实:
改一个按钮颜色,要改 7 个文件,review 的人哭了。
🤖 阶段五:自动化救赎 —— “靠工具兜底”
- 觉醒标志:开始用 ESLint、Prettier、TypeScript、单元测试。
- 进步:命名规范了,类型安全了,格式统一了。
- 但新问题:
“类型写得很全,但业务逻辑依然一团乱麻。”
🌱 阶段六:认知升级 —— “干净是持续的过程”
- 核心理念:
- 代码是写给人看的,机器只是顺便执行;
- 重构不是一次性的,而是每次提交都微调;
- 删除代码比写代码更有价值;
- 命名即设计,函数名就是你的 API 文档。
- 实践:
- 用
composables 拆分逻辑(Vue); - 单个组件 < 200 行;
- 拒绝“以防万一”的代码;
- 每次 PR 至少删除一行无用代码。
💎 终极真相:
脏代码不是“写”出来的,而是“没清理”出来的。
就像房间不会突然变乱,而是一天没收拾的结果。
真正的干净代码,不靠天才的灵光一现,而靠平凡的持续打磨。
所以,下次看到一段脏代码,别骂作者——
也许他只是缺一个安全重构的环境,或一句“我帮你一起改”的支持。
如果你愿意,我们可以一起“考古”一段你见过(或写过)的经典脏代码,看看它能如何“进化”成干净版本 😎