跳到主要内容

Claude Code为什么可以独立完成工程任务

不少小伙伴第一次接触 Claude Code,会把它理解成“放在终端里的聊天机器人”。这个说法只能解释它为什么能回答问题,解释不了它为什么能自己搜索代码、修改文件、跑测试,遇到报错以后还会继续排查。

我更愿意从一次工程任务看它。假设我们给出下面这个需求:

订单取消后,已经预占的优惠券没有释放。请先定位调用链,补一个能复现问题的测试,再修复并运行相关测试。不要改数据库表结构。

完成这件事需要连续处理几类信息:

  • 理解目标和“不要改表结构”这条边界;
  • 找到订单取消、优惠券预占、事务处理相关代码;
  • 判断问题发生在状态流转、事件投递还是消费逻辑;
  • 修改测试与实现;
  • 运行测试,并根据失败结果继续修正;
  • 汇报改了什么、验证了什么、还剩什么风险。

LLM 负责语言理解和推理,Claude Code 外面的执行系统负责把推理变成一轮轮可观察的动作。面试里把这两层分开,后面的工具调用、上下文管理、Hooks、多 Agent 就容易讲明白了。

Claude Code工程执行系统总览图

一次任务是怎样跑起来的​

Claude Code 收到需求后,通常会反复执行四个动作:读取当前状态、选择下一步、调用工具、吸收结果。这个循环一直持续到任务完成、需要用户决策,或者碰到无法继续的阻塞。

可以把它写成一个简单状态机:

接收目标
↓
读取规则与工作区状态
↓
选择下一步动作
↓
调用工具并取得结果
↓
更新判断、计划和上下文
↓
完成了吗?── 否 ──→ 继续下一轮
│
是
↓
给出结果与验证证据

这里的“选择下一步”由模型完成,“读取文件”“执行测试”“修改代码”由工具完成,工具结果再回到下一轮模型输入。Claude Code 因此具备了闭环能力。它不需要用户把每个命令逐条写出来,但每一步仍然受工具权限和当前环境约束。

第一步,先把问题缩小​

面对陌生仓库,直接读取全部文件既慢又浪费上下文。更常见的方式是先用目录、文件名和符号做筛选,再打开关键片段。

订单取消问题可能沿着下面这条线索推进:

  1. 搜索取消订单的入口方法和状态枚举;
  2. 找到取消成功后发布的领域事件或消息;
  3. 搜索优惠券释放方法的调用方;
  4. 对照正常退款、超时关闭等相似流程;
  5. 阅读相关测试,确定项目已有的测试写法。

文件路径、类名、导入关系和测试名称本身就是线索。先收窄范围,再读正文,能让窗口里留下更多与当前判断有关的内容。

第二步,把判断变成工具调用​

模型不能直接碰磁盘,也不能在脑子里执行 Maven。它只能选择已经注册的工具,并生成工具需要的参数。

例如,它可能决定搜索 releaseReservedCoupon 的调用位置。Agent运行时校验工具名和参数后执行搜索,再把结果返回。模型看到命中的文件与行号,下一轮才决定读哪几个文件。

如果工具参数不合法、命令失败或权限被拒绝,失败结果也会回到循环里。一个成熟的 Coding Agent 需要把错误当作新的环境信息:命令不存在就查项目实际脚本,测试失败就读失败栈,权限被拒绝就换成安全做法或请求用户确认。

第三步,在真实工作区修改​

代码修改发生在文件系统中,模型输出的说明并不能代表文件已经改变。Claude Code 需要调用 Edit、Write 一类工具,执行层再把改动落到工作区。

这也解释了为什么验收时应该看 git diff、测试结果和运行行为。模型说“已经修复”只是一段文本;文件变更和验证证据才是工程结果。

ClaudeCode工具调用记录

Model与Harness分别负责什么​

面试官如果追问“Claude Code 强在模型还是框架”,我会先说两边都重要,再给出清楚的职责表。

组件主要工作出问题时常见表现
模型理解意图、阅读代码、形成假设、选择工具、组织结果推理方向错、遗漏分支、误解业务语义
System Prompt定义角色、默认行为、工具使用说明行为边界含糊、工具选择不稳定
Agent运行时组织循环、注册工具、传递结果、维护会话状态工具结果丢失、状态接不上、流程提前结束
文件与Shell工具读取、搜索、修改、执行命令参数错误、路径错误、命令返回失败
权限与Sandbox限制可读、可写、可执行范围高风险动作被拦截,或授权过宽造成风险
Hooks在固定生命周期节点执行审计、阻断与收尾matcher 过宽、脚本超时、错误返回码失效
MCP连接 GitHub、监控、数据库等外部系统服务未连接、Schema 太多、凭据或网络问题
项目规则与Skills提供长期约定和按需工作流规则冲突、内容过长、Skill 触发不准

模型像一个会分析问题的开发者,Agent运行时提供工作台、工具箱、执行规程和任务记录。模型升级可以提高推理上限,执行系统的设计会影响它能否在真实仓库中稳定完成长任务。

Claude Code能看到哪些环境信息​

每轮推理都依赖当前上下文。常见信息来源包括:

  • Claude Code 自己的系统指令和工具说明;
  • 当前目录及其上层加载到的 CLAUDE.md;
  • 命中路径条件后加载的 .claude/rules/;
  • 用户本轮需求和前面的对话;
  • 已经返回的文件内容、搜索结果、命令输出;
  • 使用中的 Skill 正文;
  • Auto Memory 的索引内容;
  • MCP、IDE 或客户端注入的环境状态。

信息继续增加也会带来成本。几万行测试日志会挤占目标、约束和关键代码的位置;几十个很少使用的 MCP 工具也会增加选择难度。后面讨论上下文管理时,我会具体讲怎样控制这些信息的进入、保留和淘汰。

权限系统为何必须独立存在​

自然语言规则能指导模型,例如“不要修改迁移文件”。模型依然可能误判,长会话里也可能漏掉早期提醒。必须强制执行的边界要落到权限、Sandbox、Hook、CI 或人工审批上。

以数据库迁移为例,可以分三层:

  1. CLAUDE.md 解释团队约定:已有迁移文件禁止修改,新变更必须新增版本;
  2. permissions.deny 或 PreToolUse Hook 拦截对历史迁移文件的 Edit/Write;
  3. CI 检查迁移文件哈希,防止任何工具或开发者绕过本地规则。

三层承担的职责不同。第一层让模型知道应该怎么做,第二层在本机阻止危险动作,第三层守住团队合并入口。

从提示到强制约束的风险分层图

MCP、Skills、Hooks和Subagent放在执行链的哪里​

这几个概念经常被放在一起问,我会按“它给系统增加了什么”来区分。

机制增加的东西典型场景
MCP外部工具与数据入口查询 Sentry、读取设计稿、访问 GitHub、调用内部平台
Skill一套按需加载的做事方法接口兼容性检查、故障排查、发版清单
Hook某个生命周期节点必定执行的动作修改后校验、调用前拦截、等待权限时通知
Subagent一个隔离的支线工作窗口大量搜索、日志归因、独立审查
Agent Teams多个可通信的独立会话前后端与测试并行推进、多个假设相互验证

一个需求可以同时用到它们。主 Agent 调用 Sentry MCP 拉取错误,交给 Subagent 分析一批日志,加载故障排查 Skill 统一输出格式,并由 Hook 拦截任何生产写操作。它们在一条执行链上配合,职责并不冲突。

工程闭环怎样判断完成​

Claude Code 生成了代码,还需要证明任务已经完成。我一般让验收至少覆盖四层。

文件层​

检查实际 diff:修改范围是否符合需求,有没有顺手改到无关文件,是否出现生成产物或敏感信息。

结构层​

运行编译、静态检查和格式化。它们能发现语法、类型、依赖与风格问题。

行为层​

运行能够复现问题的测试。优惠券案例里,至少要证明订单取消后预占记录被释放,同时正常支付、重复取消等原有路径没有被破坏。

运行层​

涉及页面、进程、外部服务或异步消息时,还要看真实运行结果。测试全绿只能证明测试覆盖到的行为正确,无法替代页面截图、接口响应、消费日志或观测指标。

面试回答可以这样组织

Claude Code 可以完成工程任务,靠的是模型和 Agent运行时的配合。模型负责理解目标、阅读代码、形成判断和选择工具;运行时负责加载规则、执行文件与 Shell 工具、传递结果、维护上下文和权限。每次工具返回都会进入下一轮判断,形成“观察、行动、再观察”的循环。最终结果要由 diff、测试和运行证据验收,不能只看模型的文字结论。

参考资料​

🎁优惠