不被阅读的代码时代

发布: (2026年2月23日 GMT+8 08:20)
10 分钟阅读

Source: NHN Cloud Tech Blog

NHN Cloud_meetup banner_coding_202602_900.png

此内容是作者对在公司内部公告板上分享的文章进行加工的,为了忠实传达作者的意图和语境,保留了原文的句子风格。

前言

我长期以来一直梦想着优美的代码。
那种代码中,纯函数像水流一样组合,类型系统从根本上使 bug 不可能出现,逻辑像数学证明一样坚固。我们把它称为 ‘工匠精神’,为了达到这种境界,我们学习范畴论,努力理解类型层编程。

然而有一天,我突然意识到 再也没有人阅读代码

可读性的定义正在改变

“可读性”这个词的意义正在悄然但根本地改变。
过去的可读性是为了 人类的认知

  • 开发者能在脑中追踪逻辑吗
  • 同事在代码审查时能发现错误吗
  • 6个月后我还能理解这段代码吗

为了回答这些问题,我们讨论了 Clean Code(干净代码),制定了 SOLID 原则,并创建了 设计模式 这一共同语言。这都是在人类有限的工作记忆容量内处理复杂性的努力。

但现在,可读性正逐渐成为 机器的模式识别 的需求。

  • AI 是否在训练数据中见过这段代码的模式
  • AI 在收到修改请求时能否定位到准确位置
  • AI 在进行局部修改时,整个系统是否仍然保持完整

两种可读性有时会重叠,但本质上优化的目标不同。

  • 为人类服务的可读性追求 抽象和压缩
  • 为机器服务的可读性追求 明确性和可预测性

工匠精神的悲剧性位置

函数式编程所承诺的很明确:用代码克服人类的认知局限。

  • 引用透明性:代码的任何部分都可以独立推理
  • 不可变性:减少在脑中追踪随时间变化的状态的负担
  • 强类型系统:编译器帮助捕获错误

所有这些都是为了补足人类的局限的工具。

然而对 AI 来说,没有需要补足的局限。AI 已经学习了数百万个代码库,并装备了原始的模式匹配能力。为减轻人类认知负担而设计的优雅抽象对 AI 来说更像是噪音。AI 更习惯于普通且重复的命令式代码。

“学习起来很困难,但有长期收益。” – 函数式编程支持者

AI 打破了命令式编程的入门壁垒。现在任何人都可以借助 AI 快速编写命令式代码。相反,函数式编程的学习曲线仍然陡峭。更令人感到凄凉的是,即使是能够欣赏函数式编程之美的人也不再亲自阅读代码。他们的 Claude Code 取而代之地进行阅读。

Claude >> @PureFunctional OrderService::doStuff의 로직을 분석해서 설명해 줘

退化为媒介的代码

代码的本体论地位正在改变。

过去,代码是人类的领域。我们生活在其中。每天阅读、修改、扩展。为一个变量名纠结,为函数的位置争论。代码是我们思想的物化,因此我们关注它的美感。

现在代码正成为连接人类意图与机器执行之间的媒介

인간의 의도 → 자연어 명세 → AI → 코드(누가 신경이나 쓰는가) → 실행

在这个模型中,函数式 vs 面向对象的争论类似于 x86 vs ARM 的争论。虽然在特定情境下可能存在性能差异,但它已不再是人类居住的层面。我们正从木匠转变为建筑主

新的美学的出现

AI 时代的‘好代码’是什么?需要新的美学。

习惯表达胜过优化

// AI 友好:数百万次见过的模式
users.stream().filter(User::isActive).toList();

// AI 不友好:这是什么代码?
users.stream().reduce(new ArrayList<>(),
    (acc, u) -> { if(u.isActive()) acc.add(u); return acc; },
    (a, b) -> { a.addAll(b); return a; });

AI 擅长处理熟悉的事物。相比创造性的优化,普通的惯用表达更安全。

推理的局部性

理解函数所需的一切要么可见,要么能够一次跳转到达。Action at a distance 是禁忌。Dependency injection技巧、aspect weavingruntime proxy 等隐式机制会妨碍 AI 的推理。

可预测的结构

/order
  OrderController.java
  OrderService.java
  OrderRepository.java
  Order.java

AI 从惯例中推断上下文。如果能够预测文件位置,搜索成本会降低。惯例是压缩的信息。

明确的状态转移

// AI 友好:可能的状态被显式枚举
enum Status { DRAFT, SUBMITTED, FULFILLED }

// AI 不友好:需要通过标志组合推断状态
boolean isSubmitted;
boolean isFulfilled;
boolean isDraft;

使用枚举声明状态时,AI 能够一目了然地把握整体图景。需要组合多个 boolean 标志的代码会让 AI 也迷失方向。

冗长但明确的名称

// AI 友好:仅凭名称即可明确意图
public boolean isEligibleForRefundBasedOnPurchaseDateAndMembershipStatus()

// AI 不友好:依赖注释
/** 依据购买日期和会员状态判断是否可退款 */
public boolean canRefund()

对人类而言,简洁的名称加上详细的注释可能更易阅读。然而 AI 更信任 代码本身而非注释。如果函数名本身就包含意图,就可以在没有额外上下文的情况下准确使用。

小文件,单一职责

100 行的文件 10 个胜过 1000 行的单个文件。AI 的上下文窗口是实际的限制。小文件更容易整体替换或局部修改。

以测试为规范

@Test
void shouldRejectOrderWhenInventoryInsufficient() { /* ... */ }

AI 通过读取测试来逆向推断代码意图。测试名称即是需求,测试主体即是示例。

讽刺:函数式的回归

有一个有趣的反转。AI 友好代码的原则——不可变性、显式状态、小而纯粹的函数——与 函数式编程 的原则高度重合。函数式编程将会存活下来。不是因为它美,而是因为 机器更容易阅读

即使高层次的抽象和理论的优雅消失,不可变数据、纯函数、显式类型仍然存在。美学已经改变,但核心原则因其他原因获得了新生。

结论

我们站在美好时代的尾声。

  • 以代码为媒介,人类之间相互交流的时代
  • 将意图写入变量名,用函数结构表达思维流程的时代

那个时代正在逝去。代码正逐渐进入不经过人类眼睛的领域。正因为我们曾在代码中生活,才在意其美感;一旦走出代码,那美感便失去意义。工匠精神将像 LP 唱片机械表一样——成为热爱过程者的领域。市场不识别优雅,市场只要 速度。AI 已将命令式代码的速度几乎提升到无限。

尽管如此,我们偶尔仍记得下班后在安静的办公室里,完成的纯函数链通过测试,绿灯亮起的瞬间。类型系统在编译时捕获 bug 的快感。代码不仅仅是运行,更成为 证明 时的满足感。

美好的回忆。

NHN Cloud_meetup banner_footer_202507-01.png

0 浏览
Back to Blog

相关文章

阅读更多 »