代码重构卡在八百行函数,换了提示词优化思路后12个模块一次生成 代码重构卡在八百行函数,换了提示词优化思路后12个模块一次生成上周五下午,产品经理丢过来一个紧急需求:要在两天内给一个遗留服务加新功能。我打开代码仓,一眼就看到了那个传说中的“上帝函数”--整整837行,中间混杂着业务校验、三次API调用、本地缓存逻辑、异常重试,甚至还有几段手写的JSON解析。动一行就可能触发全局雪崩,更别说加功能了。我当时第一反应是祭出CodeWhisperer,想让它帮我完成函数拆分。可第一次尝试就把我打懵了:AI生成的建议乱七八糟,函数间调用关系错乱,甚至凭空造出了不存在的参数。直到我停下来系统地啃了一遍提示词优化这门课,才搞明白问题根源--不是CodeWhisperer不够强,而是我给的提示词一塌糊涂。那门提示词优化课程教给我的三招,后来让我花了不到一个上午就把800多行拆成了12个职责清晰的模块,回归测试全部一次通过。为什么那837行代码非拆不可这是一个负责用户权益发放的后台服务核心函数,伪代码大概长这样:def grant_benefit(user_id, benefit_code, contextNone): # 参数校验 30行 # 用户状态查询 80行 # 权益规则匹配 120行 # 库存扣减逻辑 100行 # 外部风控API调用 150行 # 缓存更新与失效 90行 # 数据库写回与事务 120行 # 通知推送 80行 # 异常捕获与补偿 60行 # 最后再塞几个零散的日志和指标 return result每次Code Review都有人提重构,但最终都因为“没时间、风险大”搁置了。这次新需求正好要改权益规则匹配那一段,我实在不敢在同一个大函数里再添乱,于是决定借机彻底拆掉这个定时炸弹。第一次翻车:我给CodeWhisperer的提示词把一切搞砸了我打开VS Code,光标放在函数中间,随手写了一句提示:# 请帮我重构这个函数,拆分成多个独立的小函数,让代码更清晰。CodeWhisperer立刻生成了十几个函数骨架。我粗略一看,好像挺像那么回事,就直接采纳了。结果一运行,全盘崩溃:一个本该负责参数校验的函数,内部竟然又调用了一次外部API。缓存更新的逻辑被分散到三个不同的函数里,根本追踪不到副作用。最离谱的是,AI把错误补偿逻辑单独抽出来,但函数签名漏了关键的事务上下文对象,运行时直接抛AttributeError。我花了一个小时回滚代码,心里把工具骂了几十遍。不过冷静下来后,我意识到问题不在CodeWhisperer本身,而是我在提示词里完全没有说明模块的职责边界、输入输出约束以及调用依赖关系。想用好它,靠的不是随便一句自然语言,需要的是专业的提示词优化技巧。系统学习提示词优化:课程里交出的三招问题摆在眼前,我当晚就去翻了一门专门讲提示词优化的在线课。这门提示词优化课程并不厚,但它把一个关键理念讲得很透:想要AI生成可维护的生产级代码,提示词必须同时包含「结构约束」「行为示例」和「禁止项」。第一招是结构化输出指令。以前我只会说“拆成小函数”,现在我会明确要求:“请为以下函数生成一组基于单一职责原则的模块,每个模块以独立函数形式出现,包含完整的类型提示和docstring,函数间通过显式参数传递数据,不得依赖闭包或全局变量。”这种硬性约束让CodeWhisperer生成的代码一下子收敛了很多。第二招是提供最小示例。提示词优化课里的一个案例让我印象深刻:直接把期望的输入输出样例贴在提示中,能极大降低AI的猜测空间。于是我在提示里加了一个简单的mock函数示例,展示我想要的命名规范和错误处理风格,CodeWhisperer随后生成的12个函数命名几乎不用改动。第三招是分步拆解。课程建议不要一次性让AI拆分整个大函数,而是将任务分解为几个阶段:先生成模块清单和依赖树,再逐个生成函数体。这样每一步的推理负载都降低了,生成的准确率直接上了一个台阶。我按照这个策略,先用提示词让CodeWhisperer分析函数依赖关系,确定了12个模块的拆分边界,再分别生成代码。那门提示词优化课程学完只花了两个晚上,但给我的重构效率带来的提升至少是60%。渐进式重构:12个模块如何一个个落地按照学到的提示词优化方法,我没有再一锅端。第一步,我在提示词里要求CodeWhisperer只分析函数内部的作用域和数据流,输出建议的模块拆分方案。它给出一份清单,把原有功能划分为参数校验、用户状态查询、规则匹配、库存操作、风控调用、缓存更新、事务提交、通知推送、异常补偿等12个模块,并标出调用顺序。我确认这个方案后,第二步开始逐个模块生成。以库存扣减模块为例,我给CodeWhisperer的提示词是这样的:# 任务:实现inventory_deduct(benefit_code, quantity, tenant_id)函数 # 输入参数:benefit_code: str, quantity: int, tenant_id: str # 返回值:DeductResult(name成功/失败, messagestr, new_stockint) # 行为:调用内部inventory_api.deduct(),处理库存不足异常,返回结果 # 禁止:直接操作数据库或缓存,不得抛出未封装异常 # 示例结构参照上面的validate_params函数这条提示词一给出去,CodeWhisperer生成的函数体几乎可以直接用,只改了两行日志。同样的模式一路用到所有模块,一个上午就完成了全部拆分,并且12个模块的单元测试也通过同样的提示词框架生成了。那会儿我才真正体会到,提示词优化并不只是一种软技能,而是一套可以被复用的工程化方法。提示词过犹不及:一次失败的高度抽象教训在拆分「规则匹配」模块时,我有点得意忘形。为了追求极致的灵活性,我在提示词里要求CodeWhisperer生成一个“基于策略模式的可扩展规则引擎”。结果AI生成了一个三层抽象、带有注册机制的函数集合,虽然设计上看起来很漂亮,但团队成员根本看不懂,而且一次简单的规则修改需要在三个文件里跳转。这个坑让我从反面加深了对提示词优化边界的理解:不能为了炫技而过度抽象。后来我调整了提示词,加上“保持代码平铺直叙,不使用设计模式,每个规则用独立的if分支处理”,CodeWhisperer立马生成了可读性极高的版本。结合机器学习入门课程中关于特征选择和模型可解释性的原则,我更坚定了“简单优于精巧”的重构哲学。回归测试:用CodeWhisperer生成12个模块的测试用例重构完成后,必须保证行为没有变化。但我原来的测试覆盖率不到30%,大部分还是手工写的。这次我决定继续发挥提示词优化的经验,让CodeWhisperer帮我生成基础测试框架。对每个模块,我构造这样的提示词:# 为inventory_deduct函数生成pytest测试用例 # 要求覆盖:正常扣减、库存不足、网络超时、边界值quantity0 # 使用mock替换inventory_api.deduct() # 每个测试函数命名以test_开头,包含Given-When-Then注释Amazon CodeWhisperer对测试生成的支持非常到位,它会自动推导mock对象和断言逻辑。我逐个模块运行生成的测试,发现三个边界遗漏,修正后再跑全部通过。整个过程我只写了大约20%的测试逻辑,其余都由AI补全。重构前后的数据对比重构结束后,我做了个简单的指标统计:指标重构前重构后变化核心函数行数83712个模块合计约720行函数体本身缩减,但模块总数略增圈复杂度(平均)629下降85%单模块最大行数837112职责更聚焦添加新权益类型耗时4.5小时1小时下降78%单元测试覆盖行数30%87%新增功能不再恐惧回归这些数字摆在团队面前时,之前对AI辅助重构持怀疑态度的同事也开始主动问我提示词优化的技巧。我直接推荐了那门提示词优化课程,因为里面教的远不止是写几句prompt,而是建立了一套「让AI产出可维护代码」的思维框架。给同样处境的人:提示词优化推动重构的6条军规先拆分依赖,再生成代码--用提示词优化让AI先输出模块依赖树,人工确认后再生成函数体,避免生成死代码。示例远比描述管用--在提示词中贴一个精简版函数示例,能让CodeWhisperer的输出质量提升不止一个档次。明确禁止项--只告诉AI要干什么不够,在提示词优化课里学到一定要写清楚“不要用全局变量”“不要引入额外抽象”,这样生成代码才安全。每次只做一件事--对Amazon CodeWhisperer给出的提示词任务越单一,结果越可靠。大函数拆分必须分阶段推进。测试生成同步进行--重构一个模块,马上用CodeWhisperer生成对应的pytest用例,把回归风险降到最低。不要过度抽象--提示词优化不等于无限抽象,保持代码平铺直叙,团队成员才能接手维护。这些建议几乎都脱胎于那一门提示词优化课程和几次实战的反复磨合。如果你也在面对那种无人敢改的历史遗留代码,不妨先用一个下午试试CodeWhisperer加上结构化提示词,很可能发现重构这件事比想象中安全得多。而如果你想知道如何写出那种让AI一次就给出正确模块的提示词,提示词优化绝对是值得你尽快补上的一课。