在代理式人工智能时代教授新手计算与编程

《Communications of the ACM》:Teaching Novice Computing and Programming in the Agentic AI Era

【字体: 大 中 小 】 时间:2026年10月31日 来源:Communications of the ACM 7.1

编辑推荐:

  AI编程代理已经深刻影响了计算教育。我们不应将其视为威胁,而应视作重新聚焦早期课程的机遇。我们提出“不稳定编译器”这一隐喻,用以阐明AI编程所赋予的能力及其对使用者的要求。我们认为,入门计算课程能够且必须转变为早期的软件工程课程,其目标是教会学生对自己借助AI产出的工作负责。这确

  AI编程代理已经深刻影响了计算教育。我们不应将其视为威胁,而应视作重新聚焦早期课程的机遇。我们提出“不稳定编译器”这一隐喻,用以阐明AI编程所赋予的能力及其对使用者的要求。我们认为,入门计算课程能够且必须转变为早期的软件工程课程,其目标是教会学生对自己借助AI产出的工作负责。这确实要求——甚至迫切要求——研究如何重新思考程序规约的教学。

格蕾丝·霍珀赢了。当她制作出第一个编译器时,她说:“我有一个可以运行的编译器,但没人愿意碰它,因为他们认真地告诉我,计算机只能做算术,不能编程序。”然而,如今我们都依赖编译器。后来,霍珀的FLOW-MATIC(启发了COBOL)以“使用英语词汇”为卖点。这一想法在数十年间也遭到广泛嘲笑。今天,我们实际上可以用自然语言编写程序。这是一条非凡的技术弧线。

然而,我们听到的关于AI编程代理时代计算教育的讨论,更多是恐慌而非庆祝:学习受到攻击,因为学生提交AI生成的解决方案;教师不知如何应对;人们疯狂寻找“防AI”的编程作业。计算教育处于守势。但作为教育者,我们不能仅仅设计“对抗装置”。在为当前巨大挑战制定策略时,我们也应抓住其巨大机遇。我们认为,入门计算课程可以(并且应该)深度融入(目前高年级的)软件工程实践,并进行调整以支持初学者借助代理构建程序的学习需求。

我们通过一个对经验丰富的程序员有帮助的隐喻来构建这一提议:我们将代理视为不稳定的编译器。这两个词共同捕捉了AI编程所赋予的以及所要求的东西,也指向了现有的计算与教育知识基础,我们可从中继续前进。

**所赋予的(它是编译器!)** AI编程代理显然是从自然语言到运行代码的编译器。20世纪50年代,早期编程语言将人们从汇编的苦役中解放出来,提升了初学者所能构建内容的水准,使编程变得平易近人,并赋能更广泛的受众。现在,这一水准又提高了,可能赋能数量级更多的人来编写有用的程序。

**所要求的(它是不稳定的!)** 编译器也是不稳定的,原因有很多。传统编译器“保持语义”,但自然语言的“语义”是模糊且含混的。散文也可能以传统编译器拒绝接受的方式不严谨。翻译提示的模型本身也有弱点和问题。系统是非确定性的。这些方面都带来了传统编译器不施加的负担。传统编译器不遗余力地提供干净的抽象,而不稳定编译器则不然。

**这是新的吗?** 一方面,这种不稳定性听起来像(而且确实是)一个问题。另一方面,这真的有多新呢?人类在实现上也不完美。我们与犯错的同事一起编程。有时犯错的同事其实就是我们自己,来自不久前的自己。我们的需求是模糊的,或者我们误解了它们。需求会变化,构建系统本身也会改变我们对需求的理解。布鲁克斯在40年前就指出,软件开发没有银弹,因为创建软件的本质在于概念设计,以及从半形式化想法到代码中的形式化表示;代理并不能让这个问题消失。

软件工程领域的一种(简化)观点——我们将其与临时的“编码”(缺乏清晰的智力或证据基础)区分开来——是它是一套纪律,旨在帮助我们在面对这些障碍时构建出完成复杂任务的出色系统。从需求分析到规约,到测试,到验证等等,都在改善这些弱点。从一开始,软件工程就一直致力于赋能人类,让计算机在面对众多复杂性和困难来源时做他们真正想做的事。

有了AI编程代理,软件工程教育必须在课程中更早开始:几乎从学生第一次参与AI驱动编程时就开始。一种模糊的编程语言需要设计和需求工程。一个不稳定的编译器需要大量测试和验证。使工作可审计需要使用和记录类型、辅助函数、API、设计概念、计划以及整体架构。因为大语言模型倾向于趋同,它们要求关注分布外任务的错误以及社会背景和负责任计算(在这种情况下,规范性解决方案可能错过关键细微差别)。

不幸的是,我们缺乏关于如何向初学者教授软件工程的知识基础。因为把代码写到页面上曾被认为很难,即使是测试等基础主题也常被贬为对初学者太高级。现在把代码行写到页面上太容易了,这些主题必须成为前沿。这需要重新考虑在计算领域接受教育意味着什么。

