从 IDE 和 Vim 切换到 Cursor

我之前开发比较大的项目一般是用 JetBrains 系列 IDE(PyCharm、CLion),开发比较小的项目一般就用 vim 了。开发比较大的项目最烦的就是写胶水代码,大部分时间都不是在思考功能的设计或者算法,而是花在胶水代码上了。

Cursor 是一个类似 GitHub co-pilot 的 AI 辅助编程 IDE,界面跟 VS Code 比较类似。2023 年 Cursor 刚开源发布不久,我就开始试用了,但当时由于基础模型能力不足,并不是特别好用。今年 5 月 GPT-4o 发布后,我重新开始用 Cursor,发现比在 ChatGPT 里面问代码问题更方便,首先不用来回切换窗口,其次 Cursor 有上下文,问的效率更高。

最近三个月,有了代码能力更强的 Claude 3.5 Sonnet,我已经完全从 PyCharm 和 Vim 切换到 Cursor,因为 Cursor 的开发效率比有 AI 补全功能的 PyCharm 高多了,整体开发效率提升了一倍,最近三个月 GitHub 也轻松保持全绿。

GitHub 最近三个月保持全绿GitHub 最近三个月保持全绿

Cursor 可以帮助快速入门新语言和框架

**Cursor 的用途不仅是提升开发效率,还能帮我们快速熟悉新的编程语言、框架和技术栈。**例如用 Go 写后端,用 React 写前端,用 Solidity 写智能合约,我之前都不会,但有了 AI 辅助编程,这些都不难。如果我上学的时候就有今天这么强的 AI,可以多学会很多编程技术。

Cursor 最适合的场景是做 demo,用不带插件的 Vim 就能写的代码,Cursor 基本上可以独立完成,一次写出来就不会有太多 bug。已经有很多学生用 GitHub co-pilot 或 Cursor 写课程作业,别人要写一周的项目,用 AI 辅助编程一晚上就搞定了。

比较挑战的场景是修改现有大型项目的代码(俗称屎山代码),用不带插件的 Vim 人都很难写,需要借助 IDE,因为需要不断查询代码仓库中其余的模块,牵一发而动全身。Cursor 使用的生成式 AI 只有根据 prompt 查询到的代码片段,代码编写过程中不能频繁交互查询代码库,因此开发大型项目时就比较难一次写很多代码,经常需要程序员接管。

演示:用 2 小时开发 AI 选课助手

由于大多数专业程序员都是在大型项目中工作,为了展示 Cursor 的能力,我选择了 USTC 评课社区,在 2 小时的在线直播中,给它开发一个 AI 选课助手。这个项目有 1 万多行代码,大部分编写于 9 年前,技术框架是 Flask + Jinja2 + SQLAlchemy + Bootstrap + jQuery,前端没有使用 React 等框架,而是裸写的 HTML + CSS + JS,实现比较重交互的 AI 应用是相对困难的。

用 Cursor 2 小时写了 800 行代码完成的 demo 截图:

Cursor 2 小时完成的 AI 选课助手 demoCursor 2 小时完成的 AI 选课助手 demo

我演示开发的 AI 选课助手是一个 RAG(Retrieval Augmented Generation)应用,旨在利用评课社区的点评,回答用户关于课程的问题。其原理是首先识别用户的意图,生成对应的搜索索引查询,再将查询到的课程总结和点评内容作为上下文输入到大模型,再由大模型给用户生成回答。

后端主要涉及 RAG、对话管理和消息历史管理。前端就是一个类似 ChatGPT 的界面,包括对话列表、消息列表、消息输入框、AI 流式输出的控件,其中 AI 助手的输出包括用户意图、搜索结果、AI 回答和用时统计。

**如果按照传统的软件开发流程,上述特性至少需要一个前端加一个后端全职开发一周。但用 Cursor,一个程序员就可以在两小时内完成一个基本可用的 demo。**虽然前端还有不少 bug,前端设计和后端的意图识别、RAG 还有很多待改进的地方,但我自己如果不借助 AI,就算是码力全开,开发完这个 demo 也需要至少一整天的时间。

