1978年就有人预言:自然语言编程是愚蠢的

Dijkstra旧文警示:自然语言编程模糊性未消,难点转向验证。
文章借Dijkstra 1978年的短文《论“自然语言编程”的愚蠢》在Hacker News重新走红一事,讨论当下大模型驱动的自然语言编程热潮。Dijkstra的核心论点是:自然语言为人类模糊交流而演化,程序则要求精确、无歧义、可机械执行,把自然语言当作编程语言是对编程本质的误解;编程的困难在于把模糊意图形式化为精确逻辑,而非敲代码的语法。评论者认为当下叙事与Dijkstra批判高度同构:生成代码变容易,但正确性仍取决于需求表达的精确度,复杂度从语法转移到验证环节。文章据此提出三点启示:不应把自然语言输入营销为“无需精确思考”,验证能力比生成质量更有护城河,须尊重自然语言与形式化语言的边界。

在AI编程助手遍地开花的今天,"用自然语言写代码"被包装成一场革命。但早在1978年,计算机科学先驱Edsger W. Dijkstra就写下了一篇题为《论"自然语言编程"的愚蠢》的短文(EWD667),对"让机器理解人类语言就能编程"这一想法泼了一盆冷水。这篇旧文最近在Hacker News上重新引发热议,获得335个点赞和224条评论。它之所以能穿越近半个世纪再次击中痛点,是因为当下大模型驱动的"自然语言编程"浪潮,恰恰在重演Dijkstra当年警告过的认知陷阱。
Dijkstra到底在反对什么
EWD667的核心论点并不复杂:自然语言是为模糊、多义、依赖语境的人类交流而演化的,而程序要求的是精确、无歧义、可机械执行的指令。把二者混为一谈,等于假设"人类语言的模糊性"可以被某种魔法消除,而Dijkstra认为这种假设本身就是对编程本质的误解。
他的批评对象并非"用自然语言描述需求"这一行为——那本来就是软件工程的日常。他反对的是把自然语言本身当作编程语言来使用,即认为只要表达得足够自然,机器就能正确理解并生成程序。在Dijkstra看来,编程的困难不在于敲代码的语法,而在于把模糊的意图形式化为精确的逻辑结构,而这个形式化过程恰恰是编程的核心价值所在。
EWD编号是Edsger W. Dijkstra自1960年代起为其技术札记(Technical Notes)使用的编号体系,前缀“EWD”取自其全名缩写。这些札记并非正式发表的论文,而是他随手记录的想法、讲义与短评,累计超过1300篇,涵盖算法、程序设计方法学、教育理念乃至计算机科学的社会影响。EWD667即其中一篇,写于1978年,篇幅仅数页。由于Dijkstra习惯将手稿复印分发给同行,EWD系列在学术圈内以非正式渠道流传,后经整理在其母校荷兰特温特大学(University of Twente)等机构存档并数字化。这些短文往往言辞犀利、观点鲜明,EWD667正是其中被引用最多的篇目之一。
五十年后,同样的争论换了包装
Hacker News评论区里,不少开发者指出,当下"用自然语言编程"的叙事与Dijkstra批判的对象高度同构。大模型可以把你的一句话变成可运行的代码,但代码是否正确、是否做了你真正想要的事,仍然取决于你能否把需求精确地表达出来——而这恰恰是自然语言最不擅长的事。
一位评论者的总结颇具代表性:自然语言编程降低了入门门槛,却把复杂度转移到了"验证"环节。你不需要再学语法,但你需要更仔细地审查AI生成的每一行代码,因为模糊的指令会产生看似合理实则错误的结果。这与Dijkstra的观点形成呼应:编程的难点从未在于语法,而在于思维的精确性。
也有评论者持不同看法。他们认为Dijkstra写作的时代,机器理解自然语言的能力几乎为零,而今天的大模型已经能在相当程度上处理歧义和上下文。这部分观点认为,EWD667的批判针对的是"把自然语言当作替代品",而当下更现实的做法是"自然语言作为接口,形式化验证作为保障"——两者并非非此即彼。
**形式化验证(formal verification)**指用数学方法证明程序满足某种规约(specification)的技术,如模型检验、定理证明、霍尔逻辑等。其核心思想是:不依赖测试抽样,而是穷尽地或演绎地证明程序在所有合法输入下都满足预期性质。文中评论者提出的“自然语言作为接口,形式化验证作为保障”,指的是让大模型把自然语言指令翻译为代码,再借助形式化工具(如SMT求解器、类型系统、契约检查)验证生成结果是否满足不变量。这一思路的局限在于:形式化规约本身仍需精确表达,而把模糊的自然语言指令自动转化为形式化规约,本身就是尚未解决的难题。因此它更像是把Dijkstra强调的“形式化”环节后移而非消除。
对AI编程工具的真正启示
这场跨越近半个世纪的对话,对今天做AI编程工具的人有几点实际意义。
第一,不要把"自然语言输入"营销成"不需要精确思考"。工具越强大,越需要用户具备把意图拆解为可验证步骤的能力。Dijkstra的警告在今天转化为一个产品设计问题:如何帮助用户发现自己的指令是模糊的,而不是假装模糊不存在。
第二,验证环节的价值在上升而非下降。当生成代码的成本趋近于零,审查和理解代码的成本就成了瓶颈。围绕"让用户高效验证AI输出"构建的能力,比单纯提升生成质量更有护城河。
第三,自然语言与形式化语言的边界需要被尊重。需求讨论可以用自然语言,但关键逻辑、接口契约、不变量,仍然需要精确的表达方式。把二者混为一谈的工具,最终会把模糊性带来的风险转嫁给用户。
结语
EWD667只有短短几页,却在近五十年后依然能引发两百多条讨论,这本身就说明问题没有被解决。自然语言编程不是新话题,Dijkstra的"愚蠢"论断也不是要否定技术进步,而是提醒我们:语言的形式决定了思维的边界,编程的精确性要求不会因为接口变得更"自然"而消失。对AI编程工具而言,真正的机会不在于让编程看起来更简单,而在于帮助用户在自然语言的模糊与程序的精确之间,建立一座可靠的桥。
相关推荐

ICLR 2027仍在发拒稿信,学术圈苦AI水文久矣
ICLR 2027持续对低质量投稿发出desk reject,Reddit社区对此表示支持。本文分析AI生成论文泛滥下学术会议的初筛压力、评价体系激励扭曲,以及研究者该如何应对。

Anthropic印度公司早于Claude?一个名字引发的趣闻
Reddit网友发现印度存在一家早于AI公司Anthropic的同名企业,引发对品牌命名与商标保护的讨论。本文梳理这一趣闻的来龙去脉与启示。

Qwen Image 2.1本地32项实测:数数翻车,动漫风格意外能打
B站UP主Luke的DevLab用RTX 5090本地实测Qwen Image 2.1共32项:拼写与空间布局可靠,苹果计数翻车,动漫风格优于写实人体,自行车轮辐条等几何结构明显短板,画面反复出现疑似训练数据残留的紫色印记。