1、一个好用的司机,不等于一个靠谱的司机
想象你坐在出租车上。司机开得又快又稳,你一路上看手机,完全没注意路。到了目的地你下车,司机走了。
然后你发现:这里是哪里?这不是我要去的地方。
上车时你说的是“去人民公园”,但没说清楚是哪个区的人民公园。司机导航去了最近的那个——但不是你心里的那个。车开得再好,方向错了。
AI 写的代码就像这个司机。语法完美,格式工整,逻辑看起来很通顺。但它可能在你不注意的地方,悄悄走偏了方向。
2、AI 的三大“坏习惯”
根据大量开发者的实际经验,AI 写的代码有三个高频问题。了解它们,你在审查时就有的放矢。
坏习惯一:幻觉——用了不存在的 API
这是最常见的问题。AI 会“发明”一个看起来很合理、但实际上不存在的函数或库。
# AI 写出来的代码
from datetime import parse_date_string # 这个函数根本不存在!
result = parse_date_string("2026-01-15")
它为什么不写正确的 datetime.strptime("2026-01-15", "%Y-%m-%d")?因为在 AI 的训练数据里,“parse_date_string” 这个词组在类似上下文中出现过,它觉得“这个组合应该能行”。
记住:AI 是在做概率预测,不是在查文档。它“觉得”某个 API 应该存在,不代表真的存在。
坏习惯二:路径只走了一半
AI 能写好“正常路径”的代码,但在异常路径上经常掉链子。
// AI 写的代码——正常路径没问题
async function fetchUserData(userId) {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
return data;
}
看起来很干净,对吧?但仔细想想:
- 如果网络断了呢?(
fetch会抛异常,没处理) - 如果返回 404 呢?(
response.json()会尝试解析错误页面,一定报错) - 如果返回的不是 JSON 呢?
- 如果
userId是undefined呢?
AI 写出这段代码的时候,它的“注意力”集中在“如何获取数据并返回”这个主路径上。至于主路径以外的分岔路,它没细想。
你要替它想。
坏习惯三:安全盲区——默认相信所有人
AI 写安全相关代码时,容易假设“输入都是合法的”。
# AI 写的查询
def get_user_by_name(name):
query = f"SELECT * FROM users WHERE name = '{name}'"
return database.execute(query)
SQL 注入的标准教科书案例。AI 当然“知道”参数化查询更好,但在快速生成代码的时候,它可能“忘了”。
这不是 AI 的疏忽——是它的训练数据里,简单示例代码远多于生产级别的安全代码。它的概率模型倾向于给出“最常见”的写法,而最常见的写法往往不够安全。
3、你不需要成为安全专家,但要有“雷达”
不需要背 OWASP Top 10,不需要考安全证书。只需要养成几个简单的审查习惯:
每次看到 AI 写的代码,心里问自己三句话:
- 每个外部输入都校验了吗? —— 用户输入、API 参数、文件内容……这些都应该先检查再使用。
- 错误情况都处理了吗? —— 网络挂了、文件不存在、数据格式不对……每种可能出错的情况,有没有对应的处理?
- 外部库的调用方式对吗? —— 不熟悉的 API 调用,花 10 秒去查一下文档,比花 10 分钟 debug 划算得多。
这三句话看起来简单,但每次坚持问自己一遍,能拦住 AI 产生的绝大部分问题。
4、写测试:Vibe Coding 的安全气囊
如果你用 Vibe Coding 写了 100 行代码,花 5 分钟写几个测试——你得到的安心感远超这 5 分钟的成本。
好消息是:你也可以让 AI 帮你写测试。 而且测试是 AI 特别擅长的领域——输入输出明确、逻辑简单、模式固定。
"帮我为刚才写的 fetchUserData 函数写测试,覆盖几种情况:
1. 正常返回用户数据
2. API 返回 404
3. 网络请求失败
用 jest,放在 __tests__/user.test.js 里。"
几分钟后你就有了一套测试。跑一遍,红的修绿的过。这个流程比手工测试快一个数量级,质量还更好。
Vibe Coding 的黄金法则:AI 写代码,AI 写测试,你读代码,你跑测试。人和 AI 各司其职。
5、“看起来能跑”≠ 代码没问题
最后说一个心态问题。
AI 生成的代码往往第一眼看起来非常漂亮——缩进整齐,变量命名规范,注释清晰。这会产生一种“看起来很专业,应该没问题”的错觉。
这种错觉很危险。
一个真实的例子:有人用 AI 写了一个文件上传功能。代码很漂亮,功能也能跑。上线一个月后发现:任何人都可以上传任意大小的文件,服务器快被塞爆了。AI 没有自动加上文件大小限制——因为在简单的示例代码里,没有人写这个。
越漂亮的代码,越容易让人放松警惕。 记住:AI 生成的代码和你自己写的第一版草稿一样,都需要被审查、被测试、被质疑。
下一篇文章是系列的最后一篇,我们聊聊如何让 AI 真正理解你的项目——上下文管理的艺术。
每天前进一小步,就是一个新的高度!