从 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