杀人执照:使用CursorAI编程
David Bethunes是一位经验丰富的软件架构师和游戏设计师,本文是他使用Cursor AI后的心得感受。

Cursor是一款AI代码编写和编辑工具,代表了人工智能在软件开发中的实际应用的重大进展,主要通过提供“代理”来实现,这些代理不仅能回答问题,还能根据自己的想法采取行动。这种强大的新能力需要一种新的编程方法,在这种方法中,你的高级推理技能变得比以往任何时候都更加重要。当一个代理被“授权去杀戮”时,作为导演的你的指令将起到决定性作用。

Cursor是一个AI集成开发环境(IDE),它是VS Code的一个分支,增加了编程代理以融入你的工作流程。这里的AI聊天窗口实际上是我的源代码区域的一半,反映了在这种编程方式中我们与代理的互动比与代码的互动更多。
如果你选择接受的任务
我想向你展示如何找到Cursor的最聪明的功能,并如何最大限度地利用它们,但我并不建议你从这里开始。如果你已经使用过其他AI工具,请从你使用Cursor的方式与你使用上一个工具相同的地方开始。对我来说,那就是使用带有Copilot的VS Code。一旦解决了Cursor之间的任何“差异”,尝试下一个更复杂的层次。
我们将要覆盖的内容如下。你可以自由跳过任何你已经知道或尝试过的部分。
- 什么是Cursor及为什么?
- 内联完成
- 按Tab键完成
- 与代码聊天
- 在聊天中修复
- 代理思维
- 复制你的风格
- 设置
- 令牌限制
- 运行代理
晚更新: Cursor已更改用户界面,将聊天和作曲标签合并为一个聊天框,因此你的截图可能与我的不同。

1、你在哪儿,光标?
Cursor 是首批真正有用的RAG应用程序之一。检索增强生成是一种花哨的说法,意思是“使用AI聊天来弄清楚如何控制应用程序的界面,而不是仅仅按按钮和点击菜单。”每个RAG应用程序都结合了一些传统的用户界面、一个后台LLM或大型语言模型,以及一个聊天框。对于光标来说,传统的应用程序是VS Code,这是一个优化用于编写代码的IDE或文本编辑器。
Cursor也是具有自主性的,这意味着它可以像一个受你控制的代理一样半自主地执行任务,这些任务是你俩事先同意的。这种控制可以从创建新文件到一次修复多个模块中的数百行代码——再到删除文件、破坏界面并阻止你的代码运行。这就是这篇文章标题的由来。
如果你已经习惯使用VS Code,你可以导入你的键绑定和设置。我不得不做了一点小调整,因为我的一个自定义键被Cursor接管了,但很容易解决,因为我的绑定没有被清除。移除Cursor的绑定后,我的原始绑定仍然存在并且正常工作。这个导入功能使得从VS Code迁移到Cursor变得容易,而VS Code是最受欢迎的IDE。
你可能会在这个时候问,“如果Cursor是在VS Code的基础上构建的,为什么不把它做成一个扩展?”对此,Cursor开发团队的回答是他们所做的改变仅通过一个扩展是不可能实现的。到本文结束时,你会看到这是真的。Cursor完全控制了IDE,这是任何扩展都无法做到的。
2、安全第一
应该不言而喻的是,如果我们打算让一个代理控制我们的宝贵代码库,我们应该遵循最佳实践使用Git。对我而言,这意味着确保我始终有一个运行的仓库副本,并在我让Cursor随意运行之前在适当的地方提交代码(我使用GitKraken和GitHub)。如果我要请求大的变更,先提交并推送这个仓库。如果某些东西工作正确,再次提交并推送,以便如果接下来的变更不起作用,我可以回滚。
这种思维方式将在新的编码风格中扮演重要角色,这种风格依赖于代理。我们过去试图仔细编写初始的工作代码,然后在此基础上构建。这仍然是事实,但是有了代理,你会发现许多行代码被立即擦除并替换为更好的(甚至只是正确的)代码,而且没有人关心。
换句话说,编写代码的工作变得如此快速和廉价,以至于它不再是主要的工作。主要的工作变成了评估这些变更并接受或修改它们。这是一个全新的世界!

