生成式软件工程
搜索
开始阅读/第 1 部分 · 机器开始会干活/第 1 章

当机器会写代码

一份作业拿了满分,背后可能是一个真懂行的人,也可能是一个只会转发题目的人。这一章讲怎么把两者分开。

这一页讲什么
  • 机器会写代码之后,哪些能力还值得花四年去训练;
  • 意图、规格、实现三样东西之间的缺口,通常落在哪一段;
  • 作品不再证明能力之后,靠什么判断一份产出是好是坏;
  • 一次完整的翻车案例:只用 Excel 公式做二维码,为什么做了六个小时还是错的;
  • 工具会过期,原则不会,哪几条原则值得记一辈子。

一、作品不再证明能力

三年前,交上去的一份程序只要跑得起来,就说明写它的人掌握了知识。作品是能力留下的痕迹,痕迹越清楚,能力越可信。这条对应关系维持了很久,久到我们把它当成了常识:能做出程序,就等于学会了。

机器会写代码之后,这条对应关系断了。同一份能跑的程序,背后可能是两种人。一种人真的想过输入有哪些情况、输出该长什么样、边界条件怎么处理;另一种人只是把题目转贴过去,再把答案转贴回来。两种情况交出来的东西,从外观上一模一样:能运行、格式整齐、代码行数还不少。

这条对应关系为什么会断,可以这样看。以前写代码的每一步都要人自己走:查文档、试写法、跑一遍看报错、改掉再跑。走完这一趟,人自然就知道哪里有坑。现在这一趟由机器走完了,人只看到了开头和结尾。中间那些「试了三次才对」「这里必须加一个判断」的经验,全都没有留在人身上。

于是有一批问题浮现出来,问得不客气,但是真实:

这三个问题没法靠「把下一门课考好」来回答。它们指向的是同一件事:当写代码这件事本身变便宜,什么还值得花时间去练。

生活类比 期末交一份读书报告。以前批改的人看你写得多细、引了哪几段原文,就能判断你读没读这本书。 现在有了写得很顺的助手,交上来的三份报告都很工整,光看纸面已经分不出谁读过。想分清楚,只能当面问一句「第三章那个人为什么拒绝了 offer」。

二、意图、规格、实现:缺口落在中间那一段

把任何一件「让机器去做」的事情拆开,都能拆成三段。

flowchart LR
  I["意图:你真正想要什么"] -->|"这一步需要产品判断"| S["规格:写清楚的可检验要求"]
  S -->|"这一步需要设计与实现"| P["实现:真正运行的代码"]

拿点外卖举例:你想「吃顿好的」是意图;「四十分钟内送到、辣度按我上次的记录、不要香菜」是规格;外卖软件里跑着的那些代码是实现。麻烦在于,每一步之间都有一道缺口。「吃顿好的」可以变成几百种不同的规格,写下哪一种取决于你没说出口的偏好;同一份规格也允许无数种实现。模型拿到任务之后,会把这些没说清楚的地方统统自己猜着填上。它填得很快、很一致,也经常正好是你没要的那个。

看一个具体的例子。有人让 AI「做个选课系统」,半小时后得到一个能跑的网页,但是没做人数上限。用这三段一读就明白了:意图是清楚的,可「选课」这个词里藏着一堆没说出口的约束,人数上限、先修课检查、时间冲突怎么办,这些属于规格,被跳过了。模型直接从意图跳到了实现,用它自己的默认选择填补空白。它没有违反任何明确指令,因为根本没有明确指令可违反。

规格要写到什么程度?有一个成本上的理由值得记住:办活动的开销大头永远在后面。方案改一版十分钟,场地订金交了退不回来。写代码同理,规格改一遍几分钟,四十个文件改完再推翻要一整天。把规格写清楚这件事,越早做越便宜。

