← 返回博客
·AI工具

Cursor 实战:AI 代码编辑器真的能提升生产力吗?

我用 Cursor 写了三个月代码,说说真实感受。Cursor 能提升生产力,但没那么神。有爽点也有坑,适合用来写样板代码、快速原型验证,但不适合写核心业务逻辑。

#Cursor#AI编程#代码编辑器#生产力

# Cursor 实战:AI 代码编辑器真的能提升生产力吗?

我用 Cursor 写了三个月代码,想说说真实感受。

先说结论

Cursor 能提升生产力,但没那么神。它更像是一个"聪明的代码补全工具",而不是什么"AI 配对编程"。如果你期待它能替代你思考,那还是算了。

我怎么开始用 Cursor 的

去年年底,团队里有人推荐 Cursor。那时候我正在重构一个老项目,代码里到处是意大利面条式的逻辑,改一处崩一片。我想着试试 AI 工具能不能帮上忙。

第一次用 Cursor 的时候,我被它的代码补全惊到了。不是那种简单的"猜下一个词",而是真的能理解上下文。比如我在写一个数据处理函数,它居然能猜到我想过滤掉空值,然后自动补全了那段逻辑。

// 我在写这个

function processUserData(users) {

const validUsers = users.filter(u =>

// Cursor 自动补全了下面的逻辑

u &&

u.email &&

u.email.includes('@') &&

u.status === 'active'

);

return validUsers.map(u => ({

id: u.id,

name: u.name || u.username,

// 又补全了

email: u.email.toLowerCase(),

lastLogin: new Date(u.last_login)

}));

}

说实话,那时候我觉得这玩意儿有点东西。

爽点在哪

1. 代码补全真的聪明

跟 GitHub Copilot 比,Cursor 的补全更"懂你"。它不是简单地根据变量名猜,而是会看你的整个文件,甚至跨文件理解上下文。

有次我在写一个 React 组件,需要从一个 API 拿数据然后展示。我刚写完 fetchData 函数,Cursor 就自动帮我写好了 useEffectuseState 的逻辑。虽然不完美,但省了我不少时间。

2. Cmd+K 改代码很爽

选中一段代码,按 Cmd+K,然后用自然语言描述你想怎么改,Cursor 会直接帮你改。

比如我有这么一段烂代码:

def get_user_orders(user_id):

orders = []

for order in db.query("SELECT * FROM orders WHERE user_id = ?", user_id):

items = []

for item in db.query("SELECT * FROM order_items WHERE order_id = ?", order['id']):

items.append({

'product_id': item['product_id'],

'quantity': item['quantity'],

'price': item['price']

})

orders.append({

'id': order['id'],

'items': items,

'total': sum(i['quantity'] * i['price'] for i in items)

})

return orders

我选中这段代码,按 Cmd+K,输入 "convert to use JOIN and optimize N+1 queries",Cursor 直接给我改成了:

def get_user_orders(user_id):

query = """

SELECT

o.id as order_id,

o.created_at,

oi.product_id,

oi.quantity,

oi.price

FROM orders o

LEFT JOIN order_items oi ON o.id = oi.order_id

WHERE o.user_id = ?

ORDER BY o.id

"""

rows = db.query(query, user_id)

orders = {}

for row in rows:

order_id = row['order_id']

if order_id not in orders:

orders[order_id] = {

'id': order_id,

'items': [],

'total': 0

}

orders[order_id]['items'].append({

'product_id': row['product_id'],

'quantity': row['quantity'],

'price': row['price']

})

orders[order_id]['total'] += row['quantity'] * row['price']

return list(orders.values())

这改得确实可以,N+1 查询的问题解决了,代码也简洁了不少。

3. 聊天功能适合用来探索代码库

Cursor 的聊天窗口(Cmd+L)可以索引整个代码库,然后你可以问它"这个函数在哪被调用了"、"这个模块是干什么的"之类的问题。

我接手那个老项目的时候,用这个功能快速理解了代码库的结构。虽然有时候它也会胡说八道,但大部分时候还是靠谱的。

坑在哪

1. 它会自信地写错代码

这是最要命的。Cursor 生成的代码看起来很合理,逻辑也通顺,但就是错的。

有次我让它帮我写一个并发控制的逻辑,它给了我这段代码:

