说明
这篇文章起源于晚饭前与AI (Opus 4.6)的一段对话。我认为,AI时代,软件工程也会呈现出类似阿姆达尔定律这样的效率瓶颈,就是你不能只通过AI来无限的提升效率,会有瓶颈阻碍效率的提升,而这个瓶颈就是人是否可理解系统,只有可以被人理解的系统,才是可演进的,而系统可理解的表现,就是代码的可读性。
我跟AI讨论这个观点,AI开始把我们的讨论整理成文章,我就去吃饭,等我吃完,AI早已整理完毕,于是我就把它写的发布了出来。
正文
AI 都能写代码了,可读性还重要吗?反正看不懂可以让 AI 解释,出了 bug 可以让 AI 修。何必还费心思去琢磨一个变量该叫什么名字、一个模块的边界该画在哪里?
这个问题背后,藏着一个更根本的问题:代码的可读性,究竟只是一种编码风格上的讲究,还是意味着更深层的东西?
可读性的价值,取决于你在建造什么
先说结论:不是所有代码都需要可读。
如果你写的是一次性的数据处理脚本、验证想法的原型、用完即弃的迁移工具 — 让 AI 快速生成,跑完拿结果,扔掉就好。没有人会在意一把用完就丢的螺丝刀是否握感优雅。
但如果你在建造的是一个需要长期维护和迭代的系统 — 而绝大多数有价值的软件都是如此 — 事情就完全不同了。
一个长期演进的系统,本质上是无数个设计决策的累积。今天你选择用事件驱动来解耦两个模块,三个月后另一个人在旁边加了一个同步调用,六个月后第三个人又加了一层消息队列。如果这些决策之间没有连贯性,系统不会立刻崩溃 — 它会慢慢变成一团谁也理不清的乱麻,每改一处就牵出三个意想不到的问题。
连贯的决策从哪里来?从理解中来。你必须能读懂前人的意图,才能做出与之一致的后续决策。
可读性,就是可理解的外在体现。 一段可读的代码,背后是作者对问题的清晰认知;一个可读的系统,背后是整个团队对设计方向的共识。
"让 AI 解释"救不了你
"看不懂没关系,让 AI 解释就行。"
这个逻辑听起来合理,就像说"不会做菜没关系,看菜谱就行"。但任何真正做过菜的人都知道,菜谱上写的"适量"和"翻炒至熟",只有你自己下过几次厨才能真正理解那个分寸。
同样的道理,当线上出了问题,你面对的不是一道从容的阅读理解题,而是一连串紧迫的判断:
问题出在哪?你需要向 AI 准确描述。AI 给了修复方案,你需要判断它改了什么、会波及哪些模块、是否会引入新的问题。这条链路上的每一步,都建立在你对系统的理解之上。
当代码不可理解时,一个危险的恶性循环就启动了 — 你描述不清问题,AI 给出偏离的修复;修复引入新问题,你依然描述不清;系统在每一次"修复"中变得更加混乱。就像一个听不懂方言的医生给病人看病,病人说不清哪里疼,医生猜着开药,病没治好又吃出了新毛病。
人始终是 AI 协作链路中的关键环节,而可理解性决定了这个环节能否正常运转。
软件工程的"阿姆达尔定律"
这个判断可以说得更精确一些。
在计算机体系结构中,阿姆达尔定律指出:一个系统的整体加速比,受限于其中无法被并行化的串行部分。哪怕你把并行部分加速到无穷快,串行部分的占比就是整个系统速度的天花板。
软件工程中存在一个类似的定律:AI 对开发效率的提升,受限于"人理解系统"这个无法被替代的环节。
AI 可以把代码生成的速度提高十倍、百倍,但如果人无法理解生成的代码、无法判断修改的正确性、无法做出连贯的设计决策,那么整体效率的天花板就卡在这里。你不能通过让 AI 跑得更快来突破一个本质上由人的理解力决定的瓶颈。
而这个定律还有第二面:你也不能通过减少人数来绕过它。
有一种诱人的想法:既然人是瓶颈,那就精简到极致 — 一个人提需求,AI 做所有事情,这个人只负责验收。但对于任何足够复杂的系统,这是幻觉。一个人的认知带宽是有限的,他不可能同时对系统的数据库设计、API 接口、前端交互、安全策略、性能瓶颈都保持足够深的理解。复杂系统之所以需要团队,不是因为打字速度不够 — AI 早就解决了这个问题 — 而是因为没有任何一个人的大脑能装得下整个系统的全部复杂性。
所以,可理解性在两个方向上都是不可绕过的:
- 纵向:AI 不能替代人的理解,效率的天花板取决于人能否看懂系统
- 横向:一个人的理解力不能覆盖整个系统,必须有多人各自负责一个可理解的局部
模块化、清晰的边界、可读的代码 — 这些不是审美偏好,而是让多个有限认知带宽的人能够协作治理一个超出任何单人理解力的系统的必要条件。
可理解的三个要素
怎样才能让一个系统是可理解的?我认为有三件事:
第一,确保你对问题的理解是对的。
这听起来像一句废话,但它是最容易被跳过的一步。太多人急于动手写代码,却没有停下来问自己:我真的理解这个问题吗?还是我只是理解了问题的表象?方向错了,代码写得再漂亮也只是在高速驶向错误的终点。
第二,学会抽象 — 将复杂问题简单化,抓住事物的本质。
抽象有两层含义。一是简化:面对一个复杂问题,剥掉那些偶然的、表面的细节,找到真正驱动它的核心结构。二是归纳:当你看穿了各个问题的表象,你会发现看似不同的问题,往往共享同一个本质,可以用同一个模型去理解和处理。初级工程师看到十个需求,写十套代码。高级工程师看到十个需求,发现其中七个本质上是同一个问题的不同变体。这不是炫技,而是在管理复杂性。问题空间是无限的,人的认知带宽是有限的。抽象就是用更少的认知代价覆盖更多的场景。
第三,用模块划分来隔离复杂性。
你在认知上完成了归纳,但如果这个归纳没有体现在代码结构上,它就只存在于你的脑子里。你离开之后,它就消失了。模块边界是把认知结构固化为代码结构的方式 — 它让复杂性有处安放,让每个人在任一时刻只需要理解系统的一个局部,而不是被整体的复杂性淹没。
这三件事不是并列的,它们解决的是同一个根本约束:人的认知带宽是有限的 — 不要把它浪费在错误的方向上,用抽象来提高它的密度,用模块来控制它的范围。
而第三点 — 模块划分 — 恰恰也是应对"阿姆达尔定律"第二面的关键手段。既然没有一个人能理解整个系统,那就必须把系统切分成每个人都能理解的局部。模块边界不仅是代码的组织方式,更是团队认知分工的物理载体。
但这三件事,很难一次做对
有一个广为流传的法则:好的系统需要设计三次。
第一次,你从零开始尝试。你以为自己理解了问题,做完之后才发现理解是浅薄的,遗漏了许多真实世界的复杂性。
第二次,你被第一次的教训吓到了,拼命弥补,过度设计,加了太多抽象层、太多防御性机制。系统变得臃肿而僵硬。
第三次,你终于知道了什么是必要的,什么是多余的。你不再恐惧复杂性,也不再迷恋抽象。你得到了一个清晰的、可以演进的设计。
这背后有一个认识论层面的事实:对于足够复杂的问题,"想清楚再动手"是一种幻觉。 真正的理解不是坐在那里冥想出来的,而是在做的过程中,被具体的矛盾和失败一点一点逼出来的。
过去,设计三次的代价是巨大的。两个月做第一版,三个月做第二版 — 还没等到第三次,deadline 就到了。所以大多数系统永远停留在第一次或第二次的状态,带着它们的混乱或臃肿,一直跑到生命周期的终点。
AI 改变的正是这一点。当每一次迭代的成本从数月降低到数天,"设计三次"就从一个美好的理论变成了可操作的实践。这才是 AI 对软件工程最深远的影响 — 不是替你写代码,而是降低你"通过做来思考"的成本。
你对问题的理解不确定?让 AI 快速生成一版,用具体的代码去检验你的假设。你不确定某个抽象是否合理?让 AI 基于它实现几个场景,看它能否自然地覆盖变化。模块边界不知道画在哪?先让 AI 做一版,看哪些地方冒出了不自然的跨模块依赖。
每一次这样的快速尝试,都是在用极低的成本获取关于问题本身的信息。这些信息,是坐在白板前画架构图永远得不到的。
但快不能代替思考
这里有一个容易掉进去的陷阱。
AI 让试错变得太容易了,以至于人们可能跳过每次迭代之间最关键的环节 — 反思。
不满意?让 AI 重新生成。还是不满意?再来一次。这不是"设计三次",这是"抽奖三次"。每一次迭代之间,如果没有停下来想清楚"上一次到底错在哪",那么无论迭代多少次,学习都不会发生。你只是在用更低的成本重复同样的困惑。
真正的迭代应该是:做完一次,停下来,回到你对问题的理解本身 — 是理解错了,还是抽象选错了,还是模块边界画歪了?带着这个反思进入下一次,每一轮才会比上一轮更接近本质。
AI 负责降低"做"的成本,人负责在每次"做"之后提取认知。两者缺一不可。
可读性从来不只是一个技术问题
走到这里,也许你已经感觉到了:我们讨论的早已不是"变量该不该用驼峰命名"这种表层问题。
代码的可读性,从来不单纯是一个技术问题。它是一面镜子,映照出我们是否真正理解了自己正在解决的问题。一个人如果对问题的理解是模糊的,他写出的代码一定也是模糊的 — 不管他用了多少设计模式,加了多少注释。反过来,当你能把代码写得清晰可读,往往意味着你已经穿透了问题的表象,触及了它的本质结构。
它也映照出我们是否为未来的演进有所思考。一个只考虑"当下能跑"的系统和一个考虑了"未来如何生长"的系统,从代码上一眼就能看出区别。前者是一堆临时决策的堆砌,后者有清晰的骨骼和留白 — 那些留白不是偷懒,而是对未来变化的预判和邀请。
所以可读性的追求,本质上是对思考质量的追求。 它逼着我们停下来问自己:我真的想清楚了吗?我的理解经得起时间的考验吗?
结语
AI 时代,代码的生产方式变了,但代码背后的那些根本问题没有变:我们是否理解了问题?我们的设计决策是否连贯?我们是否为未来留下了可以生长的空间?
可读性不是旧时代遗留的洁癖,而是回答这些问题的方式。
AI 改变的是实现的速度和成本。不变的,是人的认知带宽,以及我们对"理解"永不过时的需求。而软件工程的"阿姆达尔定律"提醒我们:无论 AI 多么强大,效率的天花板始终取决于理解系统的人 — 不是一个人,而是一群人,每个人守护着自己能够理解的那个局部,共同撑起一个超越任何个体认知极限的系统。