**重新思考计算教育的目标**

我们认为,受过训练的计算人员的核心区别将在于能否为自己生产的产品负责。几十年前,大卫·洛奇·帕纳斯指出,虽然其他工程学科提供保证,但软件却带有免责声明,并劝诫我们做得更好。直到最近,这一呼吁大多被忽视。但现在,如果任何人都能轻易生产出充满免责声明的产品,那么区别就在于生产一个工程制品:一个带有质量保证的对象。

这些保证将涵盖软件的多个维度:不仅是最基本的正确性,还包括可测试性、可扩展性、可用性、可访问性等,即软件工程师所称的“-ilities”。理解系统使用的背景,并能够保证产品在该背景下安全、快速、可用等,将变得有价值。注意每一个“-ility”都需要理解计算机科学的许多不同领域。换句话说,保证的需求将既需要也会激励软件设计者学习更多计算,而不是更少。代理的力量使即使是早期学生也能实现有趣的设计并实验其后果。

作为一个具体例子,考虑用户界面。以前,构建和修改它们需要大量编程经验,因此通常是高年级主题。现在,初学者可以毫不费力地生成看起来很复杂的界面。但它好吗?无法手动编写界面的学生仍然可以相互进行同行评审,并根据反馈快速迭代,得到更接近可用产品的东西——在此过程中,具体地观察到视觉闪亮与可用性之间的差异。

**重新设计入门课程**

将这些体验交到初学者手中,并为他们准备以保证为核心的思维模式,需要重新思考入门计算教育。一个微妙但关键的特征是,“编译器”实际上是一个综合器:我们用散文写的并不是真正的程序,而是规约。也就是说,任何未固定的选择都是(不稳定的)代理的自由度。对同一提示运行N次可能导致N种截然不同的实现——甚至可能使用不同的语言。因此,有效使用代理的艺术部分在于约束它们的行为。这一见解对我们来说并不新鲜。著名的代理式程序员如安德烈·卡帕西和西蒙·威利森,以及教育者如约翰·雷格尔,都曾讨论和撰写过他们提供的中间规约,以约束代理并使其输出可审计。

我们设想向入门学生教授适当缩小的相关技术。我们的重点不是“提示”。相反,学生现在将专注于生产软件的所有其他方面:程序计划、测试计划、测试套件、属性、约束等。他们可以深入思考不同形式的数据组织及其对可计算问题及性能权衡的影响。我们可以为这些规约定义一种半结构化格式,这实际上成为学生与代码之间的有意义的(可评分!)中间层。提示从任务的自然语言简单描述,转变为捕捉所有这些视角和特征的复杂多面描述。虽然代理也能生成这些规约,但非常容易在不确切知道输出是否符合预期任务的情况下签署它们。同行评审和新形式的概念性考试问题都可以帮助学生意识到这些困难,从而自己参与这项工作。它们还会给学生提供适合他们水平的指标,以理解“对生产的代码负责”意味着什么。

因此,早期阶段的学生可以专注于现实问题——如消费应用或数据分析——对于这些问题,他们可以就需求和约束进行有趣的对话,基于他们对世界的知识,并参与丰富的同行评审和批评。他们可以处理超出自己编程能力的问题,同时又不牺牲运行和实验评估其决策后果的能力。这与目前大多数入门计算课程的教学方式形成鲜明对比。

这就引出了一个关于向初学者教授代理式编程的常见问题:学生将在哪里学习写代码?计算专业的学生仍然需要能够写代码:它是许多后续课程中使用的媒介,在代码中工作有助于我们了解其优缺点,受训练的计算科学家需要理解构成该学科的计算模型,等等。但学生需要多少代码写作能力,以及何时需要,尚不清楚。

激进的提议将几乎完全从入门课程中消除代码写作:学生专注于设计和规约,我们让代理编写所有代码。有些人可能会问,学生没有先编写和追踪代码,怎么可能审计代理的输出?让我们现实点:追踪不可扩展,即使是在入门课程后期作业的代理输出量较低时;审计规模大到能做有趣事情的代码不太可能发生。也许学生需要学习如何就“-ilities”与代理对话,以此作为一种审计形式;他们也许能通过仅在规约层面工作就做到这一点。我们不知道这是否可行,但值得实验找出答案。

这个提议不仅激进,而且具有颠覆性,因为它需要颠倒大学标准序列中的几门课程。回到不稳定编译器的隐喻:大多数当前的入门课程并不展示编译器的输出。相反,它们使用高级编程语言来完成任务和实现学习目标,而后续课程则突破语言实现的抽象,展示越来越低层的情况。实际上,激进的提议在这里也会做同样的事,将今天早期课程中的许多编程内容移后,移到学生需要理解细节时。不稳定性意味着这种方法比汇编在课程中后移时更混乱;我们需要实验来理解如何正确设计它。

