首页 › programming › 代码不是写给人读的?可读性神话审判

代码不是写给人读的?可读性神话审判

一、为什么这个视频值得你花二十分钟

「Code is not meant to be read」——代码不是用来读的。这句话出自一个写了二十多年代码、以研究编程效率和程序员工作流出道的开发者之口,而且出自一个以“代码质量”为日常话题的频道。这种自我阵营内部的炮轰,正是它值得看的第一层理由:它挑战的不是外行对编程的误解,而是内行每天默诵的信条。

我们从小被教育:“程序是写给人读的,只是顺便让机器执行。”这句出自《SICP》序言的名言,几乎成了程序员的道德律令。Code Review、重构、Clean Code、SOLID,整个现代软件工程的大厦,很大程度上都建立在“代码的主要读者是人”这块基石上。而 ThePrimeagen 在这段广为流传的视频里,直接对着这块基石抡起了锤子。

他的论点并不是“代码可以随便写”,而是更尖锐的一问:如果可读性被神化成了唯一的美德,我们会不会正在用它制造新的复杂度? 当一个简单的业务改动需要你在二十个文件之间跳转、当你为了“面向接口编程”而写下一堆只有一个实现的接口、当“整洁”本身成为一种需要额外维护的负担——可读性还是那个我们以为的美德吗?

这段视频在程序员社区引发了大量讨论,赞成者认为它说出了被政治正确压抑的真相,反对者认为它在为懒惰开脱。但无论站哪边,看完它你都会被迫重新回答一个根本问题:我每天追求的“好代码”,到底是在为谁服务? 本文基于视频核心论点与社区公开讨论整理(播放量等数据以 YouTube 页面实际为准),并补充了我自己的延伸分析。

二、视频背景卡片

项目 内容
视频标题 Code is not meant to be read
频道 ThePrimeagen(前 Netflix 工程师,专注程序员效率与编程语言)
时长 约15分钟(以页面实际为准)
播放量 数十万级,为其频道高传播内容之一(据社区转发热度推断,未经官方核实)
核心主题 对“可读性至上”教条的批判性反思:代码的真正约束是什么

三、核心内容拆解

要点1:可读性是约束条件,不是目标函数(视频核心论点)

视频最具冲击力的观点是:我们把手段当成了目的。软件的交付物是“正确运行且可持续演化的行为”,而不是“优美的文本”。可读性确实重要,但它只是达成上述目标的众多约束之一,和性能、正确性、交付速度处在同一层级——而行业话语却把它抬到了目标函数的位置,仿佛代码写得“整洁”,系统就自动健康了。

ThePrimeagen 用了一个很妙的反问:一段无人再读、但稳定跑了十年的代码,和一段人人称赞整洁、但每季度都要返工的代码,哪个更好?这个思想实验暴露了教条的荒谬之处——可读性的价值只有在“被读取”的那一刻才兑现,而绝大多数代码的生命周期里,“被读取”是低频事件,“被执行”和“被冷落”才是常态。

【延伸分析】这个论点其实可以用经济学的“沉没成本与期权价值”来重述:为可读性做的每一份投入,本质上是在为“未来某次阅读”购买期权。期权的定价应该与行权概率成正比。一个只有你一个人维护、且你熟到闭眼能改的模块,买再贵的“可读性期权”都是浪费;一个二十人协作的核心模块,期权才值得重仓。视频没有用这个框架,但这是我认为理解它最快的路径。

要点2:读写比的神话——你的代码大部分时候没在被读

业内流传一个说法:程序员读代码与写代码的时间比是 10:1(这个量级常被归于 Steve McConnell 在《Code Complete》中引用的研究,属估算值而非精确测量)。视频对这个数字发起了正面质疑:这个统计把“打开代码文件”都算成了“阅读”,但实际上,程序员大部分的“读”,是在搜索、定位、跳转——是导航行为,不是阅读行为。

这两者的区别至关重要。阅读小说是线性的,而程序员面对的是超文本:Ctrl+Click 跳定义、全局搜索符号、Find Usages 找引用。真正需要“像读书一样从头读到尾”的代码,占比极小。因此,为线性阅读优化的那些实践——详尽的命名艺术、处处俱到的注释、教科书式的分层——服务的其实是一种罕见的阅读场景,却让我们付出了每天的开发成本。

【延伸分析】这一点与 IDE 演进史互为印证:从 Visual Studio 到 IntelliJ 再到今天的 AI 辅助编码,工具的进化方向从来不是“让代码更像散文”,而是“让导航和检索更强”。Copilot 类工具更进一步——它直接压缩了“从零写”的场景。如果未来的主流工作流是“人提意图、AI 产草稿、人做审查”,那么被考验的阅读能力将是审读与定位,而非逐行品读。可读性的内涵本身正在迁移。

