王垠:我用 AI 编程的经历

王垠博客地址

现在网络上真是太多误导了,说 AI(LLM) 编程太厉害,一行代码没写完成了项目之类。根据我之前用 ChatGPT,Claude,Copilot,最近用 Cursor 的大量实际经验,不懂编程的人想要用 AI 做出成功的项目,几乎是妄想。

会编程,但不懂真正的计算机科学,不懂如何写出极其简单,逻辑精密的程序的人,想要靠 AI 写出“王垠级别”的代码,当然也是妄想。

有人惊讶王垠也用 AI?当然,我为什么不用?我用得还挺多,而且比一般人懂得如何用。去年计算机科学基础班第5期课程后期,我现场给同学们演示时都在用 Copilot 补全……测试。但我不建议上课的同学用这些东西,因为他们还没能力鉴别它补全出来的代码,使用 AI 显然会妨碍他们的思考和进步。但我能驾驭它,所以我可以用。

这一个月来,Cursor 给我生成了 6 万多行代码。猜我接受了多少行?不到 5000 行。经常走偏方向,重复同样的逻辑而不懂提取抽象,甚至把我手动调整本来正确的部分改错,把我给它纠正过的地方又改错,写一大堆复杂的测试把自己套进去,最后无法明白为什么测试“不通过”……

几天前创建的一个新项目,耗费我 20 多个小时的“口舌”跟它解释,最后生成 2 万多行代码。最后复杂到无法修补,我不得不决定完全推翻重来。它居然还在欢呼“成功了!” 并列出一项项的“成果”,对完全没道理的基本错误视而不见。一遍遍地给它指出问题没解决,却一次次的回答“哦,我知道了!”,“这次我找到问题的根源了!”结果全是画饼…… 因为实在没法改对了,只能自欺欺人吧?

我用的模型还是最新的 Claude 4 sonnet。GPT 4.1 就更差,几乎不敢用来改代码。Claude opus 太贵又慢,而且我试了一下,好像也没比 sonnet 好到哪里去。总有人给出一些 Cursor 配置“引导语”,说你把这些写进 .cursorrules 就行了。我当然也试了,没用的。并不是你要求什么它就能满足你,就连我刚提出的要求都有被忽视的时候。

人们以为 AI 能理解大量复杂的代码,但是一次次的教训告诉我,它们不能。没人能理解杂乱的代码,王垠也不能。

如果你前后几次给指示,生成的代码加在一起,就开始重复,变得杂乱。AI 并不能理解整个代码里面的规律,相似性,它甚至可能根本没看某些代码。所以它没法简化这样的代码,甚至没法看到可以简化的地方。我有几次给它明确标出行号,指出“这个地方可以简化”。它回答说“是呢!我来帮你简化!” 结果最后它的理解根本不同,去把原来对的地方改错了,代码却一点没简化。

这就像某些不负责任的程序员。你说哪里有问题,他就只看那里。浏览一下附近的代码就得出结论,然后噼里啪啦给你改了,结果又弄出别的问题。它其实并没有全局的设计思维,只是根据局部的信息来修改。

别误会了,我用 AI 做东西并不总是失败,实际上在小范围内经常很成功。有时候它确实能把事情做出来,只是你得知道怎么驾驭它。我举这个例子,只是说明连王垠用 AI 做代码都经常有失败的时候。显然并不像宣传的那样,你只要告诉它做什么就行。我已经描述得非常详细了,却仍然做不好。王垠能把事情描述得多详细?你看看王垠的文章就知道了。

有人说目标不要定太高太快了,要有策略。这个我当然知道,我非常有策略。我之前那些成功的项目,没有智慧和策略,你觉得能做出来吗?所谓策略,就是要知道先做什么,后做什么,什么该做,什么不该做,什么暂时不要做,之类的。可以说我是这类策略的大师,没其他人知道我是怎么做事的,他们只知道最后做出来了。这些做事方法都是最高机密。

