聊聊我最近折腾的AI编程工具到底哪个能打
腾讯客户端搬砖三年,微信小程序业务线,入组快两年了。平时Mac写代码,Windows只配当测试机。最近在研究Rust,被所有权机制折磨得死去活来,但也确实觉得挺有意思。这篇文章算是我最近一段"技术探索"的总结,聊聊几个AI编程工具的真实体验。
事情是这样的
上周五晚上,产品跑过来说要加个小程序活动页,deadline是下周三。我当时正在看Rust的async/await,脑子还没切回来,一听这话血压就上来了。
"这需求上周不是评审过了吗?怎么又加?"
"老板说的,加个分享裂变功能,很简单的。"
简单个锤子。
我叹了口气,打开VSCode(别问为什么不用WebStorm,问就是习惯了),准备开干。但说实话,这种活动页的CRUD代码我写了快两年了,闭着眼睛都能写,但就是觉得累。不是身体累,是心累。
就在这个时候,我刷到了几个AI编程工具的消息:Bolt.new、OpenCode、还有JetBrains搞的Junie。
"要不试试?反正也是写搬砖代码。"
于是这个周末,我花了大概两天时间,把这三个东西都折腾了一遍。今天就来聊聊真实感受,不吹不黑,纯个人体验。
Bolt.new:说好的全栈神器呢
先说Bolt.new。这玩意儿在推特上被吹得神乎其神,说什么"一句话生成全栈应用"。我当时想,要是真这么猛,我以后还写个锤子代码。
打开浏览器,输入网址,界面确实挺清爽。我试着输入:
帮我做一个微信小程序的签到活动页面,需要有日历组件,
用户点击日期可以签到,签到后显示积分变化,
底部有一个排行榜展示前10名用户。
啪,大概等了十几秒,它真的给我生成了一个看起来还不错的页面。React写的,用了Tailwind CSS,日历组件也有,排行榜也有。
我当时心想:卧槽,这也行?
但高兴了不到三分钟,问题就来了。
第一个坑:它不懂小程序。
我忘了说是要做微信小程序,它给我生成的是个Web应用。虽然UI看着差不多,但小程序有自己的组件体系、API调用方式、路由机制,这些它完全没考虑。
第二个坑:状态管理一塌糊涂。
签到状态用的是最基础的useState,但我们的业务场景需要跟后端交互,需要处理并发签到、防重复提交、积分计算等等。它生成的代码完全没有这些考虑,就是一个纯前端demo。
第三个坑:改不动。
我想让它加个防抖逻辑,它加了。再让它改改接口调用方式,它改了。但改着改着,之前的功能就坏了。典型的"按下葫芦浮起瓢"。
我折腾了大概一个小时,最后放弃了。
说实话,Bolt.new适合什么场景呢?快速原型验证。如果你只是想给老板或者客户看一眼效果,它确实能帮你省不少时间。但如果要上生产环境,至少目前还不行。
| 维度 | Bolt.new 评价 |
|------|--------------|
| 上手难度 | ⭐⭐⭐⭐⭐ 零门槛 |
| 代码质量 | ⭐⭐ 能跑就行 |
| 业务理解 | ⭐ 基本不懂 |
| 可维护性 | ⭐ 改着改着就崩了 |
| 适合场景 | 原型、Demo、汇报 |
OpenCode:终端党的福音
说完Bolt.new,再聊聊OpenCode。
这玩意儿跟Bolt.new完全不是一个路子。它是一个终端里的AI编程助手,纯命令行操作。作为一个常年在Mac终端里摸爬滚打的人,我对这种工具天然有好感。
安装很简单:
npm install -g opencode
然后在项目目录里执行opencode,就进入了一个交互式的终端界面。
我试了一下,让它帮我写一个小程序的签到接口:
帮我用Node.js写一个签到接口,需要:
1. 校验用户是否今天已经签到
2. 计算连续签到天数
3. 根据连续天数计算积分奖励
4. 使用Redis做缓存,MySQL做持久化
它生成的代码让我有点惊喜:
const checkIn = async (ctx) => {
const { userId } = ctx.state.user;
const today = dayjs().format('YYYY-MM-DD');
const redisKey = `checkin:${userId}:${today}`;
// 先查Redis,防重复提交
const exists = await ctx.redis.get(redisKey);
if (exists) {
ctx.body = { code: -1, msg: '今天已经签到过了' };
return;
}
// 获取连续签到天数
const yesterday = dayjs().subtract(1, 'day').format('YYYY-MM-DD');
const yesterdayKey = `checkin:${userId}:${yesterday}`;
const hadYesterday = await ctx.redis.get(yesterdayKey);
const consecutiveDays = hadYesterday
? parseInt(await ctx.redis.get(`checkin:${userId}:consecutive`)) + 1
: 1;
// 计算积分,连续签到奖励递增
const points = calculatePoints(consecutiveDays);
// 写Redis
await ctx.redis.set(redisKey, '1', 'EX', 86400);
await ctx.redis.set(`checkin:${userId}:consecutive`, consecutiveDays);
// 写MySQL,异步就行
ctx.state.asyncTasks.push(() =>
ctx.mysql.query(
'INSERT INTO checkin_log (user_id, checkin_date, consecutive_days, points) VALUES (?, ?, ?, ?)',
[userId, today, consecutiveDays, points]
)
);
ctx.body = {
code: 0,
data: { consecutiveDays, points, totalPoints: await getUserTotalPoints(userId) }
};
};
说实话,这段代码质量比Bolt.new强太多了。它考虑了防重复提交、连续签到逻辑、Redis缓存策略,甚至连异步写数据库都想到了。
但是,也有问题。
OpenCode的上下文理解能力有限。它不知道我们项目的具体架构,不知道我们用的是Koa还是Express,不知道我们的数据库表结构是什么样的。所以生成的代码虽然逻辑没问题,但要真正跑起来,还需要大量的修改和适配。
另外,它对项目整体的理解不够。我问它"我们项目的路由是怎么组织的",它一脸懵逼。它只能看到当前文件或者你手动喂给它的代码片段。
| 维度 | OpenCode 评价 |
|------|--------------|
| 上手难度 | ⭐⭐⭐ 需要会用终端 |
| 代码质量 | ⭐⭐⭐⭐ 逻辑清晰 |
| 业务理解 | ⭐⭐ 需要手动喂上下文 |
| 可维护性 | ⭐⭐⭐ 改起来还行 |
| 适合场景 | 写具体函数、工具类 |
JetBrains Junie:IDE里长出来的AI
最后说说Junie。
说实话,我对JetBrains家的AI工具一直抱有期待。毕竟IntelliJ IDEA我用了好几年了,它家的代码补全、重构功能确实做得好。如果AI能力也能融入进去,那体验应该会很丝滑。
Junie目前还在早期阶段,我是通过JetBrains Toolbox安装的。装完之后在IDE里多了一个侧边栏,可以跟AI对话,也可以直接让它在当前文件里生成代码。
我试了几个场景:
场景一:重构一段屎山代码
我们项目里有一段老代码,是之前离职的同事写的,嵌套了五六层if-else,看着就头疼。我把代码选中,让Junie帮我重构。
它给出的方案是用策略模式+工厂模式来重构,代码确实清爽了不少。而且因为它在IDE里,能感知到项目的其他文件,所以重构后的代码引用关系基本是对的。
这一点比OpenCode强,OpenCode根本不知道你的项目里有哪些类、哪些接口。
场景二:写单元测试
这个是我觉得Junie最实用的功能。选中一个函数,右键"Generate Test",它就能帮你生成单元测试。而且它会分析你函数的分支逻辑,尽量覆盖各种边界情况。
虽然生成的测试不能直接跑(总有些mock不到位的地方),但作为基础框架已经很不错了,改改就能用。以前写单测我最烦的就是搭框架、写mock,现在这部分工作基本可以交给它了。
场景三:理解项目架构
我问Junie:"帮我分析一下这个项目的整体架构"。它真的能扫一遍项目结构,然后给你一个大概的架构图。虽然细节上有些出入,但大方向是对的。
这对于新同事入职来说应该很有用。我们组之前来个新人,花了两周才搞清楚项目结构,要是有Junie,估计两三天就能上手。
| 维度 | JetBrains Junie 评价 |
|------|---------------------|
| 上手难度 | ⭐⭐⭐⭐ JB用户零门槛 |
| 代码质量 | ⭐⭐⭐⭐ 懂项目上下文 |
| 业务理解 | ⭐⭐⭐⭐ 能感知项目结构 |
| 可维护性 | ⭐⭐⭐⭐ 重构建议靠谱 |
| 适合场景 | 重构、单测、项目理解 |
三个工具横向对比
折腾了一大圈,做个总结对比:
| 对比维度 | Bolt.new | OpenCode | JetBrains Junie |
|---------|----------|----------|-----------------|
| 定位 | 全栈应用生成 | 终端AI助手 | IDE内AI集成 |
| 交互方式 | 浏览器 | 命令行 | IDE插件 |
| 项目感知 | 无 | 弱 | 强 |
| 代码质量 | 一般 | 较好 | 好 |
| 学习成本 | 低 | 中 | 低(JB用户) |
| 最佳场景 | 快速原型 | 写函数/脚本 | 重构/测试/理解项目 |
| 价格 | 有免费额度 | 开源免费 | 需要订阅 |
| 我的推荐度 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
我的最佳实践
经过这一轮折腾,我总结了一套自己的用法:
1. 需求评审阶段用Bolt.new
产品过来聊需求的时候,我直接打开Bolt.new,一边聊一边生成页面原型。"你看,这个效果大概是这样,你觉得行不行?"
这招特别好用,以前产品总说"我想象不出来",现在直接看效果,沟通效率翻倍。
2. 写具体逻辑用OpenCode
比如要写个工具函数、数据处理脚本什么的,直接在终端里用OpenCode搞定。不用切IDE,不用开浏览器,纯键盘操作,效率很高。
特别是最近在学Rust,经常有些语法记不住,直接问OpenCode,它还能帮你解释原理。比翻文档快多了。
# 比如我在学Rust的时候,直接问
$ opencode "Rust中Box和Rc有什么区别?给我举个例子"
3. 日常开发用Junie
这才是主力。写代码的时候,Junie就在旁边待命。需要重构就重构,需要写测试就写测试,需要理解某段老代码就问它。
而且因为它在IDE里,上下文感知做得最好。它知道你当前文件引用了哪些东西,知道你的项目用了什么框架,生成的代码基本能直接用。
一些真心话
说实话,作为一个写了快三年客户端的人,我对AI编程工具的心态是复杂的。
一方面,这些工具确实能提高效率。以前写个活动页要两天,现在可能半天就搞定了。省下来的时间可以研究Rust,可以看看源码,可以早点下班。
另一方面,我也担心。如果AI越来越强,我们这些"搬砖程序员"还有存在的必要吗?
但转念一想,工具就是工具。锤子再好,也得有人知道往哪钉。AI能帮你写代码,但它不知道这个签到功能为什么要做、做了之后对业务有什么影响、用户真正需要的是什么。
这些判断力,才是我们真正的价值所在。
所以我的建议是:别抗拒,但也别依赖。 把AI当成一个效率工具,用它来加速你的工作,但不要让它替代你的思考。
就像我最近学Rust,虽然AI能帮我写代码,但所有权机制、生命周期这些东西,还是得自己理解透。不然出了Bug,AI可帮不了你debug。
好了,就聊这么多。那个签到活动页最后还是按时上线了,虽然中间加了两次需求(产品你懂的)。不过有这些工具帮忙,确实轻松了不少。
如果你也在折腾AI编程工具,欢迎评论区交流。特别是用Junie的同学,有什么骚操作分享一下。
不说了,leader叫我开会了,又要对需求了,头疼。
溜了溜了。


评论 0