3、他们抢走了他们的工作!
我希望你从本文中得到的一个关键要点是,Cursor(或者下一个大事件)不会消除你作为经验丰富的程序员的工作。恰恰相反。我希望你看清,作为一个拥有愿望、需求和情感的人类,一个监督者、管理者、架构师、深度思考者,在AI辅助编码中的作用将比上一代软件开发中更大。
当程序员从低级语法输入和模块或API接口连接的苦工中解放出来时,我们剩下的就是更难、更高层次的人类工作,即首先确定代码应该如何编写。
你很快就会发现,007的射击能力需要非常精确的规划才能击中目标。你还将看到那些关于“我在一小时内用AI制作了一个应用”的无尽故事,声称这些工具将解决所有问题。发生的情况是,那些故事的作者使用了像Cursor这样的工具来构建应用而不指定任何重要的内容。这就像派遣邦德去执行一项任务,杀死任何人,出于任何理由。没有约束和参数,当然你可以编写代码。
问题是,现实世界的应用程序并不是这样工作的。在我们的工作中,我们必须不断进化和扩展(以及替换)系统,这些系统有成百上千的约束和要求。尽管Cursor可以看到你所有的代码,但它无法理解任何这些。它永远不会知道你为什么要这样做或你想要什么——稍后我会向你展示你必须如何以人类的方式提出这些问题。即使有最仔细的指导和提示,你的技能作为一个程序员将受到挑战,并且我敢说,通过与Cursor级别的AI配对程序员合作,你的技能将得到提升。被称为Cursor是因为这个概念中Cursor的所在位置及其功能是整个系统的主要驱动力。在全代理模式下,“Cursor无处不在”,并且具有我们习惯的自动完成功能……乘以1000倍。
4、如上,如下
关于Cursor的自动完成功能,你首先会注意到的是它会查看光标上方和下方的几行。如果你所做的更改将破坏几行之下的内容,Cursor会提前建议进行该更改。这非常有用,尤其是在其能够查看其他模块的能力方面。Cursor能够处理相当复杂的更改,并且可以一次性进行大规模更新,而不是一行一行地修改。这是一个巨大的时间节省。

5、但还有更多……
Tab完成
随着代码为了适应新功能或重构而演变,单一更改通常需要在同一模块内进行许多(低级别的)更改。这些并不难理解。实际上,在你做出第一个更改之前,你可能就已经知道它们是什么了。例如,如果导入的模块或导入语句本身发生了变化,你需要调整该模块中的所有使用情况。
这就是我所说的“驴活”。我知道需要做什么吗?是的。我能判断是否正确吗?是的。我想坐在那里做所有的这些事情吗?不。好吧,猜猜怎么着?因为Cursor读取了检查错误的工具(即在不满意的行下面画红线的那个工具),Cursor也知道所有这些错误。
这就是Tab键成为你最好的朋友的地方。通过按Tab键,Cursor会跳转到下一个需要修复的行——无论它在模块中的位置有多远!现在,驴正在走向下一堆石头,而不是我。
因为阅读代码比编写代码快几百倍,我可以几乎瞬间审查建议的更改,然后按Tab键跳转到下一个。
如果Cursor只做这些事情,那也值得切换。因为Tab键有很多用途,Cursor并不总是能正确识别。但这没关系,因为你只需撤销你不满意的更改(使用正常的键盘快捷键),然后再次按Tab键!有时你需要将光标移近问题并按Tab键来获取修复。这在一开始看起来很奇怪。你只是在移动大量的代码块,而不是编写它们。但当你意识到仅通过打开文件和按Tab键就能完成跨多个模块的巨大更改时,你会开始认为这可能很棒!

这段与Cursor的对话展示了它如何帮助我提升了自己的编程技能。通过质疑它提出的解决方案,我了解到你可以为应用程序文件夹中的每个文件夹放置特定的TS配置文件。学到了新知识。

