一年之后,重新理解 AI 编程
效率提升的表象之下我们项目引入 AI 编程已经整整一年了。翻看提交记录一个直观的感受是效率确实上去了。功能迭代速度变快需求排期一再压缩老板对用了 AI 应该更快这件事似乎已经默认成了新的基准线。但当我真正静下心来审视这一年的代码库时一种隐隐的不安浮现出来——我们提交、合并、发布了大量 AI 生成的代码可我们真的理解这些代码吗?没人真正理解的代码答案并不乐观。很多时候AI 给出一段能跑通、能通过测试的代码大家看一眼逻辑大致对得上就直接合并了。至于这段代码在边界条件下会不会出错异常处理是否完备和系统里其他模块的隐性约定是否冲突很少有人真正逐行推敲过。换句话说我们把能跑当成了正确的替代品。这在项目早期业务逻辑相对简单时问题还不明显——即便有坑影响范围也有限发现了改一改就过去了。但一年下来业务复杂度是指数级增长的。模块之间的依赖越来越深历史遗留的假设越来越多一个看似无害的改动可能悄悄破坏了三个月前另一个功能里的隐含约定。这时候没有人真正理解代码这件事的代价开始显现排查一个线上问题常常要先花大量时间搞清楚这段 AI 写的代码到底想干什么然后才能着手修复。团队对代码库的整体心智模型变得越来越模糊、越来越依赖问 AI而不是自己想清楚。暴露出来的人性之懒这里有一个值得诚实面对的现象程序员为什么会走到这一步?很大程度上是因为老板催得紧任务排期不给人留出理解的时间。当交付压力足够大而 AI 又能在几秒钟内给出一段看起来对的代码时选择相信它、跳过审查、直接提交几乎是一种本能反应。这不是某个人偷懒而是人性在效率压力下的必然选择——趋易避难谁都一样。AI 编程工具在这个意义上像一面镜子把这种人性之懒毫不留情地照了出来。问题不在 AI而在使用方式但这不代表 AI 编程本身有问题问题在于我们使用它的方式。一年的经验让我逐渐明白AI 编程真正的价值不在于让人可以不再理解代码而在于让理解代码这件事变得更快、更轻松。如果把 AI 当成一个可以完全托付信任的黑箱工人迟早会在复杂系统里踩到无法预料的坑但如果把 AI 当成一个可以随时追问、随时要求解释、随时一起推演边界情况的结对伙伴它反而能倒逼我们比过去更快地建立起对代码的深层理解。一种新型技术债理解债务如果再往深处想一层这一年真正积累下来的其实是一种新型的技术债——不妨称之为理解债务。传统技术债是代码写得不够好以后要还;理解债务则是代码可能写得还不错但没人真正懂它以后一定要还而且利息更高。这种债务的可怕之处在于它极具隐蔽性代码能跑、测试能过、评审也走完了流程表面上一切正常债务却在悄悄积累直到某次线上故障把它连本带利地摆到所有人面前。生成与理解之间的鸿沟更值得警惕的是一种结构性的不对称。这一年里写代码的速度提升了数倍但理解代码、建立心智模型的速度几乎没有变化——人脑理解复杂逻辑的带宽并不会因为工具进步而扩容。于是生成与理解之间的鸿沟只会越拉越大代码库膨胀的速度远远超过了任何人能够真正吃透它的速度。长此以往项目会变成一片由无数 AI 生成的补丁拼接而成的珊瑚礁每个人只熟悉自己碰过的那一小块却没有人拥有整体地图。责任稀释与能力退化还有一层容易被忽略的代价是责任的稀释和能力的退化。过去代码出问题至少能追溯到是谁写的、他当时怎么想的;现在很多时候大家只能说是 AI 生成的却说不清楚是谁在什么场景下批准了它上线。责任变得模糊追责变得困难也就更难从错误中真正吸取教训。与此同时那些原本应该在写代码、调试代码、和复杂逻辑较劲的过程中锻炼出来的能力——尤其是对新人而言——正在被悄悄跳过。写出漂亮代码的门槛降低了但理解复杂系统的肌肉却没有得到应有的锻炼机会这是一种更隐蔽、也更长期的能力透支。被拿走的摩擦力还有一个更容易被忽视的机制性变化值得单独拿出来讲AI 拿走的不只是打字的时间更是打字过程中顺带发生的思考。过去写一段复杂逻辑哪怕水平有限手指敲键盘的那几分钟里大脑也在被迫过一遍分支条件、变量含义、异常场景——这是一种边写边想的天然摩擦力慢但扎实。AI 把这层摩擦力完全抹平了代码几秒钟生成思考的强制过程也随之消失。如果不主动把这部分思考找补回来它就不会自动发生。这也是为什么理解债务会积累得如此之快——不是大家变懒了而是原本免费依附在写代码这个动作上的思考现在需要额外花力气才能获得。没有记忆的协作者更深一层的问题在于AI 本身没有制度记忆。一段两年前写下的奇怪代码背后往往藏着某次线上事故的教训、某个客户的特殊要求、某次团队争论后的妥协——这些原因通常不会写进注释而是活在写代码的人的记忆里。AI 生成新代码时并不知道这些历史它只是在当下这个上下文里给出一个看似合理的答案。于是代码库里开始出现一种奇怪的分裂表面上风格统一、写法工整因为都出自同一个模型的手笔但这种一致性是假象——它掩盖了背后完全没有被继承的历史教训。团队原本靠人传人积累起来的隐性知识正在被这种看起来很像但其实没有记忆的协作方式悄悄稀释。评审正在变成仪式最后一点或许最刺痛代码评审这道本该兜底的防线正在慢慢演变成一种仪式而非真实的把关。评审人自己也在赶进度、也在用 AI也没有时间真正读懂每一行逻辑于是评审通过这个动作渐渐从我确认理解并认可这段代码退化成这段代码格式正确、测试通过、没有明显语法问题。当评审通过测试通过这些本该是理解程度的代理指标反过来变成了大家追逐的终点本身真正的理解就被系统性地挤出了流程之外——这是一种典型的目标替代我们优化的是看起来合规而不是真的搞懂了。把 AI 当作陌生的外部贡献者从这个角度看或许更健康的做法是不要把 AI 当作值得信任的同事而是把它当作一个来历不明的外部贡献者——它的每一次提交都应当像评审一份陌生人发来的 Pull Request 一样带着审视而非默认的信任去对待。这种心态上的转变可能比任何工具和流程上的调整都更重要。结语回头看这一年最大的教训或许是AI 编程带来的效率提升是真实的但它同时放大了一个更早就存在的问题——我们对交付速度的追逐一直有意无意地压缩着深入理解的空间。AI 只是让这个矛盾变得更加尖锐、更加无处遁形。真正值得我们思考的不是要不要用 AI 编程而是如何在使用它的同时重新为理解找回应有的位置。毕竟代码可以让机器帮我们写但代码背后的责任终究还是要由写代码的人来扛。