写清楚你的要求,承担一切「不明确」的后果。没有说明的地方,等于把决定权交给了模型。 不需要把所有细枝末节都提前决定,但要知道哪些地方允许它自行发挥,哪些地方决定了产品是否正好是你要的那个。 —— 课程材料原句
关键结论 翻车现场多数发生在意图和规格之间那一段。那一段没有代码,只有判断。 机器最擅长的是最后一段,最不擅长的是替你想清楚前面两段。

三、三种能力:信息差、承担责任、组织协作

写代码变便宜之后,还值钱的东西可以归成三样,说法有点扎人,但很好记。

  1. 信息差:知道计算机世界里有什么东西、知道哪里能找到答案。别人卡三天的问题,你知道该去查哪份文档、该看哪个日志。
  2. 承担责任:做了决定之后,有人要为后果负责。改一个数据库字段,可能让第二天的成绩录入全部对不上;敢拍这个板的人,得知道后果有多重。
  3. 组织协作:把人、工具和反馈组织起来,最终真的做成一件事。这一项最稀缺,也最难速成。

第三样东西听起来空洞,拆开就很具体。一个小组五个人、外加几个智能体同时在改一个项目,谁先做、谁后做、接口谁定、冲突怎么合、做完了谁验,这些安排决定项目能不能收尾。同一个模型,配上不同的安排,实际产出可能差出好几倍。这一章后面几页讲外壳、讲上下文、讲拆任务,讲的都是这件事的具体做法。

这三样东西都能在日常里练,不需要等到工作。信息差可以靠做实验补:同一件事换一种问法再问一遍,看结果差在哪。承担责任可以靠写记录补:每次决定都在实验日志里写一句「我当时以为会怎样、实际怎样」,错了也照样写。组织协作可以靠小组作业补:主动去定接口、排先后、收结果,做完之后回头看哪一步最容易卡住。

生活类比 办一场班级晚会。有人负责借场地,有人负责节目单,有人负责音响应答。 真正让晚会开成的,是那个知道「音响要先试、节目单要提前两天定、场地钥匙要找宿管阿姨拿」的人。 他不会唱歌也不会跳舞,可他清楚每一步的先后顺序和可能出岔子的地方。

四、AI slop:判断标准是「修改有没有局部性」

生产变便宜之后,次品也会按比例变多。批量生成、看起来像样、实际质量很低的产物,有一个专门的叫法:AI slop(AI 泔水,原本指喂猪的泔水,后来泛指低成本批量生产的低质内容)。用在代码上,典型症状有这么几条:

这些东西危险的地方在于它们看起来是对的:能运行、能通过自动检查、代码行数还很多,让人误以为完成度很高。等到第二个需求进来,你才发现改一处要动十处。

所以判断一份产出,有一个很好用的标准:修改有没有局部性。好的工程,改一个地方只需要动一个地方;坏掉的那种,改一个地方牵动全身,每次需求变化都要把整个系统重新解释一遍。越挣扎陷得越深,这正是《人月神话》里说的焦油坑。AI 生成得越快,掉进焦油坑的速度也越快。

关键结论 第一版能跑起来,说明不了什么。换一组输入再跑一次,再提出一个小改动,看它需要动几处。 动一处就够,这份产出值钱;动一片才够,这份产出是负资产。

五、二维码 Excel:一次完整的翻车

有一个案例值得从头看到尾,因为它把上面几件事全串起来了。

任务是:只用 Excel 公式,把一段几千字的字符串编码成分帧显示的二维码。要求听起来够具体了,可里面藏着一堆没说清楚的选择:一帧装多少内容?输入变了,公式要不要重建?「文件能打开」算完成,还是「真实扫码能还原原文」才算完成?这些都属于规格,但没有人把它写下来。

结果是这样的:有的模型思考了 25 分钟就撞上输出上限,前后花了 6 个小时才做出来;有的模型直接交了硬编码版本,只对当前这一个输入看起来正确,换一段字符串就全废。这就是 AI slop 的典型样子:演示的时候扫码能通过,换一段文字立刻露馅。

