尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Uber 70%代码由AI Agent生成?揭秘SDLC流程中的智能化改造

Uber 70%代码由AI Agent生成?揭秘SDLC流程中的智能化改造 Uber在前段时间的一次内部技术分享中透露其代码生成已有70%由AI Agent完成。这个数字一出来行业内讨论很多有人认为这是AI编程的里程碑也有人质疑这个数据是否具备普适性。抛开情绪本身更值得关注的问题是——Uber是怎么把Agent塞进如此庞大的微服务架构里的它的SDLC软件开发生命周期到底被改造成了什么样这篇文章想把这件事讲透。我会先解释Agent在Uber这类大型工程里扮演的角色边界再按SDLC各阶段拆解Agent介入的深度最后落到我们自己团队可以怎么借鉴这套思路包括一套可以照着用的Agent工作流示例、验证方式和常见坑。如果你所在团队正处于“试用AI写代码但不敢交给生产环境”的阶段这篇文章尤其适合你。1. 先回答一个问题Uber为什么敢让Agent写70%的代码很多团队连让AI补全一个函数都胆战心惊Uber凭什么敢让Agent大规模产出代码这里要先看一组背景信息。Uber的工程体系有几个典型特征微服务数量巨大服务间通过标准化的接口协议通信代码库里沉淀了海量的历史模式和业务模板。这些特征决定了Uber的代码生成天然适合Agent介入。关键在于“标准化”。当你的工程体系里服务骨架、接口定义、错误处理、日志规范、测试结构都高度一致时Agent要学习的模式就不需要靠“灵感”而是有明确的范式可循。这就像同样写作文给定固定的八股结构和优秀范文集AI写出合格文章的概率会远高于让它自由创作。Uber的70%并不是指“从零写需求然后AI自由发挥”而是在大量已有模式、模板和历史代码的加持下Agent作为自动补全和脚手架工具完成了大量重复性的编码工作。这个数字有很强的场景边界换成一家业务逻辑复杂、工程规范薄弱的公司直接套用这个数字毫无意义。所以第一个判断是Uber的Agent实践能跑通依赖的不是某一个模型有多聪明而是工程标准化程度和Agent工具的深度融合。2. Agent、SDLC与代码生成先把概念边界画清楚在继续往下拆之前有必要把几个概念画清楚。2.1 Agent不是chatbot很多开发者把Agent和聊天机器人混为一谈。区别在于“行动”。聊天机器人只能回答问题而Agent被赋予了调用工具、读写代码库、执行命令、根据反馈迭代的能力。一个最小可用的编码Agent至少需要具备理解任务的能力把自然语言需求拆解成具体代码修改感知环境的能力读取项目目录、搜索代码、查看文件内容操作环境的能力编辑文件、执行测试、运行命令、提交代码自我纠错的能力测试失败后根据错误信息修正修改。不具备这些能力的AI工具严格来说只能算“智能提示器”不能叫Agent。2.2 SDLC包含什么SDLCSoftware Development Life Cycle软件开发生命周期一般包含需求分析、系统设计、编码开发、测试验证、代码审查、部署发布、监控运维。不同团队会做增删但骨架大致如此。传统的SDLC里每个阶段都有明确的人工操作节点。Agent介入后变化不仅仅是“写代码变快了”而是需求、设计、编码、测试、审查之间的信息传递方式都开始自动化。这就是为什么要谈“SDLC架构全解析”——因为Agent的落地不是一个插件问题而是工程流程的重新设计。2.3 代码生成的层级目前AI生成代码可以分为三个层级层级典型工具介入深度可控性代码补全传统AI编程插件单行/函数级高对话式生成主流AI编程助手文件级/模块级中Agent工作流自主编码Agent任务级/服务级偏低但收益最大Uber能够做到70%代码生成显然已经跨越了前两个层级走到了Agent工作流的阶段。3. Uber的Agent工程实践本质是在重构SDLC的信息流如果看Uber的Agent实践抽象来看它做的事并不神秘把原来人与人之间传递的需求、设计、代码、测试、审查信息改成人与Agent之间、Agent与Agent之间、Agent与工具链之间的标准化交互。传统SDLC的信息流是这样的产品需求 - 工程师理解 - 编写代码 - 提交CR - 人工审查 - 合并 - 部署Agent介入后的信息流变成了产品需求 - Agent解析 - 生成代码/修改代码 - 自动测试 - 人工审查关键节点 - 合并 - 部署这里面的关键变化不是“人消失”而是人从每个环节的执行者变成了目标定义者、规则制定者和异常决策者。在Uber的实践中工程师的角色更像“技术导演”而不是“打字员”。你要做的是把需求描述清楚、把约束条件写清楚、把验收标准定清楚剩下的重复劳动交给Agent去执行。这要求工程师的思维模式从“怎么写代码”升级为“怎么描述任务、设计流程、定义质量门槛”。3.1 Agent在编码阶段介入最深编码是Agent发挥作用最集中的阶段。Uber的Agent不仅能根据prd生成服务骨架还能在已有的代码库中定位需要修改的文件、理解现有实现、生成调用的上下游接口、补充单元测试。这正是Agent和普通代码补全工具的最大区别代码补全只关心“光标后面应该补什么”Agent关心的是“这次任务要改哪些东西、它们之间如何配合”。3.2 代码审查阶段Agent从“被审查者”变成“协审者”很多讨论只关注Agent写代码忽视了Uber在代码审查环节的布局。Agent生成的代码不会直接合并在Uber内部仍然存在多级防线自动化检查、静态扫描、测试覆盖、人工审查。但人工审查的焦点变了。审查者不再一行一行地检查语法和风格而是聚焦在业务逻辑、架构合理性、边界情况——因为语法、风格、常见反模式已经被Agent和自动化工具过滤掉了。这一层很关键。如果团队引入Agent后没有同步改造审查流程代码会变成“没人真正看得懂的一堆AI垃圾”。Uber的做法是把Agent编排进流程里而不是让Agent游离在流程之外输出代码再丢给人类兜底。4. SDLC各阶段的Agent应用拆解下面按SDLC阶段逐一拆解看Agent在每个阶段做什么、做到什么程度。4.1 需求分析阶段传统方式产品经理写PRD产品需求文档工程师阅读并理解遇到不清晰的地方开会对齐。Agent介入后需求文档可以直接作为Agent任务的输入源。Agent会检查需求是否存在歧义、是否包含了明确的验收标准、是否缺失边界条件。在Uber这类接口契约驱动的架构里Agent甚至会依据PRD尝试生成初步的接口定义草案供工程师确认。实际落地时很多模板类PRD是高度结构化的。Agent可以把PRD里的每条需求映射到具体的模块和接口输出一份“需求到代码模块的映射关系”减少拆解成本。4.2 系统设计阶段这个阶段Agent的作用相对受限但仍有发挥空间。对于高度标准化的内部服务Agent可以依据历史服务模板生成架构设计文档初稿包括模块划分、数据模型、接口定义、依赖关系。这类设计在Uber的微服务体系里重复度较高Agent生成的初稿往往已经具备可讨论的基础。但对于核心业务逻辑复杂、需要深度技术选型的系统设计Agent目前还不能替代架构师。这里更适合把Agent当“研究助手”让它梳理既有代码库中的相似实现辅助架构决策。4.3 编码开发阶段这是Agent的核心主战场。Uber的Agent能够执行的任务包括根据接口定义生成服务骨架根据既有代码模式生成CRUD逻辑修改多个文件以完成一个完整的feature自动补全测试用例根据构建失败信息自动修复代码。实际工作中Agent跑一个任务的过程往往如下任务描述自然语言 - Agent读取相关文件 - 规划修改路径 - 分步编辑代码 - 运行相关测试 - 根据失败反馈迭代 - 输出最终diff4.4 测试验证阶段Agent生成代码后不会直接进入交付而是先跑一轮自动化验证。验证指标包括编译是否通过、单测覆盖率是否达标、静态扫描是否有严重告警。这里要强调Uber的Agent实践能成立正是因为它的自动化测试体系足够完善。没有高覆盖率的单元测试和集成测试作为安全网Agent生成的代码很难被信任。反过来如果一个团队连基础测试体系都没有建立引入Agent编码只会把质量问题放大。4.5 代码审查阶段在这个阶段Agent的角色是提效还是把关取决于工程配置。Uber的经验里有几个值得借鉴的点Agent生成的代码先经过自动化审查再进入人工审查人工审查核心关注业务语义和架构不再逐行读代码代码审查工具会结合历史代码模式判断新代码是否存在反模式。4.6 部署发布阶段Agent在部署阶段可以协助生成部署配置、检查发布清单、生成回滚预案。但发布动作本身在大型系统中依然需要经过严谨的审批和控制。对于一个以稳定性为生命线的系统来说发布环节不建议完全交给Agent自主决定。更合理的做法是Agent生成发布所需的所有材料和检查项人在确认后执行发布。4.7 监控运维阶段Agent可以分析线上告警日志、关联服务依赖、尝试定位根因甚至输出修复代码供工程师确认。这是比较前沿的应用方向在Uber这类大规模分布式系统中Agent辅助定位复杂故障的价值很高但依然需要人工确认。5. 落地实操如何搭一个自己的SDLC Agent工作流接下来这部分可以直接拿去参考。我不会依赖任何特定厂商的封闭能力而是用一个通用的设计思路说明如何在现有工程体系里搭建一个最小可用的SDLC Agent工作流。5.1 明确你的Agent工具需要具备什么能力一个用于SDLC的Agent在工程能力上需要具备以下接口能力说明示例工具代码库访问读取、搜索、编辑代码库Git工具、文件系统工具构建执行运行编译、测试、静态检查命令Shell工具、CI调用信息检索查询文档、历史代码、依赖关系索引工具、语义搜索模型推理理解自然语言和代码逻辑LLM调用记忆管理跨任务保存上下文和决策记录持久化存储/MCP相关组件这里还要考虑MCPModel Context Protocol这类标准化协议它让Agent工具之间的连接不再依赖每个Agent单独定制接口相当于给Agent生态建立了一套“USB-C接口”。如果团队要自建Agent工具链建议优先考虑支持标准化工具协议的实现减少后期维护成本。5.2 设计任务模板要让Agent稳定产出任务描述必须结构化。我在实践中推荐使用类似下面的任务模板# Task: 为订单服务新增取消接口 ## 需求背景 用户在支付前可以取消订单取消后释放库存。 ## 约束条件 - 保持现有订单状态机的兼容性 - 必须记录取消原因 - 失败时抛出 OrderCancelException ## 验收标准 - 单元测试覆盖正常取消、重复取消、非法状态取消 - 集成测试通过 - 接口文档同步更新 ## 参考实现 参考 promocode-service 的 CancePromoCode 实现你可能会发现这份任务描述比大多数团队的PRD还要细。原因很简单Agent没有“默认应该知道”的常识所有约束必须显式写明。任务描述越清晰Agent产出的代码越接近预期返工越少。5.3 核心流程代码示例下面用一个伪代码级别的Python示例展示SDLC Agent的核心循环# 文件路径agent_orchestrator.py 一个极简的SDLC Agent编排器示例用于演示核心循环。 实际生产级实现会接入具体LLM API、代码库工具和CI系统。 from dataclasses import dataclass from typing import List dataclass class AgentTask: description: str repo_path: str test_command: str acceptance_criteria: List[str] class SDLCAgent: def __init__(self, llm_client, repo_tool, test_runner): self.llm llm_client # 负责代码生成的模型客户端 self.repo repo_tool # 负责读写代码库的工具 self.test_runner test_runner # 负责执行构建、测试的工具 def run(self, task: AgentTask, max_iterations5): # 1. 让Agent理解当前代码库结构 context self.repo.read_project_structure(task.repo_path) print(f[Agent] 已读取项目结构共 {len(context.files)} 个关键文件) # 2. 让Agent生成代码改动计划 plan self.llm.plan_changes(task, context) print(f[Agent] 生成修改计划: {plan.summary()}) if not plan.is_valid(): return {status: FAILED, reason: Invalid plan} # 3. 循环执行修改-验证-修复 for iteration in range(max_iterations): # 3.1 执行修改 diff self.llm.generate_code(task, plan, self.repo.read_current_state()) self.repo.apply_diff(diff) print(f[Agent] 第 {iteration 1} 轮修改完成) # 3.2 运行测试 test_result self.test_runner.run(task.test_command) if test_result.success: print([Agent] 测试全部通过) return {status: SUCCESS, diff: diff, iterations: iteration 1} # 3.3 根据失败信息修复 feedback test_result.error_messages print(f[Agent] 测试失败进入修复。错误数: {len(feedback)}) self.llm.fix_code(feedback, plan) return {status: FAILED, reason: max_iterations exceeded}# 文件路径example_usage.py from agent_orchestrator import SDLCAgent, AgentTask # 模拟的LLM客户端、仓库工具和测试运行器 # 实际使用时应替换为具体实现 def main(): task AgentTask( description为订单服务新增取消接口, repo_path/workspace/order-service, test_commandmvn test -DtestOrderCancelTest, acceptance_criteria[ 正常取消, 重复取消抛异常, 非法状态取消抛异常, ] ) agent SDLCAgent( llm_clientyour_llm_client(), # 替换为你的模型客户端 repo_toolyour_repo_tool(), # 替换为你的代码库访问工具 test_runneryour_test_runner() # 替换为你的测试执行器 ) result agent.run(task) if result[status] SUCCESS: print(Agent生成代码完成请人工审查diff) else: print(fAgent执行失败: {result[reason]}) if __name__ __main__: main()这段代码演示的核心循环值得记住读取项目结构 - 生成修改计划 - 执行修改 - 运行测试 - 失败反馈 - 修复迭代只要你的生产系统能封装出三个接口代码库读写、LLM调用、测试执行就可以搭起一个最小Agent工作流。剩下的工程问题都在于如何把这三个接口做得稳定、可控、可观测。5.4 CI集成配置示例Agent不能只在本地跑它必须进入CI/CD流程。下面是一个GitHub Actions风格的配置示例实际使用请根据团队CI平台调整# 文件路径.github/workflows/agent-verify.yml name: Agent Code Verification on: pull_request: types: [opened, synchronize] jobs: verify-agent-generated-code: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Set up JDK uses: actions/setup-javav4 with: java-version: 17 - name: Run unit tests run: mvn test - name: Run static analysis run: mvn spotbugs:check - name: Check test coverage run: | # 假设使用 JaCoCo并设置一个最低覆盖率门槛 mvn jacoco:check -Djacoco.minimum0.80 - name: Post Agent review comment run: | # 这里可以调用Agent对PR做一次初步审查 python scripts/agent_review.py --pr-number ${{ github.event.pull_request.number }}这个配置要解决的核心问题是Agent生成的代码必须和人类写的代码走同一套质量门槛甚至还要更严。6. 如何验证Agent生成的代码质量很多团队在引入Agent后最大的困惑是代码能跑但质量如何量化这里提供几个可落地的验证维度。6.1 回归测试覆盖度最硬的验证标准是回归测试通过率。在CI里配置质量门槛低于阈值直接失败。6.2 代码审查通过率可以统计每个PR一次审查通过的比例。Agent生成的PR如果频繁被打回说明任务描述不够清晰或Agent上下文理解有问题。6.3 线上故障率从长期看Agent生成代码引入线上故障的比率是评估这套体系是否可靠的核心指标。建议按来源标签统计比如在commit message里打上[agent-generated]标记方便后续做数据对比。# 示例在commit中标记Agent生成 git commit -m [agent-generated] feat(order): add cancel order endpoint6.4 代码重复率和维护成本用静态分析工具检查Agent生成代码与存量代码的重复度。如果Agent只是不断复制粘贴会产生大量新的技术债。7. 常见问题与排查思路在我接触的多个实践案例中下面的问题出现频率最高。问题现象可能原因排查方式解决方案Agent产出代码频繁编译失败项目构建信息缺失Agent看不到完整依赖检查Agent上下文是否包含pom.xml/package.json等构建文件在Agent工具中显式挂载构建配置和依赖清单Agent修改了无关代码任务边界不明确检索范围过大查看Agent执行日志中的文件读取顺序在任务模板中划定允许修改的文件白名单Agent反复修复同一类测试失败对需求理解有偏差或测试环境配置缺失检查测试失败日志是否依赖本地环境变量将测试运行环境容器化支持本地与CI一致代码跑通但无法通过人工审查只满足功能验收忽视架构规范和代码风格加入静态检查规则提升验收标准在验收标准中加入“遵循项目既定架构模式”Agent工具执行超时任务过大一次要处理的文件太多拆分任务为更小的步骤将大任务拆成多个子任务分阶段执行这些问题的本质大多是“上下文不完整”和“边界不清晰”导致的和模型本身的能力关系不大。另一个需要提醒的点是Agent执行超时或工具链不稳定往往被误判为“模型太弱”。实际上可能是Agent框架与你的代码库规模不匹配。大型monorepo里Agent每次搜索全库的低效操作会拖垮整个流程。解决办法是给Agent配置索引服务让它通过语义检索访问代码而不是每次全文扫描。8. 最佳实践与工程建议下面这些建议是从Uber这类大型工程实践中提炼出来的通用经验。8.1 先建质量围栏再放Agent入场没有稳定的自动化测试、静态检查和构建系统不要贸然让Agent大规模写代码。Agent的能力边界是建立在质量围栏之内的围栏越稳Agent越能放开手脚。8.2 任务描述比模型选择重要很多团队把大量精力花在挑选模型上却忽视任务提示词的设计。在Agent实践中结构化的任务描述对最终效果的影响往往大于模型版本差异。建议把任务模板沉淀为团队内部的标准文档。8.3 用标记体系追踪Agent产出建立commit标记和PR标签系统追踪Agent产出的代码量、返工率、缺陷率。用数据判断Agent在哪些任务类型上真正提效在哪些任务上反而拖累效率。8.4 保证人工审查只审查真正重要的东西不要让审查者在Agent生成的500行代码里逐行挑错。把语法、风格、常见反模式交给自动化工具人工审查聚焦业务语义、架构质量和潜在边界问题。审查者的时间应该花在机器做不了的事情上。8.5 关注Agent安全与权限边界Agent能写代码意味着它需要访问代码库、执行命令、调用外部API。权限失控会造成严重问题。在生产环境接入Agent时至少要遵循最小权限原则Agent只能访问与任务相关的仓库只能执行白名单内的命令所有敏感操作保留人工审批。可以按下面的分类设计权限操作类型建议策略读取代码允许按仓库做白名单写代码只允许在feature分支执行测试允许但限制时间和资源安装依赖需审批合并代码禁止Agent执行部署上线禁止Agent执行8.6 保留Agent记忆与决策上下文跨任务的Agent记忆很重要。一个成熟Agent应该能记住当前的业务上下文、之前的修改意图、团队偏好的编码风格。业界正在把“记忆”作为Agent框架的标准组件来对待。你可以从简单的方案做起为每个服务维护一个AGENT_CONTEXT.md记录该服务的关键决策、约束和常见坑Agent每轮任务前先读取这个文件。9. 结束前的一点判断Uber把70%的代码生成交给Agent给行业最大的启示不是“AI要取代程序员”而是“工程标准化程度决定了AI落地的上限”。如果你的团队每天都在写重复的胶水代码规范的模板和清晰的流程已经建好那Agent完全可以大规模介入如果你的代码库混乱、测试缺失、接口规范不明确Agent不仅帮不了你反而会加速混乱。对开发者个人来说现在最值得练的能力也不是“怎么把需求描述得更像人话”而是学会以工程化的方式定义任务、设计质量防线、审查机器产出。这套方法论一旦建立无论底层模型换成哪一代你都能保持主动权。下一步建议先从一个小型服务或一个独立的feature开始用本文的流程搭一个最小Agent闭环把测试、审查、监控这几个环节跑通再逐步扩大范围。Agent编程这个方向会继续演进但工程化的基本功永远不过时——它们才是这套体系真正的地基。
返回列表