当年我做了 PySonar 之后,后来 Google 有一个团队的人花了两年时间,想做出超越 PySonar 的项目,结果最后什么也没做出来,不得不继续用我改进后的开源代码。为什么呢?因为一开头策略就错了。他们想用 Prolog 这样的逻辑编程语言来实现 Python 语言的类型推导,我一听就知道注定要失败的。为什么我知道呢?因为我已经试过了,而且我知道 Hindley-Milner 系统和 Prolog 的局限性在哪里。为什么我知道?因为我实现和改进过逻辑编程语言。

知道什么不该做,什么注定会失败,这其实是非常重要的智慧和策略。很多人都缺乏这种智慧和洞察力。

扯远了。总之,我后来发现自己平时的策略可以拿来引导 AI 写代码,比如一点点的从最基本的小函数开始写,一步步推进。这样对 AI 进行引导的话,它就能做对吗?我发现它连小块的代码也不一定写的好。有些几行的小函数都要我纠正多次,它才能改对。然后说不定将来什么时候它又把它们改错了,所以你得看它改过的每一个地方。你得知道什么样的代码是对的,什么样的是垃圾。

说白了,你得对它写的几乎每行代码进行 code review,不然很容易失控。这就是问题所在:如果你不会写代码,你怎么对别人写的代码进行 code review?

知道什么样的代码是好的对的,这就是最难的事情。没有深入的研究和很多的经验,是无法鉴别的。是的 AI 现在成了码农,我成了 VP。但一个不懂计算机科学,没写过高水平代码的 VP 领导着一群写面条代码的码农,能做出什么好东西?呵呵,我看着很多公司里的类似现象就明白了。不知道手下人在做什么,不知道谁说的是对的,不知道下一步该做什么。有多少管理者是在瞎蒙乱撞,坑蒙拐骗,我都是清楚的。

所以没能力的人有了 AI 还是没用,因为他们没能力驾驭它。他们没资格做 VP。

因为世界上绝大部分的代码都是平庸的面条代码程序员写的,训练数据都是那样,所以 AI 几乎没法写出“王垠级别”的代码,也是意料之中的。我发现把写好的代码给 AI,它确实能进行一些有用的分析和改进,但完全从头开始写的话,AI 真是寸步难行。几乎每一个小的函数都需要我反反复复多次的纠正,才能达到我期望的简单和可理解程度。

我的计算机科学班里的代码,全都是极其精辟的代码,跟公司代码和开源项目有着天壤之别。所以上我的课的同学,是没什么希望使用 AI 来完成练习的。因为数据量太少,没有训练数据,所以 AI 恐怕永远也无法达到这种精辟程度。当然毕业之后,同学们的水平都远超 AI,也远超作为 AI 训练数据来源的那些平庸程序员。

这就是为什么我的课程叫做“计算机科学”,而不是“编程”。计算机科学家和程序员/软件工程师是有巨大差别的。AI 也许能取代普通程序员,却永远无法取代计算机科学家。它只能被计算机科学家利用,作为他的工具。

别误会了,我其实觉得 AI 是很好的东西,确实是伟大的发明。我发现LLM 真的能理解人的话,并且看起来有深程度的“思考”存在,这已经是很了不起的事情。我之前对 AI 的评价大部分都是对的,比如“自动驾驶”注定要失败之类的。只是 LLM 能做到这个程度,有点超乎了我的意料。不过呢,LLM 现在的编程水平显然跟我相差很多个级别。

使用 AI 的时候,我发现解决问题的速度加快了很多,因为很多烦人的事情不用我亲自去管了,我能更专心地思考核心的部分。说白了,我就是利用 AI 来做自己不想干的“脏活”,它对此毫无怨言。这就是为什么经历了这么多次失败,我仍然继续使用它们,甚至付费使用它们。因为这个世界上有太多的脏活,复杂不堪的文档,故作高深的论文,糟糕的设计,我需要这么一个工具来帮我对付它们。但核心的思想仍然只能由我想出来,AI 对此是无能为力的。