这个案例值得复盘的地方有三层。

  1. 规格没写全,模型只能自己选。分帧大小、纠错等级、输入变化后怎么重建,每一个没写的选择都被它用默认值填了。
  2. 验收标准定得太低。「文件能打开」这个标准,一份硬编码的结果也能满足。把标准换成「用手机扫出来,得到的文字与原文逐字相同」,硬编码当场就过不去。
  3. 失败之后先换输入,再改代码。换一组输入就能区分「交付了一个计算过程」和「交付了一次表演」。
常见坑:拿演示当验收 演示成功与需求实现之间隔着很远。能运行一次的演示,证明不了这件事做完了。 验收要问的是:换一组数据还行不行,出问题的时候有没有线索,三个月后别人接手改得动吗。

六、先用好,再理解原理:地板被抬高了

传统学习路线是先学会、再动手。现在顺序可以反过来:先让 AI 帮你做出一个能用的东西,再围绕真实遇到的问题去理解原理。过去这些任务意味着翻教程、记配置、搜报错,光是「准备开始」这一步就足够让人放弃;现在你可以先拿到一个能观察、能检查的结果,再倒回来学它背后的东西。

这个顺序可以拿学游泳来对照。以前教练先在岸上讲二十分钟动作要领,你听得云里雾里,下水还是呛。换一个顺序:先扶着浮板在水里漂十分钟,体会身体怎么浮起来,再上岸讲为什么手臂要那样划。同样是十分钟的讲解,后面这种讲的是你自己碰到过的问题。

这个顺序里有一件事不能省:验收。系统到底能不能启动?数据存对了没有?快捷键符合预期吗?这些都需要证据。学习的入口变了,判断结果的工作永远在你手里。一份漂亮的摘要,证明不了阅读已经发生;一次能跑的演示,证明不了需求被满足。

再把视角抬高一点。想象一个有天花板也有地板的房间:天花板代表最优秀的工程师能做到什么,地板代表一个刚入行的人至少要能做到什么。中间这段高度,就是一个人靠这门手艺吃饭的空间。

flowchart TB
  H["天花板:最优秀的人能做到什么,这一层没有变化"]
  F1["以前的地板:会写循环、会调用接口就能入行"]
  F2["今天的地板:能交付完整、可靠、可维护的系统"]
  H --> F1
  F1 -->|"基础部分被补齐,地板抬到这里"| F2

以前地板很低。会写一个循环、会照着文档调用别人写好的接口,就能找到一份工作。现在基础部分被机器补齐了,一个新手加上一个会自己动手的模型程序,产出可能接近三年前的中级工程师。于是「能跑起来的代码」不再稀缺,地板抬到了「能交付一个完整、可靠、可维护的系统」这一层。

外面还有一组公开数据能印证这条判断。有一个常用基准,做法是给模型一个真实开源代码仓库里的问题单,看它能不能自动交出一份通过测试的补丁。2024 年前后,顶尖模型在这个基准上的解决率大约在 10% 到 50% 之间;到 2025 年,最好的模型到了 77.2%。两年前需要一位资深工程师花一整天处理的任务,现在几十分钟就能拿到一版可用的补丁。面试门槛、代码评审标准、期望的交付速度,全都跟着往上移。

这条判断有两个推论。能力刚好停在新地板下面的人会被挤压;能力在地板之上的人,价值反而被放大,因为整个房间的可活动空间变大了。天花板那一层没有变化,往上顶仍然要靠自己。

把它换成一句能指导行动的话:现在拼的是「能不能交付」,从前拼的是「能不能写出来」。交付包含写出来,还多出三样东西——做完了有没有证据、别人接手改不改得动、出了问题查不查得到原因。这三样恰好都是机器的默认产出不保证的。

生活类比 同一门课,去年考 60 分及格,今年把及格线划到 75 分,因为班里一半人都能考到 80 分。 你还是那个你,卷子还是那张卷子,能过线的位置变了。

七、讲原则,不讲工具

工具的半衰期很短。下面这张表把最近五年「当时被当成必备」的做法排在一起,你能看出换代的节奏。

