Skip to content

大人,时代变了:当代码成为新的机器码

最近使用 AI 编程时,有一个问题一直困扰着我。

现在,我们已经开始大量依赖 AI 产生代码。它可以一次完成过去需要人写几个小时甚至几天的工作,而我们也越来越少逐行检查它的具体实现。很多时候,只要程序能够运行、测试可以通过、界面看起来正常,这项工作似乎就算完成了。

但我始终很难完全放心。

AI 解决问题的过程并不稳定。它经常舍近求远,把一个简单的问题写得很复杂,或者为了并不存在的未来需求,提前引入许多不必要的抽象。面对同一个问题,人类程序员完全可能写出更简洁、更优美,也更容易扩展的实现。

更麻烦的是,有些问题很难被测试覆盖。代码今天能够运行,不代表它没有隐藏的并发问题、安全漏洞和错误边界,也不代表半年后仍然有人能维护它。

如果把 AI 生成的每一行代码重新审核一遍,我们似乎又失去了使用 AI 的意义;如果不审核,我们又凭什么相信这个自己并不了解的系统?

直到最近读到 Powderworks 的文章《Tabs, Spaces, Hand Tools, and Seat Belts》,我才开始从另一个角度理解这件事:

也许问题并不是我们应该如何继续审核每一行代码,而是代码本身正在离开人类工作的中心。

在高级语言出现以前,程序员需要直接面对汇编语言甚至机器指令。相比机器,经验丰富的人可以写出更紧凑、更高效的代码。早期编译器生成的结果并不总是理想,它可能笨拙、冗余,也可能远远不如熟练程序员亲手优化的实现。

但编译器没有停留在那里。

随着编译技术不断成熟,它生成的代码逐渐超过了绝大多数人手工优化的结果。今天,除了极少数对性能和硬件有特殊要求的场景,已经没有多少人会为了证明自己的技艺,拒绝编译器并坚持手写汇编。

更重要的是,我们也不会逐条审核编译器生成的机器码。

我们编写和审核的是源代码,然后相信编译器能够把它可靠地翻译成机器可以执行的形式。机器码当然仍然存在,也仍然决定着程序最终如何运行,但它已经不再是大多数程序员主要工作的界面。

AI 辅助编程可能正在把这条抽象阶梯再向上推一级:

人类描述意图和约束,AI 将它翻译成源代码,编译器再将源代码翻译成机器码。

从这个角度看,AI 很像一种更高层次的编译器。它的输入不再是语法严格的高级语言,而是更接近自然语言的需求、上下文和反馈;它的输出则是过去必须由程序员亲手完成的代码实现。

如果这条路继续发展,源代码可能会逐渐变成一种新的中间产物。它依然重要,就像机器码依然重要,但人类未必还会逐行阅读它。

二、AI 还不是一个合格的编译器

Section titled “二、AI 还不是一个合格的编译器”

当然,今天的 AI 还远远不能等同于成熟的编译器。

传统编译器面对的是语义相对明确的输入。相同的源代码应该得到稳定、可预测的结果,翻译过程原则上不能擅自改变程序的含义。

AI 却是概率性的。同一句需求可能产生完全不同的实现;它会误解上下文,补充未经允许的假设,也会一本正经地制造根本不存在的保证。

严格来说,AI 生成的代码并不是黑匣子——代码就摆在那里,我们随时可以打开阅读。真正接近黑匣子的,是它得出这个实现的过程,以及它以远超人类阅读速度生产代码之后,我们是否还有能力理解整个系统。

这也是当前最棘手的地方:源代码已经开始失去“人类主要工作界面”的地位,但自然语言之上的验证体系还没有成熟。

所以,未来的方向不应该是盲目相信 AI,只看结果而完全不问过程;但也不可能永远靠人逐行检查所有代码。真正需要变化的,是我们的审核层级。

过去,我们主要审核具体实现;未来,我们可能需要把更多精力放在需求、边界、约束和验证上。我们必须说清楚系统不能做什么、数据必须满足什么条件、失败时应该如何恢复,再通过类型、测试、静态分析、安全检查和运行监控去验证这些要求。

对于安全、并发、数据一致性、性能瓶颈和不可逆操作等关键部分,人工深度审核仍然不可替代。但对于大量普通实现,逐行阅读可能不再是最经济的质量保障方式。

不逐行审核所有代码,可能是未来;不验证 AI 的产物,绝不是未来。

三、你生产的是产品,还是工艺品

Section titled “三、你生产的是产品,还是工艺品”

程序员很喜欢把自己看成工匠。

