这幅图是在作者的提示下由DALL-E制作的
不,这篇文章不会涉及“否认、愤怒、讨价还价等等”。嗯……换个角度来说,那个主题也不错,不过我要跑题了。
第一阶段。ChatGPT窗口中的对话脚本刚开始的时候,我向朋友们展示了如何通过在聊天窗口输入函数描述来让ChatGPT编写简单的Python函数。他们的第一反应是:“嗯,这没啥特别的。我自己也能搞定,不用AI!”
“没错!”我说。“说的就是这个意思。别让AI助手做你自己做不来的事。”
那是在AI辅助开发的早期阶段。我会打开ChatGPT网站,让它生成一个函数,将这个函数复制到我们的编辑器中并运行。出问题了吗?复制错误信息到同一个ChatGPT对话框,请它修复这段代码。将修复好的代码复制到你的编辑器中并重复这些步骤。
简单吧!很多时候,这样做确实有效,你得到了想要的功能。有时候,经过四五次迭代后,你会喊“够了!”然后自己动手修改代码。
即使那时候,ChatGPT也非常有帮助。你可以请求它为现有的功能添加注释,创建测试,甚至生成README文件的草稿。
但是这是一个繁琐的过程:在ChatGPT和我的编辑器之间反复切换,无法直接看到代码的具体修改。大多数时候,我依赖于视觉代码审查、我的智能IDE和编译器的反馈。聪明的开发者还添加了更多的测试。
第二阶段. IDE 扩展功能很快我就换了一个叫Codeium的VS Code插件。不得不说我试用了GitHub Copilot早期版本,但它免费时并没有给我留下深刻的印象。我记得我说过,“还是我自己写吧,别去看Copilot生成的是啥,然后再决定要不要用它。”于是我决定不续费,也不再用它了。
用Codeium就不同了。也许是他们添加代码的方式不那么打扰,也许他们的代码质量更胜一筹。毕竟,现在已经过去了六个月,这在AI的时间尺度上简直是度日如年。但我一试就立刻上了瘾。
Codeium 不仅可以根据描述写代码,还可以查看你的现有代码并给出改进建议。如果你需要在多个文件中做许多类似的修改,它会非常有帮助。
Codeium 很快就能理解你的代码库,并且还能补充一些似乎缺失的功能。比如说,如果它发现你在包中刚刚添加了一个 CreateUser()
函数,它会建议添加 GetUser()
、DeleteUser()
和 ListUsers()
这些函数。它很聪明,通常它的建议正是你期望的。可以说,八九成的时候,我会接受 Codeium 的建议,八九成的时候我都会同意它的提议。
我对Codeium挺满意,特别是推荐给那些对AI持怀疑态度的人。我会这么跟朋友们说:“把它加到你的VS Code里试试看,它是免费的,不喜欢的话可以随时卸载。”
我喜欢它,也不打算删除它。但有时,我也想自己写点东西,不用AI的帮助。有时,我想学习一个新主题或新语言,希望锻炼肌肉记忆。有时,Codeium试图自动生成Markdown文档或文章,但我并不喜欢它的建议。一件好事是,你可以关闭Codeium,之后再重新启用它。你也可以对Markdown和AsciiDoc进行这样的设置以禁用Codeium。你可以让它的自动补全建议休息一个小时,然后专心撰写你的论文或代码。
Codeium帮了我很多忙,对此非常感激。后来听说了Cursor。
第三阶段. 基于人工智能的集成开发环境Cursor是最早为与AI配合使用的IDE之一。Cursor并不是一个VS Code扩展,而是一个带有额外UI功能的VS Code分叉,这些功能使开发过程更加互动。它紧跟VS Code的版本更新,因此在功能上,你不会感到落后于VS Code。此外,你可以导入你习惯的所有VS Code插件并在Cursor中使用它们。
切换到 Cursor 后,我的编码方式有了很大的变化。除了生成新代码和编辑现有代码之外,现在我还可以与 AI 进行聊天,获取解释和建议,就像和朋友聊天一样。很多次,我们的对话会从这样的问题开始:“我想在这个项目中添加日志,你推荐哪种方法?”Cursor 会给出两到三种可能的选项,给出各自的优缺点并推荐最优路径。你可以添加其他条件,比如,“我知道 logrus
是一个流行库,但我希望使用标准库中的 log/slog
。”Cursor 会根据这些新信息来调整建议。
最让我惊讶的新功能是能够与整个代码库交流。想象一下,你可以在Cursor聊天中这样说话:“@Codebase 请帮我审核我的代码库,并为这个项目写一个详细的README。”这个功能表现得非常出色!我只做了几处小修改,但总的来说,它为我的项目几乎瞬间生成了一个完美的README文件。
这让我更有信心,于是我问了下一个问题:“请推荐我为这个项目创建哪些ADR(架构决策记录)文档。”它列举了七、八个应涵盖在ADR中的主题:选择编程语言的决策、日志结构的设计决策、选择数据库的决策等。不用多说,我让它写了这些文档,并把这些文档放在一个单独的ADR文件夹里。
让 Cursor 为我的项目写测试简直是小菜一碟。这些枯燥的测试用例以及大量的样板代码都是瞬间完成的,同时还包括模拟服务和它们的测试(以确保它们是好的模拟),这一切都只需几秒钟。
有了 Cursor 的帮助,毕竟,如今还存在没有测试和文档的项目简直不可饶恕。
我最近习惯了这些功能,甚至开始有点懒惰起来。我可以轻松写出这个转换功能,但为什么要花20分钟,而Cursor和Claude只需几秒钟?当涉及在Go语言中添加所有的if err != nil
时,Cursor不会偷懒。这通常是刚开始接触Go语言的人最头疼的问题。有了Cursor,这一切几乎都是自动化的。不仅如此,Cursor还会记住你更偏好的错误信息格式,并在将来继续使用。
另一方面,来自AI的极大帮助让我在新项目中更加开放和富有创造力。当我考虑添加新功能时,“人类”的我会想到需要多少时间来实现它,然后就会决定说:“这可以稍后再做,就先放一放。”而我则会告诉Cursor,“请将这个功能添加到代码中。”它会愉快地帮你完成。花一两分钟分析一下它写的代码,新功能就添加上了。
直到现在,与Cursor以及其他之前的AI助手合作时,我觉得我对代码库的管理相当有控制权。但昨天我看到Cursor的新版本和新Claude Sonnet 3.7模型后,我的感觉变了。
第4阶段. 由AI驱动的发展之路昨天,我在项目上工作,有些地方出了问题。当我尝试访问服务器时,客户端(第一个开源项目)给了我超时。我的服务器是基于另一个开源项目搭建的。(关于该项目的详细信息,请参阅我个人网站上的这篇文章。该链接位于页面底部。)
我向Cursor寻求帮助,它建议我在代码中添加日志来查看发生了什么。我同意让它这么做,但日志里看不出有什么不对劲的地方。请求被我的服务器接受了并且转发给了库。看来我得去分叉库的仓库,在他们的代码里加点日志。但我对这个库不太熟,弄明白怎么操作可能得花点时间。就这样,这就是我的想法。
所以我继续,分叉并克隆了那个仓库,在Cursor中打开了它,然后请求它:“请在代码中加入日志,好让我能追踪请求在服务器上的流动。”它真的做到了。它明白我的需求,并在其他地方推荐加日志。
添加日志调用时需要使用日志文件(请参见脚注中的解释)。为了使用日志记录,需要添加一个新的Go接口,这需要在其他几个文件中进行修改。
那时,Cursor 认为在没有添加适当的测试之前不要做重大改动。它添加了测试,进行了修改,并让我来运行测试。不是切换到终端并手动输入命令,而是只需在同一个对话框中点击“运行命令”按钮。
我按了一下按钮,发现有些测试没过。Cursor 说:“好的,让我看看……” 然后做了一些调整。我注意到编辑器用红线划了一些函数调用和变量,提示说“这编不过去。”在我还没来得及告诉 Cursor 这个问题前,它自己也发现了,说:“是的,编译器有问题,让我来处理一下。”
而且这种情况反复出现了好几次。我目瞪口呆地坐在那里,看着神奇的光标(在Claude的帮助下)在我的代码库上做了什么。它在添加更多的日志,即时解决编译中的问题,并让我按下一个按钮重新运行测试,直到找到问题为止。
“啊,我现在看到问题了!”它说道。如果你之前没用过Cursor,不要被这句话给骗了。Cursor每次觉得自己找到问题时都会这么说。很多时候,这只是更多曲折的开始。但这次,确实就是问题所在。库期望ID变量是整数,而CLI客户端却用了字符串。我们该从哪儿开始修呢?
“让我看看,”库光说道,“根据我刚刚从网上找到的JSON-RPC 2.0规范,明确指出ID可以是一个数字、一个字符串,或者NULL。所以,我们得把库修改一下。”
在我能说任何话之前,这个库就已经改变了。当然,你知道不能直接用字符串来替换整数。这个库需要支持规范中提到的所有三种选项。“没问题,”Cursor说道,“我会创建一个结构和一个包装器,这样既保持向后兼容性,也能支持规范中提到的所有选项。”之后Cursor继续工作,进行修改。
在某个时候,我找不到方向了。它的速度太快了,我无法跟上它的速度,解释所有的变化并让我接受它们。最吓人的一刻是在那连串的变化中,它突然停下来,说:“通常,我们限制工具调用为25次。”我的心一沉。现在我是否需要自己继续那些Cursor开始的修改?
Cursor说道:“继续的话,就按这个按钮。”我照做了,它继续进行了一些修改,再经过两三次步骤就完成了。它又运行了一次自己创建的单元测试和集成测试,然后说:“现在它应该能和你的应用程序一起正常运行了。”
就这样!我现在要做的就是将更改提交到我的分支,并推送到我在GitHub上的分叉仓库。我将与库的开发人员合作,解释Cursor发现了哪些问题及解决方法。
最后,我得承认,到目前为止我对AI辅助的软件开发挺兴奋的。它帮了我大忙,让我能比之前快得多地完成好几个项目。但昨天看到Cursor时,简直是魔法一样。我发现自己不再是那个操控者了。而且我害怕自己会在这堆变化中迷失。
另一方面,我不怀疑自己无法在别人的代码里找出那个问题。很可能我会放弃,然后转而使用另一个库。还好有AI,帮助我继续这个项目。Cursor只花了一两个小时就找到了问题并解决了它。
当然,我将继续在开发过程中使用AI。我只需要学会怎么驾驭这只猛兽。
Originally published at https://pavelanni.dev 于2025年3月2日首次发布.
共同学习,写下你的评论
评论加载中...
作者其他优质文章