编程本来就是一种写作

还记得 2022 年秋天,我教一位朋友写 Python。她这个人比较随性,不按 Python 的语法规则来,觉得意思大概其就行。我被她气得够呛,跟她说:编译器看不懂你这些自由表达,它是把代码一层层拆开的,拆到底每一块都得是表达式。人看上去差不多,机器看上去可不是,少个符号整个语法树的结构都变了。

后面的事情大家都知道的,那个冬天 ChatGPT 就出来了……这下机器真的能读懂我们说的话了。

所以说,人不可骄傲自大。你觉得你说的就是板上钉钉的真理,但是真理也会变。我因为知道 Python 解释器背后的原理,觉得用自然语言编程这件事不现实,却忽视了这个需求是真实存在的。就像一开始 ChatGPT 刚 public release 的时候,我朋友圈里最看空的人都是那些做 NLP 的,觉得这个“力大砖飞”、毫无美感。恰恰是那些在此之前就知道 Transformer 架构的人因为懂得太多没有体会到神奇之处。

而今天,不会有人怀疑自然语言就是新的编程语言。而早在 SICP 里,就提出了写作和编程的统一性。程序首先是写给人读的,只是顺便让机器执行。Paul Graham 在《黑客与画家》里说得更直接:黑客和画家一样,都是创作者,好代码跟好散文的标准是一回事——清晰、简洁、有节奏。我的大学语文的结课作文也写了这个观点。

编程范式的演进

Software 1.0, 2.0, 3.0 的版图

Karpathy 2017 年写了一篇《Software 2.0》,把软件分成两代。2025 年他在 YC 的演讲里补上了第三代。三代的区别不在用什么语言写,在程序是怎么来的。

1.0:人工编写

人先把规则想明白,一行行敲成 if-else。编译器、操作系统、数据库、Excel、TCP/IP,你今天用的大部分软件都是这么来的。出了 bug 能一行行追到写错的地方。

编译器是 1.0 的极致:一段文本必须严丝合缝地拆成语法树,多一个空格都不行。好处是确定性,同样的输入永远同样的输出。代价是只有专业人士能写,而那个年代软件工程师全球都不够用。

我 2022 年秋天对朋友说的那番话,就是 1.0 的世界观:机器只认规则,人得迁就机器。

2.0:机器学习

有些规则人写不出来。猫和狗到底差在哪?垃圾邮件长什么样?写不出规则,那就别写了,换个思路:给一个目标函数、一份数据、一个网络骨架,让梯度下降在权重空间里替你找那个程序。找出来的是一堆浮点数,没人能解释为什么管用。黑箱。

为什么非得是神经网络?因为权重空间得连续可微,梯度才走得动,决策树没这个性质。Karpathy 原文说得很直接:Software 2.0 是用神经网络的权重写成的。人脸识别、语音识别、机器翻译、抖音和 YouTube 的推荐系统、AlphaGo,都是 2.0。Google 搜索的倒排索引是 1.0,2015 年之后排序里塞进去的 RankBrain 是 2.0。

“规则不必由人写”这件事其实更早就赢过一次。吴军在《数学之美》里讲,50 年代起做 NLP 的主流是规则学派,照乔姆斯基的路子让语言学家一条条写语法。70 年代 IBM 的贾里尼克用统计方法做语音识别,错误率直接压下去一大截,留下一句话:“我每开除一个语言学家,识别率就提高一点。”两派吵了十几年,到 90 年代统计学派全面胜出。那已经是一次不靠人写规则的胜利,只是当时搜程序用的还是概率模型,不是神经网络。

2.0 还有个特点:一个模型只干一件事。识别人脸的网络不会下棋,下棋的不会翻译,换个问题就得重新收数据重新训练。这就是 ANI,narrow AI,专用智能。不光要招软件工程师,还得招 MLE,还得有大数据基建。个人想从头训一个模型,已经不太现实。

3.0:自然语言

