文章翻译: The Evolution of Coding in the AI Era

人工智能时代的编码演变

2024 年 8 月 23 日 · Arvid Kahl 阅读时间:约 8 分钟

几年前,我还是一个完全不同的程序员。巅峰时我能轻松浏览文档并主要写出能用的代码;状态差的时候,我会为了一个笔误或古怪的 bug 折腾好几个小时,毫无结果。

那时我从来不会想到用 AI 来帮我 —— 因为它还不存在。

但现在情况变了。

我们生活在这样一个世界:不使用 AI 工具(AI tooling)来写代码的软件开发者,正逐渐变得少见。现在可用的技术要么极其便宜、要么免费,其实用性和影响力如此普遍,以至于过去五年或十年那种编程方式很可能被彻底替代。

代价也是存在的。

这种转变在生产力和速度上带来了若干好处,但也激发了很多恐惧,并暴露出值得探讨的潜在问题。

作为一个使用 AI 工具来构建软件产品的人,我想思考我们为何走上这条路径、存在哪些风险,以及如何缓解这些风险。我也想探讨,这对那些刚开始学习编程并要在一个把 AI 视为软件开发常态的世界里构建产品的人意味着什么。

AI 在编码中的力量

使用 AI 最大的明显优势很简单:它比你打字快。AI 生成代码的速度远超人类。即便是最近那些非 AI 的、高度复杂的代码编写工具,也比不上开源 AI 目前能做的速度与效率。这里所说的 AI 指的是专门以写代码为训练目标的大型语言模型(large language models,LLMs),或是通用到足以为用户生成代码的模型。像 ChatGPT、Claude 等都能写出代码,其中有些在产出能真正运行的软件方面表现更好。

作为软件创业者,我必须在解决有趣技术挑战的意愿和业务需求之间找到平衡。任何能让我更快地写出高质量、可靠代码的方法,我都必须去尝试。当第一批 AI 编码助手进入市场时,我很快就注意到它们的威力。对于有经验的开发者来说,这些工具非常有用——它们能生成我可以快速审阅并决定接受或拒绝的代码。

这就是关键:你必须懂得什么是好代码,才能批准好代码。

有经验的编程背景会让这些工具变得更有价值。你实际上是在外包“写逻辑”这一过程,而你所做的则是持续不断地进行代码审查(code review)。AI 做的一切就像给你发来一个拉取请求(pull request)供你审阅。这带来两点含义:

对有经验的开发者而言,这些工具对工作质量的影响是巨大的。

对于正在学习编程的人来说,仍然有必要理解编码的核心原理,才能有效评判 AI 给出的结果。

学习曲线与 AI

这是我看到人们最关心的核心问题:如果你靠 AI 学编程,你可能永远不会真正理解那些你需要用来评判代码的解决方案。你需要知道“配方”的原材料和工作原理,才能下厨;否则你只是把食物弄坏。对代码也是如此——你需要理解语法、语义、求值和执行的过程。

在开发者成长路径的某个阶段,依赖 AI 生成代码可能会妨碍他们技能的发展。如果你不会写代码,就想象不出最终系统的全貌,也就无法判断自动生成的代码到底是什么、做了什么。

直到现在,这种经验通常需要很长时间来积累。

我看到很多人在这个问题上煽动恐惧。他们不满今天的人不再必须学习编程就能产出某种程度上有用的结果。他们担心人们永远无法获得理解代码工作原理的经验,只会产生平庸、不可维护的代码,而且这些人甚至在职业早期就能赚到钱。

“现在的年轻人"现象

这让我想起一个反复出现的梗:人们总说“现在的年轻人不想工作了”。这是每十年就会重现一次的主题,是一种自我错觉式的看法。我看到一个流传的图集,里面有从去年追溯到几十年前、甚至到 1850 年代的旧报纸剪报,本质上都在说同一件事:年轻人有道德缺陷,因为他们不想工作了。

post

我觉得很有趣:每个年代总有人认为“当年大家都想工作,但现在没人想工作了”。这种自我错觉已经重复了数百年,在技术领域我们也看到类似的模式。

编程的发展演进

回顾编程的发展,我们也见证过类似的转变:

每当技术(或我们与技术交互的方式)发生“量子跃迁”,总会有一群传统主义者或纯粹主义者认为新事物正在导致知识的丧失。他们觉得这会让人们的能力退化,因为人们不再需要理解那么多关于编码或编程的底层细节。每一次,这些怀疑者最终都被证明是错的。

当人们从机器语言转向编译型语言时,编程的可达性提高了。你不必理解寄存器是什么、什么是 jump-not-equal(条件跳转)事件;你只需要懂 if-then-else(条件语句)或变量赋值。只要掌握这些,就能构建出能运行的代码。

从编译型语言到解释型语言的跃迁,使得像在 HTML 中嵌入 JavaScript、使用 PHP、Ruby on Rails,甚至 Java 变得更加普及。你只要把一个文件放到某处,并以正确方式加载,它就会按预期执行。这种可达性催生了更多有趣、更好的工具,而用这些工具建出的解决方案常常使之前的系统相形见绌。

当下的跃迁:生成代码

我认为我们正处于(如果还没完全处于的话)又一次这样的跃迁之中。我们正在从“用程序指令告诉计算机怎么做”转向“通过提示(prompt)生成代码 —— 由提示产生的代码”。这又是抽象层级上的一次提升,离底层系统更远了一步。

