如今,AI 编程助手已是开发者的标配,从自动补全到生成 MVP(最小可行性产品),它的能力毋庸置疑。
但你是否遇到过这种情况:明明是同样模型,别人用起来如虎添翼,你生成的代码却总是差点意思?
很多人觉得这是 AI 不够聪明,但 读完 Google 工程总监 Addy Osmani 的文章《程序员提示词实战指南》后,你会发现一个扎心的真相:AI 产出的质量,90% 取决于你的 Prompt(提示词)质量。
大多数开发者习惯了“Google 式”的搜索思维——扔几个关键词,期待奇迹。但在 AI 时代,我们需要更新心智模型:
把 AI 想象成一个技术精湛、博览群书,但对你的项目背景一无所知的“资深实习生”。
AI 不是读心术大师。没有你提供的上下文(Context),它就是盲目的。你问得稀里糊涂,它就回敬你“正确的废话”;你引导得当,它就能给出优雅甚至惊艳的解决方案。
因此,提示词工程,已不再是锦上添花,而是现代程序员的必备硬技能。
为了帮你掌握这项技能,本系列文章将抛弃空泛理论,从实战角度出发,帮助你系统掌握高效提问的技巧。我们将涵盖以下核心场景:
1.
2.
3. 代码重构 (Refactoring) 提示词指南(本文)
4. 从零构建新功能的提示词指南
5. 编程提示词避坑指南
之前已经介绍了高效提示词的底层逻辑。让我们开始实战模式,第三篇:代码重构 (Refactoring)提示词指南。
01实战模式二:代码重构 (Refactoring)代码重构(Refactoring),说白了就是,在不改变代码功能的前提下,把它改得更整洁、更高效、更符合地道的编程习惯,这可是 AI 助手的拿手好戏。
毕竟,AI 模型阅读过海量的优秀开源代码,这使它成为一个天然的“代码整容医生”。但要发挥它的威力,你不能只丢一句“优化一下”,因为 AI 不知道你眼中的“好代码”是什么样子。
高效重构的核心在于:用提示词定义“最佳实践”的标准。
以下是驱动 AI 进行高质量重构时提示词的三个关键支点:
1. 明确重构目标光说一句“重构这段代码”,就像去理发店跟理发师说“帮我剪短点”一样,太随意了。
你需要将目标具体化为技术指标。
你是想让代码更好读(Readability)?还是想降低复杂度?或者是想让它优化性能(Performance)?亦或是想换个编程范式或第三方库?
❌ 烂提示词模式: “把这段代码改好点。”
✅ 好提示词模式:
“重构下面的函数,提高它的可读性和可维护性(减少重复代码,使用更清晰的变量名)。”
“优化这个算法的速度,它在处理大数据量时太慢了。”
当你明确了目标,模型就知道该往哪个方向发力了。
如果你说你在意性能,它可能会换个更高效的排序算法或加缓存;如果你强调可读性,它可能会把大函数拆成小的,或者补上注释。
2. 锁定技术上下文同样的逻辑,在不同框架版本下的“地道写法”天差地别。最重要的是:报上家门——你用的是什么语言?什么框架?
同样的逻辑,在 Node.js 和 Deno 里可能完全不同;在 React 的类组件(Class Components)和函数组件(Functional Components)里更是不一样。
提示词 模板:“当前技术栈是 React 18 + TypeScript。请将这个旧的Class Component重构为使用 Hooks 的Functional Component。注意避免不必要的重渲染。”
如果不指定版本,AI 可能会用五年前的语法,写出不兼容的代码。
3. 要求自我解释重构不仅是改代码,更是学习机会。
提示词 模板:“请给出重构后的代码,并列出你做了哪些改动,解释为什么这种写法比原来的更好。”
这不仅能让你快速检查代码,还能防止 AI 悄悄改变业务逻辑。
简而言之,让 AI 解释,是一种安全带。这就像是让 AI 对自己的重构工作做了一次 Code Review。
4. 用“角色扮演”拔高标准前面我们提过,让 AI 扮演专家非常有用。在重构时,你可以说:
提示词 模板:“你是一位资深的 TypeScript 专家,按照最佳实践和现代标准重构这段代码。”
这种设定往往能炸出更有深度的改进,而不仅仅是表面修修补补,因为 AI 会努力去贴合“专家”的人设。
有一个广为流传的经典例子,是让 AI 扮演导师:
“你是一位经验丰富的 Python 开发者,正在指导一名初级程序员。请编写函数注释(Docstrings),并重写代码进行优化的同时给出详细解释。”
在一些示例里,这种“导师人设”甚至会推动 AI 主动选择更合适的数据结构,并给出更简洁的一行写法,替代原本啰嗦的循环。
02 案例实战:烂提示词 vs. 好提示词场景: 我们有一个 Node.js 函数 getCombinedData,它串行调用两个接口,然后用低效的嵌套循环合并数据。
原始代码:
async function getCombinedData(apiClient) {// 问题1: 串行请求,慢const users = await (await apiClient.fetch('/users')).json;const orders = await (await apiClient.fetch('/orders')).json;const result = ;// 问题2: 嵌套循环,O(n*m) 复杂度for (let user of users) {const userOrders = orders.filter(o => o.userId === user.id);result.push({ user, orders: userOrders });}return result;}Round 1:指令模糊的重构用户: “重构上面的 getCombinedData函数。”
AI 回复(模拟):
好的。这是 getCombinedData的重构版本:
async function getCombinedData(apiClient) {// 并行获取用户和订单const [usersResponse, ordersResponse] = awaitPromise.all([apiClient.fetch('/users'),apiClient.fetch('/orders')]);if (!usersResponse.ok || !ordersResponse.ok) {thrownewError('Failed to fetch data');}const [users, orders] = awaitPromise.all([usersResponse.json(),ordersResponse.json()]);// 按 userId 索引订单,以便高效查找const ordersByUser = {};for (const order of orders) {if (!ordersByUser[order.userId]) {ordersByUser[order.userId] = ;}ordersByUser[order.userId].push(order);}// 合并数据return users.map(user => ({user,orders: ordersByUser[user.id] || []}));}AI 确实把请求改成了并行,也用了 Map 优化。但在错误处理上,它自作主张把两个接口的报错合并成了一个通用的 "Data Fetch Error"。
点评:虽然 AI 可以“蒙”对了性能优化方向,但很可能擅自修改了错误处理逻辑,我们需要在 AI 生成的代码中进行抽卡,模糊指令带来了不可控的副作用。
Round 2:目标导向的重构用户:
重构上面的 getCombinedData函数,以消除重复代码并提高性能。
具体约束:
避免重复的 users 和 orders 获取逻,也许可以用一个辅助函数,或者把两次获取合并处理。
如果可能,并行获取两个列表。
保留每个请求的独立错误处理(我想知道具体是哪个调用失败了)。
改进数据合并部分,使用更高效的结构来查找,而不是嵌套循环。 请提供重构后的代码,并加上注释解释你的修改。
AI 回复(模拟):
async function getCombinedData(apiClient) {// 1. 并发请求,提升响应速度const [usersRes, ordersRes] = awaitPromise.all([apiClient.fetch('/users'),apiClient.fetch('/orders')]);// 2. 独立错误检查 (遵从指令)if (!usersRes.ok) thrownewError('Failed to fetch users');if (!ordersRes.ok) thrownewError('Failed to fetch orders');const [users, orders] = awaitPromise.all([usersRes.json(), ordersRes.json()]);// 3. 构建索引 Map,空间换时间const ordersMap = orders.reduce((map, order) => {(map[order.userId] ||= []).push(order);return map;}, {});// 4. O(n) 复杂度合并return users.map(user => ({user,orders: ordersMap[user.id] || []}));}点评:这个回答完美命中所有目标!代码更干净、跑得更快,而且听话地保留了独立的错误信息。 AI 的解释也一一对应了我们的要求。这就是“把重构定义清楚”的威力,我们不仅告诉 AI 要做,还告诉了它怎么做、保留什么、优化什么。
--
这个例子给我们上了一课:当你心里清楚想要什么效果时,一定要把它写出来。
AI 擅长执行指令,但它不会读心术。对于复杂的代码,列出你的“愿望清单”,效果绝对比一句“优化一下”好上一百倍。社区经验也一再强调:结构化、目标明确的提示词,能显著提升结果质量。
03 进阶:重构的“骚操作”1. 询问替代方案也许 AI 的第一版重构方案能用,但你好奇有没有别的写法。 你可以问:
“这个重构方案不错。能不能换个思路重构?比如用函数式编程风格(多用数组方法少用循环)?” 或者 “如果用递归而不是迭代,代码会变成什么样?”
就好比跟同事头脑风暴,能帮你拓宽思路,最后选你最满意的。
2. 验证与测试AI 写的代码,千万别直接上线!它可能会引入微妙的 Bug,特别是如果你没在提示词里说清楚限制条件的话。
比如在上面的例子里,如果原来的代码故意要把错误分开记日志,而 AI 给合并了,那就是个 Bug。
作为人类,你的职责是审查,你可以问: “在重构之前,请先为原函数写 3 个单元测试。确保重构后的代码能通过同样的测试。”
这是保证重构不改崩业务逻辑的最强保险。
3. 分步重构如果函数很大,或者你想改的地方很多,别试图一次搞定。
比如,先让 AI “重构以提高可读性”(改名、拆函数),确认没问题了,下一轮再让它“优化那个算法”。这样既不会把模型指令压爆,也方便你一步步检查每次改动。
4.边重构边学习再次强调,利用 AI 的解释功能。
如果它用了一个你没见过的骚操作(比如用 reduce构建 Map),好好看看它的解释。这能把你的一次提问变成一堂迷你技术课,帮你掌握最佳实践。
--
到目前为止,我们已经搞定了调试(修旧代码)和重构(改旧代码)。
接下来,顺理成章的一步就是:让 AI 帮我们写新功能,生成新代码。我们来看看怎么写这类提示词才最有效。
在进入新功能实战前,为了方便你随时复习,特意整理了一份《Vibe Coding 提示词入门速查表》。建议收藏保存,写 Prompt 卡壳时随时翻看:
长按下方图片保存高清版

最近文章列表:
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]