2.0 搜出来的程序里有一种很特殊:它在整个互联网的文字上训练过,语法、库、Stack Overflow 上所有的争吵都压进了那几万亿个参数里,输入天然就是语言。你不用再训练它,直接跟它说话,你的话进入上下文窗口,它的行为就变了,权重一个都没动。

这是跟 2.0 的根本区别:只训练一次,之后换问题不用重新训练,换一段 prompt 就行。ChatGPT、Claude Code 都是这一代。Google 搜索也在换,AI Overviews 已经摆在了倒排索引上面。同一个模型上一秒写 SQL,下一秒改简历,再下一秒解释量子纠缠。这算不算 AGI 有争议,“一次训练,到处能用”这件事没争议。

只需要有人会写 prompt。而写 prompt 说到底就是把话说清楚。这个人可以是你自己。

为什么偏偏是语言做到了?因为语言天生就能操作世界。咒语、法令、合同,都是说出来就改变现实的东西,奥斯汀 1955 年在哈佛那门课干脆就叫《如何以言行事》。代码只是其中最严格的一种,严格到非得专业人士来念。Naval 说程序员从前像巫师,得背下晦涩的咒文才能施法;AI 等于给每个人发了一根魔杖。所有问题都能用语言描述,所以一个学会了语言的程序就拿到了所有问题的入口。

Karpathy 说 prompt 就是程序。我觉得这不是修辞:一段文本改变一台机器的行为,这就是程序的定义。

开头那张图示意得不太好:软件 2.0 和 3.0 并不是只吃掉之前 1.0 的领土。它们最主要的是带来了更多新的软件,尤其是 3.0,它会创造多得多的新软件。有很多原来在成本上没有办法用软件去满足的需求,现在也可以去满足了。

Software 1.0, 2.0, 3.0 的版图在扩大:2.0 和 3.0 主要是新增领土,不是替代 1.0

对照表

Software 1.0Software 2.0Software 3.0
程序怎么来的人写:想清楚规则,敲成代码训练:从数据里搜出来说话:用自然语言在上下文里指定
程序长什么样源代码,确定、可读、可审计权重矩阵,几十亿浮点数,不可解释自然语言,上下文窗口里的 token,人机都能读
人做什么需求分析 → 算法设计 → 编码 → 测试定损失函数、建数据集、搭网络、调参把意图、约束、示例放进上下文窗口
一个程序解几个问题一个一个(ANI)随便换(某种意义上的AGI)
代表产品编译器、数据库、倒排索引、Excel人脸识别、语音识别、推荐系统、AlphaGoAI Chatbot、Coding Agent、AI Music Generator、AI Image Generator、 Working Agent
需要什么人软件工程师软件工程师+机器学习工程师会把话说清楚的人(产品经理)
怎么 debug断点、单步、读 stack trace查数据分布、调超参、改结构、重训改 prompt:补上下文、给示例、换说法
出错的样子bug:可复现,可定位泛化失败、过拟合:玄学炼丹需要经验幻觉、误解意图:一本正经地答错

门槛没消失,换了个地方卡你。1.0 卡算法和语法,2.0 卡数据和数学,3.0 卡你能不能把意图说清楚。

那意图和表达怎么练?同样叫“提示词技巧”,哪些会过期,哪些不会?请见下一篇。

延伸阅读

  • Andrej Karpathy, Software 2.0(Medium, 2017)——1.0 / 2.0 的原始划分。
  • Andrej Karpathy, Software Is Changing (Again)(YC AI Startup School, 2025)——3.0 的提出;prompt 就是程序。
  • Paul Graham,《黑客与画家》(人民邮电出版社,2011;原著 Hackers & Painters, 2004)——编程是创作,好代码的标准和好散文一样。
  • Naval & Nivi, A Motorcycle for the Mind(Naval Podcast, 2026-02)——“人人都是施法者”的出处。
  • 吴军,《数学之美》(人民邮电出版社,2012;初稿为 2006 年 Google 黑板报系列)——第 2 章“自然语言处理:从规则到统计”,规则学派 vs 统计学派的十几年之争。