将“代码”一词用于计算机编程指令可以追溯到第一台存储程序计算机本身,即EDSAC,它在1949年运行了它的第一批代码。用户被指示将每个计算机操作的“代码”输入到机器的内存中。今天,我们将这种编程称为机器代码,这是比汇编语言低一级的语言。
6、让我们谈谈代码,宝贝
与代码聊天
Cursor宣传说你可以“与你的代码聊天”,这可能让你觉得你一直在用其他工具这样做。我可以向你保证,你并没有。Cursor所指的具体含义是通过引用@
键来明确调用文件和函数。如果你想修改你的doSomethingGreat()
函数,你可以在提示中写入@doSomethingGreat()
。

在这里,你可以看到Cursor强大的“与代码聊天”的功能。通过开始写@scriptrunner
,它找到了我正在谈论的模块(甚至显示了左侧的一些头部信息),并将对该源代码采取行动。之前提到的@nextLine()
也是以相同的方式通过自动完成功能写入的。
幸运的是,Cursor已经知道你所有的文件(和文件夹)以及函数名称,所以你不需要完整地输入名称,只需要足够让它自动完成,然后按下——你猜对了——Tab键!你也不需要告诉它函数或文件的位置。
当你以这种方式引用代码时,你包括了当前的源代码在提示中,并确保其内容被考虑在答案中。Cursor在任何给定时刻可以处理多少代码取决于你使用的交互模式(稍后会详细介绍),但通过函数、模块、文件或文件夹名称引用代码总是会将Cursor指向确切的代码。
这意味着我们可以提出更复杂的问题,比如,“你能找到@components
中所有使用通配符导入的地方吗?”Cursor将仅在该文件夹中查找答案。在最顶层,我们可以写@codebase
,Cursor将在生成答案时考虑整个代码库。在代理模式下,@codebase
包含在所有请求中,我们使用特定的模块或函数名称来限制操作或指向特定的代码结构。

7、翻新工程
在聊天中修复
VS Code在你将光标放在它们上面时,只有有限的能力来修复格式化错误。一个对话框会出现,提供一些显而易见的东西,比如缺少导入。但是VS Code不能真正分析整个代码库或找出更深层次的修复。这就是Cursor的“在聊天中修复”选项的作用。它替代了VS Code在这些错误上的弹出窗口。

当你点击进入格式化错误时出现的“在聊天中修复”选项,会将问题提交给代理进行全面修复,但通常只需要按Tab键就足够了——而且只要靠近该行即可;你不必点击特定的错误。第二次按Tab键会修复屏幕截图中显示的下一个错误,进一步的Tab键按压将继续向下遍历文件,直到没有格式化错误。太棒了!
当你选择“在聊天中修复”时,你看到的错误会被复制到屏幕右侧的聊天窗口中。聊天会自动看到整个@codebase
,并且还可以深入调查那些其他文件。
这对于解决你在某个模块中看到的错误,但实际上是另一个模块引起的错误特别有用。这里再次,你可能已经知道出了什么问题,可以自己修复。让Cursor来做这件事的好处是它速度快且准确,不会像人那样在简单修复上犯愚蠢的错误,而人们在重复性、详细的工作中容易疲劳——特别是从重复性、详细的工作中表现下降。
AI的性能也会随着提交的文本量增加而降低,这被称为“上下文窗口”。这是另一个地方,你需要进行成人监督。当话题改变或结果达成时,你需要切断线程并开始新的聊天,以防止AI过度延伸并引入无关材料。你所有的以前的聊天都会被保存,因此如果你发现需要回到以前的问题,重新加载那个聊天并继续,以便包含所有先前的上下文。