我们在意命名是否准确、抽象是否优雅、每一层结构是否恰到好处。漂亮的代码不仅可以工作,它还体现了作者对问题的理解和审美。这些东西构成了程序员的职业尊严,也让编程不仅是一份工作,而像是一门手艺。

但是,工业化改变的从来不只是工具,也包括人们评价产品的方式。

今天仍然有刀匠亲手锻造刀具。他们也会使用电锤、砂轮和切割设备,而不是为了追求纯粹,拒绝一切现代工具。但他们制造的更多是工艺品、高端定制品或者个人作品,而不是承担整个社会日常需求的工业产品。

大多数人购买一把刀,关心的是它是否锋利、耐用、安全、价格合理,并不关心刀匠落下了多少锤。用户使用一个软件也是如此。他们在意问题有没有解决、系统是否稳定、数据会不会丢失,而不会因为代码写得优美,就原谅一个无法使用的产品。

这并不是说工业化以后,质量就不再重要。恰恰相反,工业产品需要更加严格的质量标准。只是质量不再主要依靠某个工匠的个人经验,而是依靠可以复制的流程、规范、工具和验证体系。

因此,传统编程会不会消失,也许不是最重要的问题。刀匠没有消失,木匠和钟表匠也没有消失。未来仍然会有人亲手写代码,研究精巧的算法,打磨优美的实现,并从中获得无法替代的乐趣。

但我们必须分清楚:自己生产的究竟是产品,还是工艺品;亲手写代码究竟是一种市场仍然需要的生产方式,还是我们不愿放下的兴趣和身份。

过去几十年里,程序员是技术发展的受益者。

行业增长快、人才稀缺、工资高,让不少人产生了一种错觉:程序员天然比其他生产者更聪明,也拥有某种不会被工业化触及的特殊地位。仿佛机械化可以改变工厂,自动化可以改变办公室,却不会改变编程本身。

现在,这种特殊性正在消失。

大量商业代码本来就是生产资料和工业产品,而不是等待后人欣赏的艺术作品。普通程序员所做的工作,也和其他生产劳动一样,会被拆分、标准化、自动化,并被纳入更大规模的生产流程。

这并不是对蓝领工作的贬低,而是程序员必须接受一个现实:我们并不是天然高于其他劳动者的“天之骄子”。当生产工具发生变化,我们同样会失去一部分对生产过程的控制,同样需要适应新的分工,也同样可能从掌握完整手艺的工匠,变成软件流水线上的一个环节。

当然,工业化不会让所有人处于同一个位置。

一部分常规代码生产会被去技能化,越来越接近标准化操作;一部分人会转向定义问题、设计系统、制定标准和建立验证机制;还有少数人继续深入底层,在研究、关键基础设施和高端定制中保留传统工匠的位置。

改变的不是“世界还需不需要程序员”,而是世界需要什么样的程序员,以及还愿意为哪一种能力付费。

面对这种变化,仅仅坚持“人写的代码更优美”没有太大意义。

一个真正的刀匠不会因为热爱手艺,就拒绝电锤和切割设备;一个程序员也不能因为 AI 的实现不够漂亮,就否认整个生产方式正在改变。工具是否值得使用,最终取决于它能否更稳定、更低成本地生产出符合要求的产品。

我们可以继续热爱编程,但不能因为自己热爱这门手艺,就认定市场会永远需要它。

对于大多数人来说,现实的选择大概只有两种。

一种是跟上这次变化:把工作重心从亲手完成每一处实现,逐渐转向定义目标、设计约束、验证结果,并为整个系统负责。我们不再通过写了多少代码证明价值,而是通过能否可靠地把一个想法变成产品证明价值。

另一种,则是趁新的生产方式还没有完全进入组织流程、绩效考核和岗位要求之前,尽可能把 AI 带来的效率留给自己。

我在上一篇《AI 时代的生产力红利,应该归谁?》里写过:当所有人都开始使用 AI,今天的效率优势很快就会变成明天的最低要求。我们真正需要争取的,是在窗口关闭以前,把更高的生产力兑换成自己的时间,再把时间兑换成生活的选择权。

我们当然仍然可以亲手写代码,就像今天仍然有人亲手锻一把刀。

但我们必须分清:这是因为社会仍然需要用这种方式制造产品,还是因为我们仍然热爱这门手艺。

热爱没有错,工匠也不会消失。只是当工业化真正到来,工匠不再天然站在生产体系的中心。对大多数以编程谋生的人来说,继续争论 AI 写出的代码够不够优美,可能已经不是最重要的问题。

更重要的是,我们能不能接受代码正在成为新的机器码,能不能学会在更高的抽象层次上工作,以及能不能在时代完成转身之前,为自己保留一点选择的余地。

大人,时代确实已经变了。