我用 Cursor 写了两个月代码,项目代码量不降反升,为什么?

两个月前,我满怀期待地把主力开发工具切换成了 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、缓存、错误上报全配套。

你没说不需要,它就默认你全都要。


项目代码变多之后,改动也变难了

以前我写个上传功能,只改一个文件。

现在要:

  1. 改上传逻辑?uploadFile.ts
  2. 改上传状态?useUploadStatus.ts
  3. 改进度条显示?useThrottleProgress.ts
  4. 还有 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 高产,也不等于团队高效。

你们怎么看?😄

📌 你可以继续看我的《为什么》系列文章

相关推荐
郑州光合科技余经理1 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
平头哥~5 小时前
Day 07 _ 那条 1px 的线,为什么在手机上忽粗忽细
前端·css·样式·学习资料
小江的记录本5 小时前
【CSS】CSS 动画:transition、animation、transform、CSS3 新特性(附《思维导图》)
前端·css·安全·spring·前端框架·css3·动画
circuitsosk5 小时前
任务规划器的三种范式对比:ReAct、Plan-and-Execute 与 Tree-of-Thought 在真实业务中的取舍
前端·javascript·python·react.js·llm·ai agent
hzxpaipai6 小时前
企业官网技术架构拆解:前端、后台、数据库、服务器如何协同
前端·数据库·架构
小磊哥er7 小时前
深入解构Claude Code - 第 12 篇 · 整体串起来
javascript·ai编程
小磊哥er7 小时前
深入解构Claude Code - 第 11 篇 · 工程上的讲究
javascript·ai编程
2601_963749107 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
Eloudy7 小时前
HSB FPGA 架构总体
fpga开发·架构
yychen_java7 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构