一、背景三年前我加入了一家创业公司接手了一个「看起来还不错」的项目。代码量300 行。功能能用。架构没有。反正能跑就行 —— 前同事的原话。三年后这个项目变成了 30 万行团队从 1 个人变成了 10 个人。当系统开始在线上频繁出问题时我们终于意识到代码量和维护成本是呈指数级上升的。这篇文章记录的是我用真金白银线上故障换来的 5 个教训。二、教训一提前抽象但不要过度抽象最早的 300 行代码里有个 Utils.java里面放了 3 个方法。后来变成 StringUtils、DateUtils、FileUtils、HttpUtils、JsonUtils……问题是过度抽象导致一个新同事要改一个 bug需要跨 5 个工具类才能搞清楚调用链路。现在的做法用 UtilityClassLombok标记工具类每个工具类不超过 200 行如果某个方法只有一个调用方先内联等出现第三个调用方再提取三、教训二命名不是小事这是最容易被忽视的问题。// ❌ 错误示范List dataList getData();MapString, Object m new HashMap();process(m);// ✅ 正确示范List pendingOrders fetchPendingOrders();MapString, Object orderParams new HashMap();processPayment(orderParams);为什么重要 因为代码读的次数远远多于写的次数。好的命名让代码自解释不需要注释。四、教训三数据库设计 —— 不要「存就完了」300 行的时候数据存在一个超大 JSON 字段里。读出来改一下写回去。30 万行的时候这个 JSON 字段 50KB每次更新都要全量读写。踩过的坑JSON 字段没有索引查询全表扫描多个字段混在一个 JSON 里改一个也要写整个数据一致性全靠业务代码保障现在的做法能用关系表就别用 JSON必须用 JSON 时确保它有索引MySQL 8.0 支持 JSON 索引大字段和核心字段分表存储五、教训四单元测试不是负担是保险我以前觉得写单元测试浪费时间直到有一次改了一个「看起来没影响」的代码结果把三个月的核心逻辑全改崩了。从那以后我坚持三个原则核心链路必须覆盖支付、登录、下单一次性写对更重要TDD 太理想化但至少补测试测试失败及时修CI 挂了就停下手头的事修三个月后我们的回归测试从 2 小时缩短到 15 分钟线上故障减少了 80%。六、教训五重构不是重写300 行到 30 万行之间我们经历过一次大重构——彻底重写。结果是花了 6 个月推迟了三个版本上线上线后还有一堆 bug。重写的问题丢失了对业务细节的理解测试数据要迁移新系统总有意想不到的边界情况渐进式重构才是正道用防腐层隔离新旧代码每次只重构一个模块用特性开关逐步切换流量七、写在最后代码行数从 300 涨到 30 万真正重要的不是代码量而是代码的演化能力。好的架构不是设计出来的是不断重构出来的。你怎么看待「代码重构」这件事遇到过哪些坑欢迎在评论区聊聊