时间当时被当成必备的做法后来的变化
2021 年编辑器里的自动补全,加上一整本笔记式的代码工作流还有一部分人在用
2023 年网页版聊天窗口,手动复制粘贴代码基本被编辑器里的集成功能取代
2024 年早期版本的编辑器智能体,早期的流程编排接口接口已经大幅重构
2025 年命令行智能体,模型上下文协议的生态正在成为主流
2026 年编码智能体,以及围绕它搭起来的外壳这一门课讨论的对象

如果一门课教你某款工具的十二个快捷键,一个学期之后这些内容就过期了。如果它教你另外三件事——为什么上下文是最稀缺的资源、为什么工具的切分方式决定智能体靠不靠谱、为什么架构品味是机器最难替代的部分——那么下一个工具出现时,这三条照样成立。

每一条原则都能落到一个具体动作上。「上下文是最稀缺的资源」落到动作上,就是每开一个新会话之前先把目标、约束、证据、示例四样写在一张纸上。「工具的切分方式决定靠不靠谱」落到动作上,就是接新工具之前先问它暴露了几个操作、说明写没写清。「架构品味最难替代」落到动作上,就是每次改完问一句「下一个需求进来,我需要动几处」。

换成一个具体的练习方式:每上手一款新工具,都问一句「它为什么被设计成这样」,把答案记进一份实验日志。日志四栏就够:任务是什么、我用什么方式让 AI 做、结果哪里好哪里不对、下次改哪一句。三个月后,这份日志比任何一份网上教程都更贴合你自己的习惯。

现在就做 十分钟,建一份实验日志并写完第一条。
① 在桌面新建一个文本文件,命名为「实验日志.txt」,系统自带的记事本就能编辑;
② 写下四行:任务是什么、我怎么问的(把原话整段贴进去)、结果哪里好哪里不对、下次我会改哪一句;
③ 选一件这两天真实发生的事来写,例如用 AI 整理社团名单、解释一段看不懂的代码、写一份活动通知;
④ 把这四行发给 AI,让它指出「下次我会改哪一句」写得够不够具体。改到能直接照做为止。

自测

1. 一位同学把作业连题目一起发给 AI,拿到满分。用意图、规格、实现的语言说明这份满分证明不了什么。
意图是「完成这道题」,规格没有写下来,实现由模型补齐。模型会用它自己的默认选择填满所有空白,这些选择未必是题目真正的要求。满分说明这份实现通过了一次检查,说明不了交作业的人能不能写出规格、能不能判断实现是否满足规格。
2. 「作品不再证明能力」这句话对大学生意味着什么?
意味着不能再靠交出一件作品来证明自己。要么补上规格那一段的能力,把模糊的愿望写成可以逐条检查的要求;要么补上验收那一段的能力,能判断一份产出改起来是否有局部性。这两件事恰好是作品本身看不出来的。
3. 怎么判断一份 AI 产出算不算 AI slop?这一章给的核心标准是什么?
修改有没有局部性:改一个地方,是否只需要动一个地方。如果每次需求变化都要重新解释全部隐含关系、重写大片内容,项目就在往焦油坑滑落,不管它的第一版多漂亮。
4. 二维码那个案例里,验收标准写成「文件能打开」会放过什么错?该改成什么?
会放过硬编码版本:它只对当前那一个输入看起来正确,换一段字符串就废了。该把标准改成「用手机扫出来,得到的文字与原文逐字相同」,并且换一组输入再测一次。验收标准写得越低,越容易把一次性表演当成完成。
5. 「地板被抬高」具体指什么?为什么说天花板那一层没有变化?
地板是刚入行至少要能做到什么。以前会写循环、会调用接口就能入行,现在基础部分被机器补齐,「能跑起来的代码」不再稀缺,地板抬到了能交付完整、可靠、可维护的系统。天花板是最优秀的人能做到什么,那一层要靠人自己想出新东西,机器补齐基础的部分没有动到它。