<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>编程方法论 on Kalend's Blog</title><link>https://blog.kalend.top/tags/%E7%BC%96%E7%A8%8B%E6%96%B9%E6%B3%95%E8%AE%BA/</link><description>Recent content in 编程方法论 on Kalend's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Fri, 10 Jul 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.kalend.top/tags/%E7%BC%96%E7%A8%8B%E6%96%B9%E6%B3%95%E8%AE%BA/index.xml" rel="self" type="application/rss+xml"/><item><title>AI编程不是一句话搞定：任务拆解的粒度艺术</title><link>https://blog.kalend.top/2026/07/10/2026-07-10-task-decomposition-granularity.html/</link><pubDate>Fri, 10 Jul 2026 10:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/07/10/2026-07-10-task-decomposition-granularity.html/</guid><description>&lt;p&gt;我见过太多人（包括我自己）踩同一个坑：把一个大需求直接丢给 AI，期待它一口气交付完整功能。&lt;/p&gt;
&lt;p&gt;结果呢？前半段看起来不错，后半段开始离谱。你 accept 了前 200 行代码，到第 300 行发现逻辑对不上，回头一看——第一步的数据结构就埋了雷，后面全是连锁反应。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论先说：AI 编程的核心技能不是 prompt 写得多好，而是任务拆得多细。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一为什么一句话搞定是最大的陷阱"&gt;一、为什么&amp;quot;一句话搞定&amp;quot;是最大的陷阱
&lt;/h2&gt;&lt;p&gt;先说一个反直觉的事实：上下文窗口越大，你越容易高估 AI 的能力。&lt;/p&gt;
&lt;p&gt;2026 年主流模型的上下文窗口已经到了 200K tokens，理论上能装下一个中型项目的全部代码。但问题是——&lt;strong&gt;能装下不等于能理解&lt;/strong&gt;。模型在处理长上下文时，注意力会稀释。你丢进去 10 个文件让它同时改，它可能只精确处理了前 3 个，后面 7 个在&amp;quot;凭印象&amp;quot;写代码。&lt;/p&gt;
&lt;p&gt;这引出一个核心概念：&lt;strong&gt;幻觉半径&lt;/strong&gt;。任务越复杂，模型的&amp;quot;合理猜测&amp;quot;范围越大，犯错概率指数级增长。一个小功能的幻觉半径可能只有 2-3 行代码，一个完整模块的幻觉半径能覆盖整个文件。&lt;/p&gt;
&lt;p&gt;更致命的是&lt;strong&gt;错误累积效应&lt;/strong&gt;。第一步的数据类型选错，第五步的 API 就对不上，第十步的 UI 就要推倒重来。这不是 AI 笨——你让一个聪明人同时处理 10 个相互依赖的任务，他也会犯错。&lt;/p&gt;
&lt;p&gt;类比一下：你不会让实习生第一天就独立交付整个支付模块。你会先让他改个按钮颜色，再写个工具函数，逐步加码。AI 编程也一样——&lt;strong&gt;不是因为它不聪明，而是因为复杂任务的本质就需要分步验证。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二任务拆解的三层粒度模型"&gt;二、任务拆解的三层粒度模型
&lt;/h2&gt;&lt;p&gt;拆解不是随便切，有一个实用的分层框架：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;层级&lt;/th&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;时间粒度&lt;/th&gt;
					&lt;th&gt;例子&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;L1&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;功能级&lt;/td&gt;
					&lt;td&gt;10-30 分钟&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;实现用户登录&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;L2&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;步骤级&lt;/td&gt;
					&lt;td&gt;5-15 分钟&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;创建登录表单组件&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;L3&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;指令级&lt;/td&gt;
					&lt;td&gt;1-5 分钟&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;在 LoginForm.tsx 中添加邮箱验证&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;最佳实践：从 L1 开始规划，用 L3 实际执行。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;什么意思？你在脑子里或文档里先拆出 L1 功能清单——&amp;ldquo;登录&amp;quot;是一个 L1，&amp;ldquo;评论系统&amp;quot;是一个 L1。然后每个 L1 拆成 3-5 个 L2 步骤。真正交给 AI 执行的是 L3：一个具体的、明确的、可以在几分钟内验证的小指令。&lt;/p&gt;
&lt;p&gt;为什么要这样？因为每个 L3 指令都是一个&lt;strong&gt;可验证的检查点&lt;/strong&gt;。做完了，跑一下，看看对不对。对了继续，错了立刻修。这比一口气做完 10 个功能再回头 debug 效率高一个数量级。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三五种拆解策略"&gt;三、五种拆解策略
&lt;/h2&gt;&lt;p&gt;拆解有章法可循，不是凭感觉切。以下是五种我反复验证过的策略：&lt;/p&gt;
&lt;h3 id="按文件拆"&gt;按文件拆
&lt;/h3&gt;&lt;p&gt;每个文件一次修改。不要让 AI 同时动 10 个文件——它会顾此失彼，改了 A 忘了 B 的 import 路径。&lt;/p&gt;
&lt;p&gt;实操技巧：先问 AI &amp;ldquo;这个功能涉及哪些文件？&amp;quot;，然后一个一个来。&lt;/p&gt;
&lt;h3 id="按层次拆"&gt;按层次拆
&lt;/h3&gt;&lt;p&gt;先数据层 → 再逻辑层 → 最后 UI 层。这是经典的分层架构思路，但很多人在 AI 编程时忘了它。&lt;/p&gt;
&lt;p&gt;为什么要分层？因为数据模型是地基。你先让 AI 写 UI，回头发现数据结构不对，UI 就得全改。反过来，数据模型定好了，API 和 UI 怎么改都不伤根基。&lt;/p&gt;
&lt;h3 id="按依赖拆"&gt;按依赖拆
&lt;/h3&gt;&lt;p&gt;画一下依赖图，先实现被依赖的模块。工具函数比业务逻辑先写，公共组件比页面组件先写。&lt;/p&gt;
&lt;p&gt;一个简单判断法：如果模块 A 的测试需要模块 B 的存在，那 B 就该先做。&lt;/p&gt;
&lt;h3 id="按风险拆"&gt;按风险拆
&lt;/h3&gt;&lt;p&gt;高风险部分（支付、认证、数据迁移）单独审查，低风险部分（样式、文案、配置）可以批量处理。&lt;/p&gt;
&lt;p&gt;这不是歧视低风险代码，而是&lt;strong&gt;把有限的审查精力集中在最可能出问题的地方&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="按测试拆"&gt;按测试拆
&lt;/h3&gt;&lt;p&gt;每个拆分点都是一个可测试的里程碑。如果一个子任务你写不出测试用例，说明它太大了，需要继续拆。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;好拆分：实现用户注册 API → 可以写测试验证返回 201 和正确的 user 对象
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;坏拆分：实现整个用户系统 → 测试用例写不出来，因为不知道从哪验证起
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="四审查机制设计"&gt;四、审查机制设计
&lt;/h2&gt;&lt;p&gt;拆解是骨架，审查是免疫系统。没有审查的拆解，只是把一个大错误切成了十个小错误。&lt;/p&gt;
&lt;h3 id="checkpoint-审查"&gt;Checkpoint 审查
&lt;/h3&gt;&lt;p&gt;每完成一个子任务，停下来 review。不需要逐行看代码，重点检查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;接口是否符合预期（输入输出类型对不对）&lt;/li&gt;
&lt;li&gt;边界情况有没有处理&lt;/li&gt;
&lt;li&gt;和上一步的衔接是否顺畅&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="自动验证"&gt;自动验证
&lt;/h3&gt;&lt;p&gt;让 AI 自己跑测试、lint、类型检查。这是最高效的审查方式——不需要人肉看，机器告诉你对不对。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Prompt 示例：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;写完这个函数后，自己跑一下 pytest，确保所有测试通过。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;如果有 lint 警告，也一并修复。&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="回滚机制"&gt;回滚机制
&lt;/h3&gt;&lt;p&gt;git commit 要频繁。每完成一个 L3 指令就 commit 一次。这样出错时能精确回退到上一个正确的状态，而不是 &lt;code&gt;git stash&lt;/code&gt; 整个进度。&lt;/p&gt;
&lt;h3 id="渐进信任"&gt;渐进信任
&lt;/h3&gt;&lt;p&gt;这是核心原则：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;阶段&lt;/th&gt;
					&lt;th&gt;信任级别&lt;/th&gt;
					&lt;th&gt;操作方式&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;小任务（L3）&lt;/td&gt;
					&lt;td&gt;Agent 自主&lt;/td&gt;
					&lt;td&gt;不审查，看结果&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;中任务（L2）&lt;/td&gt;
					&lt;td&gt;轻度审查&lt;/td&gt;
					&lt;td&gt;自动验证 + 快速扫一眼&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;大任务（L1）&lt;/td&gt;
					&lt;td&gt;人工审查&lt;/td&gt;
					&lt;td&gt;逐个 checkpoint 检查&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;关键任务&lt;/td&gt;
					&lt;td&gt;人工参与&lt;/td&gt;
					&lt;td&gt;每步确认再继续&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;信任是挣来的，不是给的。先让 AI 在小任务上证明自己，再逐步放权。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五实战案例一个真实功能的拆解过程"&gt;五、实战案例——一个真实功能的拆解过程
&lt;/h2&gt;&lt;p&gt;需求：&amp;ldquo;给博客系统加一个评论功能。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;这句话看起来简单，实际涉及至少 6 个独立模块。如果一把丢给 AI，大概率翻车。拆开看：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L1 拆解（6 个功能）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;① 数据模型 → ② API 端点 → ③ 前端组件 → ④ 前后端连接 → ⑤ 样式交互 → ⑥ 测试
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;L2/L3 拆解（以&amp;quot;数据模型&amp;quot;为例）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;L2-1: 定义 Comment schema（字段、类型、约束）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;L2-2: 创建数据库迁移文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;L2-3: 写基础 CRUD 方法
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;L3-1: 在 schema 中添加 content: text, author: string, post_id: integer, created_at: timestamp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;L3-2: 运行 migration，验证表创建成功
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;L3-3: 实现 create 方法，写一个测试验证能插入数据
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键点：每一步都是独立的、可验证的、可回滚的。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L3-1 做完，跑类型检查，确认 schema 没语法错误&lt;/li&gt;
&lt;li&gt;L3-2 做完，查数据库，确认表结构正确&lt;/li&gt;
&lt;li&gt;L3-3 做完，跑测试，确认 CRUD 正常&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;任何一步出错，只回退那一步，不影响其他部分。这就是拆解的价值——&lt;strong&gt;把不可逆的大失败变成可逆的小失败。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六不同工具的拆解差异"&gt;六、不同工具的拆解差异
&lt;/h2&gt;&lt;p&gt;不同工具对拆解粒度的要求不同：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;工具&lt;/th&gt;
					&lt;th&gt;适合粒度&lt;/th&gt;
					&lt;th&gt;原因&lt;/th&gt;
					&lt;th&gt;注意事项&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;L2-L3&lt;/td&gt;
					&lt;td&gt;Agent 模式可自动执行多步，但文件级操作仍需控制&lt;/td&gt;
					&lt;td&gt;单次改动不超过 3 个文件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;L1-L2&lt;/td&gt;
					&lt;td&gt;长上下文能力强，可以一次处理更大范围&lt;/td&gt;
					&lt;td&gt;但仍需 checkpoint，不能盲目信任&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;OpenCode/Codex CLI&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;L2-L3&lt;/td&gt;
					&lt;td&gt;沙箱隔离，适合高风险操作的独立审查&lt;/td&gt;
					&lt;td&gt;适合&amp;quot;先在沙箱里试，确认后再合并&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;通用原则：工具越强，粒度可以越粗，但不能不拆。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;即使是最强的模型，面对&amp;quot;帮我重写整个认证系统&amp;quot;这种指令，也大概率会遗漏边界情况。能力上限不等于可靠性上限。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="七常见反模式"&gt;七、常见反模式
&lt;/h2&gt;&lt;p&gt;最后列四个我见过最多的反模式，每个都是血泪教训：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;一口气全做完&amp;rdquo;&lt;/strong&gt;——丢一个大需求，期望一次交付。这是最常见也最致命的。你以为省了时间，实际在后面付出了 3 倍的 debug 时间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;过度拆解&amp;rdquo;&lt;/strong&gt;——拆到每行代码一个指令。走到另一个极端，效率为零。L3 是底线，再细就该自己写了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;只拆不审&amp;rdquo;&lt;/strong&gt;——拆了 10 个步骤，一口气全执行完，中间不检查。拆解的意义在于验证，不检查等于没拆。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;盲目信任&amp;rdquo;&lt;/strong&gt;——AI 说&amp;quot;测试全通过&amp;quot;就信了。实际上它可能只跑了它自己写的测试，而那些测试恰好跳过了真正的 bug。&lt;strong&gt;验证要独立于被验证的对象。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="写在最后"&gt;写在最后
&lt;/h2&gt;&lt;p&gt;AI 编程的真正门槛不是 prompt engineering，是&lt;strong&gt;工程思维&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;能用 AI 写代码的人越来越多，但能把 AI 编程用好的人——任务拆得清、审查做得实、质量守得住——依然是少数。&lt;/p&gt;
&lt;p&gt;任务拆解听起来像管理话题，和技术无关。但做过大型项目的人都知道：&lt;strong&gt;最难的从来不是写代码，是决定先写什么、后写什么、什么不写。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI 改变的是编码速度，没有改变软件工程的基本规律。小步快跑、持续验证、快速回滚——这些原则在 AI 时代比任何时候都重要。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;varkm&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>