async function processTasksConcurrently(tasks, maxConcurrency) {

const results = [];

for (let i = 0; i < tasks.length; i += maxConcurrency) {

const batch = tasks.slice(i, i + maxConcurrency);

const batchResults = await Promise.all(

batch.map(task => task())

);

results.push(...batchResults);

}

return results;

}

看起来没问题对吧?但我实际跑的时候发现,这个"并发控制"根本不并发。它每次等一个 batch 跑完才跑下一个,但实际上 Promise.all 已经把 batch 里的任务都并发了。真正的并发控制应该是这样的:

async function processTasksConcurrently(tasks, maxConcurrency) {

const results = [];

const running = new Set();

for (const task of tasks) {

const promise = task().then(result => {

running.delete(promise);

return result;

});

running.add(promise);

results.push(promise);

if (running.size >= maxConcurrency) {

await Promise.race(running);

}

}

return Promise.all(results);

}

Cursor 生成的代码能跑,但逻辑不对。如果你不仔细看,直接 merge 进去,那就是给自己埋坑。

2. 上下文窗口有限,大项目会懵

Cursor 声称能索引整个代码库,但实际用起来,当你的项目超过几万行代码,它就开始犯迷糊了。

它会忘记之前文件里定义的函数,或者搞混不同模块里的同名变量。这时候你得手动把相关文件添加到上下文里,不然它生成的东西就是错的。

3. 太依赖它会让你变懒

这是我个人的感受。用了一段时间 Cursor 之后,我发现我开始变懒了。遇到不会的 API,我不再去查文档,而是直接让 Cursor 帮我写。遇到报错,我不再去仔细看错误信息,而是直接把报错扔给 Cursor,让它帮我修。

这导致一个问题:我对代码的"感觉"变差了。以前我会仔细思考每一行代码的含义,现在我只是"大概知道"它在干什么。

有次 code review,同事问我这段代码为什么这么写,我居然答不上来,因为那是 Cursor 帮我生成的。

我的使用建议

1. 把它当辅助工具,别当主力

Cursor 适合用来:

  • 写样板代码(boilerplate)
  • 快速原型验证
  • 代码格式化和重构
  • 解释陌生代码
  • 不适合用来:

  • 写核心业务逻辑(除非你仔细 review)
  • 做架构决策
  • 处理安全相关的代码
  • 2. 生成的代码必须 review

    这是铁律。不管 Cursor 生成的代码看起来多合理,你必须逐行 review。重点关注:

  • 边界条件处理
  • 错误处理
  • 性能问题
  • 安全漏洞
  • 3. 学会写好的 prompt

    跟 Cursor 交互的时候,prompt 写得好不好直接影响输出质量。

    不好的 prompt:

    帮我写一个用户登录的功能

    好的 prompt:

    实现一个用户登录函数,需求:

  • 输入:email 和 password
  • 验证:email 格式、password 复杂度
  • 查数据库:users 表,用 bcrypt 比较密码
  • 返回:成功返回 JWT token,失败返回错误信息
  • 注意:防止 SQL 注入、密码不能明文存储
  • 越具体,它生成的东西越靠谱。

    4. 不要过度依赖

    定期强迫自己不用 Cursor,纯手写代码。保持对代码的"手感"。

    我现在的规定是:周末的项目不用 Cursor,平时的工作可以适度使用。这样既能享受 AI 的便利,又不会让自己退化。

    它值那个价钱吗?

    Cursor 现在的价格是 $20/月(Pro 版)。值不值取决于你怎么用。

    如果你只是用来写写简单的脚本、做做原型,那可能不值。GitHub Copilot 更便宜,而且集成更好。

    但如果你是在维护大型代码库、经常需要重构代码、或者要快速理解陌生项目,那 Cursor 的聊天和代码索引功能还是很有价值的。

    我个人觉得,$20/月换来 20-30% 的效率提升,还是划算的。但如果你期待它能让你效率翻倍,那还是算了。

    总结

    Cursor 是个好工具,但它只是工具。它能帮你省时间,但不能替代你思考。

    用它的前提是你已经是一个有经验的开发者,知道什么是好代码,什么是烂代码。如果你还是新手,我建议先打好基础,再来用这些 AI 工具。不然你只是从一个坑掉进另一个坑。

    最后说一句:AI 不会取代程序员,但会用 AI 的程序员会取代不会用的。关键是,你得知道自己在干什么。


    *写完这篇文章,我去看了眼 Cursor 给我生成的代码,发现有个边界条件没处理。果然,还是得自己来。*