Readable Code First, Machines Follow Along

复制链接
约 4 分钟阅读

程序必须写给人读,而机器执行只是顺带的。 - 哈罗德·阿贝尔森

读完这句,什么在心中回响?

一句话点明软件的真正对象

哈罗德·阿贝尔森这句“程序必须写给人读,而机器执行只是顺带的”,首先把编程的重心从“让计算机跑起来”挪回到“让人能理解”。机器只需要精确的指令,而人需要意图、结构与边界:为什么这么写、假设是什么、如何扩展、哪里可能出错。正因为软件会被反复修改、交接和复用,代码的第一读者往往不是编译器,而是未来的同事、审阅者以及几个月后的自己。 因此,这句话并非轻视执行效率,而是提醒我们:真正昂贵的成本常常在维护阶段。写得可读,本质上是在降低团队沟通成本,让系统能长期演化。

可读性就是可维护性的入口

当软件进入现实环境,可读性直接决定维护效率:定位问题、添加功能、重构模块都依赖对代码的理解速度。接着我们会发现,“能运行”只是最低门槛;如果实现方式晦涩,任何小改动都可能引发连锁风险。正如 Donald Knuth 在《Literate Programming》(1984) 倡导的那样,程序应当像文章一样表达思想,让读者先理解“叙事”,再追踪“细节”。 换句话说,代码不仅是指令集合,也是知识载体。一个命名清晰、结构分明的函数,相当于把设计决策公开给团队;反之,隐晦的技巧和过度压缩的表达,会把知识锁进作者的脑中,形成长期的维护债。

机器不缺耐心,人缺

进一步看,机器执行代码从不抱怨:再长的变量名、再多的空行、再清晰的分层,对它而言都是等价的语法符号。人类却会在阅读中迅速疲劳,尤其在故障排查或赶进度时。于是,可读性的价值在压力场景里更突出:凌晨两点的线上事故,读得懂的日志与清晰的错误处理路径,比“聪明”的一行流式链式调用更救命。 这种差异解释了阿贝尔森的优先级排序:为了机器而写的代码往往追求“最短路径”,为了人而写的代码则追求“最少误解”。当系统规模扩大,误解的累积成本会远超几条指令的微小性能差异。

如何把意图写进代码里

既然代码要给人读,接下来关键是把“意图”显化:用贴近业务的命名替代抽象缩写;用小而单一职责的函数替代巨型过程;用明确的边界条件与错误分支替代隐式假设;用合适的注释解释“为什么”,而不是重复“做了什么”。《The Pragmatic Programmer》(Hunt & Thomas, 1999) 也强调,清晰表达与降低重复能让系统更可靠,因为读者能更快确认逻辑是否符合需求。 更重要的是保持一致性:统一的风格、层次和约定,会让读者把注意力放在业务差异而非格式差异上。可读性并不依赖华丽写法,而来自稳定的结构与可预测的模式。

可读性与性能并不天然对立

最后,这句话常被误解为“只要好看就行”,但阿贝尔森并没有否定效率,而是在强调先后顺序:先让人能正确理解与验证,再在必要处做有依据的优化。很多性能问题其实来自错误的算法或不合理的架构边界,而这些往往能通过清晰的表达更早暴露。等到需要优化时,可读的代码也更易于做基准测试、替换实现与隔离热点。 因此,最成熟的实践是双赢:用可读的默认实现覆盖大多数场景,再把少数关键路径用注释、测试与清晰的抽象包裹起来进行优化。机器最终会执行所有代码,但决定代码能否长期生存的,仍是人能否持续读懂它。

一分钟思考

这句话暗示了什么小小的行动?

相关名言

已选2条

探索相关主题