1. Agentic Coding 画了一张自己会写代码的饼,客户端团队得先看清三件事
1.1 从自动补全到多步自主执行:能力边界的一次位移
最近团队里聊 AI 编程,问得最多的一个问题是:Agentic Coding 到底和 Copilot 有什么区别?我一般用一句话回答:Copilot 在你按下 Tab 的那一刻就结束了,Agent 在你按下回车之后才刚刚开始工作。
这两者背后的技术逻辑完全不同。传统 AI 编程助手做的是“单轮续写”——给定上下文窗口里的代码,预测下一个 token,本质上是个增强版的自动补全。它没有目标,没有计划,也不对你写出来的东西负责。Agentic Coding 则是把大语言模型放进一个“感知—规划—行动—观测”的循环里:系统先给 Agent 一个任务,Agent 自己拆解步骤,调用工具读文件、改代码、跑测试、执行命令,再根据工具返回的结果决定下一步做什么,直到满足预设的验收条件才停下来。
这套循环通常由一个 agent runtime 承载,市面上常见的 Claude Code、Codex CLI、以及各种开源编码 Agent 框架,底层都是这个思路。客户端团队在评估的时候,不用急着纠结具体选哪一家,先把这套循环的三个关键部件拆清楚:上下文收集器、工具执行器、校验器。上下文收集器决定 Agent 能看到什么,工具执行器决定它能改什么,校验器决定它怎么知道自己改对了。很多团队把精力全放在“让模型写更多代码”上,其实真正需要下功夫的是后两个。
1.2 客户端工程不是“通用后端任务的换皮”
我在内部推动 Agentic Coding 落地时,最大的阻力不是模型能力不够,而是“通用方法论在客户端场景里直接失效”。如果你把一个后端团队跑通的 Agent 工作流原样搬到客户端仓库,大概率会翻车,原因在于客户端工程有五个通用场景压不住的特性。
第一是多端异构。一个需求往往同时涉及 iOS、Android、桌面端甚至小程序,代码库各自独立,底层语言和构建体系完全不同。Agent 就算在一个端上做得很好,换一个仓库,它对该仓库的了解程度会瞬间跌回零。第二是构建链路重。移动端一次全量编译动辄几分钟到十几分钟,Agent 如果像后端那样“每次改完立刻跑全量测试”,整个迭代节奏会慢到没法用。第三是产出物特殊。客户端交付的是需要签名、渠道分包、过平台审核的安装包,不是部署完就能跑的容器,这给“自动化验证”增加了大量额外环节。第四是隐性工程质量。服务器端接口通了就算赢,客户端还得盯包体积、启动耗时、内存占用、低端机兼容,这些都不在编译器的检查范围内。第五是权限与隐私。客户端通常涉及隐私合规、权限声明、合规弹窗,这些代码出问题不只是 bug,而是产品事故。
后面所有章节,都是围绕这五个特性展开的。理解了这个前提,你才明白为什么客户端团队落地 Agentic Coding,不能照抄任何一份“通用工程指南”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Agent 的上下文视野:客户端仓库里哪些信息它根本看不见
2.1 单文件上下文的幻觉:跨模块改动必然出错
从原理上讲,Agent 的能力上限不取决于模型本身,而取决于它在一个任务里能拿到多少有效上下文。模型再聪明,看不到的东西就不可能改对。客户端工程恰好是“信息极度分散”的典型:一个界面展示逻辑,可能横跨布局文件、样式资源、数据模型、网络层、埋点代码五六个模块;一个配置项,可能同时出现在 manifest、plist、远程配置中心和构建脚本里。
我见过最典型的失败场景是:Agent 接到“修改某个页面的文案”这个任务,它只打开了那个页面的源文件,把硬编码字符串替换掉了,然后宣布完成。但实际上这个页面用的是资源文件里的字符串引用,远端还有一套动态文案配置。真实线上用户看到的仍然是旧文案。这不是模型笨,而是它的上下文收集器没有把“这个页面渲染文本的完整链路”拉进来。
所以客户端团队要建立一个认知:Agent 默认只能看到它被明确告知可查看的文件。你给它开了一个目录的读权限,它就默认只在那个目录里找答案。跨模块的隐式依赖,对 Agent 来说就是盲区。
2.2 构建反馈是 Agent 的第二双眼睛
Agent 和人一样,也需要“错了我才知道怎么改”。在纯代码生成阶段,它对自己的产出是否正确其实毫无概念,唯一的反馈来源是工具的执行结果。对客户端工程来说,这个反馈链条比后端长得多——一次完整的验证至少要经过:静态检查、单元测试、编译链接、安装启动、真机或模拟器交互。
我建议客户端团队给 Agent 配一套“分层验证策略”,而不是让它每次改完都跑全量构建。第一层是语法级快速校验,用 lint 和编译器的单文件检查,成本低,适合高频执行;第二层是模块级单测,针对 Agent 改动的那个模块跑相关测试;第三层才是全量构建和安装启动,这个成本最高,应该只在 Agent 认为自己完成时触发一次。这样既保证了反馈密度,又不至于让 Agent 在每轮迭代里干等几分钟构建。
工具执行器在这里有个容易忽略的细节:它执行的命令必须是确定性的、输出可解析的。如果给 Agent 一个“跑测试然后看输出”的shell命令,输出格式五花八门,Agent 很难从中提取失败原因。更靠谱的做法是封装一些标准化的脚本,比如 ./agent_scripts/verify_module.sh <模块名>,内部统一处理错误码和结果摘要,Agent 只需要读到“PASS/FAIL”和关键报错信息即可。
2.3 给 Agent 写一份“仓库地图”,而不是“仓库简介”
很多团队已经知道要用 AGENTS.md 这类文件给 Agent 提供指引,但实际写出来往往是一份“项目简介”——写了项目是什么、用了什么框架,却完全没回答 Agent 最需要的问题:“这个仓库的代码是怎么组织起来的?我改这个文件,还需要同步看哪些地方?怎么验证我没有改坏?”
真正对 Agent 有用的仓库描述文件,信息密度应该远高于给人看的文档。我建议至少包含五块内容:仓库拓扑(源码、资源、脚本、配置分别在哪,模块依赖关系如何)、关键命令(干净的构建命令、测试命令、lint命令分别是什么)、代码规范摘要(命名、目录职责、禁止事项)、跨模块影响面(哪些公共基础设施改动会辐射全仓,比如网络层、内存缓存、埋点SDK)、以及“人类 reviewer 最关注什么”。
下面是一个精简示例,可以当作起步模板:
markdown复制# Repository Guide for Agent
## Module map
- app/: UI层,业务页面,依赖 core/ 和 network/
- core/: 基础组件(路由、主题、通用工具),变更需全量回归
- network/: API层,请求/响应模型,新增接口必须配套 mock 数据
- resources/: 本地化文案与图片资源,字符串必须走资源文件,禁止硬编码
## Commands
- Build: ./gradlew :app:assembleDebug
- Unit tests: ./gradlew :core:testDebugUnitTest
- Lint: ./gradlew lint
- Add resource: 在 resources/ 修改后,必须同步检查 3 种语言的翻译文件
## Non-negotiable rules
- 禁止修改核心模块的公共 API 签名,除非任务描述中明确要求
- 所有涉及用户隐私的权限变更,必须列出具体权限名并说明用途
- 启动耗时敏感路径不允许新增同步 IO
这份文件写清楚之后,Agent 的错误率会显著下降。但要注意,它不是一次性写完就完事了,每次仓库结构变动后都要同步更新。我会在后面的章节详细讲如何让这份“仓库地图”不自废。
3. 从“代码生成器”到“工程 Agent”的分级落地路线
3.1 L1:补全与生成,适合作为全员准入门槛
客户端团队引入 Agentic Coding,不建议一上来就上全自动任务流,而是先让大家把 AI 编码工具用熟。这个阶段我称它为 L1:补全与生成。它不要求 Agent 做多步规划,只是在人的主导下生成函数、补全样板代码、写单元测试。
L1 的价值不在于提升多少效率,而是让团队成员建立对生成结果的“质感判断力”——什么样的代码是能用的,什么样的代码只是看起来能编译。这个能力没有捷径,只能靠大量看生成结果练出来。具体做法很简单:统一在 IDE 里装好 AI 插件,约定好常用的提问模板,比如“为这个类生成单元测试,覆盖边界条件”“把这个回调改成协程写法,保持行为不变”。
在这个阶段,最容易犯的错误是让 Agent“一次性生成整个文件”。我见过很多新人让 AI 把整个网络层代码写出来,然后发现接口签名、错误处理风格和团队现有代码完全不一致,最后返工量比手写还大。L1 阶段必须约定:生成代码的粒度不超过“一个函数”或“一个类”,并且生成后必须由人逐行 review。
3.2 L2:单任务 Agent,能独立完成一个边界清晰的子任务
当团队对生成结果有了一定判断力,就可以进入 L2:让 Agent 独立完成一个边界清晰的子任务。典型的例子是“给这个页面补充空态页”“为这个接口封装缓存逻辑”“调整这个组件的 padding 适配新设计稿”。这些任务的共同特点是有明确输入输出、影响范围可控、验证标准清楚。
L2 的实现方式不复杂:把任务描述、仓库地图文件路径、相关模块的代码路径、完成定义打包成一个 prompt,交给 Agent 执行。关键是任务的“边界清晰”程度直接决定成功率。一个合格的任务描述至少要包含三部分:目标(做什么)、约束(不能碰什么)、验收(怎么算完成)。比如:
text复制任务:为 UserProfileFragment 增加网络请求失败时的重试按钮。
约束:只能修改 app/src/main/java/.../UserProfileFragment.kt 及其布局资源文件;禁止改动 network/ 模块。
验收:布局中存在 id 为 retry_button 的按钮,点击后重新调用 loadUserProfile();编译通过;相关单测通过。
我在实践中发现,把“约束”写清楚比把“目标”写清楚更重要。Agent 很容易在实现过程中“顺手”优化无关代码——它自己觉得这是改进,但会大幅增加 review 成本。L2 阶段的另一个要点是:每个任务都必须配套一个轻量级的验证脚本,让 Agent 在执行完毕后能自检。
3.3 L3:多步骤端到端任务,绕不开“可验证性”这个坎
L3 是 Agent 真正开始“像工程师一样工作”的阶段:给它一个产品需求,它自己拆解任务、梳理依赖、按顺序修改多个文件、运行测试、最终提交一个可评审的 MR。比如“给列表页增加下拉刷新与错误重试”这种横跨 UI、网络、状态管理的需求,就属于 L3 的典型任务。
L3 能否成功,最大的瓶颈不在 Agent 的推理能力,而在“可验证性”。和人一样,Agent 只有在每一步都能确认“我做对了”时,才能走完一个长链路。所以进入 L3 之前,必须先完成两件事:一是把单测覆盖率补到核心模块的合理水平,让 Agent 有足够的“安全网”;二是把构建和测试命令做成标准化脚本,让 Agent 可以低门槛地获取反馈。
在 L3 阶段,我强烈建议给 Agent 增加“中途检查点”。不要让它一口气从上做到下,而是在任务描述里明确要求:完成第 1 步后运行指定测试,把结果贴出来;确认无误后再继续第 2 步。这相当于给 AI 加了一层“先做小验证再放大”的护栏,效果比任何提示词技巧都好。
3.4 L4:多 Agent 分工,至少要有一个 reviewer agent
L4 是多 Agent 协作,简单说就是让多个 Agent 各司其职:一个负责写代码,一个负责 review 代码,一个负责跑验证。很多团队一听到“多 Agent”就觉得非常复杂,其实在客户端场景里,最值得先做的是加一个 reviewer agent。
reviewer agent 和 coding agent 用同一个代码库,但它的职责不是写代码,而是检查 coding agent 的产出:是否引入了超出任务范围的变更、是否遵守了仓库规范、是否有明显的安全隐患、测试是否充分。它可以把“人工 code review 的第一遍粗筛”接走,让人 review 集中在逻辑正确性和产品体验上。
实现起来并不需要太重的框架。最朴素的方案就是两段式流水线:coding agent 产出 MR 后,触发 reviewer agent 基于仓库地图文件和 MR diff 生成 review 意见;人工根据意见做最终判断。如果 review 不通过,把意见反馈给 coding agent 让它修改。这个闭环一旦跑通,就等于把团队从“人工检查机器”里解放出来了。
不过我要泼一盆冷水:不要把 L4 想象成完全无人值守。客户端仓库的复杂性决定了人工 review 在很长一段时期内仍然是质量底线,reviewer agent 定位是“过滤器”而不是“决策者”。
4. 质量红线:客户端可交付的代码,不是“能编译”就算赢
4.1 编译通过只是起点,客户端代码的隐性债务都在编译之后
在客户端团队里,代码“能编译”和“能交付”之间的距离,比很多开发者想象的要大。一个改动可能编译通过、单测全绿,但上线后导致启动时间增加 50 毫秒、包体积增加 1MB、低端机首帧渲染掉帧——这些问题编译器都不会报错,但它们直接影响用户体验和业务指标。
Agent 尤其容易在这里闯祸,因为它的“完成感”来自工具反馈,而工具反馈通常不会包含“这个新加的第三方库让包体积大了多少”“这个懒加载改成直接初始化对启动时间有什么影响”。所以客户端团队的 Agentic Coding 工程化,必须把这些隐性指标显式化,变成 Agent 可感知的检查项。
一个有效的做法是:在 CI 里接入性能回归看护。每次 MR 触发构建后,自动产出一个对比报告,标明包体积、启动耗时(在指定模拟器上)、新增依赖数量相对于主干的变化。如果超过阈值,CI 直接失败。这相当于给 Agent 装上了“性能血压计”,它一旦发现自己改坏了指标,就会在下一轮迭代里自动收敛。
4.2 用“完成定义”把验收标准写进 Agent 的任务书
“完成定义”这个词很多人听说过,但真正落到 Agent 任务里的很少。原因很简单:大多数团队的完成定义是写在 Wiki 里给项目管理者看的,格式是人类友好型,Agent 读不懂也执行不了。要让 Agent 遵守质量红线,必须把完成定义改写成机器可检查的清单。
举一个客户端的实际例子,一个 UI 改造任务的完成定义可以写成:
- 目标页面在 iPhone SE、Pixel 6 两种屏幕尺寸下无布局溢出;
- 新增资源文件不超过 3 个,且全部小于 20KB;
- 页面冷启动新增耗时不超过 10ms;
- 代码经过 lint 且无新增 warning;
- 不新增任何第三方依赖。
第五点尤其关键。客户端团队对第三方依赖的引入通常非常敏感,一个依赖可能带来十几 MB 的体积、隐私合规风险、以及长期维护成本。Agent 不会天然理解这一点,它只觉得“这个需求用这个库实现最简单”。所以“不新增第三方依赖”这种约束必须显式写进任务书,并且通过 CI 的依赖检测来做硬校验。
4.3 从提示词工程走向护栏工程:用机器规则拦住“看起来对”的错误
很多团队在用 Agentic Coding 时,把希望寄托在“更好的 prompt”上,想在提示词里把所有规则说清楚。但提示词是不可靠的,模型可能这次遵守了,下次就忘了,尤其当任务复杂、上下文变长的时候。我的经验是:凡是可以写成机器规则的质量要求,就不要放在提示词里。
客户端工程里能“规则化”的东西远比想象中多。比如:禁止在非工具类文件里 import 某个重型基础库;发现硬编码的 http:// 地址直接报警;新增文件必须带有版权头;布局文件不允许出现超过 5 层的嵌套。这些规则用 lint 插件、Git Hooks、CI 静态检查就能拦住,根本不需要模型“自觉遵守”。
这套思路我称之为“护栏工程”:提示词定方向,护栏兜底线。方向说错了,Agent 走弯路,是效率问题;底线没兜住,Agent 越过红线,是事故问题。效率问题可以容忍,事故问题不行。所以我会建议客户端团队,在把 Agent 接入正式流程之前,先把 lint、格式化、依赖检测、单元测试覆盖率检查、性能阈值这些护栏全部建好,一个都不能少。
4.4 一份可迁移的变更禁令清单
在客户端团队里,有一些代码区域是无论 Agent 多自信都不应该独立碰的。我把它们整理成一份“变更禁令清单”,作为仓库地图文件的组成部分。每个团队的清单会不一样,但以下几个条目大概率通用:
| 禁区类型 | 原因 | 处理方式 |
|---|---|---|
| 核心模块的公共 API 签名 | 影响所有上层调用方 | Agent 只能新增,不能修改或删除 |
| 隐私权限声明与合规弹窗 | 法律与平台审核风险 | 任何变更必须人工介入 |
| 支付类与账号类逻辑 | 资金安全和风控敏感性 | 默认禁止 Agent 自动修改 |
| 构建脚本与签名配置 | 一旦出错直接阻塞发版 | Agent 可读,不可写 |
| 全局缓存与存储迁移 | 数据丢失不可逆 | 必须先出迁移方案再评审 |
| 核心网络层超时与重试策略 | 线上问题影响面大 | 改动必须附带开关和监控 |
有了这张清单,任务拆分时就很容易判断:这个任务是否触碰禁区?如果触碰,那么 Agent 的角色应该降级为“起草方案”,由人来完成最终修改。这条规则写进工作流之后,团队对 Agent 的信任度会明显提升,因为大家知道有 Agent 碰不到的地雷。
5. 客户端 Agent 的运行架构:任务拆分、沙箱权限与度量指标
5.1 从 issue 到 Task 的拆分模板:上下文越窄,效果越稳
Agentic Coding 在客户端团队里能不能跑起来,很大程度上取决于“任务拆分”这个上游环节的质量。一个模糊的 issue 直接丢给 Agent,它要么无从下手,要么自己想象出一个目标然后跑偏。所以必须在 issue 和 Agent 之间加一道“任务化”工序,把产品语言翻译成机器可执行的工程语言。
我总结了一套拆分模板,目前在团队里的命中率还不错:
- 背景:这个任务要解决什么用户问题,为什么现在做;
- 影响面:涉及哪些模块、哪些端,哪些代码不允许改动;
- 实现路径建议:给出 Agent 推荐的实施顺序,先从哪个文件入手,再改哪个文件;
- 验证方式:明确列出验收测试命令和人工检查点;
- 风险点:明确写清楚这个任务最容易踩的坑。
这套模板写起来有成本,但它带来的收益是让 Agent 的成功率从“抽奖”变成“大概率事件”。而且随着模板积累,你会发现很多任务是可以复用历史模板的——同一个模块、同一类改动,把上次的任务描述稍微改改就行。
5.2 让 Agent 在最小权限沙箱里干活,签名和密钥不能靠近
客户端工程的权限管理比后端更敏感。后端 Agent 如果拿到生产环境的部署权限,顶多影响一个服务;客户端 Agent 如果拿到签名密钥,理论上可以伪造安装包,这是供应链级别的灾难。所以 Agent 的运行环境必须坚持“最小权限”原则。
具体到客户端场景,我建议做三件事。第一,Agent 的构建和测试都在独立的沙箱容器里执行,与开发者的本地环境隔离;容器里只预装构建工具链和公开依赖,不存任何私钥。第二,签名操作单独放在一个受控的签名服务里,Agent 产出的安装包只能生成“未签名版本”,签名环节由后续的发布流水线完成,Agent 不可触达。第三,访问内部代码仓库和内部依赖源时,使用独立的只读凭据;如果 Agent 需要推送分支,使用临时令牌,并且令牌的有效期只到任务结束。
这套环境搭建起来需要一点投入,但它是客户端团队大规模落地 Agentic Coding 的前提。任何“先跑起来再说,权限以后收紧”的想法,在客户端这种高合规要求的领域都不该有。
5.3 度量指标:盯着“无害合并率”,而不是代码行数
客户端团队落地 Agentic Coding 之后,怎么衡量它到底有没有用?我的建议很直接:别看代码生成量,别看“AI 写了多少行代码”这种虚荣指标,要看“无害合并率”——Agent 提交的 MR 中,无需人工改动或只需极少改动就能合并的比例。
为什么这个指标最有效?因为它同时拉齐了效率和质量的诉求。一个能大幅生成代码但错误率高的 Agent,它的无害合并率会很低,因为人工 review 和返工成本会吃掉所有效率收益。反过来,一个只生成少量代码但每笔都能用的 Agent,反而更值得信任,可以逐步交给它更重要的任务。
在这个主指标之外,还可以跟踪几个辅助指标:单任务平均迭代轮数(反映任务拆解质量)、Agent 产出导致的构建失败率(反映验证闭环是否有效)、性能回归被 CI 拦截的次数(反映护栏工程是否到位)。这些指标一起看,就能比较立体地判断团队在 Agentic Coding 上的进展。
6. 客户端团队落地踩坑实录与第一批试点怎么选
6.1 四个常见失败模式,我基本都在团队里见过
客户端团队做 Agentic Coding,真正的问题很少出在“模型不够聪明”,而是出在工程化的细节上。我梳理了四个反复出现的失败模式,排在最前面的“仓库上下文缺失”前面已经详细讲过,另外三个也很典型。
第二个失败模式是按“后端方式”设计验证闭环。移动端编译慢是客观事实,如果 Agent 每改一次代码就触发一次全量构建,任务执行时间会从分钟级变成小时级。正确的做法是前面说的分层验证——高频用轻量级检查,全量构建只在最后跑。否则 Agent 会因为等待反馈太慢而被闲置,整个流程效率反而低于人工作。
第三个失败模式是任务描述里没有“禁止项”。Agent 天然有“过度实现”的倾向,给它一个明确的改动,它可能会顺手重构相邻代码、升级依赖版本、修改缩进风格。这些“额外好意”会显著拉爆 code review 的成本。解决方式是在任务描述中强制包含“约束”栏,并在 CI 里做 diff 范围检查。
第四个失败模式是只有“写代码 Agent”,没有“检查 Agent”。很多团队跑通了一个会自动改代码的 Agent 就很兴奋,直接把大量任务交给它,然后发现评审的人工成本并没有下降——因为每个人都对 AI 写出来的代码不放心,反而看得更仔细。增加一个 reviewer agent 做第一层过滤之后,这个情况才真正好转。
6.2 第一批试点任务的选择标准
如果你正打算在客户端团队里启动 Agentic Coding,我的建议是从小处开始,选好第一批试点任务比定宏大规划重要得多。合格的第一批任务应该满足四个条件:影响面可控、验证标准明确、不触碰禁区、对团队有真实价值。
比如“给所有空态页补充错误重试按钮”“为单元测试补全若干边界用例”“把项目中的硬编码颜色值替换为主题变量”“整理某个模块的日志埋点,统一日志格式”。这些任务都不大,但做完之后能明显改善工程质量,而且失败成本低,非常适合作为 Agent 的练兵场。
选任务时还要注意“数量”而不是“规模”。与其让 Agent 做一个横跨五个模块的大任务,不如让它做二十个互相独立的小任务。小任务的上下文更窄,Agent 的成功率更高,团队也能更快积累“哪些仓库信息对 Agent 最重要”的经验。
6.3 推行 Agentic Coding 不是买工具,而是改工作流
最后想聊一点团队层面的认知。很多客户端团队在引入 Agentic Coding 时把它当成“选型问题”——选一个工具,配上模型,大家就能开始用。但实际操作下来,你会发现它其实是“工作流改造问题”。任务怎么拆、仓库信息怎么组织、验证闭环怎么搭、护栏怎么建、review 流程怎么变,这些才是决定成败的关键。
工具更新换代很快,今天这个 Agent 框架流行,明天可能就被新的取代。但“仓库地图意识”“分层验证策略”“护栏工程”“无害合并率”这些方法论是稳定的,它们才是客户端团队从 Agentic Coding 中真正获益的底座。我个人的体会是,与其追着新工具跑,不如先花几周时间把底座搭扎实。底座一旦建好,换工具只是换个驱动层而已。
