广州的三月已经有些闷热,回南天的潮气贴在图书馆的玻璃窗上,化成细密的水珠。大四下学期的课表很空,没有了考研和秋招的兵荒马乱,我大部分时间都坐在这里靠窗的位置,面对着电脑屏幕上跳动的代码。
作为一名广州商学院的软件工程学生,在过去三年的时间里,我习惯了用折腾和竞赛来填补民办三本学历带来的隐性焦虑。简历上那两个国家奖学金和4.02的绩点,以及几个国二的竞赛证书,背后是由无数个熬夜写CRUD、调接口、看报错堆栈和查阅官方文档的夜晚堆砌起来的。但在2025年的今天,当我合上那些厚重的设计模式书籍,回望这几年的编码历程,我发现开发流里最大的变量,早就不是我敲击键盘的速度变快了,或者是盲打快捷键的熟练度,而是我的编辑器里多了一些“幽灵”般的助手。
AI辅助编程工具已经从两年前那种带有噱头性质的“玩具”,变成了我现在日常开发中不可或缺的基础设施。这几个月,因为毕业设计和一些外包项目的缘故,我深度体验了目前主流的几款工具。这里没有太多狂热的技术推崇,也没有要被时代淘汰的焦虑恐慌,我只是想平静地记录下它们在我实际工作流中的样子,以及那些踩过的坑。
最早进入我视线的是GitHub Copilot。作为老牌的AI编程助手,它以插件的形式安静地躺在VS Code的右下角,图标小到经常会被忽略。
它的存在感很低,低到你经常会忘记它是一个AI,而更像是一个长在你潜意识里的打字员。当你敲下变量名,或者写下一行双斜杠注释的瞬间,灰色的斜体代码就会如影随形地出现在光标后方。它的行内补全流畅自然,几乎不需要任何学习成本。肌肉记忆会让你在看到灰色代码的下一秒,下意识地按下Tab键。在打蓝桥杯和准备计算机设计大赛的那段时间,Copilot帮我省去了大量编写实体类、Getter/Setter、基础校验逻辑以及手写各类正则匹配的时间。
但用久了,它的局限性也会逐渐显露。Copilot的视界是受限的,它像是一个视力极好但视野狭窄的执行者。它对大型项目的全局理解很弱,通常只能基于当前打开的几个文件,或者最近浏览过的代码片段来推测你的意图。
有一次在重构一个前后端分离的校园二手交易平台时,我需要把后端的鉴权模块做一次彻底的升级。我在注释里写下了需求,Copilot非常顺滑地帮我补全了一大段Spring Security的配置代码,甚至连跨域处理和JWT拦截器都写好了。逻辑看起来天衣无缝,语法高亮也没有任何异常,但项目启动时却直接抛出了BeanCreationException。
排查了近两个小时,翻阅了多篇文档后我才发现,它生成的是基于WebSecurityConfigurerAdapter的旧版API用法。而我的项目使用的是Spring Boot 3.0,这个类在2.7版本之后就已经被废弃并移除了。那一刻我意识到,Copilot是一个很好的局部补全工具,但如果你完全信任它去处理涉及版本更迭的框架配置,它会让你在排错时付出成倍的代价。它不看你的pom.xml,也不关心你的依赖树。
随着项目复杂度的增加,局部补全已经无法满足我的需求,我开始寻找能理解整个工程上下文的工具。于是,我把主力编辑器切换到了Cursor。
Cursor不是单纯的插件,而是基于VS Code底层魔改的AI IDE。这种架构上的差异,带来了交互体验上的质变。在Cursor里,⌘K快捷键成了我每天按得最多的组合。你可以直接在编辑器里框选一段代码,唤出浮动对话框,用自然语言告诉它“把这段时间格式化逻辑改成适配时区的形式”。几秒钟后,它会直接在原地生成红绿相间的Diff差异对比,你可以清晰地看到它删了什么、加了什么,然后按需接受或拒绝。
更让我产生依赖的是它的Composer模式。在开发一个需要跨文件修改的需求时,比如在数据库里增加一个“用户账号软删除”的状态字段。以往我需要依次修改Entity实体类、Mapper的SQL语句、Service层的业务逻辑、Controller层的接口,最后再切到前端项目去改API定义和Vue组件的渲染逻辑。
而在Cursor的Composer里,我只需要用文字描述这个需求,它能在后台同时读取前后端的目录结构,在多个文件中穿梭,把所有需要联动修改的地方一次性处理好。它真正理解了项目的上下文关联。
不过,Cursor并非完美无缺。首先是现实的经济问题,对于一个还在靠生活费和奖学金支撑的大学生来说,每个月20美元的订阅费,加上繁琐的虚拟信用卡支付流程,是一笔不小的时间和金钱开销。
其次,它偶尔会有一种“过度自信”的毛病。有几次我只是让它优化某个工具类的性能,它却在没有告知我的情况下,顺手把同文件里其他几个它认为“不够优雅”的方法也重写了。比如它把一个原本运行良好的SimpleDateFormat替换成了LocalDateTime,理由是前者线程不安全。这在理论上是完全正确的,但它没有考虑到项目中另一个老旧的第三方依赖包只接受Date类型的入参。结果导致了依赖这些方法的外部模块在运行时默默崩溃。使用Cursor,你必须像Review一个聪明但莽撞的实习生提交的PR一样,仔细审查它给出的每一个Diff片段,不能有丝毫懈怠。
最近,我又开始尝试Anthropic出品的Claude Code。这是一款完全运行在终端命令行里的AI编码助手。
习惯了图形界面的开发者刚接触它时可能会觉得有些简陋。它没有花哨的侧边栏,没有可视化的代码树,只有黑底白字的终端交互。但对于经常需要折腾Linux服务器、写Shell脚本和处理CI/CD流水线的人来说,它非常契合DevOps的工作流。
它的代码理解能力极其出色,甚至带有一种自主探索的特质。前几天我在研究一个开源的分布式爬虫项目,面对庞大的源码结构和错综复杂的依赖关系毫无头绪。我在根目录唤醒了Claude Code,让它帮我理清系统架构。我看着它在终端里自己执行ls查看目录结构,用cat读取package.json和核心的配置文件,甚至自己用grep去搜索某些关键函数的调用链路。最后,它条理清晰地给我输出了一份包含模块依赖关系的架构说明。它不仅能写代码,还能像一个真实的开发者一样,自主执行终端命令来验证自己的猜想。
但纯终端的交互并不适合所有场景。当需要对比大量前端UI代码的修改时,终端输出的文本流会让人感到视觉疲劳,你很难直观地看出DOM嵌套层级的细微变化。而且,Claude Code的Token消耗非常惊人。它在后台不断读取文件、执行命令、自我纠错的过程,都在燃烧着API的额度。有时候只是让它排查一个简单的环境变量配置问题,看着终端里不断跳动的思考过程,几毛钱甚至几块钱的Token就悄无声息地花出去了。这种按量计费的模式,总会给人带来一种隐性的心理负担。
把这些工具融入日常开发流后,我粗略估算过,我的整体编码效率大约提升了百分之三十到五十。
这个数字背后,是那些枯燥的样板代码不再需要我手动敲击,是不熟悉的正则表达式不再需要去搜索引擎和技术论坛里反复翻找测试,是那些繁琐的批量重命名和结构调整可以在几秒钟内完成。我有了更多的时间去盯着图书馆窗外的树叶发呆,去思考数据库的表结构怎么设计才更符合第三范式,去思考不同微服务之间的边界应该划在哪里,去推敲接口的响应时间如何进一步压榨。
很多人担心AI会取代程序员,尤其是像我这样非名校出身、学历背景并不光鲜的底层码农。但我现在的感受恰恰相反。AI抹平了那些机械记忆和低级编码的门槛,它让“写代码”这件事本身变得廉价,但同时也让“做软件”的门槛变低了。
在过去的教育体系里,我们花了太多的时间和精力去记忆API的拼写、语法的边缘特性和框架的固定配置。现在,AI把这些纯体力劳动接管了过去。但它不能替代思考,架构设计的取舍、业务逻辑的边界判断、异常链路的兜底方案、以及对用户真实需求的洞察,依然需要人脑来完成。它只是一个不知疲倦的加速器,一个能把你的想法快速翻译成代码的工具,而不是一个能独立承担业务责任的替代者。
合上电脑前,看着屏幕上静止的IDE界面,我总会想起这段时间折腾这些工具的体会。最好的工具,其实是安静的。它不喧宾夺主,不弹窗打扰,只是默默接管那些机械的劳动,让你能够把有限的精力,真正专注于那些有价值的思考上。在这个技术快速迭代的当下,保持对新工具的敏锐,同时守住对软件工程本质的理解