AI 辅助编程工具与 Vibe Coding 实践记录
AI 辅助编程工具与 Vibe Coding 实践记录
一、主流 AI 辅助编程工具
| 工具名称 | 使用形式 | 功能简介 |
|---|---|---|
| Cursor | 客户端(AI 编程 IDE) | 基于代码编辑器开发的 AI 编程工具,需下载安装。支持代码补全、自然语言修改代码、理解整个项目以及自动执行多步骤编程任务。 |
| ChatGPT | 网页版、桌面客户端、移动客户端 | 通过自然语言生成代码、解释错误、设计程序结构和编写测试代码,适合学习编程和解决开发问题。 |
| Windsurf / Devin Desktop | 客户端、IDE 插件 | 原本是一款 AI 编程 IDE,现逐步发展为 Devin Desktop。能够结合编辑器和 AI Agent,帮助开发者编写、修改、测试和调试代码。 |
| Gemini Code Assist | IDE 插件、网页版 | 可集成到 VS Code、JetBrains 等开发工具中,根据注释和上下文生成代码,也能帮助解释代码和修复错误。 |
| GitHub Copilot | IDE 插件、网页版、客户端 | 可安装在 VS Code、Visual Studio、JetBrains 等 IDE 中,也可在 GitHub 网页和 Copilot 客户端中使用,提供代码补全、代码解释、代码生成和代码修改等功能。 |
二、什么是 Vibe Coding
Vibe Coding 通常翻译为 "氛围编程" 或 "感觉编程"。它是一种以自然语言描述需求、让 AI 生成和修改代码的编程方式。
在这种方式中,开发者不一定从头开始手动编写每一行代码,而是先告诉 AI 想实现什么功能,例如:
请使用 Java 编写一个方法,找出集合中库存最大的粮食对象,并处理集合为空的情况。
AI 会根据需求生成代码,开发者再通过继续对话的方式让 AI 修改代码、增加功能或修复问题。
Vibe Coding 的重点是"通过描述想法来驱动软件开发"。 它可以提高开发效率,特别适合:
- 快速制作原型
- 编写重复性代码
- 学习新技术
但是,AI 生成的代码不一定完全正确,仍然需要开发者检查代码逻辑、运行测试,并注意安全性和可维护性。因此,Vibe Coding 不能完全代替程序员的思考和代码审核。
三、使用 AI 工具编程记录
1. 提示词原文
请使用 Java 编写一个完整、可运行的示例程序,实现以下功能:
1. 定义 Grain 粮食实体类,包含以下属性:
- grainId,类型为 int
- grainName,类型为 String
- inventory,类型为 int,表示库存
2. 编写一个工具方法,传入 List<Grain> 粮食集合,找出库存最大的粮食对象并返回。
3. 在 main 方法中准备 3 条测试数据:
- 玉米,库存 800
- 水稻,库存 300
- 大豆,库存 400
4. 调用工具方法,打印库存最大粮食的名称和库存。
5. 注意判空:
- 如果集合为 null 或空集合,不能抛出 NullPointerException;
- 对这种情况进行合理处理。
要求代码结构清晰,使用 Java 标准集合类,不需要使用数据库或第三方框架。
2. AI 返回的代码
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Grain> grains = Arrays.asList(
new Grain(1, "玉米", 800),
new Grain(2, "水稻", 300),
new Grain(3, "大豆", 400)
);
Grain maxInventoryGrain = GrainUtils.findMaxInventory(grains);
if (maxInventoryGrain == null) {
System.out.println("粮食集合为空,没有可用的粮食数据。");
} else {
System.out.println("库存最大粮食:" + maxInventoryGrain.getGrainName());
System.out.println("库存:" + maxInventoryGrain.getInventory());
}
}
}
/**
* 粮食实体类
*/
class Grain {
private int grainId;
private String grainName;
private int inventory;
public Grain(int grainId, String grainName, int inventory) {
this.grainId = grainId;
this.grainName = grainName;
this.inventory = inventory;
}
public int getGrainId() {
return grainId;
}
public void setGrainId(int grainId) {
this.grainId = grainId;
}
public String getGrainName() {
return grainName;
}
public void setGrainName(String grainName) {
this.grainName = grainName;
}
public int getInventory() {
return inventory;
}
public void setInventory(int inventory) {
this.inventory = inventory;
}
}
/**
* 粮食工具类
*/
class GrainUtils {
/**
* 找出库存最大的粮食对象。
*
* @param grains 粮食集合
* @return 库存最大的粮食对象;集合为空时返回 null
*/
public static Grain findMaxInventory(List<Grain> grains) {
if (grains == null || grains.isEmpty()) {
return null;
}
Grain maxGrain = null;
for (Grain grain : grains) {
if (grain == null) {
continue;
}
if (maxGrain == null || grain.getInventory() > maxGrain.getInventory()) {
maxGrain = grain;
}
}
return maxGrain;
}
}
3. 运行结果
库存最大粮食:玉米
库存:800
四、对 AI 生成代码的评价
这段代码总体上是合理的,能够满足题目要求。具体分析如下:
✅ 优点
- 实体类设计合理:
Grain类包含了题目要求的三个属性:grainId、grainName和inventory,并提供了完整的 getter/setter 方法。 - 核心逻辑正确:
GrainUtils.findMaxInventory方法使用循环遍历集合,能够正确找出库存最大的粮食对象。 - 判空处理完善:对
null集合和空集合进行了判断,遇到这些情况时返回null,不会抛出空指针异常。 - 测试数据正确:
main方法准备了玉米、水稻和大豆三条测试数据,并正确打印了库存最大的玉米及其库存。 - 额外健壮性:代码还额外处理了集合中存在
null元素的情况(if (grain == null) continue;),具有一定的防御性编程意识。 - 算法效率高:只需遍历集合一次,时间复杂度为 O(n),空间复杂度为 O(1)。
⚠️ 需要注意的地方
AI 生成代码虽然能够快速完成任务,但开发者仍然应该自己编译和运行代码。建议进一步测试以下边界情况:
| 测试场景 | 预期行为 |
|---|---|
传入 null 集合 |
返回 null,不抛异常 |
| 传入空集合 | 返回 null,不抛异常 |
| 集合中只有一个粮食对象 | 返回该对象 |
| 所有粮食库存都相同 | 返回第一个最大库存对象 |
集合中包含 null 元素 |
跳过 null,正常处理 |
| 库存为零或负数 | 正常比较,不抛异常 |
📝 总结
这段代码可以作为本题的合格实现,但不能完全依赖 AI 输出,仍然需要人工检查和测试。Vibe Coding 是提升效率的好工具,但开发者的代码审查能力依然是保障质量的关键。
本文记录了使用 AI 工具进行 Vibe Coding 的完整过程,包括工具介绍、概念说明、实际编程记录和代码评价,供学习参考。
浙公网安备 33010602011771号