语义的归帆:论代码之于心智的权宜与终结

摘要

软件工程这一路走来,说穿了,就是一部人类想从机器那冰冷的二进制逻辑里逃出来、跌跌撞撞向着人类 心智模型 (Mental Models)攀爬的流亡史。这么多年,大家守着 Python、Java 这些所谓的“高级语言”沾沾自喜,其实不过是五十步笑百步。正如这篇报告要细细拆解的那样,这些语言归根结底只是一种 “悲催的权宜之计” (a miserable compromise)。这种权宜,逼着我们把那些丰盈、流动、满含深意的人类念头,硬生生塞进那些僵硬、死板、缺头少尾的句法框框里。

我想辩驳的,无非是两点:其一,这世上凡是用高级语言写得出的程序,定然有一段自然的雅言能将其说得清清楚楚、毫无歧义;其二,读那段雅言,定然比读那一堆代码来得赏心悦目。如今计算语言学、信息论和脑科学的新知叠出,加之大语言模型(LLMs)的横空出世,这番范式的流转已是势在必行。我们正站在 “软件 3.0” 的门槛上,看着那编程的本质,从“人去迁就机器”,转回了“机器来迁就人”。有了人工智能作伐,Donald Knuth 当年心心念念的 “文学式编程” (Literate Programming)1,怕是不再是乌托邦式的空想,而要成为案头的日常了。往后的日子,代码终将退化成一种卑微的、不可见的中间产物,唯有那些用自然语言写就的 “活体规约” (Living Specifications),才是这软件世界里唯一的真理。

第一部分 代码的困局:那场“有损”的翻译

语义的鸿沟:删繁就简的代价

论及计算机科学的里子,不得不提 Peter Naur 一九八五年那篇如金石之声的旧文《编程即理论构建》(Programming as Theory Building)2。Naur 看得透彻:软件这东西,魂魄不在那一串串源代码里,而在程序员脑子里那套关于“这世界如何运作”的 “理论” (Theory)。

当程序员伏案写代码时,做的是一场极其惨烈的“信息压缩”:把那些关于业务愿景、伦理分寸、用户心思以及设计时的左右为难,统统剥离,把所有的“之所以然”(Why)都抛进废纸篓,只留下一堆关于“如何为之”(How)的干瘪指令。这是一种 “有损压缩”

代码这种形式语言,本是为了消除歧义好让机器干活,哪里顾得上保留人的初衷?就像一句简单的 user.age >= 18,机器是懂了怎么比大小,可那句“需依律确认为成年人以合乎 GDPR 规矩”的弦外之音,却已消失殆尽。后人读这代码,非得耗费巨大的心力,像考据出土文物一样,试图从那干枯的语法中反向推导出前人的心思3

所以说,代码确是“悲催的权宜之计”。几十年来我们不得不忍受这种高强度的脑力折磨,无非是因为在 AI 出世之前,缺了那么一个既懂人话又懂机器逻辑的“中间人”。为了计算的确定性,我们牺牲了表达的自然性。Dijkstra 曾戏言 APL 语言是“完美的错误”4,我看这话推而广之也无不可——所有的编程语言,都是架在人脑和电脑之间那座摇摇欲坠的危桥。

顶会论文里的启示

行家都看得出,在 NeurIPS、ICSE 或是 OSDI 这些顶尖的讲坛上,大师们切磋技艺,用的终究是自然语言,而不是堆砌代码。这便揭示了一个悖论:人们常夸代码“言简意赅”,那其实只是“算法指令”层面上的省事。若论及“传道授业”,自然语言的信息密度不知要高出多少。

一篇论文,寥寥数语便能道尽 Transformer 架构里自注意力机制(Self-Attention)的精妙,若是换成 PyTorch 代码,几百行洋洋洒洒,读者还得在脑海里苦苦推演矩阵运算才能悟出一点门道。代码的高密度,是 “语法密度” ;而雅言的高密度,那是 “语义密度”。我们要懂 Q * K^T,更要懂这背后的“查询与键值的契合”。既然计算机科学家在最高智力的交锋中本能地摒弃代码,那这本身不就是对“代码至上论”最有力的反证吗?若 AI 真能填平从“论文”到“系统”的沟壑,代码这件人工制品,怕是也没什么存在的必要了。

