用 AI 撸个真实 App 居然得花一年,这结论听起来挺离谱
我花了一年时间把一个复杂的业务逻辑 App 从零跑通,中间经历了从 Cursor 到 Claude Code 的工具迁移,最核心的体悟是:AI 编程的瓶颈不在于它能写多少行代码,而在于你对系统架构的掌控力。
为什么“AI 快速开发”是个伪命题?
在项目前三个月,我陷入了典型的“AI 幻觉速度”中。用 Cursor 配合 Claude 3.5 Sonnet,写页面、接 API 简直是秒级响应。但到了中期,代码量突破 1 万行后,问题集中爆发了。
最典型的坑就是:AI 倾向于用最简单的局部最优解,而不是全局最优解。它会为了修复 A 处的 Bug,在不经意间破坏 B 处的逻辑,而因为代码量太大,它在 Context Window(上下文窗口)里记不住之前的约定。
实测踩坑点:
我当时在处理一个复杂的权限校验逻辑,AI 建议我直接在每个 Page 组件里写校验。结果随着页面增加到 20 多个,我想修改一个权限规则,得手动在 20 个文件里同步修改。这就是典型的“AI 堆砌代码”导致的技术债。
效率反弹的实操配置
为了解决这个问题,我强行改变了与 AI 协作的模式。不再让它“帮我写这个功能”,而是先定义“协议”和“架构”。
我现在习惯在项目根目录建立一个 .cursorrules 或类似的指令文件(如果是用 Claude Code,我会写在全局 Prompt 里),强制要求它遵循特定的模式。
我的一个具体配置示例(针对 TypeScript + Tailwind 项目):
{
"architectural_rules": [
"所有业务逻辑必须解耦到 /services 目录下,禁止在 UI 组件中编写超过 5 行的逻辑代码",
"状态管理必须使用 Zustand,严禁在组件间通过 Props 传递三层以上的数据",
"API 请求必须统一通过 /api/client.ts 封装,且必须包含 try-catch 错误处理"
],
"coding_style": {
"naming": "使用 kebab-case 命名文件,使用 PascalCase 命名组件",
"type_safety": "禁止使用 any,所有接口必须定义 Interface"
}
}有了这套约束,AI 乱写代码的概率降低了大概 40%。当你发现它开始写 any 或者把逻辑塞进组件时,直接用这个规则怼回去,效率反而更高。
从 Cursor 迁移到 Claude Code 的实操差异
在项目后期,我尝试了 Claude Code 这种直接在终端运行的 Agent。对比 Cursor 的 IDE 集成,Claude Code 的逻辑推理能力在处理“跨文件重构”时明显更强。
一个典型的重构场景对比:
- Cursor: 我需要手动打开文件 A → 选中代码 → 告诉 AI 修改 → 再打开文件 B → 告诉 AI 同步修改。
- Claude Code: 直接下令
grep "UserAuth" && refactor all usages to use the new AuthProvider。
它能自动扫描文件系统,分析依赖关系,然后一次性提交多个文件的修改。这种“全局感知”能力是缩短开发周期(尽管还是花了一年)的关键。
最终的避坑指南
如果你打算用 AI 做一个长期运行的项目,记得死守这几条底线:
- 不要依赖 AI 的内存: 无论 Context Window 多大,它都会忘。关键的架构设计必须写在 Markdown 文档里,每次开始新功能前,先喂给它这个文档。
- 强制要求写测试: 不要相信 AI 说“这段代码没问题”。强制它生成 Vitest 或 Jest 测试用例。
- 小步快跑,频繁提交: 每次 AI 修改完一个功能,立刻
git commit。一旦它把代码改崩了,回滚是唯一的救命稻草。
# 典型的 AI 开发循环
git checkout -b feature/ai-update
# 让 AI 修改代码
npm run test # 必须跑测试
git add . && git commit -m "feat: ai-implemented-logic"一年时间,我完成了原本需要 3 人团队开发半年的工作量。AI 确实没让开发变成“瞬间完成”,但它把一个独立开发者的上限拉高到了一个恐怖的程度。