AX 爱鲜报

综合 / 阅读 · 2026-10-30 09:38 · 1 阅读 · 0 赞

Uncle Bob 开源 ub-mode:用确定性工具给 AI 编码 Agent 立规矩

《代码整洁之道》作者 Uncle Bob 发布仅 6KB 的 Skill「ub-mode」,GitHub 获 4.4K+ Star。它不靠长 Prompt 约束模型,而是把 TDD、整洁代码与架构边界封装成三阶段工作流,并绑定 CRAP 分数、重复代码检测、变异测试等外部工具做硬性校验,让 AI 编码 Agent 的产出可量化、可验收。

让 AI 修一个空指针 Bug,它顺手重构了半个文件;在 Prompt 里写满十几条代码规范,转头就被无视;AI 拍胸脯说测试全部通过,上线后却悄悄爆出逻辑漏洞。

Prompt 写得越长,大模型越容易遗忘中间的约束,也就是业内常说的「Lost in the Middle(中段丢失)」。靠文字劝告约束 Agent,本质上就像拿海盗法典当硬性法律,模型只会把规则当成可选择性遵守的建议。

50 年编程老兵、《代码整洁之道》作者、敏捷宣言签署人 Uncle Bob(Robert C. Martin)给出了一套完全不同的解法——ub-mode。

这个仅 6KB、只有两个文件的 Skill,上线后斩获 4200 Star,核心思路一句话:不靠模型自觉,靠确定性工具做强制校验,给 AI 编码 Agent 穿上无法挣脱的紧身衣。

先让它能工作,再把它做好,最后遵循工程实践。

这就是 ub-mode 整套体系的核心纲领,也是 Bob 大叔在直播对谈里验证数月、落地多智能体开发流程之后,沉淀出来的标准化规则。

01 Bob 大叔整套 AI 编码思想

很多人只看到 ub-mode 这份 Skill,却不理解它背后一整套工程认知。

早在和 Matt Pocock 的直播对话中,Bob 大叔就抛出了极具争议的观点:AI 写的代码,我完全不看。

但这不代表放任 AI 自由发挥。他不是盲目信任,而是放弃传统人工逐行 Code Review,搭建一套层层拦截的自动化质量脚手架:单元测试、Gherkin 验收测试、QA 流程、CRAP 复杂度评分、依赖规范、变异测试、覆盖率校验。

他在实战里发现一个极易被忽略的真相:AI Agent 同样会被腐烂代码拖累。

如果持续放任 Agent 堆积烂代码、不清理技术债,它会陷入恶性循环:改一处、崩一处,不停原地打转,甚至直接罢工。Agent 的复杂度容忍阈值和人类不一样,但上限客观存在。

也正是这套认知,催生了 ub-mode。

它不是一份新的 Prompt 合集,而是把 Bob 大叔多年的 TDD、整洁代码、架构边界思想,封装成 Agent 可以严格执行的工作流,并且绑定可量化、可自动化核验的指标,把软性建议变成硬性关卡。

同时他明确提醒所有开发者:当下很多人鼓吹软件基础不重要,这类人很快就会吃到苦头。AI 擅长战术编码,但是架构、模块划分、识别系统复杂度,依然是人类的战略工作。架构自动化目前还走不通,必须由人主导。

02 ub-mode 到底是什么

ub-mode 仓库极度精简,只有两份核心文件:README.md + SKILL.md,整体体积仅 6KB。

它本身不自带检测工具,只定义 Agent 的工作流程、校验规则、验收标准;配套的质量检测工具独立拆分:

  • Crapper:计算 CRAP 分数,结合圈复杂度 + 测试覆盖率评估函数复杂度
  • Dryer:扫描代码,识别高相似度重复代码块
  • Mutator:变异测试工具,自动篡改代码逻辑,检验测试用例是否有效
  • uml-viewer:架构可视化工具,查看模块依赖、UML 结构

⚠️ 重要校准:

ub-mode 规则要求 CRAP 分数<10;Dryer 触发阈值 0.8,而 Dryer 原生默认阈值是 0.82,部署时必须手动对齐参数,不能直接使用工具默认值。

很多教程在这里踩坑,直接照搬工具默认配置,导致规则失效。

ub-mode 的定位是Agent 的工作纪律手册,不是开箱即用的完整质检平台。你可以把 SKILL.md 交给 AI 编程助手,让它理解整套流程;但分数、变异测试结果,必须依靠外部工具产出,不能只相信 AI 自己口头汇报。

03 完整工作流拆解

ub-mode 强制每一次代码修改,都严格分成三大阶段:先让它能工作 → 再把它做好 → 遵守工程实践。

阶段 1:先让它能工作(保证功能正确,最小改动)

这一阶段的核心是「懒惰协议」:最小修改、一处决策只写一次,禁止无意义重构。

  • TDD 准则:修改代码前先写失败测试,确认测试因为预期问题失败;只用最小改动让测试通过。

重点:如果写不出诚实有效的测试,不要强行凑一个劣质测试应付流程。

Bob 大叔明确:TDD 是适合人类的开发纪律,不适合强制套给 Agent,ub-mode 里的 TDD 是行为导向,不是死板的逐行交替。

  • 架构边界规范:数据只在入口处校验一次,进入业务内部直接信任;业务逻辑尽量封装为纯函数;用类型设计让非法状态根本无法被表达;外部数据只解析一次。

  • 幂等设计:操作重复执行、崩溃重试,最终状态保持一致;优先分离可变状态,尽量缩小共享写入范围。

  • 先减后加:新增任何逻辑之前,优先消除已有复杂度;不把新需求硬塞到旧设计里,从第一性原理重新思考方案。

阶段 2:再把它做好(质量校验,量化关卡)