既然没有“唯一正确的方式”,你的被授权去执行任务的代理绝对会想出某种方式来完成你要求的任务。保证的。它会是正确的方式吗?对于你的应用程序来说什么是正确的?只有你自己知道。
为了使AI能够完全按照你的要求工作,你必须非常清楚地了解这些需求。你不能在需求上犹豫不决,否则你会得到一些其他的工作方式,但不是你应用所需的“正确”方式。
这就是AI代理迫使你作为一个程序员提升自己的地方!如果你不能完全描述你的应用应该如何工作,那么它只会按照AI决定的方式工作。而那距离Tipperary还很远。

这是一个简单但高度工程化的提示,只能有一个正确的结果。这是一个简单的任务,Cursor在这方面非常擅长,但需要人类来决定是否需要进行这个改变。在这个改变之后,我通过简单地说让我们为**@someOtherModule
**也这样做,对超过40个其他文件进行了类似的修改。
当“提示工程”这个词第一次出现时,它有点像是一个笑话。但现在不再是了。我不得不认真思考我的提示——不仅它们包含什么内容,还需要多少个才能达到终点,如何分割聊天线程,以及说什么和不说什么。
在创建代理提示时所投入的思考与传统编程一样多。唯一的区别是,这种新方法更快。
这就是为什么作为有经验的程序员,我们的工作在新时代将变得更加重要。即使我们可以创建一个包含了应用所有规格(视觉设计、JIRA工单、TDD、QA等)的提示,也需要一个人来制定这些规格,并将其交给其中一个人来完成。一个人需要协调一个RAG应用程序来构建和维护这样的代码。但这个人不需要写很多代码,只是批准或拒绝它,并指出需要额外更改和改进的地方。
公司也不能将这些代理编码任务交给初级程序员——正是因为这些初级程序员缺乏全局视角,无法告诉代理该做什么。詹姆斯·邦德不适合担任英国情报部门的主管,因为他没有足够的智慧、信息或全球视野。

8、这条消息将会自毁……
当你向代理提交一个提示时,你赋予了它执行所有建议更改的权力,包括大量编写、重写或删除代码,创建和删除文件,彻底改变你的构建设置或运行时环境,或者其他明显涉及破坏性的更改。
为什么你会这么做?在现实世界中,我们经常这样做。开发人员整天都在进行破坏性更改。在许多情况下,如果没有首先破坏应用,就不可能扩展应用——这是有意为之的。我们不想尝试为遥远的未来构建,所以我们必须打破最初简单的设计和连接,以实现更健壮、可重用且可以不同方式部署的模块。
实际上,我们通常默默地自己完成所有这些更改。我们可能会大规模地更改前端以适应API的变化,或者因为工具要求而更改后端。这是一个隐藏的时间陷阱,因为我们没有更好的办法而不去讨论它。
代理就是更好的办法。如果我们能在高层次上描述我们需要的大规模更改,并提及所有可能的“陷阱”或更改必须包含的所有重要约束条件,我们就可以坐下来观看代理完成这一切——从一个工作版本的代码移动到下一个,而不会在中间运行一个中断的版本。

这是一个导致意外破坏的例子。我需要添加一些架构指导,这些指导是它无法从我的代码中得知或推断出来的——就像一个人类程序员向队友提到他们无法自行推断的事情一样。注意,Cursor现在“看到了问题”,并在我添加了这些信息后写出了修复方案,尽管其中包含了一个拼写错误。如果我没有自己进行诊断并添加这些信息,Cursor可能会提出另一个不起作用的解决方案。
你的一部分可能在说这不可能,而且会在中途出错。你是对的。但你可以忽略这一点。即使你的大修复需要回滚Cursor所做的整个一系列更改(比如从仓库中丢弃正在进行中的文件),这也不重要,因为你将立即再次发送代理去写新的文件。
这是一个明显的例子,说明我们需要放弃旧的编程风格才能让它起作用。
与其在中途停止代理并试图让它在脑海中全部拼合在一起,我们可以让它尝试完成任务,然后我们自己评估它。如果不正确,我们就丢弃它并更改提示,告诉它我们不喜欢什么或发生了什么问题。
当我们不得不自己编写每一行代码时,仔细考虑它们是有意义的。但有了代理,这样做是没有意义的。通常,Cursor会想出一个解决方案,并在实施过程中决定它并不好,然后继续自我纠正!
有时我会按下停止按钮,因为它忘记了某些重要的事情或走上了明显的错误道路。但谁应该为此负责?不是Cursor。如果我在最初的提示中包含了约束或问题,我就不会遇到这些问题。人类的大脑思考和架构观点在这里占主导地位。
那些“修订”对话看起来最像婚姻咨询。我发现自己会说:“我担心我们忽略了某事”,或者“我不太舒服于因为这件事而改变那个”。但就像人类伴侣一样,AI除非直接听到你的担忧,否则无法知道它们。我常常惊讶于,在解决更复杂的问题时,这些“沟通遭遇”最终导致了有效的修复。