从下面的全程视频可以看到,我用 Cursor 的时候其实几乎不是在编程,而是在跟 AI 沟通需求。只有在 AI 搞不定的时候,我才去亲手写代码,其余时候只需要定位到需要做什么,然后让 AI 去改代码就行了。

视频中间有很多时间是在敲 prompt 和定位 bug,看的过程中可以跳过。前 40 分钟是在沟通需求和完成第一版代码,后面 80 分钟都是在修 bug,其中后端的 bug 不多,bug 主要是跟仓库现有代码的接口问题,一开始的大模型 prompt 写得也不太专业;前端 bug 较多(前端代码量也是后端的 2 倍),在 JSON 格式处理的 debug 中浪费了比较多时间。

(视频时长 2 小时,709 MB)

用 Cursor 的总体开发流程

总结一下,用 Cursor 的总体开发流程是:

  1. 想清楚要做什么,设计系统架构。
  2. 让 Cursor 编写每个模块,一般是先数据结构(数据库表结构),再后端,再前端的顺序比较好。每个模块开始编写时最好给它一个干净的文件,外围有类似功能的文件供它参考,然后给每个模块一个清晰的 prompt,就像跟人沟通需求一样。就像现实世界的合作开发一样,一开始的需求思考和沟通绝对不是浪费时间,一开始定好需求,后面能省很多返工的时间。AI 用 1 分钟左右就能写出一版,看一遍,了解 AI 写的代码结构,顺便修复一些很容易看出的问题。
  3. 各个模块联调。在联调的时候发现问题,程序员定位到问题所属的模块,可以把错误直接告诉 Cursor,让它自己去改。如果 Cursor 改不好,程序员再自己去定位和修改问题。如果问题源于代码仓库中的已有代码,一般是需要程序员人工介入定位的,不要过度依赖 AI 编程。在需要人工接管的编程中,仍然可以使用 Tab 方式提升编码效率,也可以随时使用 Ctrl+K 进行代码重构。

当然,用 Cursor 仍然需要扎实的计算机编程基础和工程实践经验。Cursor 只是辅助编程工具,尚未达到端到端完成整个工程项目的水平,没有架构设计能力,也不具备调试和定位 bug 的能力,很多时候仍然需要程序员手动接管。

在前面的视频中可以看到,AI 生成的代码还是有很多 bug 的,其中一些一眼就能看出来,例如大模型 prompt 不专业、前端流式传输用的 API 不对,如果编程经验不足,后续调试估计要花很多时间。在调试过程中,程序员也首先需要定位到是哪个模块的问题,再让 Cursor 去改。有时候 Cursor 改不对,例如前端页面布局问题,需要手工修复。

**因此,优秀的程序员用了 Cursor 效率能大大提升,基本功不扎实的程序员用 Cursor 的效率提升就不一定很大。**有些程序员看不懂别人的代码,那调试 Cursor 自动生成的代码可能比自己写还费劲。

每个程序员都要学会用 AI 辅助编程

一位朋友说,现在 AI 编程的水平至少相当于年薪 40 万人民币的程序员,编程基本功扎实,代码风格良好。(说这句话的时候 OpenAI o1 还没发布,今天 o1 的编程水平已经没多少人类能比过了)

**我再次呼吁,每个程序员都要学会用 AI 辅助编程,去年的最佳实践是问 ChatGPT,今年的最佳实践是用 GitHub co-pilot 或 Cursor 这样的 AI 辅助编程工具,明年可能最佳实践就是 OpenAI o1、Devin 这样的端到端 AI 编程工具了。**不会用 AI 辅助编程的程序员,由于生产效率和学习效率太低,过不了几年可能就会被淘汰。

有些人可能担心,AI 编程比人都厉害了,大多数程序员是不是要失业了?其实大可不必担心,因为 “要做什么” 这件事情总是需要人想清楚的,各种编程语言、框架和工具都是在减少人在细枝末节上消耗的时间,从而可以更专注于有创造力的事情。从汇编语言到 C 语言再到 Python 等高级语言,程序员不但没有失业,还创造了更多的价值,AI 辅助编程也是如此。

Comments