功能跑通不等于代码合格,这一步就是 ub-mode 区别于普通 Prompt 的关键,全部绑定可检测指标:

  • 修复根因:只掩盖报错的防护判断不算修复,必须定位根源问题
  • 测试行为,而不是测试实现:测试站在使用者视角校验可观测输出,不能绑定内部实现细节
  • Crapper 校验:拆分函数、补充测试,保证每个函数 CRAP 分数<10
  • Dryer 校验:相似度 ≥0.8 的重复代码,需要合并、抽离公共逻辑
  • Mutator 变异测试:补全测试覆盖,杀死存活变异体,清理死代码
  • 重构原则:固定原有行为,只调整结构,依靠测试证明功能没有改动

阶段 3:工程实践(留痕、保护上下文、版本管理)

  • 完整日志:记录每一处改动、改动理由,任务结束输出变更报告
  • 保护上下文窗口:主线会话保持精简,细节放到外部工具,只保留摘要,规避中段丢失
  • 清理工作区:安全删除无用代码、文件,不改动未提交的开发内容
  • 提交规范:小批量、有序提交,每一条提交写明改动内容、验证方式,最后推送主线

风险提示:ub-mode 原文包含自动推送代码的指令。团队协作场景强烈建议关闭自动推送,增加人工审核节点,避免未经评审直接合并代码。

04 上手部署步骤

整套流程分为「快速试用」和「完整指标校验」两层,新手可以先跑轻量模式验证效果。

步骤 1:部署 SKILL.md(轻量模式,无需安装工具)

以 Claude 为例,其他支持 Skill 的 Agent 可对应调整目录

mkdir -p ~/.claude/skills/ub-mode
cp SKILL.md ~/.claude/skills/ub-mode/SKILL.md

重启 AI 助手,新开会话输入指令:/ub-mode

Agent 正常响应整套流程,代表 Skill 加载成功。

轻量模式短板:Crapper、Dryer、Mutator 的分数校验只会作为文本规则,没有真实指标输出,只能当作流程约束。

步骤 2:部署配套质检工具(完整生产模式)

克隆 Crapper、Dryer、Mutator 三个独立仓库,工具会自动创建虚拟环境 .venv

# 复杂度检测
./crapper --threshold 10 ./src

# 重复代码检测,对齐 ub-mode 要求 0.8,不是默认 0.82
./dryer --threshold 0.8 ./src

# 变异测试,只针对本次变更文件
./mutator --changed

工具输出结果统一写入 .metrics 目录,生成 crap.edn、dry.edn、变异快照,Agent 读取文件结果完成校验,不再靠 AI 自证质量。

步骤 3:日常使用范式

给 Agent 提需求时,搭配 ub-mode:

请开启 ub-mode,修复 XX 接口空指针问题;只做最小改动,完成后输出变更日志、测试结果、三项指标报告,禁止自动推送代码。

05 横向对比

现在社区热度最高两套 AI 编码 Skill:ub-mode、Ponytail,侧重点完全不同,适合不同团队:

  • ub-mode(Uncle Bob):强测试导向、量化质量指标、变异测试 + CRAP 复杂度、重视架构边界、适合对代码可维护性、长期技术债管控有要求的团队;适合后端、业务系统、长期迭代项目。
  • Ponytail:偏向精简、防过度设计、克制重构,约束 Agent 不要写冗余抽象,适合快速原型、脚本、一次性业务逻辑。

一句话选型:长期迭代、看重测试和可维护性 → ub-mode;快速写原型、避免过度抽象 → Ponytail。

同时对比传统 Prompt 方案:

  • 长 Prompt 规范:受中段丢失影响,规则容易被忽略,属于软性引导;
  • ub-mode:规则精简,核心约束交给外部确定性工具,不受上下文窗口衰减影响。

06 实战踩坑清单

  • ❎ 不要指望 ub-mode 自动搞定架构设计:复杂模块拆分、依赖规划,仍然需要人主导,AI 架构自动化目前无法落地
  • ❎ 不要直接开启自动推送:团队项目必须拦截自动 push,ub-mode 只是 Agent 工作规范,不能替代代码评审
  • ❎ 不要混淆 Dryer 阈值:工具默认 0.82,ub-mode 要求 0.8,参数不对会漏检重复代码
  • ❎ 不要迷信指标:CRAP、变异测试、重复度只是防线,无法覆盖越权、性能、业务逻辑理解偏差这类高阶问题,指标是兜底,不是万能药
  • ❎ 不要把 ub-mode 当成保姆:新人依然要手写代码、吃透软件工程基础,只靠指挥 Agent,无法识别代码腐烂、Agent 陷入困境的信号
  • ❎ 不要给 Agent 分配超大需求:延续敏捷思路,小步迭代,做完一小轮,人工复盘架构,再继续迭代,拒绝瀑布式前置规格驱动开发

07 总结

ub-mode 不是用来替代程序员,而是重新划分人机分工:

Agent 负责战术编码、反复执行枯燥的测试、重构、指标检查;

人负责战略层面:定义需求、设计模块边界、制定质量标准、判断指标之外的业务风险、把控整体架构。

Bob 大叔的警告直到今天依然有力:软件工程的底层基础,是人类用来拆解复杂系统的工具。AI 只是抬高了抽象层级,复杂度的底层规律没有消失。

你可以用 Agent 写代码,但如果你看不懂底层原理、分不清好架构和烂架构,当系统复杂度撞上天花板的时候,你会束手无策。

Prompt 约束治标,确定性工具和软件工程基础,才是治本。

项目地址:https://github.com/unclebob/ub-mode

标签 AI Agent 开源 GitHub TDD 代码整洁之道

评论

登录后才可评论

0 条评论

  • 暂无评论,来写第一条吧。