最近我亲身经历了这一点:我需要把一段转录文本(transcript)转换成 SRT 字幕文件(SRT subtitle file)格式,用于我自己的业务 Podscan。我没有自己写那段代码,而是让 Claude AI(Claude)在我写的代码雏形基础上,生成一个能把转录文本翻译成有效 SRT 数据的函数。结果是一个可靠可用的函数,能稳定完成任务。

我对 Claude 说:“输入会是像这样的文本。”我贴了一段要转换的转录材料。然后我说:“我希望输出是有效的 SRT 数据。”然后敲下回车。出来的就是一个能工作的函数,能够把我的转录文本转成 SRT 文件。

编码性质的变化

这次经历让我意识到:编码在演变。它不再是把每一行代码都敲出来,而是知道需要完成什么,并用指令(指示 AI)去让 AI 去做。函数的心智模型仍然重要——例如接收数据、按行拆分、处理每一行——但具体实现可以交给 AI 去完成。

作为开发者的那部分我仍在努力接受这种变化。过去有趣的部分是解析数据、拆分行、提取时间戳、移动那一行文本、把文本放到下一行、然后把该行的索引放到文件的另一行。但在某种程度上,那已经不再是有趣的部分了。

我敢打赌:在这个地球上的每一天,总有人在实现类似的功能。有人把一种文件变成另一种、把数据格式从 A 转成 B,而这个任务往往已经有人写好了库(library)来处理。我的意识到的是:开发者被高薪聘用、被需要,不是因为我们知道如何拆分一个文件并取出某一部分。

开发者的真正价值

真正的价值在于:我能口头或文字上清晰表达需要发生的事情、阐明输入与输出、以及大致流程;我有能力说“我需要的输出是有效的 SRT,而你将得到的输入是这种结构化文本”。这就是当今的软件开发,也是未来软件开发会继续走向的方向。

过去那种因为错过一个逗号就追踪每一行并制造 bug 的日子会消失。机器会为我们处理这些细节。剩下的将是架构设计——从宏观层面的完整应用设计(可能包含 17 个协同工作的部分),到微观层面的单个函数定义。

编程教育的未来

我们正在把“执行代码”这一环节从编码中分离出来,而把“提示(prompting)与指令(instructing)”置于更重要的位置。要精确地提示与指令 AI,我们需要理解逻辑的心智模型、流程、数据结构和数据转换。

也许教学会改变,就像 70、80 年代教授 BASIC、COBOL、C 或 Ada 时那样。也许未来的软件开发者更多被要求成为“指令者(instructors)”。越早理解:若要准确地提示与指示,你需要掌握逻辑模型、流程、数据结构和数据转换 —— 我们就能越快建立起面向未来开发者的课程体系,而这些开发者无需手动逐行深入每一段代码。

把编码当作“编辑”

长期以来,我觉得写作人与软件开发者之间其实没什么不同:两者都是在写带有指示性的文本——一个是写给人看的,另一个是写给机器看的。现在我们在某种程度上正从“写作”转向“编辑”。我们在编辑别人(即 AI)所产出的“想法”,使之符合我们对目标受众的理解。

书籍编辑的受众是出版方推送的读者;软件编辑的受众是系统、计算机以及执行由这些 AI 系统生成代码的解释系统(interpretive systems)。想写好书,你得懂编辑;想写好代码,你也得懂提示与指令的艺术。

前路

前路可能并非一帆风顺。许多开发者对这种变化持防御态度,感到被冒犯:那些他们花多年时间掌握的技能,现在看起来可以被这么轻易地完成。很多开发者对这件事非常反感,因为编码本来就是他们费尽心血学来的技能,而现在代码生成这么容易似乎是在贬低他们的努力。

但好处也是不可否认的。我个人从生成代码速度的提升中获益良多。对我而言,阅读、解析、理解和验证代码,总比从零构思代码要容易得多。这就是为什么编码现在与过去根本不同——我们不仅写代码的速度更快,理解与验证代码的速度也更快。AI 已经留下了深远的影响,我认为我们不会回到过去那种状态。

在这个由 AI 辅助编码的新时代,我们作为开发者的角色在演变。我们正变成架构师、指令者和代码编辑者,而不再仅仅是编写者。虽然这个转变对部分人来说可能具有挑战性,但它也为软件开发中的创新与效率开辟了令人兴奋的新可能性。

在前进的过程中,我们需要拥抱这种变化,同时确保自己在培养能够有效引导和指示 AI 去创建未来软件解决方案的技能。编码的未来已来,它是人类创造力与机器效率的激动人心的混合体。

我的一些简短思考(要点提炼)

  1. 作者强调的是角色的转变:从“代码书写者”转向“系统架构师 / 指令者 / 编辑者”。关键能力从手写实现转为构建心智模型与有效提示(prompt engineering)。
  2. 对初学者的建议隐含着警告:即便有 AI,也必须打好基础(语法、数据结构、执行模型),否则无法评判 AI 的产出。
  3. 历史上每次抽象层级跃升(机器码→编译→解释)都曾遭遇抵触,但最终扩大了可达性与创新;AI 可能重复这一轨迹。
  4. 实务层面:AI 会替我们处理重复、机械的实现细节,开发者应把精力放在架构、边界条件、数据模型与系统整合上。
  5. 教育需要演进:课程可能从“教写代码”转为“教如何思考系统、设计流程与构造有效提示(prompt)”,同时保留核心编程原理的训练。

Start searching

Enter keywords to search articles

↑↓
ESC
⌘K Shortcut