← 返回博客
·AI工具

Cursor AI 写了一坨屎,但我居然原谅了它

Cursor AI 与 GitHub Copilot 的深度对比,从实战角度分析两款工具的优劣

#Cursor#GitHub Copilot#AI编程#开发者体验

# Cursor AI 写了一坨屎,但我居然原谅了它

因为它是目前唯一让我用"代写"而不是"代做"来形容的AI编码工具

GitHub Copilot 和 Cursor 我都用了超过两年。如果要用一句话总结这两个工具的现状:**Copilot 变成了 Visual Studio Code 里的一个装饰件,而 Cursor 成了一个让人又爱又恨的半成品。**

说实话我不喜欢写对比文。市面上已经有一百篇"Copilot vs Cursor"文章了,每篇都在列功能清单。但你跟我聊过之后会发现:没人讲清楚一件事——为什么 Cursor 的 bug 明明比 Copilot 多十倍,开发者还是愿意迁就它?

答案很简单:**Cursor 有上下文记忆能力,而 Copilot 没有。** 这一个是质的区别。

Copilot 的退化之路

微软把 Copilot 从一个"智能提示工具"慢慢变成了"语言模型聊天窗口"。自从 Copilot Chat 上线之后,VS Code 编辑器里多了个 sidebar,能跟你对话,能帮你改代码,能生成单元测试。

然后呢?

开发者用了三次就不用了。

问题出在**上下文**。你在 VS Code 里写了一个文件,打开 Copilot Chat 问它"帮我重构这个函数",它会看你选中的代码。但它看不到你这个项目里其他文件里的定义、接口、架构。它就是一片孤岛。

2024 年我带了一个后端团队做微服务迁移。我用 Copilot 重构了三个接口,生成的代码语法完全正确,但调错了另一个模块里的常量名。那个常量在项目里叫 API_TIMEOUT,Copilot 生成了 APITimeout,整个构建直接挂掉。你猜怎么查的?我在日志报错之前根本没发现——这玩意儿能编译通过。

我花了两小时找这个命名错误。要是我用 Cursor,它扫一下整个 workspace,至少能发现这个符号不存在。

Cursor 的上下文优势是质变

Cursor 做了两件事让它跟 Copilot 拉开差距:

第一,它**读取你的整个 workspace**。不是当前文件,是整个项目。你按 Tab 补全的时候,它背后在跑一个 RAG pipeline——把你的代码切片、索引、然后在生成时检索相关片段。这不是魔法,就是工程,但效果很直观。

第二,它有 **Composer 模式**(就是它的多文件编辑功能)。你可以在一个对话框里说"把这个 API 的响应格式统一改成 PascalCase",它会自动找到所有相关的 handler、DTO、测试文件,全部改完。

我用 Composer 做过一次数据库迁移脚本的重构。原始脚本里有 8 个查询函数,分布在 3 个文件里,用的命名风格完全不一致。我说"统一用 snake_case 命名并加注释",Cursor 花了大约 90 秒改完了所有文件。其中 7 个是对的,有一个把注释类型写错了,我手动修了一下。

这效率放以前要半小时。

但是 Cursor 真的好用吗?

不。

**它经常犯一些很低级的错误。**

比如最近我在写一个 Rust async 程序。用了 tokio::select! 宏来处理多路并发。Cursor 生成的代码里混进了一个根本不存在的参数:

tokio::select! {

result = some_future() => { /* handle */ },

biased; // ← 这行导致编译失败

}

biasedtokio::select! 的一个 attribute,但不是这样用的。正确写法应该在宏前面加 #[tokio::select!] 或者用 tokio::select! { biased => ... } 这种形式。Cursor 直接把中间参数当语句插进去了。

这种错误你一眼就能看出来,但如果你在看一堆代码的时候,可能会漏掉一行。

还有更离谱的。上个月我让 Cursor 帮我写一个 PostgreSQL 的多表 JOIN 查询,涉及到 usersordersorder_items 三张表。生成的 SQL 看起来没问题,但我拿到数据库执行的时候报了错——**因为它把一个 NOT NULL 约束的字段当成了可空字段来做 LEFT JOIN**,导致结果集里出现重复的行。

我查了半小时才发现问题。最后是我自己用 psql 跑了个 EXPLAIN ANALYZE 才发现 Join 条件写错了。

Copilot 有没有可取之处?

说实话有。**它的 Inline Suggestions 现在越来越精准了。**

Copilot 的 Tab 补全在 2024 年之后有了肉眼可见的改进。你输入函数名的时候,它能猜到你大概要调什么参数。比如:

# 我打了一行

response = requests.post(

# Copilot 自动补全了常用参数

response = requests.post(url, headers=headers, json=data, timeout=30)

这不是 AI 有多聪明——这只是基于 GitHub 上数十亿行公开代码的模式匹配。但模式匹配在某些场景下非常好用,因为你写的代码往往就是"常规写法"。

而且 Copilot 不占用内存。Cursor 作为一个独立的 Electron 应用,开个 Workspace 基本要吃掉 500MB+ 的 RAM。对于 M1 MacBook Air 或者老机器来说,这感觉不友好。

我的结论

如果你在以下场景用,选 **Copilot**:

  • 你习惯在 VS Code / JetBrains IDE 里工作,不想换编辑器
  • 你写的是常规代码(CRUD、模板、配置),不需要深度理解项目结构
  • 你对内存敏感
  • 如果你在以下场景用,选 **Cursor**:

  • 你维护的是一个有一定规模的项目(>5000 行代码)
  • 你需要跨文件修改
  • 你能容忍它的错误率,花一点时间 review
  • 个人现在每天两个都开。VS Code 里装 Copilot 做日常补全,需要大改代码的时候切到 Cursor 的 Composer。这算是一个折中方案。

    **最后吐槽一句:** 希望两个产品都能别再把 AI Coding 包装成"全自动编程"了。你用了它们之后就会发现,90% 的时间你还是得自己 review、调试、改 bug。AI 能加速,但不能替代。认清这一点,你会少浪费很多时间。