前一阵我给自己定了个小目标:逼自己连续两周,把所有能交给AI的琐碎编码任务,全部用AI写代码来完成。这两周下来,网上一堆“AI马上要取代程序员”的说法,我基本确定是吓唬人的;但另一句话我认,“AI能让普通开发者的日常效率翻倍”,是真的。这篇就是这个系列的第一篇记录,不聊虚的,从选型、提示词、调试到改代码,完整走一遍AI辅助编程的真实流程,把我踩过的坑全摊开说。适合正在犹豫要不要把AI纳入工作流的开发、测试和运维朋友,也适合想入门的同学先看看这条路到底长什么样。
1. 内容整体设计与思路拆解
1.1 为什么突然想试“AI 写代码”
作为一个常年和业务系统打交道的开发者,我手头真正让我头疼的,往往不是那种需要啃三个月的核心架构,而是一堆“食之无味、弃之可惜”的琐碎脚本:写个临时数据清洗、做一个批量文件重命名、给测试环境造一批假数据、把一段老的Python逻辑翻译成Java。
这些事情有个共同特点:不复杂,但很磨人。以前我都是自己动手,一写就是半小时起步,中间还要反复查文档。后来看身边同事开始用AI生成代码,我也动了心思。我的想法很简单:不指望AI帮我想清楚业务架构,只要它能把这些一次性脚本的活接下来,把常规DTO、工具类、正则、SQL映射这些“体力活”搞定,就已经值回票价了。
所以这个系列的第一篇,我刻意选了一个非常小的真实任务来试水。任务越小,越能看清楚AI的稳定性和边界在哪,也方便记录从需求到落地的完整链路。
1.2 选型:通用大模型还是垂直编程工具
开始尝试前,我先给自己列了个选型清单。市面上可选的方案大致分成两类:一类是通用大模型,比如Claude、GPT系列,通过网页或API对话来获取代码;另一类是编辑器里的AI编程插件,比如GitHub Copilot、通义灵码、CodeGeeX、Fitten Code这类,直接在IDE里做补全和对话。
我的第一反应是“小孩子才做选择,我全都要”。但实际用了几天后发现,两类工具解决的是完全不同的问题,得按场景分配。
| 类型 | 典型工具 | 优势 | 短板 |
|---|---|---|---|
| 通用大模型 | Claude、GPT系列 | 上下文理解强,能处理长对话和复杂需求拆解 | 要手动复制粘贴代码,离编辑器远 |
| 编辑器补全 | GitHub Copilot | 和写码节奏无缝衔接,注释转代码体验好 | 大段生成容易放飞自我 |
| 编辑器对话 | 通义灵码、Fitten Code、Cursor | 能直接选中代码片段提问,边写边改 | 方案完整性弱于通用大模型 |
| 终端Agent | Codex、Claude Code类 | 能自己跑命令、改文件,接近“AI替你干活” | 翻车时定位成本高 |
如果你刚开始接触AI写代码,我的建议是先别急着买付费工具。通用大模型免费额度足够跑完第一个任务,编辑器插件也有一批免费可选的,先用最便宜的方案把流程跑通了,再考虑付费工具是否值得。
1.3 谁适合用“AI 写代码”,谁暂时别碰
两周试下来,我对适合场景有比较清晰的判断。先说适合的:写一次性脚本、做原型验证、跨语言翻译、生成单元测试、解释老代码逻辑、写正则和SQL这类“模式化”产物。这些任务边界清晰、验收标准明确,AI生成的代码即使有小问题,也容易通过测试暴露出来。
不适合的也要说清楚:涉及复杂业务约束的系统核心模块,比如订单状态机、资金计算、权限控制;安全敏感代码,比如鉴权逻辑、加密解密;以及那些需要大量隐性上下文才能动手的模块,AI看不到你们的内部设计文档,硬让它写,它只能编一个看起来很合理但实际不合规的版本。
我踩过一个很典型的坑:让AI生成一段访问内部服务接口的代码,它给我写了一个自以为很标准的OAuth2流程,结果我们内部用的其实是签名机制,两边完全对不上。所以我的原则是:AI可以用来写骨架,但涉及内部规范的部分,人工必须牢牢把关。
1.4 “AI 写代码”的三个老大难,先打预防针
两周前我对AI写代码的印象停留在“它挺能写”。两周后,我对它的评价变成了“它能写,但有三件事你必须提前心里有数”。
第一件事,AI生成的代码经常是“看起来对,跑起来错”。这个错还不是语法错,而是逻辑边界错:数组越界、空指针、时区问题、编码问题,全是跑起来才暴露的。第二件事,AI非常自信地给你一个完全错误的方向,尤其在你描述不清楚的时候,它会顺着你话里的漏洞编一个自洽但错误的方案。第三件事,上下文一长它就会“失忆”,你让它改完A再改B,它很可能把A给忘了。
这三个问题不是AI厂商能靠更新模型解决的,而是AI写代码本身的结构性问题。所以我的应对方式很固定:小步验证、代码审查、问题不断抛回给它。后面每个部分都会围绕这三件事展开。
2. 核心细节解析与实操要点
2.1 AI 写代码的能力边界,到底在哪里
想用好AI写代码,第一步不是学提示词,而是搞清楚它到底擅长什么。我的体感是,AI本质上是一个“见过无数代码模式的超级检索器”,它对常见场景的“套路”非常熟练,但对“你这家公司的特殊约定”一无所知。
比如生成一段从Excel里读取数据并生成SQL插入语句的脚本,这种事网上有海量资料,AI能写得非常像样。但如果让它写一段对接你们内部统一登录、带特定埋点、带降级开关的接口代码,它大概率会写得四不像。
这就像你请了一个见过很多世面的外包工程师,但它从来没进过你们公司。它能帮你把通用部分做得又快又好,但公司内部特定的部分,你得自己做或者仔细教它。所以我后续的所有实操,都是把任务拆分之后,只把“通用套路”部分丢给AI,内部定制部分自己动手改编。
2.2 提示词才是真正的“生产力”
网上很多人说“AI写代码不行”,我看了下他们的提问方式,普遍是把需求说得非常模糊:“给我写个爬虫”“做个管理系统”。这种问法,AI只能给你一个泛泛的模板,离可用差得远。问题的关键不在AI,而在提示词。
我后来把提示词固化成了一个模板,核心就四块:角色定义、任务描述、约束条件、输出格式。拿我第一周做的一个文件分类脚本举例,我的提示词是这样的:
你是一名Python开发工程师。请编写一个Python脚本,功能是把指定目录下的文件按扩展名分类移动到对应的子文件夹中。 要求: 1. 只处理普通文件,不处理子目录 2. 目标子文件夹不存在时自动创建,命名格式为“{扩展名}_files” 3. 如果目标位置已有同名文件,自动在文件名后加 _1、_2 编号,不能覆盖 4. 每移动一个文件都打印一条日志 5. 支持命令行参数传入目录路径,不传则默认当前目录 6. 编码使用UTF-8,兼容Windows和Linux 请输出完整可直接运行的代码,不要给解释。你会发现,这个提示词里几乎没有废话,全是AI做决策需要的信息。特别是“不能覆盖”、“兼容Windows和Linux”这种边界约束,你不说,AI百分之百不会主动想到。
还有一个技巧值得单独说:如果需求复杂,不要期望一个提示词搞定。你先让AI生成主体框架,然后针对框架里你不满意的地方,一条一条追加修改要求。比如第一次生成完我发现它没处理目录本身权限不足的情况,我就追加一句“分类移动时请捕获权限异常并给出清晰报错”,它很快就能补上。
2.3 “AI 生成 ≠ 可用”:代码审查时间不能省
这两周我最大的进步,是养成了一种“AI代码审查强迫症”。AI写出来的代码,我永远不会直接复制到项目里就跑,一定会花一两分钟通读一遍,重点看几个地方。
第一是边界条件。稍微有点经验的AI会处理空列表、空目录,但很多AI想不到“目标文件已存在”这种现实冲突,或者“文件名包含特殊字符”的情况。第二是异常处理,AI默认写出的代码往往是没有try/except的,一旦遇到权限问题、网络超时,整个程序就会崩。第三是资源释放,尤其是涉及文件读写、数据库连接、网络请求的操作,AI偶尔会漏掉close或with上下文管理。
我把这个审查流程总结成了一张自查清单,贴在终端旁边:入参校验做了吗、异常分支处理了吗、资源释放了吗、有没有硬编码绝对路径、会不会误删文件、类型转换有没有隐患。每一条都对着过一遍。如果你觉得自己不会审查,最简单的办法是让AI自己审查,把代码发给它问“这段代码有哪些潜在问题”,它一般能找出七八成问题,剩下的还是靠经验。
2.4 小步快跑,别让 AI 一口气建系统
我一开始犯过一个典型的错误:让AI一次性生成一个带数据库、带接口、带前端页面的完整小系统。结果AI输出了一大坨代码,我自己看都看不完,更别说验证哪个部分有问题。项目毫无悬念地卡住了三个小时,最后我全部删掉重来。
后来我总结出一条铁律:每次只让AI完成一个可运行、可验证的小步骤。比如做一个小系统,我会拆成“先生成数据库表结构”“再写数据访问层”“再写一个查询接口”“最后写一个简单页面”。每个步骤之间我亲手把它跑通,再让AI做下一步。
这个策略和模块化开发很像,但更严格。因为AI的生成是基于概率的,步骤越少、目标越明确,它猜中你心思的概率越高。一旦中间隔了好几层上下文,它就会开始自由发挥。小步快跑还有一个好处:出错时你能迅速定位是哪一步的提示词写得不好,修正成本极低。与其花半小时懊恼AI为什么不听话,不如花十秒钟把任务拆小再喂一次。
3. 实操过程与核心环节实现
3.1 第一个完整任务:批量整理文件夹脚本
前面说了半天思路,这里进入完整实操。我的第一个任务是写一个Python脚本,把下载文件夹里乱七八糟的文件按扩展名分类到对应子文件夹。为什么选这个任务?因为它边界清晰、涉及文件操作和异常处理、还能直观看到AI写的代码在真实环境下跑得怎么样。
需求我先在文档里定清楚,再翻译成提示词。注意我在需求定义阶段就做了取舍:“只做文件分类移动,不做重复文件清理,不做内容识别”。别让AI去猜你没写清楚的需求,宁可自己先拆好,也不要让它自由发挥。
然后我把这段需求连同格式要求一起发给AI,得到了一版完整代码。下面是我简化后的产物,它基本做到了“能跑”,但离“好用”还有距离。
import os import shutil import sys from collections import defaultdict def classify_files(directory='.'): if not os.path.isdir(directory): print(f"目录不存在: {directory}") return ext_map = defaultdict(list) for entry in os.listdir(directory): full_path = os.path.join(directory, entry) if os.path.isfile(full_path): ext = os.path.splitext(entry)[1].lower().lstrip('.') or 'noext' ext_map[ext].append((entry, full_path)) for ext, files in ext_map.items(): target_dir = os.path.join(directory, ext + '_files') os.makedirs(target_dir, exist_ok=True) for name, full_path in files: dest = os.path.join(target_dir, name) if os.path.exists(dest): base, extname = os.path.splitext(name) counter = 1 while os.path.exists(os.path.join(target_dir, f"{base}_{counter}{extname}")): counter += 1 dest = os.path.join(target_dir, f"{base}_{counter}{extname}") shutil.move(full_path, dest) print(f"已移动: {name} -> {os.path.basename(dest)}") if __name__ == '__main__': target = sys.argv[1] if len(sys.argv) > 1 else '.' classify_files(target)平心而论,第一版生成到这个程度,我是满意的。它用了defaultdict做分组,用os.makedirs的exist_ok避免重复创建,还处理了同名冲突的问题。这些都是网上常见写法,AI抓得很准。
3.2 踩坑与调试:和 AI 来回拉扯的过程
代码生成只是开始,后面才是真正见功夫的地方。我把它保存成organize_files.py,在测试目录里扔了一堆假文件跑了一遍,第一次运行就暴露了三个问题。
第一个问题是日志信息有误导性。它打印的是已移动: 文件名 -> 文件名,但目标路径只显示文件名不带子目录,我看日志根本不知道文件被移到了哪里。这不算严重,但确实影响使用体感。第二个问题是编码问题。在Windows的cmd窗口下,中文日志直接报UnicodeEncodeError,程序跑到一半就崩了。这其实不是AI的代码逻辑错,而是运行环境编码不匹配,但它没做任何兼容处理。第三个问题是权限异常完全没考虑,如果某个文件被占用或没有权限,程序直接抛异常退出,后面的文件也没处理完。
发现问题后,我并没有自己动手改,而是把报错信息原样贴回给AI,又加了一句要求:
脚本在Windows下运行时中文日志报UnicodeEncodeError,请修复编码兼容问题。另外请给每个文件的移动操作加上异常捕获,单个文件失败不能影响其他文件继续处理。日志请改成:已移动: 原文件名 -> 目标子目录/新文件名。AI很快返回了修订版本。它在文件头加了sys.stdout.reconfigure(encoding='utf-8'),用try/except包裹了shutil.move,还完善了日志里的目标路径。这里我想提醒一句:你给AI反馈错误时,一定要把完整报错信息、运行环境、期望行为三点写清楚,缺一个它就可能瞎猜。这也是AI写代码场景里最实用的提示词技巧。
3.3 我的改造:脚本从“能跑”到“好用”
AI的修订版跑通了,但我作为一个经常收拾烂摊子的开发者,觉得这个脚本还差最后几步才算“好用”。这一步我选择自己动手,因为下面这些东西属于个人使用习惯,AI猜不到也不应该瞎猜。
我加了三个功能。第一个是--dry-run参数,执行时只打印将要做什么,不真正移动文件。这很重要,任何涉及批量移动、删除的操作,我都建议先有个演练模式,防止手滑。第二个是日志同时输出到控制台和文件,方便排查“前天跑的脚本到底把文件弄哪儿去了”。第三个是移动完成后统计每个分类的文件数量,让我心里有数。
改造后的主体逻辑没变,但可靠性和可用性提升了一个档次。这恰好也是我想表达的观点:AI写代码是帮你把80%的重复工作做掉,剩下20%的个性化打磨,恰恰是体现工程师经验的地方,也是你不可替代的地方。
3.4 实际耗时就记一笔
这个任务如果我自己从头写,大概需要30分钟到40分钟,其中一半时间花在回忆os模块和shutil的API细节上。用AI辅助之后,整个流程耗时的分布是这样的:写需求定义和提示词花了大约8分钟,等AI生成、审查、修改花了15分钟,我自己做个性化改造花了10分钟。总计约35分钟。
注意,总时间其实没有显著缩短。但区别在于:以前是我一个人花40分钟纯写代码,现在是AI负责输出主体,我负责审查和决策。这种工作方式的转变,在简单任务上体现得不够明显,一旦任务变成“生成100个DTO”“把200行老代码翻译成另一种语言”,AI带来的效率红利就会非常夸张。这也是我坚持用AI的原因:它不是省掉你的时间,而是让你把时间花在更有价值的事情上。
前面这段实操走完,我对AI写代码的第一印象已经从“玩具”变成了“趁手工具”。但紧接着,我就遇到了一堆奇奇怪怪的问题,有的来自AI,有的来自编辑器环境。接下来把这两周遇到的高频问题集中整理一下。
4. 常见问题与排查技巧实录
4.1 “VSCode 写 C 没有代码提示”是怎么回事
我知道很多人搜热词时都遇到过一个场景:装了AI插件,但在VSCode里写C/C++代码,发现代码提示没了。这个问题的锅,一半在编辑器配置,一半在环境依赖,还真不能全赖AI。
C/C++的语言代码提示依赖C/C++扩展和编译器的配合。你如果单纯装了AI补全插件,它只能做“续写”,没法做“基于编译器上下文的智能提示”。排查思路按下面顺序来:先确认装了微软官方的C/C++扩展;再看项目里有没有tasks.json和c_cpp_properties.json,没有就找插件自动生成;然后检查编译器路径配没配好,Windows下常见的是Mingw没进PATH。把这些配置理清之后,再用AI插件补全,两边就不会打架了。
这里有一个很容易踩的坑:AI补全插件默认可能会和VSCode自带的tab补全快捷键冲突。我实际遇到的情况是,按Tab想接受AI补全,结果触发的是编辑器的默认代码片段,比如自动补了</。解决方法是到快捷键设置里把“接受AI建议”的快捷键改一下,或者把编辑器的tab-completion关掉,两者留一个。
4.2 AI 修不好自己的 bug,怎么把错误信息喂给它
用AI写代码,最让人血压升高的场景,是你把报错信息贴给AI,它改了一次还是错,再改一次更离谱,第三次直接给你一个风格完全不同的新方案。遇到这种情况,我现在的处理方式很固定:停止无脑追问,把“错误现场”整理成一小段结构化的问题描述。
高效的问题描述包含四部分:第一,我想干什么,背景一句话说清楚;第二,我做了什么操作,最好是可复现的最小步骤;第三,完整报错信息原样贴出,不要自己概括“报错了”,你概括得越狠,AI错得越远;第四,我期望的结果和实际结果的差异。照这个模板写,AI的修复成功率至少提高一半。
如果这样改了三次还不行,我的建议是直接换个对话重新生成。AI在同一个对话里反复修同一个问题,容易陷入“钻进死胡同”的状态,它会为了迎合你上一条要求,把前面本来对的东西改坏。新开对话,把原需求加“已尝试的修复方式”重新描述一遍,往往能跳出循环。
4.3 上下文窗口太小,大型项目怎么用 AI
很多朋友会抱怨“AI写代码只能写玩具,我们这种大项目它根本看不懂”。这个说法一半对。AI确实看不到你的完整工程,它每次只能接触你丢给它的那一段提示词。但这不意味着大型项目不能用AI,关键是把“项目级信息”塞进提示词里,或者用“接口先行”的策略。
我的做法是:让AI产出某个模块的代码前,先手工把相关的接口定义、数据结构、关键枚举压缩成一个“上下文小抄”贴在提示词最前面。AI不需要知道你们整个系统的来龙去脉,它只需要知道你这次让它写的函数,要接收什么、输出什么、依赖哪些类型。把这些信息喂给它,它生成的代码就能和你项目里的现有代码衔接上。
还有一个小技巧:先用对话模型做设计,再用编辑器插件做实现。我通常会在ChatGPT或Claude这类对话模型里,把模块的整体设计、文件拆分、接口签名先讨论清楚,然后把接口签名复制到编辑器里,让补全插件挨个函数实现。这样既解决了上下文问题,又让两代工具各用所长。
4.4 AI 代码里的隐性安全问题
这两周我特别留了一个心眼:所有AI生成的代码,过安全这一关。不是说不信任AI,而是因为它见到的训练数据太杂,经常不自觉地用一些“看起来简单但很危险”的写法。
最常见的几个问题在这里集中说一下。第一个是执行系统命令时用了shell=True,比如用os.system拼接字符串,如果中间夹了用户输入,这就是命令注入点。第二个是处理文件路径时直接拼接字符串,导致路径穿越,比如用户传入../../就能把文件移到别的目录。第三个是反序列化或动态执行,AI有时会为了“动态”用eval()或pickle处理不可信数据,这在真实业务里是绝对不能出现的。
我给自己定的审查红线就三条:用户输入不能直接拼进系统命令;文件路径操作必须用os.path.join并校验真实路径;凡是AI代码里出现eval、exec、pickle,一律标红重写。这三条算是最低要求,再往上要根据具体业务场景做安全评审。
4.5 问题速查表
把这两周遇到的高频问题整理成一个速查表,方便大家遇到类似情况直接定位。
| 现象 | 大概率原因 | 解决动作 |
|---|---|---|
| AI生成的代码能跑但结果不对 | 需求没写清边界约束 | 补充输入输出示例,让AI按例子对齐 |
| 同一对话反复修不好 | AI陷入局部死循环 | 新开对话,重新描述需求 |
| 编辑器代码提示失效 | 语言服务和AI补全冲突 | 检查扩展配置,调整快捷键 |
| 中文日志输出乱码或报错 | 控制台编码不匹配 | 重配stdout编码,或设置环境变量 |
| AI用危险写法 | 训练数据影响 | 人工审查,按红线规则重写 |
| 生成代码和项目风格不搭 | 缺少风格约束 | 在提示词里加“参照XX文件风格” |
| 上下文一长就失忆 | 窗口限制 | 把关键信息压缩成上下文小抄 |
这张表里的每一条,我都真实踩过。尤其是“同一个对话反复修不好”和“上下文失忆”,几乎是每个用AI写代码超过三天的人都会遇到的。提前有心理准备,能少吃很多亏。
5. 工具生态与工作流组合
5.1 通用对话模型和编辑器插件,分工完全不同
前面操作和排查都聊完了,再来横向说下工具生态。很多新手问“到底哪个AI写代码最强”,我现在的观点可能有点泼冷水:不存在最强,只存在和你的工作流匹不匹配。通用对话模型和编辑器插件是两种物种,千万别搞混。
通用对话模型适合做“离线思考”,你给它完整上下文,它给你一大段设计方案或完整文件。它的优点是上下文窗口大、理解能力好,能陪你推演需求。编辑器插件适合做“在线辅助”,你在写函数时它给你补下一行,你选中报错代码它给你解释。它的优点是快、顺手,但视野很浅,只盯着当前文件看。
把这两者配合起来的典型姿势是:先用通用对话模型把一个模块想清楚,拿到可执行的整体方案,然后回到编辑器里用插件一行行把方案落地。这就像你先和资历深的同事过一遍设计,再回工位写代码,效率自然高。滥用编辑器插件去问“帮我设计整个系统”,得到的结果大概率是灾难。
5.2 我实测过的几类方案,一句话总结
这两周我前后试了五六种工具,这里不报参数不跑分,只给个人感受。GitHub Copilot的补全体验还是最顺滑的,但付费且对国内网络的依赖是个门槛;Claude在长上下文和方案设计上很稳,是我用来做整体设计的主力;通义灵码这类国产插件胜在免费、上手快,在IDE里用中文对话很自然;Fitten Code在某些场景下补全速度很快,作为轻量备选不错;Codex这类付费编程工具我短测过一两次,功能很强,但对使用者的工程素养要求也高,新手容易在花哨能力里迷失。
需要特别说明的是,我这些评价都是基于我自己的工作场景和网络环境,仅供参考。工具迭代非常快,两个月的口碑就可能反转,选型的关键不是追新,而是固定一套自己熟悉的工作流。工具是流动的,方法论才是沉淀下来的资产。
5.3 当前我的工作流组合
经过两周折腾,我目前固定下来的工作流是“三件套”:开新任务先打开对话模型,把需求和边界聊清楚,拿到方案;然后在编辑器里用补全插件把方案里的函数一个个实现;实现完后,把关键文件整段喂回对话模型,让AI做一次代码评审,重点挑边界问题和安全问题。
这三步里我最重视的是最后一步——AI评审。散步时我在想,人写代码会眼瞎,AI写代码也会眼瞎,但让两个“瞎”的互相看对方,反而能找到更多盲点。哪怕AI的评审意见只有一半靠谱,也相当于免费多了个结对工程师。这套组合不依赖任何单一付费工具,如果中途哪个环节不好用了,我可以随时替换。
5.4 关于“AI Agent 替你写代码”的一点实测体会
最后聊一下“AI Agent”。现在很多文章都在讲AI能自己开终端、自己改代码、自己跑测试,听起来像是你只需要在旁边喝咖啡。我这个系列一开始也专门试了这个方向。
实际体验是:在非常封闭的沙箱环境里,给一个非常明确的任务,比如“让这个函数通过全部单测”,Agent确实能完成,但过程远没有宣传的那么丝滑。它经常会在两三个似是而非的方案之间来回横跳,反复修改、反复跑失败,吞掉大量时间。有一次我让它自己修复一个测试失败,它在十分钟内换了三种解决思路,最后一种还把本来通过的两个测试弄挂了。
我的判断是,这类Agent可以当“实习生”用:在你的全程监督下,帮你做批量操作和试错推导,但别把它当成“无人驾驶”。至少现阶段,把Agent的能力作为辅助手段嵌入现有流程,比完全放手要靠谱得多。等Agent成熟了,这个系列再回头更新对应的实践案例也不迟。
每次实践往里走一步,都会有新的细节冒出来。这次的经历告诉我:用好AI写代码,关键不在“让它写得更多”,而在“让它更懂你要什么,以及你更懂它能给什么”。把这个基础工作做扎实,AI才会从玩具变成真正的生产力。