AI辅助软件开发的四个阶段

我必须承认,到目前为止我对AI辅助软件开发非常热情。它帮助了我很多,使我能够在没有AI的情况下更快地完成几个项目。

AI辅助软件开发的四个阶段

不,这篇文章不会是关于“否认、愤怒、讨价还价……等等。”嗯……这可能也是一个好话题,但我扯远了。

1、第一阶段:在ChatGPT窗口中的脚本

当这一切开始时,我向朋友们展示了ChatGPT如何仅通过在聊天窗口中获取函数描述就能编写简单的Python函数。他们的第一反应是,“嗯,我没有看到什么魔法。我自己也可以不借助任何AI完成。”

“正是如此!”我的回答是。“这就是重点。不要让AI助手去做你不能自己做的事情。”

这是AI辅助开发的早期阶段。我会打开ChatGPT网站,要求它编写一个函数,将该函数复制到我们的编辑器中并运行。有什么问题?将错误消息复制回同一个ChatGPT窗口并请求修复代码。将修复后的代码复制回你的编辑器并重复这个过程。

很简单,对吧?很多时候,它确实有效,你会得到你想要的函数。有时,在四到五次迭代后,你会说:“够了!”然后开始自己修复代码。

即使在那时,ChatGPT也是非常有帮助的。你可以要求它为现有的函数添加注释,创建测试,甚至生成README文件的草稿。

但这是一个繁琐的过程:在ChatGPT和我的编辑器之间来回切换,无法看到代码中具体发生了什么变化。大多数时候,我依赖于自己的视觉检查、智能IDE和编译器。聪明的开发者也会在这个过程中添加测试。

2、第二阶段:IDE扩展

很快,我转到了名为Codeium的VS Code扩展。我必须承认,当GitHub Copilot首次可用且免费时,我也测试过它的早期版本。我不太满意。我记得我说过,“我宁愿自己写代码,而不是看Copilot生成的内容并决定是否接受它。”我决定不订阅Copilot并停止使用它。

但Codeium不同。也许它们添加代码的方式不那么突兀,或者它们的代码质量更好。毕竟,在AI的时间尺度上,已经过去了六个月,这是一段很长的时间。但我试了一下,立刻就上瘾了。

Codeium不仅可以根据描述编写代码,还可以查看你的现有代码并提出修改建议。如果你需要在多个文件中进行许多类似的更改,这非常有用。

Codeium可以快速理解你的代码库,并可以添加看起来缺失的函数。例如,如果它看到你在包中刚刚添加了一个CreateUser()函数,它会建议添加GetUser()DeleteUser()ListUsers()函数。它相当聪明,通常其建议是你期望的结果。我认为十次中有八九次,我都同意Codeium的建议并接受了它们。

我对Codeium非常满意,并推荐给所有人,特别是对AI持怀疑态度的人。“只需将其添加到你的VS Code并尝试一下,”我会告诉我的朋友。“它是免费的,如果你不喜欢它,可以移除。”

我喜欢它,当然,我不会移除它。但有时候,我想自己写一些东西,不需要AI的帮助。有时候,我想学习一个新的主题或新的语言,并想培养肌肉记忆。有时,Codeium试图为我编写Markdown文档或文章,但我不喜欢它的建议。一个好处是你可以禁用Codeium并再次启用它。你还可以为某些语言禁用它;这是我为Markdown和AsciiDoc所做的。你可以将自动补全建议“暂停”一小时,以便不间断地工作在你的论文或代码上。

Codeium很好地为我服务,并且帮助了我很多,对此我非常感激。然后我听说了Cursor。

3、第三阶段:基于AI的IDE

Cursor是最早一批专为AI使用而构建的IDE之一。Cursor不是一个VS Code扩展;相反,它是VS Code的一个分支,具有额外的UI功能,以帮助它们更深入地参与开发过程。它们紧跟VS Code版本,因此在VS Code功能方面你不会感到落后。更重要的是,你可以导入所有你所依赖的VS Code扩展,并在Cursor中使用它们。

转向Cursor彻底改变了我的编码方式。除了生成新代码和编辑现有代码外,我现在可以与AI对话并获得解释和建议。通常,我们的对话以一个问题开始,比如,“我想为这个项目添加日志记录。你推荐哪种方法?”Cursor会给我两个或三个可能选项的概述,给出优缺点并建议最佳路径。你可以添加其他条件,比如,“我知道logrus是一个流行的库,但我希望使用标准库和log/slog。”Cursor会根据这些新信息调整其建议。

完全让我震惊的新功能是能够与整个代码库对话。想象一下,能够在Cursor的聊天窗口中说,“@Codebase 请审查我的代码库并撰写一个良好的README文件来解释这个项目。”它表现得非常出色!我不得不添加几个修正,但总体而言,它在几秒钟内为我的项目创建了一个完美的README。

这鼓励了我,我问了下一个问题,“请建议我应该为这个项目创建哪些ADR(架构决策记录)文档。”它回答了七个或八个应该在ADRs中涵盖的主题:语言选择、日志结构设计、数据库选择等。不用说,我要求它编写所有这些文档并将它们放在一个单独的ADR目录中。

在那之后,让Cursor为我的项目编写测试几乎是理所当然的。所有这些带有大量样板代码的无聊测试用例都是在几秒钟内创建的,还包括模拟服务及其测试(以确保它们是好的模拟)。

