在 AI 时代学习编程思维:新手程序员必修的 5 堂课 | JetBrains 学院博客翻译

281 阅读11分钟

本文分析了新手程序员在 AI 辅助学习环境中面临的挑战与应对策略,引用研究指出 AI 可能加剧学习困难学生与普通学生之间的差距。通过对比两种典型的 AI 工具使用方式,揭示了过度依赖 AI 会阻碍学习进程,而有策略地运用则能提升学习效率。文章提出五个核心建议:注重解题思路而非代码产出、培养元认知能力以规避思维误区、避免未经充分设计的编码、警惕 AI 工具造成的能力幻觉,以及管理学习过程中的心理因素。同时介绍了 JetBrains 基于这些教学原则开发的 AI 教育功能。

这是系列文章《如何在 AI 时代学习编程》的第二篇。别忘了阅读第一篇,《学习编程还有意义吗?》。

想象一下以下场景:

一名学生正在上一门入门级计算机科学课程。他们没有任何编程经验,并且觉得自己在数学和技术科目方面不是很好。在这门课程中,老师允许使用像 ChatGPT 这样的大型语言模型和 AI 代码完成软件来帮助学生完成作业。

在完成家庭作业时,学生仔细阅读了提示,然后开始编写代码。几乎立刻,一个 AI 代码建议工具生成了一个很长的函数,这让他们感到不知所措,于是他们转向了 ChatGPT。他们认为最好将 AI 用作导师而不是答案机器,于是请求逐步指导。然而,在阅读了第一条建议后,他们跳过了解释,寻找更快的解决方案,并复制了生成的代码。然而,这段代码并没有完全符合问题的要求,还包含了一些不熟悉的语法,导致他们感到困惑。在反复在 IDE 和 ChatGPT 之间传递代码后,他们最终生成了一个通过测试用例的版本,但并没有完全理解它是如何工作的。

被问及后来他们觉得 AI 有多有用时,他们回答说“非常有用”,并感激它作为他们难以掌握的课程中的私人导师的作用。他们对自己实际上如何使用 AI 缺乏意识,并且对材料的理解程度存在扭曲的看法。

现在想象一下,同一班级里的另一名学生。她曾经参加过一个 STEM 夏令营,并且对学习编程感到过挫败。她觉得这并不容易,但有经验在身,知道她有能力产出可运行的代码。

在完成相同的作业时,这名学生仔细阅读了问题描述,并开始通过命名变量和添加注释来规划她的解决方案。她在输入代码时,AI 助力的代码建议工具提供了频繁的输入,但她偶尔会看一下,大部分时间还是选择忽略,更倾向于按照自己的计划来。当她接受建议时,这些建议都是小而具体的,比如补全括号或简单的条件语句。虽然她遇到了一些语法错误,但她仔细地纠正了它们,并成功地完成了作业,短时间内通过了所有测试用例。回顾起来,她承认 AI 帮助她更快地完成了任务,但归功于她自己的结构化思维,才得到了正确的解决方案。

Two beginner programmers are depicted. One is struggling to learn programming and one is not, one offloads their thinking to AI and misses crucial concepts, and one prioritizes the thinking skills.

以上示例并非假设。这一场景在 2024 年的一项研究中得到了说明,该研究探讨了 AI 在扩大成绩优异与成绩不佳学生之间差距中的作用。虽然这可能看起来有些反直觉,但随着 AI 随时准备为我们编写代码,这可能意味着在最初阶段需要我们亲手编写更多的代码,至少在开始阶段是这样。 

为此,我们在插件中引入了多项基于 AI 的功能,包括课程内容的机器翻译、理论查询和 AI 提示。目标不是完全避免 AI,而是学会如何有效地与 AI 共存。以下五堂课将帮助你培养所需的技能和实践,以便更好地利用 AI 工具,成为一名更强、更独立的程序员。

如果您错过了,请阅读本系列的第一部分: 编程学习是否仍然值得 

专注于问题解决 ,而不是输出

编程中的暂停是有用的,即使它们感觉像是陷入了困境。新手程序员往往惊讶于完成一个函数甚至一行工作的代码需要花费多少时间。这个缓慢且常常令人沮丧的过程是建立你需要成为更好程序员的认知过程所必需的。

精炼你的思维也将提高你快速阅读和理解自己未编写的代码的能力。虽然这一直很重要,但现在有了 AI 代码助手,开发人员阅读的代码比以前多了很多。如果你的大语言模型自动生成了你的函数,你希望能够快速接受或拒绝建议,而不会陷入理解其逻辑的困境。

黑客自己的心理学

如果有一个想法应该立即走出研究的围栏,进入课堂,那就是元认知意识的概念。诚然,它没有这样做可能是因为“元认知意识”这个术语并不吸引人——但这个想法其实很简单。它关乎你识别“思维陷阱”的能力,并有效地解决问题。

研究表明,向初学者教授这些挑战可以立即并持久地改变学生的生产力、独立性和信心。鉴于此,花点时间学习它们可能是个好主意!

以下是一些在编程中常见的元认知困难或“思维陷阱”:

  1. 正确的问题,错误的答案(形成)  – 你理解了问题,但使用了错误的方法来解决它。
  2. 陷入僵局(摆脱困境)  – 即使你意识到自己的方法不起作用,也很难改变它。
  3. 答非所问(假设)  – 你完美地解决了问题……但不是应该解决的问题。
  4. 差之毫厘,谬以千里(定位错误)  – 你快速地完成了步骤,以为马上就要完成了,结果却发现有重要的东西被忽略了。
  5. 骨折处贴创可贴(成就)  – 你不断进行小的修复,希望代码能开始工作,但实际上它需要彻底的改造。

有趣的是, 研究人员发现 ,与解决这些挑战相比,AI 实际上为初学者 引入 了新的元认知难题。具体来说,

  1. 不知不觉落后(进度)  – 你以为自己跟上了课程,但因为 AI 完成代码可以超越你当前的理解,你实际上在不知不觉中落后了。
  2. 打断的弹出窗口(干扰)  – 每当你试图集中注意力时,AI 代码补全工具就会抛出一个建议,打断你的思路。
  3. 接受错误建议(误导)  – 你信任一个建议(来自 AI、教程,甚至是自己的猜测),而这个建议看似正确,但实际上却将你引向了错误的方向。

目前,大多数 AI 工具并没有考虑到这些挑战。即使考虑到了,你才是自己思维的唯一专家,外部资源也只能在一定程度上帮助你发现思维中的陷阱。

不要急于编写草率的代码

尽管在电影中看起来很酷,但快速编码对于学习来说是不 productive 的。完成你的第一个编程作业时,花时间理解问题并正确地制定解决方案是非常重要的。这两个过程都是思维过程,应该在你开始编码之前完成!虽然快速生成大量代码很有成就感——实际上,你编写代码越快,调试代码的时间就越长。

不要犯下经典的错误,即在模糊的想法上磨练,直到只剩下一堆你已经花费了五个小时调试但又无法以正确的方式重建的语法和语义错误。你将大部分时间花在调试上本可以更好地花在在写一行代码之前先理清数据结构和程序架构上。一旦你的程序逻辑在脑海中牢固,实现它就只是语法的问题了。

采取措施避免错觉的熟练感

在上述研究中,许多新手程序员自信地认为他们使用 AI 工具解决了编程问题,但实际上却忽略了作业的核心教训。这种不合理的自信,被称为错觉的熟练感 ,再加上使用过多的 AI 建议导致了他们缺乏意识到自己停滞不前的原因。

研究中使用术语自我效能来描述人们对自己完成特定任务的能力的信心。健康的自我效能感能促进坚持和参与,但如果你高估了自己的能力,可能会忽视批判性反思,未能弥补知识上的空白。

尽管错觉的胜任感无论使用何种工具都可能发生,但 AI 可能会加剧这种现象。通过提供现成的建议或解决方案,AI 可能会给你一种错觉,认为你已经掌握了某个概念,即使你独立应用它时仍然感到困难。

以下是一些避免这种错觉的建议:

  1. 始终优先考虑主动学习 :编写代码、调试和主动分解问题比阅读或复制解决方案更能激活大脑。这种参与状态是激活学习所需神经电路的关键。
  2. 尝试橡皮鸭调试:当遇到困难时,不要立即去找 AI 助手,而是尝试经过验证的橡皮鸭调试技术,即你尝试逐步口头解释错误代码的运行情况。这种技术有助于你将模糊的直觉理解转化为具体的句子,几乎总是能帮助你发现需要更改的地方。
  3. 教初学者你正在学习的内容:即使你只掌握了一些基本知识,向别人讲解编程也是最被低估的教育方法之一。初学者通常会提出问题,这些问题可能会揭示出你可能忽略的关于材料中的更大概念。
  4. 代码回放和批评 : 值得做的事情值得做好。寻求同侪评审、教师反馈,甚至是提供详细批评的自动化工具,可以突出理解上的不足。这额外的一步会有所回报。
  5. 将错误重新定义为“负面专长” : 即使你的 DIY 代码满是 bug 和不切实际的方法,成为一名好程序员不仅要知道什么有效,还要知道什么无效。
  6. 建立信心 而不需要 复杂的工具:  挑战自己在下次作业中不使用 LLM 或 Stack Overflow。通过剥夺自己获得简单答案的机会,你可以锻炼更强的编程能力。你最终可能会回到这些工具,但这些练习可以帮助建立信心和了解自己的理解。

了解学习中的情绪

所有的程序员都知道,编程思维往往在两种极端之间摇摆:要么是实现完美代码时的兴奋,要么是令人沮丧的困惑。无论你已经编程一周还是数十年,这种情感体验几乎是相同的。诀窍是学会与这些体验共存,而不是与之对抗。

要真正维持你的编程实践,你应该努力培养真正的自信,发展对挫折的积极应对方式,让自己被灵感所激励,尽情地玩耍和创造,并以你的工作为荣。要知道,这些几乎比你所学习的信息更重要,因为它们决定了你对编程的态度。培养并保持相信自己是一个喜欢编程的人的信念,这将远远超出你手工计算排序算法每一步的能力。