今年 8 月份时试用了下 Cursor,发现非常惊艳,顺带写了一篇介绍 Cursor 的文章[1]。之后我很快就把日常工作环境从 GitHub Copilot + JetBrains 全面转向了付费版 Cursor,几个月使用下来感觉非常丝滑。
在自己使用的同时,我也经常向同事和朋友推荐 Cursor,不过发现不少同学还是经常会有疑问,比如:
这里有不少问题,我发现最好的方式还是通过 live coding 来展示,所以 1024 程序员节那天我也在公司内部做了个分享,尽可能通过边操作演示边讲解的方式来展现 Cursor 的优点和使用技巧。不过当时用的是公司内部的代码项目,不好直接分享,所以这里就略微改动下,希望能通过这篇文章揭示一些 Cursor/Coding Copilot 的魅力与实践心得。
Cursor 是几位非常年轻的 MIT 学生在 2022 年创立的一家公司,当时其实 GitHub Copilot 已经有非常大的体量了。在产品刚推出时我也简单试用了下,当时感觉非常简单,好像就是把跟 ChatGPT/Claude 对话,生成代码的流程放到了 VSCode 里,没啥特别的……
但后来的发展出乎了几乎所有人的意料,我们来看下当时的格局:
所以 Cursor 为什么有勇气拿着微软的 IDE 进行“魔改”,调用的也是跟微软合作最紧密的 OpenAI 的模型,来跟上面这些大玩家竞争呢?
经过我个人的体验,包括也看了Cursor 主创团队的访谈[2],发现他们还是找准了几个非常犀利的点进行切入:
这背后的思考还是非常值得我们学习的,明确定位、深入理解“工作流”、快速迭代,使得如此小的一个团队也能撼动 GitHub Copilot 这样的庞然大物。
前面提到 Cursor 的定位是专业开发者,这里可以再明确一下它产生价值最大的场景以及和其他产品的区别:
接下来我们就结合 Cursor 的功能来实际看下真实日常工作中是怎么使用它来提效的。
这是 Cursor 目前最核心的优势功能,简单来说,就是它可以预测你下一个想要编辑的代码,并自动帮你完成。我们来看几个场景。
一个阳光明媚的早晨,你跟你的结对编程伙伴一起修改一段代码。你可能会跟伙伴说,当时在做原型开发时,这个文件用了很多 print 语句,现在要正式上线了,我们应该把它们都改成 logger 输出。可能还要注意一下,不同的信息在输出时应该选择不同的 logging level。
这个需求,你当然可以在 Cursor 里通过"CMD + L"唤出 chat 窗口,然后把整句话打进去,等待 Cursor 生成整个文件的 diff。但这个意图同样也可以通过“写代码”的方式来隐性表达,比如你直接在文件里写:
import logging
logger = logging.getLogger(__name__)
# 已有代码略。..
然后你只需要改动第一个 print 语句,你的编程伙伴 Cursor 就能懂得你的意思了。接下来只需要 tab tab tab,你会惊奇地发现 Cursor 能“猜到”你想修改的所有地方,并且还很智能地把不同的 logging level 设置正确。
请注意打出上面这段代码的时间,跟你用 chat 窗口打整个需求的时间相比,可能更短,而且省去了后面 apply+review+accept 的时间。所以很多时候我们都可以想一下,是不是某些意图的表达用写示例代码/简单注释的方法来说会更快。
这也是一个很常见的场景,与其用自然语言说我想给某个函数加个参数,这个参数是干嘛用的,需要同时把使用这个参数以及调用这个函数的地方进行修改等,有时候你直接编辑这个函数,把参数写上,Cursor 就会明白你的意图。以 Cursor 官网的一个例子来看:
你只要在__init__
方法里加上dropout
这个参数,Cursor 就会自动帮你把需要使用的地方也都补全上。如果文件里还有调用LSTMModel
的地方,Cursor 也会根据情况做初始化时的修改。
许多这种无法直接用 IDE 完成的小重构,都可以用 Cursor Tab 很好地进行理解和快速完成。
其实上面的通过写代码来表达意图的做法,很可能你在用其他补全类产品时也在不自觉使用了。比如有时候 Copilot 补全的不对,你可能会:
你会发现 Cursor Tab 其实就是把“删掉一点”和“改个光标位置”这两件事情也自动化了。所以上手体验会比 GitHub Copilot 等更加“智能”。
在编辑中使用"CMD + K"就能在光标位置/选中代码上唤出 inline chat 浮窗,相比侧边栏 chat,主要提供了 2 个好处:
个人比较喜欢用 inline chat 来做以下任务:
标准的侧边栏 chat,也是大家最熟悉的形态,很容易拿它来跟 ChatGPT/Claude 这类产品对比。作为一个专业 IDE,在开发已有项目时这里的区别还是比较明显的,尤其是在 context 的获取上。我们来看几个典型场景。
比如我们需要跟编程伙伴一起做一个重构,在model
层修改了一个模型,需要在调用这个模型的文件里做多处对应的修改,包括一些复杂的控制流判断等。如果使用 ChatGPT 来解决,你需要把模型的改动,当前的文件,加上指令本身,全部打进去,然后等待 ChatGPT 生成新代码,拷贝回来,再看看有没有改错的地方。这里就体现出了用原生 ChatGPT 的工作流的不顺畅之处:
而在 Cursor 里,你可以非常丝滑地解决以上痛点:
@
可以非常灵活制定文件夹、文件、某个代码定义等。apply
,Cursor 会直接应用到当前文件上,生成一个“pull request”形式的 diff,供你 review。以上图为例,我在命令行中运行了mypy
做代码检查,出现了两个错误。然后只需要点击那个Debug with AI 的小按钮,错误就自动发送给了 Cursor Chat,生成了代码 diff,接受之后就一切正常了。这个效率非常之高。
无论你是 TDD 流派,还是先写功能,再补测试,都可以跟 Cursor 来交流,让其帮助快速构建测试的模板代码(各种依赖、mock 等),并不断迭代覆盖更多的场景。
写完之后直接运行,如果有报错,可以结合上面的 Debug with AI 功能,让 Cursor 来帮忙快速修复。
这是来自官网的一个案例,看起来应该是在做一些 Rust 代码的优化工作。我们日常也可以通过 chat 让 Cursor 来帮忙快速 review 整个文件,并对例如性能、稳定性、安全等方面提出检查与优化需求。
平时在 debug 一些问题和学习一些新框架时,我们也会经常使用devv[3],phind[4] 这类代码领域的perplexity[5]。我们同样也可以用@Web
指令来让 Cursor 去做一些网络搜索,获取更加全面和 up to date 的知识信息,然后结合我们的代码库给出更具有针对性的解决方案。比如我们可以尝试下让 Cursor 来帮我们从poetry
迁移到uv
:
可见这种传统的需要高频使用网络搜索的场景都可以尝试用 Cursor 解决,包括很多环境配置,依赖安装,疑难报错解决等等。
此外还有个类似的功能是@Docs
,尤其适合一些非常流行的 library 有不兼容的大版本变更情况。比如 Pydantic 1.x 版本存在了很久,模型训练中可能已经对其形成了比较牢固的记忆了。但是项目中实际使用的是 Pydantic 2.x 版本,这时候将新版文档的网址引入进来,提供给模型参考就会非常有必要,能大大提升生成代码的准确性。
这个在旧版本中是一个单独的 tab,但是新版本中好像升级成了“Bug Finder”,且需要按使用次数收费……不过没关系,我们仍然可以在 chat 中使用@Git
来让 Cursor 帮助我们 review 代码,还是能发现一些潜在 bug 的。如果为了效果好,可能需要做一些 prompt 的优化。
所以相比 inline chat,在 chat 窗口中可以进行的任务种类更多样化,不一定是代码编辑,也可以是纯聊天,主打一个情感陪伴。
可以看到在 chat 里通过@
操作符可以非常自由地控制当前聊天的 context,跟与真人程序员交流非常相似。除了上面提到的之外,还可以:
@Recommended
来自动推荐带入的 context。@Codebase
引入整个 codebase,比如阅读理解整个项目代码或者查找一些特定功能的实现。@Notepad
这个功能我比较少用,常见的用法是开一个 notepad,让 AI 来生成一些功能开发的计划,然后再在具体的代码文件里去引用参考这些计划。@Lint errors
自动修复 lsp 检测到的代码问题。这种灵活控制 context 的能力,体现了 Cursor 团队对于程序员日常工作流程的深入理解,也明显与通用的 chatbot 拉开了差距。
另外像在 chat 里上传设计图让 Cursor 实现这种基本功能也都是具备的。只不过目前大模型结合图片的推理能力还是略微弱了些,这个功能实用性还不强。
很多博主都推荐过这个功能,我理解其主要是在 chat 单文件编辑的基础上,进一步拓展到了多文件的编辑与创建。事实上在 0.43 版本之前,我用这个功能比较少,因为当前模型能力在复杂项目中其实还挺难准确生成跨多个文件的编辑的(有不同意见的同学欢迎提供案例指正)。
所以简单理解来说,编辑复杂度从低到高的任务,可以基本对应到 tab -> inline chat -> chat -> composer,形成一个逐渐递进关系。
有意思的是,随着Windsurf[6] 的推出,大家发现可能是之前 composer 的 agent workflow 写得太简单了才导致效果不好?Windsurf 的 Cascade 虽然需要花上更多的时间“思考”,但是用同样模型能达到的效果还经常比 composer 更好。于是 Cursor 也很快在 0.43 版本中推出了 composer 的 agent 模式。
可以看到现在 Cursor 也会在过程中去进行多步的 context 检索,阅读,执行命令 (terminal),获取返回信息,判断下一步操作等,终于有点 ReAct agent 的模样了。其实前面我们已经看到 Cursor 在各个环节都做了 AI 能力的嵌入,利用一个 agent 把这些能力串联起来,还是挺自然的一个演进。
之前也有一些演示将 composer 用于代码之外的领域,例如将个人知识库存在 Obsidian 这类本地 markdown 文件中,再用 composer 进行“AI 检索问答”。不过新版本里好像 composer 更加聚焦在了代码场景,我尝试了几次都没有触发文档检索。倒是 chat 里可以通过@Codebase
来实现这个效果。
另外值得一提的是cursorrules
这个文件,可以把它简单理解成针对当前项目的一个通用知识说明。比如可以包括:
你可以从cursor.directory[7] 中找到一些项目模板,根据自己的项目进行修改和使用。
从上面的介绍中,我们可以看出 Cursor 已经能够在我们的很多日常工作中帮助完成一些“低熵”的任务,例如:
从“心流”理论来看,一方面通过自动补全和 chat,Cursor 很好地帮助我们完成了那些低难度的“无聊”打字工作;另一方面,大模型的丰富知识结合对代码库 context 的深入解析(借助 RAG),也能够很好地提升程序员的知识面,降低了未知技术和不熟悉代码带来的挑战和焦虑感。日常使用就像真的在与一位虚拟程序员伙伴持续结对编程,能持续保持专注度和创造力。
要在 AI 时代更好地利用这些工具来提升生产力,我们的精力会更多往设计和验证这两个环节倾斜。
@
指令时更容易找到合适的 context,这在深入使用 Cursor 过程中会有比较深的体会。像好的命名,单一职责等原则都很有帮助。当然这块个人的思考还不是很多,欢迎大家一起提供想法,交流探讨。
这里我们也简单对比一下 AI 辅助编程的一些其它产品:
总结来说,在 2024 年 12 月这个时间点,如果不折腾的话,用 Cursor 就挺好。如果从 JetBrains 迁移,问题也不大:
更详细的介绍也可以上网搜一下这方面的迁移指南。
从 Cursor 产品角度看,我们可以从 Agent 框架和程序员 workflow 两个角度来思考未来的提升方向。不过这篇文章也比较长了,这里也不做太多展开。有几个前面提到的点可以简单汇总一下:
另外一个值得探讨的问题是,程序员这个职业群体会有什么变化吗?
去年试用 MidJourney,Suno 的时候,也有种感觉是不是未来人人都会是数字艺术家了?但很快我就发现,我自己其实并没有这方面的“创作冲动”,即使给我看一堆别人创作的东西,很多时候也描述不出来自己想要画什么。最后我的需求基本上收敛到了每次写文章的时候,才会想着去生成一幅封面图。而这个功能或许未来会直接集成在很多自媒体的平台中。
目前我对于程序员未来的想法也是类似的,代码创作可能相比画画、写作、音乐、视频等覆盖的人群更少,普通人日常中可能很少会想着我要开发一个自己的 app。而一些可能需要利用代码生成来达到个性化的垂直场景,或许会作为一种功能包括在其它垂直场景的产品中。
你的想法是什么呢?也欢迎留言交流。
一篇介绍 Cursor 的文章:https://zhuanlan.zhihu.com/p/716192597
[2]Cursor 主创团队的访谈:https://www.youtube.com/watch?v=oFfVt3S51T4
[3]devv:https://devv.ai/
[4]phind:https://www.phind.com/
[5]perplexity:https://www.perplexity.ai/
[6]Windsurf:https://codeium.com/windsurf
[7]cursor.directory:https://cursor.directory/
[8]aider:https://aider.chat/
[9]cline:https://github.com/cline/cline