在Cursor提供了这么多帮助之后,如今没有测试和文档的项目是不可原谅的。

我最近习惯了所有这些功能,甚至开始觉得有点懒惰。当然,我可以轻松地编写这个转换函数,但如果Cursor和Claude可以在几秒钟内完成,为什么我要花20分钟呢?Cursor在处理Go语言中那些通常导致初学者沮丧的第一批if err != nil时并不懒惰。有了Cursor,几乎可以自动完成。不仅如此,如果它注意到你偏好某种错误消息格式,它会在将来使用这种格式。

另一方面,有了来自AI的巨大帮助,我在新项目中变得更加开放和富有创造力。在考虑添加新功能时,“人类”的我会考虑实现所需的时间并决定,“这可以等待。”“AI辅助”的我会告诉Cursor,“请将此函数添加到代码中,”它会愉快地为你完成。分析它写的内容只需一两分钟,新功能就添加好了。

到目前为止,与Cursor和其他之前的AI助手一起工作时,我觉得我对代码库发生的事情基本上是掌控的。但昨天我见证的新版Cursor和新的Claude Sonnet 3.7模型改变了这一点。

4、第四阶段:AI驱动的开发

昨天,我在一个使用另外两个开源项目的项目上工作。有些事情没有正常运作。客户端(第一个开源项目)在访问我的服务器时给我超时,而我的服务器是使用另一个开源项目构建的。

我向Cursor求助,它建议在我的代码中添加日志记录以查看发生了什么。我慷慨地允许它这样做,但日志并没有显示任何可疑之处。请求被我的服务器接受并转发到库。看起来我不得不分叉库的repo并在其代码中添加日志记录。但我不熟悉它,而且要弄清楚如何做需要一段时间。这就是我当时的想法。

所以我继续操作,分叉并克隆了repo,在Cursor中打开它,并问它,“请在我的代码中添加日志记录,以便我可以跟踪请求通过服务器的过程。”它做到了。它理解我试图解决的问题,并建议在其他地方添加日志记录。

添加日志调用需要使用日志文件(见脚注中的解释)。使用日志记录需要添加一个新的Go接口,这需要在几个其他文件中进行更改。

在这一点上,Cursor认为在没有添加适当的测试的情况下进行重大更改不是一个好主意。它添加了测试,进行了更改并要求我运行测试。不是切换到终端并运行命令。只是在同一个对话框窗口中按“运行命令”按钮。

我按下了按钮,看到一些测试失败了。Cursor说,“好吧,让我来解决这个问题……”我又做了一些修改。我注意到我的编辑器用红色的波浪线标记了一些函数调用和变量,告诉我,“这将无法编译。”在我能够告诉Cursor这一点之前,它自己也注意到了,并说,“是的,我发现编译器有问题。让我来解决这个问题。”

这种情况重复了好几次。我只是张着嘴,看着这个神奇的Cursor(在Claude的帮助下)对代码库做了什么。它添加了更多的日志,实时修复编译问题,并要求我按下按钮重新运行测试,直到找到问题。

“啊,现在我看到问题了!”它说。如果你以前没有使用过Cursor,不要被这句话所迷惑。每次Cursor认为它找到了问题时都会这么说。很多时候,这只是旅程的开始,后面还有更多的曲折。但这次,它确实找到了问题所在。库期望ID变量是一个整数,但CLI客户端使用的是字符串。我们应该修复哪一部分?

“让我看看,”Cursor说。“我在互联网上刚刚拉取到的JSON-RPC 2.0规范中明确指出,ID可以是数字、字符串或NULL。所以,我们必须修复这个库。”

在我能说什么之前,库已经被改变了。当然,你明白你不能简单地用一个字符串替换一个整数。库应该支持规范中描述的所有三种选项。“没问题,”Cursor说。“我会创建一个结构和包装器,以保持向后兼容性,同时也会支持规范中描述的所有选项。”然后它继续工作,进行更改。

在某个时刻,我跟不上它的速度了。它工作得如此之快,解释所有更改并让我接受它们,以至于我跟不上它的节奏。最可怕的一刻是在那股变化流中间,它突然停了下来,说:“通常,我们限制运行次数为25次工具调用。”我的心沉了一下。现在我必须自己来继续完成Cursor开始的更改吗?

幸运的是,Cursor说:“要继续,请按这个按钮。”我照做了,它继续进行更改,直到再经过两三次步骤后完成了。它再次运行单元测试和集成测试(这些测试是它创建的),然后说:“现在它应该可以与你的应用程序一起工作了。”

果然!我现在要做的就是将更改提交到我的分支,并将其推送到GitHub上的分叉仓库。我将与库的开发者合作,解释Cursor是如何发现并修复这些问题的。

5、结束语

我必须承认,到目前为止我对AI辅助软件开发非常热情。它帮助了我很多,使我能够在没有AI的情况下更快地完成几个项目。但昨天我看到的Cursor简直就像是魔法。我不再控制整个过程。而且我害怕可能会在中途留下这些更改。

另一方面,我毫不怀疑我自己无法找出别人代码中的问题。很可能我会放弃并切换到另一个库。AI帮助我继续在这个项目上工作。Cursor只用了大约一两个小时就找到了问题并解决了它。

毫无疑问,我将继续在我的开发过程中使用AI。我只需要学习如何驾驭这只野兽。


原文链接:Four stages of AI-assisted software development

汇智网翻译整理,转载请标明出处