你是否也遇到过这样的情况:让AI 生成一段代码,运行完美,目标实现,但是你却对这段代码并不清楚。
你是否担心,长此以往,编程能力会悄悄退化?
这个问题的答案,可能和你想的不一样。
Anthropic 在今年1月出了一份报告 "How AI assistance impacts the formation of coding skills",给出了指引:用AI的方式不同,效果天差地别。
简要来说,让AI 生成代码来提高工作效率时,如果你想学习新技术、提高自己,就需要多做一些:
- 还要看懂、理解代码和技术,这些都可以询问AI,让AI 老师帮助你。
- 遇到代码报错时,先自己查看调试、再问AI。
AI辅助编程 v.s. 无AI辅助编程
下面我们来具体看看这份报告。其中做的实验主要考察两个方面:
一、在要用到新技能的编码任务中,是否使用AI辅助能让程序员更快地完成工作?
二、这种AI辅助是否会影响程序员对新技能的掌握?
这个实验招募了52名程序员,他们都有至少一年的Python开发经验,熟练使用Python。实验中,要求他们使用一个以前没有用过的Python库Trio来完成指定的编码任务。每个任务都包括一段问题描述、起始代码和Python库Trio的知识点(这是模拟程序员根据自学教程,"做中学"某个知识点的过程)。这些程序员们分成了两组,一组在编写代码时使用AI辅助,另一组没有AI辅助。
完成编码任务之后,马上测试这两组程序员对于新学知识的掌握程度。一般从四个方面来测试编程技能:调试代码 ( Debugging )、读代码 ( Code Reading )、写代码 ( Code Writing )和概念 ( Conceptual )。研究人员没有测试写代码这一项,一是可能代码出错会影响判断。更重要的是,现在AI 可以写一些基础的函数和代码,人类主要负责代码架构设计。因此,写代码的能力似乎不那么重要了,而阅读和调试AI生成的代码是必备技能,还要掌握概念、知识点。
实验结果显示,AI辅助编程组完成编码任务的平均时间比无AI辅助编程组快约两分钟,没有明显的差异。分析原因是AI辅助组的一些程序员花了很多时间思考和编写合适的提示词。需要注意的是,这个实验是模拟应用新技术、新知识到编码工作中的情况,需要边学边用。如果是已经掌握的技术,估计AI 辅助编程能够极大提高效率,相比无AI辅助组的优势会大得多。
但是,测试中AI辅助编程组的表现是50%,无AI辅助编程组的表现是67%。AI辅助编程组低了17%。
怎么会出现这么大的差异?
研究人员进行了深入分析。有AI辅助的那一组直接采用AI生成的代码,完成编码任务的过程中遇到的错误很少。而无AI辅助的组,遇到了更多错误。他们在调试时,深入理解代码,从而加深了对新库的理解。
看来,在掌握新技术上,遇到并调试代码错误很重要。
六种使用AI辅助编程的方式
那么,有AI辅助编程是否就一定意味着学习能力降低呢? 毕竟用AI辅助编程是大势所趋。
不一定。如何使用AI会影响后续测试的表现,也就是会影响他们获得这个技能的程度。
研究人员梳理出使用AI辅助的六种方式,如下图所示:
这张图中,横轴是编码任务的完成时间,越往右表示完成时间越长。纵轴是测试得分,越往上表示得分越高,对新技术的掌握程度越高。
可以看到,其中有三种AI使用方式的测试得分低,分别是39%、35%、24%(均低于40%),完成时间分别为19.5分钟、22分钟、31分钟;另外三种AI使用方式的测试得分高,分别是65%、68%、86%(均不低于65%),完成时间分别为22分钟、24分钟、24分钟。
这里有一个重要的发现:编码任务完成时间长,学习效果并不一定好。 例如图中右下角的 Iterative AI Debugging组,耗时最长(31分钟),测试得分反而最低(24%)。反过来说,学习效果好也可以花费时间并不多,例如图中最上方的Generation-Then-Comprehension组,耗时中等(24分钟),测试得分最高,达到86%。
也就是说,编码任务完成时间并不是学习效果的可靠指标,那么,这其中起作用的是什么呢?接下来就来分析一下这两类AI使用方式:
学习效果差的三种AI使用方式
测试得分低的三种使用AI的方式分别是:
-
AI Delegation (AI委派):这个组的程序员完全依赖AI来编写代码。这个组完成编码任务的速度最快,在编码过程中也极少甚至没有遇到错误。
-
Progressive AI Reliance (渐进式AI依赖):这个组的程序员一开始会问AI 一两个问题,但很快就把所有的代码编写工作都交给AI。
-
Iterative AI Debugging (反复依赖AI调试):这个组的程序员依赖 AI 来调试或验证所写代码。这个组与 AI 对话次数更多,所以完成编码任务也花费时间更多。但是,程序员依赖 AI 来解决问题,而不是让自己的理解更清楚,因此测试表现差。
这三组的共同点就是完全依赖AI,基本上拿到任务或遇到问题就全盘交给AI了。 他们在使用AI的同时,也让AI替代了自己的思考,并没有在这个过程中形成自己的理解。因此,在测试时就暴露出没有掌握好这个新技术。
学习效果好的三种AI使用方式
测试得分高的三种使用AI的方式分别是:
-
Generation-Then-Comprehension (先AI生成代码、然后理解):这个组的程序员先用AI生成代码,然后问AI一些问题,帮助理解。这组程序员完成编码任务并不快,但是在测试中展现了对新知识点的高水平理解。值得注意的是,这种使用方式看上去与AI Delegation(AI委派)组几乎一样,不同的是,这组还用AI来帮助自己理解。
-
Hybrid Code-Explanation (生成代码+解释代码):这个组的程序员既用AI生成代码,也要AI解释所生成的代码。阅读和理解这些解释花费了一定时间,但也让他们很好地掌握新技术。
-
Conceptual Inquiry (查询概念):这组程序员只是问AI 一些概念问题来弄明白知识点。理解了新技术之后,(从描述来看)他们自己编写代码,没有使用AI 生成代码。这组程序员遇到的代码错误更多,但是他们自己解决这些错误。这个模式完成编码任务速度快。
这三组程序员不仅用AI生成代码,还会让AI来讲解代码帮助自己理解,或者主动问AI概念、知识点的问题。 因此,他们对于新技术的理解更加深入。
看来,完全可以用AI来生成代码,但必须理解代码背后的逻辑。
更多发现
实验中还有一个有趣的发现,对于AI生成的代码,手动输入和直接复制粘贴的掌握效果几乎没有差别,并不会因为打字“抄写”一遍就理解吸收,反而还会拖慢任务完成速度。这也和我们学习编程时的体会相似,照着样例代码敲一遍,并不会留下印象,而应该是不看示例,自己独立写一遍才有效。
此外,实验中并非所有AI辅助组的程序员都使用了AI生成代码,只有约三分之二的人这么做。其中那些完全依赖AI、不追问理解的程序员,学习效果普遍较差。比如测试得分最低的8个人中,有3个就属于 AI Delegation 组(AI委派组)。可以想见,如果使用AI 辅助的程序员都是这样仅使用AI生成代码,虽然完成任务会更快,但是与无AI辅助组在测试中的差距恐怕也会更大。
总结
所以,AI会让你的编程能力进步还是退步呢?
答案并不取决于工具本身,而是取决于你如何使用它:
-
完全依赖AI,不做思考→ 能力停滞甚至退化;
-
让AI解释代码和概念,独立调试代码→ 效率与能力兼得;
OpenAI 研究员Gabriel Petersson 的做法就是“高分使用方式”的典型:他在学习新技术时,先让AI介绍知识点,再让AI生成代码,然后他看代码,不断追问AI,直到完全弄懂。(详细内容欢迎阅读这篇文章: OpenAI 研究员如何用AI高效学习?)
你在使用AI 编程时,有哪些‘避坑’经验或高效技巧?欢迎在评论区分享,让我们一起探讨,如何在AI时代成为更好的程序员。
参考: