大模型编码避坑指南

举报
Uncle_Tom 发表于 2026/05/06 11:53:34 2026/05/06
【摘要】 大模型编程过程中常见的问题:1. 错误假设、隐藏困惑、缺少权衡;2.过度复杂、臃肿抽象;3. 无关编辑、触碰不应碰的代码; 4. 未验证就说已经完成了。通过四个原则: 1. 编码前思考;2. 简单至上;3. 精准的手术式修改;4. 目标驱动执行,我们可以避免这些问题。

大模型编码避坑指南

1. 用大模型开发代码过程中经常遇到的问题

来自 Andrej 的推文

“模型会代你做错误假设,然后不假思索地执行。它们不管理自身的困惑,不寻求澄清,不呈现矛盾,不展示权衡,在应该提出异议时也不反驳。”

“它们真的很喜欢把代码和 API 搞复杂,堆砌抽象概念,不清理死代码……明明 100 行能搞定的事情,非要实现成 1000 行的臃肿架构。”

“它们有时仍会改动或删除自己理解不足的代码和注释,即使这些内容与任务本身无关。”


2. 解决的四个原则

四个原则,集中在一个文件中,直接解决这些问题:

原则 解决什么问题
编码前思考 错误假设、隐藏困惑、缺少权衡
简洁优先 过度复杂、臃肿抽象
精准修改 无关编辑、触碰不应碰的代码
目标驱动执行 通过测试优先、可验证的成功标准

2.1. 编码前思考

不要假设。不要隐藏困惑。呈现权衡。

LLM 经常默默选择一种解释然后执行。这个原则强制明确推理:

  • 明确说明假设 — 如果不确定,询问而不是猜测
  • 呈现多种解释 — 当存在歧义时,不要默默选择
  • 适时提出异议 — 如果存在更简单的方法,说出来
  • 困惑时停下来 — 指出不清楚的地方并要求澄清

2.2. 简洁优先

用最少的代码解决问题。不要过度推测。

对抗过度工程的倾向:

  • 不要添加要求之外的功能
  • 不要为一次性代码创建抽象
  • 不要添加未要求的"灵活性"或"可配置性"
  • 不要为不可能发生的场景做错误处理
  • 如果 200 行代码可以写成 50 行,重写它

检验标准: 资深工程师会觉得这过于复杂吗?如果是,简化。

2.3. 精准修改

只碰必须碰的。只清理自己造成的混乱。

编辑现有代码时:

  • 不要"改进"相邻的代码、注释或格式
  • 不要重构没坏的东西
  • 匹配现有风格,即使你更倾向于不同的写法
  • 如果注意到无关的死代码,提一下 —— 不要删除它

当你的改动产生孤儿代码时:

  • 删除因你的改动而变得无用的导入/变量/函数
  • 不要删除预先存在的死代码,除非被要求

检验标准: 每一行修改都应该能直接追溯到用户的请求。

2.4. 目标驱动执行

定义成功标准。循环验证直到达成。

将指令式任务转化为可验证的目标:

不要这样做… 转化为…
“添加验证” “为无效输入编写测试,然后让它们通过”
“修复 bug” “编写重现 bug 的测试,然后让它通过”
“重构 X” “确保重构前后测试都能通过”

对于多步骤任务,说明一个简短的计划:

1. [步骤] → 验证: [检查]
2. [步骤] → 验证: [检查]
3. [步骤] → 验证: [检查]

强有力的成功标准让 LLM 能够独立循环执行。弱标准(“让它工作”)需要不断澄清。


3. 完整的模板

这是一套行为准则,旨在减少大型语言模型(LLM)在编程时常犯的错误。可根据需要与项目特定的说明合并使用。

权衡提示: 这些准则倾向于谨慎优先于速度。对于琐碎的任务,请自行运用判断力。

先思考,再动手写代码

不要想当然。不要掩饰困惑。主动提出权衡点。

在开始实现之前:

  • 明确说出你的假设。 如果不确定,就直接问。
  • 如果存在多种理解方式,把它们都列出来——不要默默地只选一种。
  • 如果有更简单的做法,请指出来。必要时可以提出反对意见。
  • 如果有不清楚的地方,立刻停下来。指出哪里让你困惑,然后提问。

简单至上

用最少的代码解决问题。绝不写任何投机性的代码。

  • 绝不添加超出需求范围的功能。
  • 对于只使用一次的代码,不要做抽象
  • 不要添加未被要求的“灵活性”或“可配置性”。
  • 不要为不可能发生的场景写错误处理代码。
  • 如果你写了200行代码,但其实50行就能搞定,那就重写它

问问自己:“资深工程师会觉得这写得太复杂了吗?”如果是,那就简化它。

精准的手术式修改

只动必须动的地方。只收拾自己留下的烂摊子。

在编辑现有代码时:

  • 不要“优化”周围的代码、注释或格式。
  • 不要重构那些本来没坏的东西。
  • 遵循现有的代码风格,即使你个人有别的写法偏好。
  • 如果你发现了无关的死代码(不再使用的代码),可以提一句,但不要删除它

当你的修改导致某些代码变成“孤儿”时:

  • 移除由你的修改导致不再被使用的导入、变量或函数。
  • 除非被明确要求,否则不要移除原本就存在的死代码。

检验标准: 每一行变更的代码,都应该能直接追溯到用户的需求。

以目标为导向的执行

定义成功的标准。循环验证,直到达标。

将任务转化为可验证的目标:

  • “添加验证” → “先写针对无效输入的测试,再让测试通过”
  • “修复Bug” → “先写一个能复现该Bug的测试,再让测试通过”
  • “重构X” → “确保重构前后的测试都能通过”

对于多步骤的任务,先列出一个简短的计划:

1. [步骤] → 验证方式:[检查项]
2. [步骤] → 验证方式:[检查项]
3. [步骤] → 验证方式:[检查项]

明确的成功标准能让你独立地推进工作。模糊的标准(比如“让它能跑就行”)则需要不断地去澄清。


如果这些准则奏效,你应该会看到: 代码差异(diffs)中不必要的变更变少了,因过度复杂而导致的重写变少了,澄清问题的提问发生在了实现之前,而不是犯错之后。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。