两个月前,我满怀期待地把主力开发工具切换成了 Cursor。原本以为:
"AI 来写代码,我来专注业务,代码量自然会下降。"
结果------代码行数不仅没变少,反而暴涨了一倍,我整个人都惊了。
用 Cursor 写代码,爽是真爽
Cursor 就像一个代码小助手,随传随到、任劳任怨。
比如我只写了这么一段需求注释:
typescript
// 上传文件,失败重试 3 次,并显示进度条
Cursor 自动补全了整个函数,附带封装好了异常处理和进度更新,还贴心地生成了一个上传状态的 useUploadStatus
hook,顺手还补了测试。
我一看,忍不住点了个 👍,直接复制粘贴进项目:
typescript
export const useUploadStatus = () => {
const [progress, setProgress] = useState(0)
const [status, setStatus] = useState<'idle' | 'uploading' | 'success' | 'error'>('idle')
return { progress, status, setProgress, setStatus }
}
然后是上传逻辑:
typescript
export const uploadFile = async (file: File, onProgress: (p: number) => void) => {
let attempts = 0
const maxRetries = 3
while (attempts < maxRetries) {
try {
const res = await uploadToServer(file, onProgress)
return res
} catch (err) {
attempts++
if (attempts >= maxRetries) throw err
}
}
}
第一次看到 Cursor 自动写出这些,我真的怀疑它是不是我未来的合伙人。
三天之后:我看着 14 个 utils 文件开始头疼
"上传功能"从一段 20 行的函数,演变成:
uploadFile.ts
useUploadStatus.ts
retry.ts
uploadError.ts
useThrottleProgress.ts
UploadConfig.ts
UploadTest.spec.ts
Cursor 每次帮我写代码,都"顺手"搞个封装、"顺手"提个公用逻辑。
久而久之,每个功能都能拆成 N 个文件,整个项目像微服务一样松散。
Cursor 写代码太"认真",不是你说多少,它写多少
我写了这一行提示:
typescript
// 登录失败后提示错误,跳转到登录页
结果 Cursor 写成了这样:
typescript
if (!isAuthenticated) {
showToast('登录已过期,请重新登录')
router.replace('/login')
}
正常。
但它还写了一个"自动登录逻辑":
typescript
const autoLogin = async () => {
const savedToken = localStorage.getItem('token')
if (savedToken) {
const isValid = await validateToken(savedToken)
if (isValid) {
setToken(savedToken)
return true
}
}
return false
}
还配了个 useAuth
hook,再带了一个 AuthProvider
组件,还提议我在入口加个 <AuthGuard>
。
我看着这些代码的心情是这样的:
"......兄弟,我只是想跳个转,没让你开发一个鉴权系统啊。"
问题的根本:Cursor 不知道你项目的"轻重缓急"
人类程序员是会做"场景判断"的:
- 这个项目 MVP 阶段,能跑就行;
- 这个模块未来不会复用,就别封装了;
- 这个 feature 下周就要砍掉,不要测了。
而 Cursor 没有"轻重缓急"的概念,它只会按**"最稳妥方式"**写代码。
你说登录,它给你写认证中间件;
你说表单,它帮你做 schema 验证和字段格式化;
你说请求,它直接带 token、缓存、错误上报全配套。
你没说不需要,它就默认你全都要。
项目代码变多之后,改动也变难了
以前我写个上传功能,只改一个文件。
现在要:
- 改上传逻辑?
uploadFile.ts
- 改上传状态?
useUploadStatus.ts
- 改进度条显示?
useThrottleProgress.ts
- 还有
UploadError.ts
可能也得动
写的时候优雅,改的时候疯狂找引用。连我自己都开始找不到某些逻辑在哪封装了。
而且有个特别尴尬的地方:
我不知道这段代码是不是我自己写的。
有时候看一段函数结构奇特、变量命名清晰,我一脸问号:
"这真是我写的?还是 Cursor 帮我写的?"
后来我调整了写法:少让 Cursor 自由发挥
✅ 改法 1:先写结构,Cursor 补细节
我现在都习惯这样写:
typescript
export const login = async (username: string, password: string) => {
// TODO: 发送请求,成功后保存 token
}
然后选中 TODO 这段,让 Cursor 来补。这样它不会擅自添加其它逻辑。
✅ 改法 2:提示里加限制
直接说:
typescript
// 不需要封装 hook,只用基础写法
// 不需要类型优化,也不需要加错误类型
加一句限制,Cursor 立马收敛。
✅ 改法 3:生成后手动删,保留"精简版"
现在我每次用完 Cursor,第一步不是测试,而是删代码。
比如它帮我写了 5 个文件,我会思考:
- 哪些是"AI 凑字数"的?
- 哪些是当前阶段不必要的抽象?
- 有没有"为封装而封装"的 utils?
删完再提 PR,反而更利索。
Cursor 的问题不是技术,是"没有分寸感"🙂
AI 写代码的问题,不在于它写得不好,而是写得太好,太多,太过了。
它能写出全套最佳实践代码,但项目不需要。
它能封装出泛用 hook,但业务没复用需求。
它能自动生成注释、类型、测试,但维护起来很重。
项目代码多,不代表代码质量高;AI 高产,也不等于团队高效。
你们怎么看?😄