在与 AI 及 AI 编程相关的论坛中,我经常看到经验丰富的软件开发人员讨论像 Cursor 这样的编程工具是否有价值,是否值得订阅。
在使用 Cursor 作为我个人和工作项目日常工具几个月后,我有了一些切身体会。现在我来分享一下这个工具是否 “必须拥有”,以及如何快速从这个工具中获得好处。如果你想尝试 Cursor,我的这些经验或许能帮到你。你可能已经尝试过 Cursor,发现效果并不好,没关系,你可以根据我的建议再试试,说不定会有意想不到的好处。
声明:Cursor 并没有赞助我,我也不是产品评论员。我既不是在支持这个产品,也不是在抨击它,我只是在分享自己的使用经验。
我已经写了 36 年代码了,涉及多种语言,但在职业生涯中主要专注于 C 语言为主的计算机游戏引擎和 Go/Python/JS 的 Web 开发。我希望读者能够同样舒适高效地处理大型代码库,能够在自己选择的语言中编写和调试代码等。我会给那些希望 AI 教他们编程概念或为他们编写远远超出他们水平的代码新手非常不同的建议!
对我来说,AI 助手的吸引力在于为我处理模板和重复任务,让我能够专注于解决特定问题的有趣逻辑。我对自动生成大量代码并不特别感兴趣;我对 “写出的代码行数” 作为效率指标持高度怀疑态度。我宁愿花更少的时间编写相同数量的代码,花更多时间思考边界情况、可维护性等。
好了,不啰嗦了,咱们开始。
Cursor 是 Visual Studio Code(VS Code)的一个分支,其核心 UI 中集成了由 LLM 提供支持的功能。它是一款专有产品,提供免费版和订阅选项;但是,定价表并没有涵盖实际订阅者的权益及其与竞争产品的比较。我会根据自己的理解在下面讨论特性时尝试澄清这一点,快速总结如下:
尽管其他基于 LLM 的编码工具专注于聊天体验,但在我使用 Cursor 的过程中,Tab 完成功能与我的日常编码实践最为契合,并节省了最多时间。显然,这个功能经过了大量的思考和技术研究,不仅能为一行、几行或整个函数建议补全,还能建议下一个编辑所需的下一行。这样就可以实现部分更改,然后通过反复按 Tab 键自动完成整个文件中相关的更改。
使用它的一种方式是将其视为一个加强版的代码重构工具。例如,假设我有一段变量名称采用 under_score 命名法的代码,我想将其转换为 camelCase 命名法。只需重命名一个变量的一个实例,然后通过所有应该更新的行按 Tab 键即可,包括其他相关变量。许多繁琐且易出错的任务可以通过这种方式自动化,而无需编写脚本:
有时,Tab 补全会独立找到一个 bug 并提出修复。许多时候,当我在 Python 或 Go 中添加依赖项时,它会建议导入。如果我用引号括起字符串,它会适当地转义内容。与其他工具一样,它还可以根据函数签名和可选文档字符串编写整个函数:
总体而言,这个工具让我感觉它在读我的想法,猜测我的下一步动作,让我少考虑代码,多考虑架构。
另外值得注意的是:补全的速度非常快,我从未感到等待建议的延迟。它们基本上在我停止输入的瞬间就出现。如果等待时间太长,我肯定无法接受。
那么,我对 Tab 补全功能有什么不满呢?一个小烦恼是:有时我未能及时看到建议,继续输入,补全就消失了。一旦它消失,就没有办法让它再出现,只能输入其他内容,希望能有新的建议。
另一个恰恰相反:有时补全完全错误,我会有意地拒绝它。随后,但非常少见,我会接受一个完全不同的补全,而先前拒绝的建议也会悄然应用。这已经导致一些难以追踪的 bug,因为我没有意识到错误的逻辑被接受了。虽然我并没有发现这些情况频繁到足以抵消 Tab 补全带来的生产力提升,但确实会影响效率。
据我了解,这些功能在与基础模型的交互上都非常相似 —— 我几乎专门使用 Claude 3.5 Sonnet—— 而差异在于用户界面。
行内编辑可以通过选择一些代码并按 Ctrl-K/Cmd-K 调用。我输入所需的更改,并在文件中获得一个漂亮的差异,可以选择接受或拒绝。我主要用这个来实现函数内部的代码或进行小规模重构。
一个很好的例子是,如果我循环执行一些任务,并且想将它们并行化,那么这种方法就非常有效:
聊天侧边栏通过 Ctrl+L/Cmd+L 打开,提供更多的空间进行多轮对话,尽管我对目前为止测试过的 LLM 模型有一个小的不满,那就是它们总是首先返回代码,而不是在存在歧义时请求澄清。
建议的代码有一个应用按钮,会在当前选定文件中创建一个差异。这对于在单个文件中进行更大的重构或基于我当前打开的文件创建一个全新文件很有用。如果有额外的文件相关,它们可以手动添加到上下文中,但 Cursor 会尝试根据查询及其在后台生成的索引来猜测哪些文件是相关的。
这里有一个例子,它将一个应用程序的数据库 API 转换为一个 REST API,以访问它,带有参数验证和正确的 HTTP 状态代码,然后编写一个客户端库以访问该 REST API:
另一个例子是,我在使用聊天侧边栏将客户端库从 Python 转换为 Go。注意,松散类型的 Python 是如何转换为定义良好的结构体类型和符合 Go 的习惯用法,包括错误处理!这根本不是一对一的重写:
最后,Composer 专门用于跨文件重构。这也是我使用最少的功能,但它为一次查看多个文件差异提供了更好的用户体验。
我直到在我认为过于简陋的文档中遇到这个功能时才意识到它的存在,但各种聊天模式总是包括位于工作区根目录的 .cursorrules 文件的内容,以提供额外的上下文。我一直在尝试使用这个功能来告知 LLM 仓库的编码标准、常用包和其他文档。
这个功能可能有助于解决我在使用 Cursor 时遇到的一大障碍:除非代码风格和模式已经存在于你正在编辑的同一文件中,否则它不会遵循编码风格。例如,在可汗学院,我们使用一个专有库来在 Go 中在函数之间传递上下文。这用于记录、HTTP 请求等,因此 LLM 需要能够使用它。这在过去一直很困难,但也许一个写得好的 .cursorrules 是一个好的第一步。
目前的一个局限性是每个工作区只能有一个这样的文件,因此像我们这样的包含多种语言代码的单一代码库将比一个包含少量风格一致的代码的小型仓库更难设置。
此外,文档建议 .cursorrules 文件仅用于聊天模式,而不适用于 Tab 补全。然而,我已经尝试在工作区中将该文件固定在一个选项卡中,并确认通过这种方式至少可以将其包含在 Tab 补全的上下文中。
像 Cursor 这样的工具最令人兴奋的地方并不是我可以更快地编写代码,因为说实话,实际编写代码并不是瓶颈;事实上,我经常需要放慢自己的速度,以避免过于关注代码,而忽视了要解决的高层问题。真正的价值在于改变我编码的方式。
这项技术仍处于早期阶段,但我发现它已经改变了我的工作方式,并且我预计在不久的将来还会发生以下变化:
我是否会在几年后继续使用 Cursor,或转向其他工具,我现在无法确定。但我确定的是,在写这篇文章时,Cursor 是最好的 LLM 编程助手,我建议你试试。
文章来自于微信公众号“AI大模型实验室”,作者“李木子”
【开源免费】n8n是一个可以自定义工作流的AI项目,它提供了200个工作节点来帮助用户实现工作流的编排。
项目地址:https://github.com/n8n-io/n8n
在线使用:https://n8n.io/(付费)
【开源免费】DB-GPT是一个AI原生数据应用开发框架,它提供开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力,让围绕数据库构建大模型应用更简单、更方便。
项目地址:https://github.com/eosphoros-ai/DB-GPT?tab=readme-ov-file
【开源免费】VectorVein是一个不需要任何编程基础,任何人都能用的AI工作流编辑工具。你可以将复杂的工作分解成多个步骤,并通过VectorVein固定并让AI依次完成。VectorVein是字节coze的平替产品。
项目地址:https://github.com/AndersonBY/vector-vein?tab=readme-ov-file
在线使用:https://vectorvein.ai/(付费)
【开源免费】XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。它帮助开发者提供一个简单易用的平台,可以对大语言模型(LLM)和多模态图文模型(VLM)进行预训练和轻量级微调。XTuner 支持多种微调算法,如 QLoRA、LoRA 和全量参数微调。
项目地址:https://github.com/InternLM/xtuner