1. 被误解的“基本功”:为什么 Prompt 不是终点
这两年跟不少同行聊 AI 编程,发现一个挺普遍的现象:很多人把“会写 Prompt”当成了核心竞争力,甚至觉得只要提示词写得够花哨,AI 就能自动把活干完。我一开始也这么想过,直到踩了几次坑才明白,Prompt 顶多算个遥控器,真正决定你能不能把 AI 编程用出生产力的,是遥控器背后那套工程底子。
先说说我自己的经历。去年接手一个数据处理的小工具,需求不复杂:从几个格式不统一的表格里抽字段、做清洗、再输出成结构化结果。我一开始图省事,直接丢给 AI 一段描述,让它“帮我写个脚本处理这些数据”。结果它给出来的代码跑是能跑,但字段映射全靠硬编码,表头稍微变一下就直接崩。我改了三轮 Prompt,加了一堆“请考虑表头变化”“请做异常处理”的约束,代码确实变好了一点,但每次改需求都得重新调一遍提示词,效率低得离谱。
后来我换了个思路:不再指望 AI 一次性理解我的模糊意图,而是先把问题拆清楚——输入是什么、输出是什么、中间有哪些边界情况、哪些地方必须人工兜底。把这些想明白之后,我写的 Prompt 反而变短了,但生成的代码质量高了一大截。这件事让我意识到,AI 编程的真正门槛不在提示词技巧,而在你有没有能力把问题定义清楚、把方案拆解到位、把结果验证明白。
这篇文章想聊的就是这个:抛开那些“万能提示词模板”,一个真正能把 AI 编程用起来的人,到底需要哪些基本功。我会从问题拆解、上下文管理、代码审查、调试排查这几个角度展开,结合我自己和身边同行的实操经验,把每个环节的关键点和避坑技巧讲透。不管你是刚接触 AI 编程的新手,还是已经用了一段时间但总觉得“差点意思”的老手,应该都能从中找到一些可复用的思路。
2. 基本功之一:把模糊需求拆成可执行单元
2.1 为什么“说清楚”比“说漂亮”重要
很多人写 Prompt 的时候,习惯堆砌形容词:“请写一个高效的、健壮的、可扩展的……”但 AI 不是人,它没法从这些抽象词汇里推断出你真正的约束条件。你说“高效”,它可能理解成时间复杂度低,也可能理解成代码行数少;你说“健壮”,它可能加一堆 try-catch,也可能做参数校验。模糊的形容词越多,AI 自由发挥的空间越大,结果偏离预期的概率也越高。
我后来总结了一个原则:能用具体例子说清楚的,就不要用形容词。比如你要处理一个用户上传的 CSV 文件,与其说“请做健壮的错误处理”,不如直接告诉 AI:“如果文件为空,返回空列表;如果某行列数不匹配,跳过该行并记录日志;如果编码不是 UTF-8,尝试用 GBK 解码。”这样 AI 不需要猜,生成的代码也更贴近你的实际需求。
这个思路其实跟传统软件工程里的“需求拆解”是一回事。只不过以前你是跟同事沟通,现在你是跟 AI 沟通。沟通对象变了,但“把话说清楚”这个基本功没变。
2.2 拆解需求的三个层次
我习惯把需求拆成三个层次:输入层、处理层、输出层。每一层都要明确“是什么”“可能出什么错”“怎么兜底”。
输入层要回答的问题包括:数据从哪来?格式是什么?有没有可能为空?有没有编码问题?字段类型是否固定?举个例子,如果你要让 AI 写一个读取配置文件的函数,你得先想清楚:配置文件是 JSON 还是 YAML?路径是硬编码还是传参?文件不存在时是报错还是返回默认值?这些细节你不说,AI 就会按它的默认习惯来,而它的默认习惯大概率跟你的项目规范不一致。
处理层是核心逻辑所在。这里的关键是把大逻辑拆成小步骤,每一步都单独描述。比如“从文本里提取日期”这个需求,可以拆成:先识别可能的日期格式(YYYY-MM-DD、YYYY/MM/DD、MM-DD-YYYY 等),再逐个尝试解析,最后统一转换成标准格式。你拆得越细,AI 生成代码的准确率越高,后续调试也越容易定位问题。
输出层容易被忽略,但其实很重要。你要明确输出是打印到控制台、写入文件、还是返回给调用方?输出格式是 JSON、CSV 还是纯文本?有没有排序要求?有没有去重需求?这些细节看起来琐碎,但如果不提前说清楚,后面返工的成本远高于一开始多写两句话。
2.3 一个拆解实例:从“帮我写个爬虫”到可执行方案
假设你要让 AI 帮你写一个抓取网页表格数据的脚本。直接说“帮我写个爬虫”基本等于没说,AI 会给一个通用模板,但大概率跑不通你的目标页面。
我通常会这样拆:
- 目标页面特征:表格在 HTML 里的位置(比如第几个 table 标签)、是否有分页、是否需要登录。
- 请求方式:静态页面直接请求,动态页面需要分析接口。这里要提醒 AI 优先考虑请求接口而不是模拟浏览器,因为前者更轻量。
- 数据字段:每一列对应什么含义、是否需要类型转换(比如把“1,234”转成整数 1234)。
- 异常处理:网络超时怎么办、页面结构变化怎么办、数据为空怎么办。
- 输出格式:存 CSV 还是 JSON、字段顺序、编码格式。
把这些写清楚之后,AI 生成的代码基本可以直接用,最多改改选择器。反过来,如果你只给一句“帮我写个爬虫”,那就得做好反复调试的准备。
实操心得:拆解需求的时候,我习惯先自己在纸上画一遍流程图,把每个节点的输入输出标清楚。这个过程看起来慢,但能帮你发现很多“以为自己想清楚了其实没有”的漏洞。画完之后再写 Prompt,通常一次就能生成可用的代码。
3. 基本功之二:上下文管理决定生成质量
3.1 为什么 AI 会“忘记”你说过的话
用 AI 编程时间长了,你会发现一个现象:对话轮次一多,AI 就开始“忘事”。前面说好的命名规范,后面生成的代码又变回默认风格;前面确认过的数据结构,后面又改了回去。这不是 AI 故意跟你作对,而是它的上下文窗口有限,加上每一轮对话都是基于前面的内容重新推理,信息衰减是必然的。
我踩过最惨的一次坑,是让 AI 帮我重构一个模块。一开始说好了“保持现有函数签名不变”,前几轮它确实遵守了,但改到第五六个函数的时候,它开始自作主张改参数名。我当时没仔细看,直接合并了代码,结果调用方全报错,排查了半天才发现是签名变了。
从那以后,我养成了一个习惯:关键约束要反复强调,重要上下文要主动维护。具体做法包括:
- 每轮对话开始时,用一两句话重申核心约束,比如“继续之前的重构,记住所有公开函数签名不能变”。
- 把已经确认的数据结构、接口定义单独整理成一段“上下文摘要”,每次新开对话时先贴进去。
- 对于特别重要的约束,直接在 Prompt 里用“必须”“禁止”这样的强约束词,而不是“最好”“尽量”。
3.2 上下文摘要的写法
上下文摘要不需要很长,但要把关键信息浓缩进去。我通常包含这几块:
- 项目背景:一句话说明这个模块是干什么的。
- 技术栈:语言、框架、依赖库的版本。
- 数据结构:核心的类、接口、字段定义。
- 命名规范:变量、函数、文件的命名风格。
- 已确认的决策:比如“错误处理统一用自定义异常”“日志用标准库的 logging 模块”。
举个例子,如果你在做一个数据处理管道,上下文摘要可以这样写:
项目背景:从多个数据源抽取数据,清洗后写入目标库。 技术栈:Python 3.10,pandas 2.0,SQLAlchemy 2.0。 数据结构:原始数据为 DataFrame,字段包括 id(int)、name(str)、ts(datetime)。 命名规范:函数用 snake_case,类用 PascalCase,常量全大写。 已确认决策:空值统一用 None 表示,不用 NaN;时间统一转成 UTC。这段摘要不到一百字,但能让 AI 快速进入状态,减少大量来回确认的成本。
3.3 长对话的断舍离策略
很多人舍不得关掉一个已经聊了很久的对话,觉得“前面有上下文,关了可惜”。但实际上,当对话轮次超过一定数量后,继续在同一个对话里工作反而效率更低。因为 AI 需要处理的上下文越来越长,推理质量会下降,而且你自己翻前面的内容也费劲。
我的做法是:一个任务一个对话,任务完成就关掉。如果任务特别大,就拆成几个子任务,每个子任务单独开对话,用上下文摘要来衔接。这样每个对话都保持“短而聚焦”,AI 的生成质量更稳定,你自己也更容易管理。
注意事项:新开对话时,不要只贴上下文摘要就完事,最好再附上一段“当前要做什么”的说明。比如“基于以上上下文,现在请帮我实现一个函数,从 DataFrame 中过滤出 ts 在指定范围内的行”。这样 AI 既有背景信息,又有明确目标,生成结果更靠谱。
4. 基本功之三:代码审查能力比写代码能力更重要
4.1 AI 生成的代码为什么不能直接信
AI 生成的代码有一个特点:看起来很像那么回事,但细节处经常埋雷。它可能用了你不熟悉的库、可能忽略了边界条件、可能引入了不必要的依赖、可能在性能上做了错误假设。如果你不具备代码审查能力,直接复制粘贴,短期可能省事,长期一定出问题。
我见过最典型的例子,是 AI 生成的“去重”逻辑。它用了一个集合来记录已出现的元素,看起来没问题。但如果元素是字典或列表这种不可哈希的类型,代码直接报错。AI 不会主动告诉你这个限制,因为它默认你传入的是可哈希类型。这种坑,只有你自己审查的时候才能发现。
4.2 审查清单:我每次都会看的几个点
经过多次踩坑,我整理了一份 AI 代码审查清单,每次生成代码后都会过一遍:
| 审查项 | 关注点 | 常见问题 |
|---|---|---|
| 边界条件 | 空输入、极值、类型异常 | 未处理 None、未检查列表长度 |
| 错误处理 | 异常捕获范围、日志记录 | 捕获过宽、吞掉异常、无日志 |
| 性能 | 循环嵌套、重复计算、内存占用 | 在循环里查数据库、大列表全量加载 |
| 依赖 | 是否引入新库、版本兼容性 | 用了未声明的库、版本不匹配 |
| 命名与风格 | 是否符合项目规范 | 命名随意、风格不一致 |
| 安全性 | 输入校验、敏感信息处理 | 拼接 SQL、明文密码 |
这份清单不需要每次都逐项打勾,但心里要有数。尤其是边界条件和错误处理,这两块是 AI 最容易偷懒的地方。
4.3 如何让 AI 自己审查代码
除了人工审查,你也可以让 AI 自己审查。但要注意,不能让 AI 用同一套思路审查自己刚写的代码,那样它大概率会说“没问题”。更好的做法是换一个角度提问,比如:
- “这段代码在输入为空列表时会怎样?”
- “如果数据库连接失败,这段代码会抛出什么异常?”
- “这个循环在最坏情况下会执行多少次?”
这种“针对性提问”能逼着 AI 从不同角度重新审视代码,往往能发现一些它自己之前忽略的问题。
实操心得:我习惯在让 AI 生成代码后,紧接着追问一句“这段代码有哪些潜在问题?”然后根据它的回答再决定要不要修改。有时候它会自己指出一些我没想到的隐患,相当于多了一层保险。
5. 基本功之四:调试与排查的硬功夫
5.1 当 AI 代码跑不通时怎么办
AI 生成的代码跑不通,太正常了。这时候很多人第一反应是继续问 AI:“为什么报错?”然后 AI 给一个修改建议,再跑,再报错,来回好几轮。这种“对话式调试”效率很低,因为 AI 看不到你的实际运行环境,只能根据你描述的错误信息猜测。
更高效的做法是:先自己定位问题,再带着具体信息去问 AI。比如报错信息是“KeyError: 'name'”,你先自己检查一下数据里到底有没有 'name' 这个键,是数据源变了还是代码写错了。定位到具体行之后,再问 AI“这行代码在数据缺少 name 字段时会报 KeyError,怎么改更稳妥?”这样 AI 给的建议会精准得多。
5.2 常见问题速查表
我整理了一份 AI 编程中常见的问题和排查思路,供参考:
| 问题现象 | 可能原因 | 排查方向 |
|---|---|---|
| 代码跑不通,报语法错误 | AI 用了不兼容的语法 | 检查语言版本、库版本 |
| 结果不符合预期 | 需求描述有歧义 | 重新审视 Prompt,补充具体例子 |
| 性能很差 | 算法复杂度高 | 检查循环嵌套、数据库查询 |
| 偶尔报错,难以复现 | 边界条件未处理 | 检查空值、类型异常、并发场景 |
| 依赖安装失败 | 版本冲突 | 检查依赖库版本兼容性 |
这张表不是万能的,但能帮你快速缩小排查范围。遇到问题先对照一下,往往能省不少时间。
5.3 建立自己的“踩坑记录”
我有个习惯,每次遇到 AI 编程相关的坑,都会记一笔:问题现象、原因、解决方法。时间长了,这份记录就成了我自己的“避坑指南”。比如:
- AI 生成的日期解析代码默认用当前时区,跨时区场景要显式指定 UTC。
- AI 生成的 SQL 查询经常忘记加索引提示,大数据量下性能堪忧。
- AI 生成的递归函数有时没有终止条件,需要手动补上。
这些经验看起来零散,但积累多了,你对 AI 代码的“直觉”会越来越准,审查和调试的效率也会越来越高。
6. 从“会用 AI”到“用好 AI”的进阶路径
6.1 把 AI 当成结对伙伴,而不是代码生成器
很多人用 AI 编程的方式是“我描述,它生成,我复制”,这其实浪费了 AI 很大一部分价值。更好的方式是把 AI 当成结对编程的伙伴:你负责定义问题和审查结果,它负责提供思路和初稿。你们之间有来有回,而不是单向输出。
比如你在设计一个模块的接口时,可以先让 AI 给几个方案,然后你逐个分析优缺点,再让它根据你选定的方案细化。这个过程本身就能帮你理清思路,有时候 AI 提出的角度是你自己没想到的。
6.2 持续积累领域知识
AI 能帮你写代码,但不能替你理解业务。如果你对某个领域的知识不够扎实,AI 生成的代码你也没能力判断对错。所以用好 AI 编程的前提,是你自己在某个领域有足够的积累。AI 是放大器,不是替代品。
我自己的做法是,在让 AI 生成代码之前,先花点时间把相关领域的核心概念过一遍。比如要做数据可视化,先搞清楚 matplotlib 和 seaborn 的区别、什么场景用什么图、常见的坑有哪些。这些知识不需要你手写代码,但能让你在审查 AI 代码时更有判断力。
6.3 保持对新工具的敏感度
AI 编程这个领域变化很快,新的模型、新的工具、新的实践方式层出不穷。保持敏感度,但不要盲目追新。我的原则是:新工具先小范围试用,确认能解决实际问题再引入工作流。不要因为某个工具“很火”就强行用,适合自己的才是最好的。
最后分享一个小技巧:我习惯每周花半小时回顾一下这周用 AI 编程时遇到的问题和解决方法,把值得记录的整理成笔记。这个习惯坚持了半年多,现在遇到类似问题时,翻翻笔记就能找到思路,省了很多重复踩坑的时间。
这个内容后续还可以这样扩展:针对特定领域(比如数据分析、Web 开发、自动化脚本)整理更细化的 AI 编程实践指南,或者把上下文管理、代码审查这些环节做成可复用的模板,方便直接套用。