ub-mode 调研:Clean Code 之父给 coding agent 立规矩——6KB 仓库三天 3.2K 星,原则交给提示词、约束交给工具

111次阅读
ub-mode 调研:Clean Code 之父给 coding agent 立规矩——6KB 仓库三天 3.2K 星,原则交给提示词、约束交给工具

深度调研 + 真机冒烟 · 2026-10-28 · 环境:SKILL.md 装入 Claude Code 技能目录 + crapper 质量门自指实测 · 仓库:unclebob/ub-mode · 姊妹篇:《ThinkRail 调研》、《REA 调研》、《复刻开源仓库方法论》


写在前面

10 月 25 日,Robert C. Martin——《Clean Code》作者、软件圈尊称 ” 鲍勃大叔 ”——建了一个新仓库。没有描述、没有 License、没有发布公告,全部内容只有两个文件:一份 2.2KB 的 README 和一份 4KB 的 SKILL.md。三天,3,244 星 。这个叫 ub-mode 的仓库是给 AI coding agent 用的 ” 行为准则技能 ”:把鲍勃大叔四十年工程纪律压缩成一份 agent 可执行的提示词规范,外加三把确定性的质量卡尺。本站恰好刚写完 agent skills 生态 与逆向技能 REA,现在轮到这个赛道的分量最重的一位作者入场。本篇做三件事:拆 SKILL.md 的内容结构、实测配套质量工具 crapper、以及指出一个所有星标狂欢者都没提的问题——这个仓库本身没有 License。

一、解决什么问题:agent 写代码缺 ” 纪律层 ”

当下 coding agent 的能力清单里堆满了 ” 做什么 ”:写测试、跑命令、重构、提交。但几乎没有产品回答 ”以什么纪律做“——什么先做什么后做、复杂度上限在哪、重复代码容忍到什么程度、上下文窗口怎么节约。人类的资深工程师靠 years of scar tissue 内化这些纪律,agent 靠的是训练数据里良莠不齐的均值。ub-mode 的答案是把工程纪律做成三层:

  1. 原则层(提示词)——SKILL.md 用祈使句写下可执行的规则序列,agent 每次改代码都遵循 ”First Make it Work → Then Make it Right → Practice” 的顺序
  2. 约束层(工具)——光靠提示词 ” 建议 ” 复杂度要低是不够的,配套的 crapper/dryer/mutator 三把确定性卡尺把 CRAP 分数、重复度、变异存活率变成可测量的硬门禁
  3. 习惯层(实践)——记日志、守上下文窗口、清理 worktree、小步提交,这些 ” 工程师的肌肉记忆 ” 被显式写成 agent 的操作规程

二、项目名片

维度 数据(2026-10-28 实核)
仓库 unclebob/ub-mode · 3,244⭐(10-25 建仓,3 天)/ 158 forks / 无 License / 零描述 / 3 open issues
体量 全部内容 = 2 个文件:README.md(2,195B)+ SKILL.md(3,958B),共约 6KB——可能是趋势榜史上最小的仓库之一
作者 Robert C. Martin(unclebob),《Clean Code》作者,GitHub 17,822 关注者 / 106 个公开仓
提交史 仅 4 个 commit(10-25 一小时内完成):初始提交→文档化配套工具→注明血统→清理引用
配套工具 crapper(CRAP 分数,133⭐,0BSD)· dryer(重复检测,57⭐,0BSD)· mutator(变异测试,76⭐,0BSD)· uml-viewer(可视化,462⭐,无 License)
血统 README 明示 ”loosely based on portions of @poteto’s rules”——poteto 即 lauren(xAI 工程师、React Compiler 核心团队,1.4 万关注者)
安装 把 SKILL.md 复制进 ~/.claude/skills/ub-mode/(或 grok/cursor 同类目录),对话中 /ub-mode 激活

三、架构拆解:SKILL.md 三段论与三把卡尺

SKILL.md 的内容结构(全文精读)——它不是鸡汤合集,是高度可执行的规则序列:

第一段:First Make it Work(先能跑)——九组规则里最出彩的是几条直接针对 agent 痼疾的:Laziness Protocol(一个决策只活在一个地方;交付解决问题的最小改动)、Attack the Premise(当两个共享同一前提的修复都死在同一道门上,把那个前提写成一句话,数清楚哪些角色持着失衡——在换下一个修复之前先拆掉那个前提)、Subtract Before You Add(加任何东西之前先做减法)。架构节则是纯干货:让非法状态不可表达、边界处校验数据内部信任、业务逻辑留在纯函数、操作幂等、共享状态先分离再序列化。

第二段:Then Make it Right(再做对)——修根因(只藏住崩溃的 guard 不是修复)、测试行为而非实现(” 如果每个函数返回 void 测试还能过,扔掉它 ”)、然后点名三把工具:Crapper 把每个函数的 CRAP 压到 10 以下、Dryer 消灭相似度 ≥0.8 的重复块、Mutator 杀灭存活的变异体并删除死代码。

第三段:Practice(实践)——最有时代感的一节:Keep a Log(记录每个动作及理由,完成后汇报)、Guard the Context Window(主线程保持精瘦,大块头送去别处只留摘要——这是 Clean Code 时代不存在、agent 时代独有的纪律)、Worktree Cleanup、小步有序提交。

三把卡尺的数学 :crapper 的 CRAP 公式是 CRAP = CC² × (1−coverage)³ + CC(CC 为圈复杂度、coverage 为测试覆盖率)——立方项意味着 覆盖率是主导杠杆:一个 CC=10 的函数,覆盖率 0% 时 CRAP=901,覆盖率 100% 时 CRAP=10。工具支持 Clojure/Java/Go/TypeScript/Rust/Python 六语言,一跑扫全树,输出最差函数排名。

四、真机实测:装 skill + crapper 自指冒烟

ubmode-lab 场(本机 Claude Code 技能目录 + crapper 源码克隆):

安装:SKILL.md 经 gh api 落入 ~/.claude/skills/ub-mode/SKILL.md(3,958 字节,与仓库逐字节一致)——按官方 README 的路径约定即装即用,无需任何构建。

crapper 冒烟 走了一段弯路(如实记录):直接分析 nanoid 时卡在 tree-sitter 语法包在线下载超时(本机对 GitHub 大文件限速 ~43KB/s 的老问题),直连与代理预热各失败一次;最后对整个 crapper 运行加代理环境变量(HTTPS_PROXY=socks5://127.0.0.1:10808)跑通——分析对象换成 crapper 自己的源码(自指测试):

CRAP Report (Languages: python, --no-coverage)
parse_args      crapper.cli     CC=16   CRAP N/A   ← 全库最差
_changed_files  crapper.cli     CC=9    CRAP N/A
percent_for     coverage        CC=9    CRAP N/A
_walk           discover        CC=9    CRAP N/A(共 19+ 函数上榜,CC 7-16 区间)

三个发现:① 工具真实可用——六语言识别、最差优先排序、阈值退出码一应俱全;② 最诚实的部分:parse_args CC=16,超过 ub-mode 自己定下的 CRAP<10 门槛——大叔的工具抓到了大叔代码里的复杂度热点(CLI 参数解析函数天然复杂,但这正是 "纪律要靠工具而非名望维护" 的活证据);③ –no-coverage 模式下 CRAP 列为 N/A——没有覆盖率数据就没有 CRAP 分数,立方公式必须吃覆盖输入,这也解释了 ub-mode 为什么把 mutator(变异测试逼近真实覆盖)列为配套。

五、数字与证据

  • 增长 :3 天 3,244 星、158 fork、4 commit 零营销——纯 ” 作者声誉 × 时代情绪 ” 的病毒传播;对比本站写过的 dsh(大厂背书 26 万星)与 HowToLiveBetter(社区协作 68K 星),ub-mode 证明 个人声望在 agent 技能时代仍是第一分发渠道
  • 配套工具的日期线索 :crapper/dryer/mutator 均建于 2026-09-30—— 先造工具、后发宣言,ub-mode 是工具链成熟后才公开的 ” 说明书 ”,不是拍脑袋的 prompt
  • 血统的诚实:README 主动注明源自 poteto 的规则(而非隐匿借鉴)——4 个 commit 里有一条专门做这个署名,学术式礼仪在 GitHub 上罕见
  • 星标结构异常:主仓 3,244⭐ 而配套工具 crapper 仅 133⭐——大多数给星的人给的是 ”Clean Code 之父入场 agent 时代 ” 这个符号,而非工具链本身

六、生态位:从《Clean Code》到 SKILL.md,纪律的第三次封装

把鲍勃大叔的输出形态排成时间线:2008 年《Clean Code》(纪律封装给人读的书)→ cleancoder.com 博客与 Clean Coder 系列(纪律封装给团队听的课)→ 2026 年 ub-mode(纪律封装给 agent 执行的技能)。三次封装的内容高度同构(小函数、好命名、测试先行、根因修复),但约束力递增:书靠读者自觉,课靠团队文化,skill 靠确定性工具硬门禁 ——这正是它与前两次的本质区别,也与本站 复刻方法论 的 ” 差分对拍 ” 哲学同源:凡能测量的不要劝告,凡能门禁的不要提示。

放进本站 agent 生态地图:ThinkRail 的 living specs 管项目知识、context-mode 管上下文供给、mem0 管记忆、ub-mode 管 行为纪律 ——agent 的 ” 工程素养层 ” 第一次有了权威来源。值得玩味的是路线差异:REA 用 39.7 万星做 MCP 大一统,ub-mode 用 6KB 做最小主义—— 这个赛道同时容得下最重和最轻。

七、风险与坑

  1. 主仓无 License(本篇最大的坑)——GitHub API license 字段为 null,无 LICENSE 文件即默认 ” 保留所有权利 ”:可以阅读、可以按 README 自用安装,但 正式的再分发、修改再发布、商用集成在法律上未被授权 。按本站 许可证决策树 ,这属于 ” 先问再拿 ” 档——讽刺的是,配套工具反而全是 0BSD(近公有领域)。给星标狂欢者的提醒: 没有 License 的 3.2K 星仓库,星标不构成使用权
  2. rules-loosely-based 的边界模糊——”loosely based on poteto’s rules” 的授权状态同样未声明;poteto 原仓未在本次检索中定位到公开版本
  3. crapper 的覆盖依赖——CRAP 分数需要覆盖率输入(--no-coverage 下 N/A),意味着完整门禁要接测试覆盖率管道;CI 集成成本自理
  4. Clojure 血统的倾向——工具链从 crap4clj 演化而来,uml-viewer 干脆是 Clojure(Quil)写的;非 Clojure 用户体验属二等优先
  5. 三天空窗期的成熟度——4 个 commit、3 个 issue、无 release、无版本号;规则集本身大概率还会变动(作者在 README 里已做了一轮引用清理)
  6. download 超时坑——crapper 依赖 tree-sitter-language-pack 按需下载语法包(GitHub 大文件),弱网环境会像我一样卡死;解法是代理环境变量或预下载

八、总结

调研 + 实测结论:ub-mode 是 ”Clean Code 之父入场 agent 时代 ” 的宣言式作品——6KB 的 SKILL.md 把四十年工程纪律压成 agent 可执行的三段论,配三把确定性卡尺把 ” 建议 ” 变成 ” 门禁 ”;本机安装即用,crapper 自指冒烟通过(还诚实地抓到了自家 CC=16 的热点)。但主仓无 License 是悬顶之剑:星标狂欢之外,正式商用前请先等一份授权文本。

  • 适合现在就装:个人开发者与 agent 重度用户——按 README 自用安装无法律疑虑,三段论规则立竿见影
  • 务必注意:企业级铺开前等 License;CRAP 门禁要配覆盖率管道才完整
  • 行业信号:本站判断这是 ”agent 工程素养层 ” 的开山事件——如果鲍勃大叔的路线被验证,下一波入场的是更多 ” 传统工程权威 × agent 技能 ” 的组合,纪律的封装战争刚刚开始

下一观察点:License 是否补齐、crapper/dryer/mutator 的版本化发布、poteto 原规则仓是否公开、以及 SKILL.md 规则集的迭代频率——一个 4 commit 的仓库能长成什么,三个月后见分晓。


参考与延伸

by 飞熊 · yunying(增长运营官)· 全部数字来自 2026-10-28 GitHub API 实核与本机 ubmode-lab 冒烟日志(SKILL.md 3,958 字节安装 + crapper CRAP 报告可复查)

正文完