9、 我是众口一词的
复制你的风格
在AI编码的早期,人们担心建议的内容会被从别人的代码库中提取出来。从我已经说过的内容来看,很明显,虽然训练现有的代码给Cursor(实际上是Claude Sonnet)提供了大部分的基础理解,但采取行动在我的代码上并复制我的代码才是赋予它力量的关键。
基于此,我尽量引用我的代码和我的风格。我会说,“把@someFolder
中的所有注释改为使用在@myModule
中建立的模式。”或者,“我想开发一个处理游戏音频文件的模块,方式与@app-node-images
处理图像文件的方式相同。音频文件将在@mp3
文件夹中。”然后让它编写新的模块。所有的样式、模式甚至注释都将从现有的模块中获取并更新为音频。类似的关键名称也会自动调整……一切都会如此!
我一直相信复制我自己的有效代码,然后编辑它以适应新的场景。现在,我可以直接告诉Cursor去做。扫描它编写的模块并自己定制它比从旧的一个复制粘贴并手动进行最小的编辑要快得多!我可以在一个模块中进行重构,然后说“以同样的方式重构@someOtherModule
”,Cursor会打开另一个文件并用绿色线条显示添加的内容和红色线条显示删除的内容。
10、扔掉规则手册
设置
Cursor与其他AI聊天机器人的许多差异一开始可能会让人感到不知所措,而且众多设置也并不显而易见。为了向早期的通过定义严格规则工作的自定义GPT一代致敬,Cursor确实允许你为聊天和项目设置规则——比如“始终使用某个库版本”,或其他你想添加的整体约束。但在实践中我发现这并不是必要的,因为Cursor已经能够弄清楚你在做什么,不太可能建议超出你当前应用范围的东西。例如,我无需解释我在使用Lit或Vite,就可以谈论我的Web组件或构建问题。
让我们来看看最重要的设置……

在第一个设置面板中,你可以验证你的订阅级别和导入您的键绑定来自VS Code,这您只需要做一次。理论上,您可以创建类似OpenAI自定义GPT的规则,但在代理具有完整的代码上下文时,我没有立即看到这种做法的实际用途。
您可以完全免费使用Cursor,但您的请求将全部处于慢速模式,并且在达到每月限制后会被截断。它们仍然可以完美工作,只是您需要等待那些付费获得更多积分的人先排队。这绝对是可以接受的服务,我建议您在这个免费模式下进行所有实验。您可以升级到Pro模式(目前为每月$20)以获得每月一批快速请求和无限慢速请求。除此之外,如果您认为购买增加的速度有价值,您可以购买额外的令牌。

在这里您可以更改模型,但不要这样做。它已经设置正确了。如果您愿意,可以选择特定提示的模型。Claude 3.7 Sonnet Thinking是最先进的。我在本文中没有选择模型完成所有操作,我认为这是未来的趋势。(工具会自行选择模型。)

在这里您可以输入自己的API密钥以供支持的LLM使用,但您不需要这样做。我认为除非您有大量需求,否则您可能不会比Cursor更便宜。您的里程可能会有所不同。您必须使用Sonnet模型才能获得代理行为,这是好的,因为它在所有标准编码测试中表现最佳。
11、Riddle Me This…
在Cursor设置的模型标签页上,您可以打开和关闭模型,稍后在页面下方看起来您可以输入自己的API密钥并可能绕过这些限制。也许您可以这样做,但您需要同时拥有OpenAI和Anthropic的密钥,老实说,除非您从这两家公司都有巨大的计划,否则我不认为会有太多节省。但这值得探索一下。复杂的代理请求需要Claude Sonnet,这是当前AI编码测试的领导者。