要点3:抽象税——每一层间接都在给未来的改动收过路费

视频里最有实操冲击力的部分,是对过度抽象的控诉。ThePrimeagen 描绘了一个所有大厂程序员都经历过的场景:你想改一个字段的校验逻辑,结果发现调用链是 Controller → Service → UseCase → DomainService → Repository → Mapper → Entity,每一层都“职责单一”、都“面向接口”、都“可测试”,而你的一个改动需要同步修改七个文件、三个接口定义和两套 DTO。

这就是我称之为“抽象税”的东西(视频中的表述更口语化):抽象不是免费的,每引入一层间接,你就给未来所有经过这里的改动征了一笔过路费。当抽象层的数量超过它们解决的问题数量时,架构就从资产变成了负债。他特别点名了教条化的 Clean Code 实践——为每个函数拆出只有一行的实现、为每个类配一个接口“以便将来替换实现”——指出这类仪式感代码制造了大量永远不会到来的“将来”。

【补充背景】对 Clean Code 的批评并非孤例。计算机界对 Robert C. Martin 那本书的争议持续多年,常见的批评包括:书中的示例拆分导致函数数量爆炸、部分建议有性能代价、以及对“整洁”的定义缺乏可度量的标准。ThePrimeagen 的贡献是把散落的批评收束成一个传播力极强的口号式命题。

要点4:复杂度守恒律——Brooks 四十年前就写好的判决书

视频背后的理论根基,其实早在 1987 年就由 Fred Brooks 写下了。他在 IEEE Computer 上发表的经典论文 《No Silver Bullet》 中,把软件复杂度一刀切成两半:本质复杂度(essential complexity)——问题本身固有的、无法消除的部分;偶然复杂度(accidental complexity)——工具、语言和历史遗留强加给你的部分。布鲁克斯的核心论断是:工具的进步只能压缩偶然复杂度,而本质复杂度岿然不动。

拿这个框架看“可读性之争”,很多争论会突然变得清晰:团队里那股挥之不去的“复杂感”,有多少来自问题本身(业务规则就是绕),有多少来自我们自制的抽象(七层调用链)? 糟糕的工程实践把偶然复杂度堆到本质复杂度之上,让团队误以为“问题就是难”;而教条化的“整洁实践”,则常常是另一场偶然复杂度的搬家——从代码里搬进了类图和接口定义里。复杂度守恒,你只能选择它住在哪里。

【延伸分析】Lehman 软件演化定律(1970年代起由 Meir Lehman 提出)补上了另一半:使用中的真实系统必须持续变化,否则其可用性趋于衰减。也就是说,改动不是意外而是常态,“未来会怎么改”天然不可预测。这两条定律合在一起,正好击碎了“提前抽象”的合法性:既然你无法预测未来,那你为“未来灵活性”预付的每一笔抽象税,赌的都只是你的想象。

要点5:他不是让你写烂代码——被忽略的免责声明

必须公平地说,这段视频最容易被断章取义。ThePrimeagen 反对的是可读性教条,而不是可读性本身。他在频道其他内容中反复强调的主线其实相当务实:让程序先正确地跑起来(make it work),在真实的重复出现之前不做预防性抽象,性能敏感的热路径代码要敢于为速度牺牲“优雅”,以及——最重要的一点——程序员应该把时间花在理解问题上,而不是表演工程美学。

他自己的直播写码风格也印证了这一点:大量使用直白的循环和条件,函数偏长,很少为了拆而拆,但变量命名和逻辑流非常清晰,跟着看毫不费力。这揭示了一种被教条掩盖的可能性:直白的代码可以同时是易读的。真正伤害可读性的往往不是“函数太长”,而是“为了短而拆散后,你必须在脑中重建的碎片数量”。

【我的判断】这类“反教条”内容的最大风险,是被初学者当作放纵的许可证。但注意其适用前提:ThePrimeagen 的放松是有底气的——他有极强的语言功底和调试能力兜底。对新手而言,先经过教条阶段的刻意练习(知道拆分的收益在哪),再学会不拆(知道拆分的代价在哪),顺序不能颠倒。教条是脚手架,住进去才是悲剧。

要点6:视频没说透的解法——用 Deep Module 度量,而不是用“可读性”投票

如果抛弃“可读性”这个模糊标准,用什么替代?斯坦福教授 John Ousterhout 在 2018 年的《A Philosophy of Software Design》中给出了我认为更精确的答案:深模块(Deep Module)。好的抽象是“接口窄、功能深”——暴露给使用者的心智负担小,背后藏的实现量大;坏的抽象是“浅模块”——接口一大堆,进去没什么货。衡量标准不是“读起来美不美”,而是“每个模块向使用者收了多少认知税”。