第二部分 雅言的无歧义与可读性之辩

假设一:关于“无歧义”的迷思

有人担心:“自然语言真能无歧义地描述程序吗?”这确实是个棘手的理论问题,甚至会撞上数学逻辑里的 “贝里悖论” (Berry's Paradox)5。也就是那个“不能用少于二十个字定义的最小正整数”的怪圈。若任由自然语言泛滥,逻辑确实可能坍塌。况且,依着柯尔莫哥洛夫复杂性(Kolmogorov Complexity)的说法6,有些逻辑极度复杂的程序,即使用白话去讲,怕是也不比代码短多少。

然而,我们毕竟不是在做纯数学游戏,而是在做工程。在工程的 语用学 (Pragmatics)里,“无歧义”求的不是数学上的唯一解,而是 “意图的精准传达”

现代的大语言模型告诉我们,若是加上了 “受控自然语言” (Controlled Natural Language)的笼头7,或者是通过一来一往的问答,自然语言的野性是可以被驯服的。当我们说“一段话描述清楚程序”时,这段话里自带着上下文的规矩、边界的哨卡。就像描述“快速排序”,若只是泛泛而谈,自然有歧义;但若加上定语——“用随机基准点的、非稳定的、原地的,且时间复杂度为 O(n log n) 的”,那便是铁板钉钉,再无二致。AI 这个书童,自会将其映射到唯一的逻辑上去,若有不懂,它还会回头来问(Interactive Disambiguation)8

假设二:脑科学眼中的可读性

至于说“自然语言比代码好读”,这在脑科学里早就是铁案如山。

用核磁共振(fMRI)去扫一扫便知,人脑读代码时,累的是管逻辑推理和工作记忆的那块区域,那是做苦工;而读自然语言时,亮起的是布罗卡区,那是人类进化数百万年修来的本能9

读代码,认知负荷 (Cognitive Load)极重10。你要把那满屏的符号硬生生嚼碎了,化作语义,再在脑子里搭出个模型来,简直是逆水行舟。而自然语言虽有冗余,那冗余却恰恰是它的慈悲,给人脑留了喘息和联想的空间。

有研究说,读好的代码像读小说,那是因为它顺应了人的叙事本能(Storytelling)11。可再优雅的代码,也毕竟受困于语法。一段“遍历用户,挑出那些一年没来且无牵无挂的,标为非活跃”,人脑一扫即过;换成代码,若是变量名起得再不知所云些,那就是一场灾难12。所以,一段精心雕琢的自然语言,直接把“理论”端给你,不比那一堆还要你去猜谜的代码高明得多?

第三部分 从文学编程到 AI 掌镜的文档革命

Knuth 的旧梦与现实的骨感

一九八四年,Donald Knuth 提出了 “文学式编程” (Literate Programming)13,老先生的初心是极好的:“别光顾着指挥机器干活,先试着给人讲清楚你要机器干什么。”他想让程序员像写文章一样写程序,代码只是嵌在散文里的注脚。

但这法子四十年来没成气候,原因无他:太累。程序员既要当瓦匠砌代码,又要当秀才写文章,两头受罪。且代码一改,文章就得跟着修,稍有不慎,便是文不对题,维护起来简直是噩梦。

AI 穿针引线:文学编程的复兴

如今,大语言模型(LLM)来了,这最大的绊脚石便被踢开了。现在的 AI,既通晓句法,又懂得文章背后的机锋1415

在新范式里,咱们不用再亲自去写那些冗长的注释。
一者,注释比代码长。AI 会像个尽职的经学家,替你的逻辑代码写出详尽的疏注,讲清楚“为何此处要落这一笔”。
二者,像 nbdev16 这样的工具会进化。你只需写个大概的草稿,AI 便能将其润色成一篇图文并茂的“技术散文”。

活体文档:双向的奔赴

最妙的是,那令人头疼的“文档与代码脱节”,也将成为历史。AI 代理(Agents)能让文档系统具备 “自愈” 的能力17。你改了代码,它自动去修文档;更进一步,若你把文档(规约)奉为真理,那你改了文档,AI 便自动去重构代码。这就是 “双向同步” (Bi-directional Sync),文档不再是故纸堆里的死物,而是与系统共呼吸的 “活体” 18

第四部分 软件 3.0:终极抽象的落地

这便是 Andrej Karpathy 口中的 “软件 3.0” (Software 3.0)19

抽象的跃迁

在 1.0 时代,我们在泥坑里写 C++;2.0 时代,我们喂数据给神经网络;到了 3.0 时代,我们写提示词(Prompts)——也就是写人类的意图。
最近流行的 "Vibe Coding" (氛围编程)很有意思20,现在的开发者不再纠结底层的语法细节,而是跟 AI 聊着天,调整程序的“调性”或“氛围”。代码成了一种中间的编译产物,像 .obj 文件一样,人不需要去看它,只消看结果便是。

规约驱动开发(SDD)

为了实现那“无歧义”,工业界正转向 “规约驱动开发” 21。程序员的首要任务,是写好一份详尽的、结构化的 自然语言规约 (Spec)。这 Spec 便是镇山的宝,一旦定下,AI Agent 便负责将其“编译”成代码,并生成测试用例去验明正身。若代码跑偏了,Agent 会自动修正。
在这种光景下,自然语言规约成了核心资产,而代码,只是为了在硅基芯片上跑起来而不得不生成的权宜之计罢了。

破解贝里悖论:交互式消歧

至于那个理论上的“歧义”幽灵,现代 AI 用 “交互式消歧” 来化解。你说“把数据分组”,AI 会问:“是按日期分,还是按类别分?”几番问答,原本模糊的语言便坍缩成了精确的逻辑。这一连串的对话,便成了比代码更高明的程序描述。

第五部分 结语:代码的隐退与意义的回归

工具的进化

未来的集成开发环境(IDE),怕是要改头换面,不再是代码编辑器,而是 “理论构建器”。你看得见的是交互式的规约文档,看不见的是后台奔忙的 LLM 推理引擎。调试不再是盯着堆栈发愁,而是去调试你的“意图”(Intent Debugging)。

自愈与永恒

随着 “不可变代理” (Immutable Agents)的出现22,每一次规约的变动都生成一个新的、经得起考验的 Agent。系统有了自愈的能力,代码层面的补丁,全由机器代劳。

尾声

综上看来,所谓“代码的终结”,并非危言耸听。

尽管数学上的绝对无歧义难以企及,但通过 AI 的斡旋,我们已能获得比形式语言更精准的自然语言规约。既然自然语言是人类心智的故乡,那么消除代码这个“中间商”,让人直接操作思维模型,岂不是极大地解放了人的灵性?

写代码,确是人类在机器尚且愚钝时的不得已。如今,我们终于有望迈入新纪元。在那里,程序员不再是把思维翻译成 C++ 的翻译匠,而是架构师,甚至是哲学家。我们要做的,是清清楚楚地思考,准准确确地表达,去构建逻辑严密的“理论”。

接下来的路,清晰得很:
先是用 AI 做出极致的“文学编程”,让代码淹没在雅言的汪洋里,成了注脚;
继而建立双向同步,让文档活过来,让代码隐下去;
最终,代码在界面上彻底消失,自然语言成为人机之间唯一的桥梁。

这不仅是技术的更迭,更是 意义的回归。我们终于可以不再纠结分号该落在哪里,而去专心致志地,把玩创造本身的乐趣了。


  1. Literate programming - Wikipedia, https://en.wikipedia.org/wiki/Literate_programming ↩︎

  2. https://www.riverandsoftware.com/p/programming-as-theory-building-peter-naur#:~:text=In%20his%20seminal%20paper%20%E2%80%9CProgramming,people%20who%20work%20on%20it↩︎

  3. Programming as Theory Building - Embedded Artistry, https://embeddedartistry.com/fieldatlas/programming-as-theory-building/ ↩︎

  4. Memorable Edsger Dijkstra Quotes, https://www.scranton.edu/faculty/mccloskey/dijkstra_quotes.html ↩︎

  5. The Berry Paradox - Logic, https://jamesrmeyer.com/paradoxes/berry-paradox ↩︎

  6. Utility of Kolmogorov complexity measures: Analysis of L2 groups and L1 backgrounds, https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0301806 ↩︎

  7. Controlled Natural Language for Requirements Specification: A Systematic Literature Review | Request PDF - ResearchGate, https://www.researchgate.net/publication/397963168_Controlled_Natural_Language_for_Requirements_Specification_A_Systematic_Literature_Review ↩︎

  8. Identifying and Resolving Ambiguous Intents in Coding Instructions using Discourse Frameworks - OpenReview, https://openreview.net/pdf?id=gn8Ex8hMnV ↩︎

  9. Predictive Coding or Just Feature Discovery? An Alternative Account of Why Language Models Fit Brain Data - NIH, https://pmc.ncbi.nlm.nih.gov/articles/PMC11025645/ ↩︎

  10. Examining Factors Influencing Cognitive Load of Computer Programmers - PMC - NIH, https://pmc.ncbi.nlm.nih.gov/articles/PMC10452396/ ↩︎

  11. The Hidden Psychology Behind Why Some Code 'Feels' Better to Read | by Sohail Saifi, https://medium.com/codetodeploy/the-hidden-psychology-behind-why-some-code-feels-better-to-read-a4a5e43ecb8c ↩︎

  12. The Effect of Poor Source Code Lexicon and Readability on Developers' Cognitive Load | Venera Arnaoudova, https://veneraarnaoudova.ca/wp-content/uploads/2018/03/2018-ICPC-Effect-lexicon-cognitive-load.pdf ↩︎

  13. Literate programming - Wikipedia, https://en.wikipedia.org/wiki/Literate_programming ↩︎

  14. Literate Programming with LLMs? - A Study on Rosetta Code and CodeNet - ResearchGate, https://www.researchgate.net/publication/397318661_Literate_Programming_with_LLMs_-_A_Study_on_Rosetta_Code_and_CodeNet ↩︎

  15. Literate Programming with LLMs? - A Study on Rosetta Code and ..., https://research.chalmers.se/publication/549267/file/549267_Fulltext.pdf ↩︎

  16. Literate Programming in Python using NBDev - Frederick Giasson, https://fgiasson.com/blog/index.php/2023/08/30/literate-programming-in-python-using-nbdev/ ↩︎

  17. AI-Powered Self-Healing CI - Nx, https://nx.dev/docs/features/ci-features/self-healing-ci ↩︎

  18. The Top 7 Documentation Generator Tools to Know About in 2025 - Kodesage, https://kodesage.ai/blog/7-documentation-generators ↩︎

  19. What's Software 3.0? (Spoiler: You're Already Using It) - Hugging Face, https://huggingface.co/blog/fdaudens/karpathy-software-3 ↩︎

  20. Vibe coding: programming through conversation with artificial intelligence - arXiv, https://arxiv.org/html/2506.23253v1 ↩︎

  21. Spec-Driven Development: A Deep Dive into the AI-Centered Future of Software Engineering, https://medium.com/@geisonfgfg/spec-driven-development-a-deep-dive-into-the-ai-centered-future-of-software-engineering-db2d15fa882e ↩︎

  22. Why versioning AI agents is the CIO's next big challenge, https://www.cio.com/article/4056453/why-versioning-ai-agents-is-the-cios-next-big-challenge.html ↩︎