12、Juicy Fruit
最后,在功能标签页上是我们要讨论的好东西。我已经打开了我提到的所有制表和预测功能。我还允许它对提示中未提及的文件进行操作。这可以让它在一个请求中修复所有相关的必要文件。

为了获得最大的自动完成功能,请在此处打开Cursor Tab和Cursor Prediction。另外打开Auto-apply to files outside context以允许代理具有更广泛的修复和更改范围。
您会看到我没有勾选底部的YOLO模式框。默认情况下,Cursor会在每次操作(一个完成的请求)后停止。当您提交给代理时,大多数操作会自动完成,但像文件删除这样的操作会等待您的批准。YOLO模式会关闭这一点,但我还没有到达那一步。:-)
13、滚蛋,小子!
令牌限制
经过几天的免费模式,然后几天的$20/月计划后,我决定尝试一个大型重构并支付一些额外的令牌以获得快速完成。我设定了$20的限额,并在三天内消耗了$12.64。就AI聊天而言,这相当昂贵。在那三天的工作中,这是否值得?绝对值得。

订阅Pro级别后,每月有500个快速请求,唯一的额外快速令牌获取方式是按需使用。除此之外,您将退回到较慢的请求,具有相同的功能,但需要排在付费令牌用户的后面。
我可以不付费或只支付每月$20的基本计划,在稍微长一点的时间内实现相同的结果,但任何雇主都会很快看到为每个程序员每月支付数百美元的价值,如果他们实际使用这个工具来生产产品的话。
如果我在我上一份工作中要证明这一点,仅基于我能完成多少票务、待办事项和新功能以及速度有多快,这将是很容易的。这就像是问你的雇主在工厂里是否会付钱让你多一条手臂。是的,他们会的。

14、灯光,摄像机,行动!
运行代理
在聊天窗口中,在提交第一个提示之前选择左下角的Agent
。这将启用整个聊天的代理。当它思考并输出想法或代码时,您会看到一个停止按钮,如有必要可以中断。在每次对单个文件进行更改后,您会看到文件打开并突出显示更改。您可以逐个接受它们,或者一次性接受。一旦整个任务完成,聊天会提供一个接受所有更改的按钮,以保存所有文件中的更改。

Cursor的新聊天界面让您可以在左下角切换到代理。您的聊天不会在60秒后自毁。它们将永远存在,如果您想继续使用相同的上下文、问题或解决方案,请再次调用它们。为每个新主题、问题等开始新的聊天。
Cursor确实设置了回滚点并可以撤销自己的操作,但我不会使用它来撤销我想要撤销的更改。我更愿意依赖我的Git仓库,因为在那里我可以看到命名的提交并且知道里面有什么。Cursor可以自行回滚以完成我交给它的任务,但如果我要撤消更改,我会从Git(或在模块中使用Ctrl-Z)撤消,而不是要求Cursor撤销某些内容。每当我这样做时,我都会告诉它我已经撤销了模块并说明原因——就像您会对人类配对程序员做的那样。

我使用Cursor对我的Watson游戏引擎进行了大幅改进,显著提高了其架构、可维护性和速度,并将构建大小减少了一半。由于这种类型的大规模更改会引起如此多的破坏性更改,如果没有Cursor,我几乎不可能解决这些问题。

15、那就是全部了!
这些都是我今天的见解。希望您觉得它们有所帮助。如果觉得有用,拍手、评论或分享给您的网络可以帮助提高我的可见度,尤其是在我现在正在找工作的情况下,因为我以前的工作室关闭了。
我感谢您。
原文链接:License to Kill: Coding with Cursor AI Agents
汇智网翻译整理,转载请标明出处