Ousterhout 主张每个模块的“最佳复杂度”不为零:把适度的复杂度关进少数深模块内部,换取外部世界的极简。这和 Clean Code 式的“复杂度摊薄到无数小函数小类”正好相反。2022 年他与 Martin Fowler 在 YouTube 上有一场公开对谈(在 YouTube 搜索 “John Ousterhout Martin Fowler” 可找到官方记录),两种哲学的正面对撞非常值得一看——那场对谈可以看作本视频情绪化论点的学术完整版。

要点7:搜索才是第一阅读方式——重构你的工作流而非你的代码

最后是一个操作性极强的推论。既然代码阅读的主形态是导航而非通读,那么提升效率的最高杠杆点,可能不在改代码风格,而在改导航工具链。ThePrimeagen 是 Vim 的重度布道者,原因正在于此:Vim 的核心竞争力不是打字快,而是符号级移动与检索的肌肉记忆——用 grep 类工具全库搜索、用 ctags/LSP 跳定义、用模糊搜索打开文件,把“读代码”变成一套高速导航系统。

这给普通开发者的启示很直接:评估一下你每天“找代码”花掉的时间。如果你还在用鼠标滚动文件树、肉眼定位一个函数,你的阅读效率瓶颈根本不在代码风格,而在工作流。先用工具把导航速度拉满,再谈可读性投资——这是这个视频给出的、最少人听但最值钱的建议。

四、知识结构图

flowchart TD
    A["可读性神话审判"] --> B["代码第一交付物:行为"]
    A --> C["局部漂亮不等于系统易懂"]
    A --> D["真正的敌人:复杂度"]
    B --> E["读写比被高估:导航多于通读"]
    E --> F["把代码当超文本:搜索式阅读"]
    D --> G["本质复杂度:问题固有"]
    D --> H["偶然复杂度:工具与自造包袱"]
    D --> I["Lehman定律:系统必须持续演化"]
    H --> J["过度抽象 = 抽象税"]
    C --> J
    J --> K["解法一:Deep Module 深模块"]
    J --> L["解法二:YAGNI 三次规则"]
    F --> M["解法三:升级导航工具链"]
    G --> N["接受无法消除的部分"]

五、实战启示:明天上班就能用的四条

第一,给你的抽象记过路费账。 每次准备引入一层间接(接口、回调、泛型、中间层),先问一句:它现在解决了几个真实存在的问题?如果答案是零或一,先不引入。采用“三次规则”——同样的模式出现第三次时再抽象,此时你才真正知道共性是什么。为想象中的未来写代码,本质是在用今天的确定性补贴明天的不确定性,而汇率极差。

第二,按“读取频率”给代码分级投资。 核心业务路径、多人协作的模块、新手常改的区域——重仓可读性,命名、注释、测试一个都别省。而一次性脚本、即将废弃的迁移代码、只有你维护的冷路径——直白优先,能跑就赢。把“整洁预算”当真金白银分配,而不是无差别撒给每一行。

第三,把复杂度关进深模块。 与其把系统拆成一百个浅层小类,不如设计少数几个“接口窄、肚子深”的模块,让复杂性集中封印。判断标准就用 Ousterhout 的那把尺子:使用这个模块的人,需要理解多少东西才能正确调用它? 需要理解得越少,模块越好。下次 Code Review 时,用这个问题替代“这样可读吗”,讨论质量会立刻上一个台阶。

第四,本周花两小时升级你的导航系统。 学会 IDE 的结构搜索和 Find Usages 快捷键;在终端装一个 ripgrep;如果你用 VS Code 或 JetBrains 系,把“最近文件”和“跳转定义”练到不用想。对多数开发者而言,这两小时带来的日常收益,超过重构一百个函数命名。

六、延伸学习路径

  1. 《No Silver Bullet》(Fred Brooks, 1987) — 本视频的理论源头,理解本质/偶然复杂度之分的必读经典,全文不长,条目见 Wikipedia: No Silver Bullet
  2. 《A Philosophy of Software Design》(John Ousterhout, 2018) — "Deep Module" 概念出处,可视为本视频的学术完整版;另推荐在 YouTube 搜索 "John Ousterhout Martin Fowler" 观看两人 2022 年的对谈实录
  3. Lehman 软件演化定律 — 理解“为什么系统必然持续变化”的奠基理论,Wikipedia 条目
  4. YAGNI 原则 — 极限编程的核心理念之一,“你不会需要它”,Wikipedia 条目
  5. ThePrimeagen 频道的其他内容 — 关于 Vim 工作流、Rust 与程序员效率的系列视频,可与本文观点互补着看

七、一句话总结

代码的价值不在于它读起来多美,而在于它让多难的问题变得多简单——可读性是工具,不是信仰。

参考来源

  1. Code is not meant to be read — ThePrimeagen(YouTube) — 本文分析的核心视频(链接为频道内搜索,播放数据以页面为准)

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入