ARTICLE · 1166385
AI 时代重读《编写可读代码的艺术》:它关心的从来不是代码好不好看
让 AI 生成一个模块,已经不算什么难事。
真正麻烦的是三个月以后。
需求变了,测试还是绿的,可没人敢动那段代码。写代码的人忘了当初为什么这么写,AI 也只记得现在的文件,不知道哪些绕路是业务要求,哪些只是历史遗留。
这时重新看《编写可读代码的艺术》,会发现它真正关心的从来不是“代码好不好看”。
它真正追问的是:
一个人需要花多久,才能建立这段代码的正确理解?
AI 改变的,正好是这件事的另一半:
代码生产越来越便宜
代码理解却没有同步变便宜
所以 AI 时代最容易积累的,不只是技术债,还有一种更隐蔽的东西:理解债。
代码今天能跑,不代表三个月后还有人知道它为什么这样跑。
短代码,不一定更容易理解
看这段很短很漂亮的 Python 代码代码:
PYTHON
return [order for order in orders if order.status == "paid" and order.total > 100]
业务规则其实是:
只给已付款、金额超过 100 元的订单显示“可发货”。
换一种写法:
PYTHON
for order in orders:
if order.status != "paid":
continue
is_large_enough = order.total > 100
if is_large_enough:
yield order
代码变长了,但“已付款”和“超过 100 元”这两个条件被明确写了出来。以后需求改成“超过 200 元”,也更容易找到该改哪里。
可读性不是让代码更短,而是让读者更快回答:
数据从哪里来?
经过了什么?
谁改变了它?
为什么这样改变?
第一个反差:AI 越会写漂亮代码,系统越可能难懂
AI 很擅长把一小段代码整理得漂亮:
这里抽一个函数
那里复用一个工具
这几个判断合并一下
每个函数可能只有十几行,命名也很规范。
但原来一眼能看懂的流程,可能变成:
process
↓
validateRequest
↓
getUser
↓
checkPermission
↓
loadConfig
↓
prepareData
↓
calculateResult
↓
buildResponse
单个函数都很清楚,整个数据流却要在十个文件之间来回跳。
这就是 AI 时代一个容易被忽略的风险:
局部可读,不等于系统可理解。
函数该不该拆,不能只看行数。真正要问的是:它们是不是两个不同的业务概念,未来是不是应该一起变化。
第二个反差:重复代码有时比“优雅抽象”更便宜
AI 看到两段代码长得像,往往会建议把它们合成一个 PriceCalculator;但订单价格、运费和退款金额,也许只是今天碰巧用了相似公式,明天却会分别变化。
这正是 DRY(Don't Repeat Yourself)最容易被读错的地方。
DRY 要消灭的不是所有长得相似的代码,而是同一条业务知识被写在多个地方。比如“订单满 100 元免运费”这条规则,如果同时散落在下单、结算和退款逻辑里,改一次就得找三遍,这才是真正危险的重复。
但订单价格、运费和退款金额只是恰好用了相似公式,就不一定应该强行共用一个抽象。它们未来可能分别变化,过早合并反而会让本来独立的规则绑在一起。
真正该消灭的不是重复代码,而是重复的知识。 错误的抽象,会让三个本来可以独立修改的地方绑在一起。
第三个转折:可读代码不是写给 AI 的,却决定 AI 能不能安全修改
过去是:
程序员 → 代码 → 编译器 → 机器
现在多了一层:
人 → AI → 代码 → 编译器 → 机器
Agent 会搜索代码、定位文件、修改实现、运行测试,再回来继续修改。它能不能安全行动,取决于代码库是否把边界表达清楚。
如果支付、订单和库存各自有明确边界,你可以告诉 AI:
只改支付模块,不要改变订单状态机。
如果所有逻辑都塞进一个 processEverything(),你连“只改哪里”都很难说清楚。
所以,人不是为了 AI 才写得更规整。清晰的结构首先是给人看的,同时让 AI 更容易判断:
哪些地方相关
哪些状态不能碰
这次修改可能影响什么
代码便宜以后,什么必须变贵?
以前代码很贵,程序员会自然控制数量:
这个函数真的需要吗?这个抽象值得吗?
现在 AI 可以很快增加工具函数、兼容分支和抽象层。工程师真正要控制的,就不再只是写了多少行代码,而是系统增加了多少无法被人快速理解的复杂性。
Code Review 也会随之改变重点。格式、命名和简单静态检查可以交给工具,人更该追问:
这个抽象边界对吗?
这个状态变化够明显吗?
AI 下次修改时,哪里不能碰?
如果它改坏了,我能在十分钟内发现吗?
这才是重新理解《编写可读代码的艺术》后,最值得带进 AI 时代的地方。
可读性不是装饰,也不只是让同事少皱几次眉。它是在给未来的修改者留下足够清楚的因果:
这段代码为什么存在
它依赖什么
哪些地方可以改
改了以后会影响什么
过去,这个“未来的修改者”主要是另一个程序员。
现在,它也可能是下一次接手任务的 Agent。
所以今天写代码,实际上是在同时维护两种可读性:
人能不能快速建立正确理解
Agent 能不能根据边界做出可验证的修改
这也是为什么《编写可读代码的艺术》在 AI 时代没有过时。它真正留下的不是一张命名和格式清单,而是一种工程要求:
让代码把自己的因果关系说清楚。
这可能是最值得带进 AI 时代的一句话:
AI 让代码越来越便宜,工程师要做的是控制系统复杂性的增长速度。
关联阅读