不那么激进但仍然重大的修改是,将设计与规约与手动代码阅读和代码写作交织在一起。在这个版本中,我们最初强调如何阅读代码,以便学生了解它如何反映规约和约束。大多数入门计算课程反而从一开始就强调写作代码,尽管这与其他形式的读写能力背道而驰!(少数计算教育项目表明,在写代码之前先读代码有好处,尽管通常是在小项目上,而且往往针对更年轻的学习者。)从那里开始,我们可以让学生写代码来练习自己编码规约和约束。将规约和测试作为中间表示采纳,带来了课程灵活性:有些问题会限定在学生手动编写代码的能力范围内,而另一些则有意超出学生的代码写作能力,但强调我们讨论过的所有其他学习目标。

无论进行哪种重新设计,都需要大量研究。以这种方式教授计算机入门课程似乎是不可能的,但这可能只是我们自己专业视野盲区的一种错觉。8 相反,我们必须透过新手的眼睛来看待世界,以确定哪些方法对他们有效,哪些无效,同时避免我们自身的专业知识和经验造成的扭曲视角。在布朗大学,我们于2026年春季开设了一门课程,目的正是如此,面向已经修读过一个学期编程的学生。我们已另行报告了我们的研究结果;4 我们关于“规约”作为可行的中间表示形式的想法就源于那次经验。

行动呼吁

计算机教育必须回应代理式编程在质量和保障方面的需求。关键在于,这些需求并不仅限于未来的专业软件工程师。例如,一位只修读了一门计算机课程的社会科学专业学生,之后可能会创建用于决策环境的程序,但他们可能永远不会修读高级“软件测试”课程,因此他们仅有的一次接触应该确保他们既能识别可能出错的地方,也知道如何防范。这一点一直如此,但直到最近,训练不足的学生所能构建的系统的范围往往有限。如今,即使是“小提示”也能生成完整的系统,这些系统花哨的界面很容易掩盖各种微妙的潜在弱点。正如研究人员长期以来在电子表格和其他最终用户平台中观察到的那样,3,6,9 工具的显著进步使得即使是随意编程的人也变得强大得多——因此,在无意中,也变得危险得多。

因此,总体而言,我们主张对我们的早期课程进行重大调整。代理式编程将会长期存在。如果计算机教育对它侧目而视,那么学生——尤其是考虑到各种媒体和有影响力人士的鼓动——将直接认为计算机课程无关紧要。我们有责任为学生、也为整个社会调整我们的课程,以便学生既能接纳代理工具,又能学习设计、开发、调试和捍卫他们带入世界的代码所需的知识。回到我们的核心隐喻,“不稳定编译器”中的编译器部分使我们能够追求比以往任何时候都更宏大的目标;而不稳定的部分则需要我们对系统进行广泛、多模态的描述,以保持代理在正轨上。

入门编程教师常有的说法是:“我不教编程——我教的是解决问题!”对他们来说,这应该是一个解放的时刻!如果我们从费力地使用某种低级语法编写代码的苦差事中解放出来,我们现在应该能够几乎完全专注于“解决问题”的部分,但现在要处理更丰富的问题。我们坚信,计算机科学、软件工程和设计领域数十年的工作提供了丰富的思想和方法,这些思想和方法可以(通过编译器)且必须(通过不稳定部分)在入门课程中最终发挥作用。

致谢

我们要感谢本·夏皮罗、比尔·皮尤、丹·瓦拉克、哈里森·戈尔茨坦、艾瑞斯·巴哈尔、孙智云、乔·波利茨、马修·王、罗伯特·戈德斯通、斯里库马尔·苏布拉马尼安、威尔·克里克顿以及匿名审稿人提供的反馈。我们特别感谢2026年春季课程中的19名学生,他们参与了我们的生动实验。这项工作部分得到了美国国家科学基金会(NSF)奖项2208731和国防高级研究计划局(DARPA)协议HR00112420354的支持。本材料中表达的任何观点、发现、结论或建议均为作者本人的观点,并不反映资助者的立场。

凯西·菲斯勒是布朗大学(美国罗德岛州普罗维登斯)的研究教授。
施里拉姆·克里希纳穆尔蒂(shriram@brown.edu)是布朗大学(美国罗德岛州普罗维登斯)的教授。
迈克尔·利特曼是布朗大学(美国罗德岛州普罗维登斯)的副教务长(负责人工智能)和大学教授。
相关新闻
生物通微信公众号
微信
新浪微博
  • 搜索
  • 国际
  • 国内
  • 人物
  • 产业
  • 热点
  • 科普

热点排行

    今日动态 | 人才市场 | 新技术专栏 | 中国科学人 | 云展台 | BioHot | 云讲堂直播 | 会展中心 | 特价专栏 | 技术快讯 | 免费试用

    版权所有 生物通

    Copyright© eBiotrade.com, All Rights Reserved

    联系信箱:

    粤ICP备09063491号