独家揭秘!Google 工程师都在用的 AI 编码技能框架到底有多强?
当 Claude Code、Cursor、Windsurf 都在追逐"更快更强"时,Google 工程师 Addy Osmani 悄然放出了一个让整个 AI 编码圈地震的技能框架——agent-skills。它不仅重新定义了 AI 编程的工作流程,更把 Google 十年工程实践的精髓全部装进了这几个 Markdown 文件里。今天,我们就来深扒这个项目,看看它到底有什么魔力能让 15,910 颗星星在一周内暴涨。
一、为什么我们需要 AI 编码技能框架?
在开始深入 agent-skills 之前,我想先聊聊我自己踩过的一个大坑。
1.1 我的血泪史:从" AI 写得快"到" AI 写得烂"
去年我用 Claude Code 做一个后台管理系统,AI 确实写得飞快,三个小时搞定了原计划三天的工作量。我美滋滋地提交代码、合并 PR、准备上线——然后事故就来了。
线上报错的频率比需求文档更新还快。用户登录偶发失效、报表导出跑到超时、数据统计永远对不上。最离谱的是,有一个 SQL 注入漏洞被安全团队扫描出来了,当时我的脸都绿了。
我复盘了一下,问题根源在哪里?AI 写得快,但它不懂"工程" 。它不知道:
- 什么样的代码该有什么样的测试覆盖
- 哪些边界情况必须考虑
- 安全红线在哪里
- 性能陷阱在何方
这不是 AI 的错,是我的错——我没有给 AI 一个真正的"工程师思维框架"。
1.2 agent-skills 的诞生背景
这就是 agent-skills 出现的意义。它不是一堆提示词,而是一套完整的工程技能体系,把资深工程师的思维模式、工作流程、质量标准,全部编码成了 AI 可执行的技能。
这个项目有多火?让我给你一组数据:
| 指标 | 数据 |
|---|---|
| GitHub Stars | 15,910+ (且在快速增长) |
| 本周 Stars | 6,693 |
| 支持的 IDE | Claude Code, Cursor, Gemini CLI, Windsurf, OpenCode, Codex |
| 技能数量 | 20 个核心技能 + 3 个专家角色 + 4 个参考清单 |
而且这个项目的作者是 Addy Osmani——Google Chrome 团队的核心工程师,曾主导 PWA、 Lighthouse 等知名项目。他把自己在 Google 学到的工程实践,全部沉淀进了这几个 Markdown 文件。
二、核心架构:六阶段开发模型
agent-skills 把软件工程划分为六个阶段,每个阶段对应不同的技能:
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ Idea │ ──▶ │ Spec │ ──▶ │ Code │ ──▶ │ Test │ ──▶ │ QA │ ──▶ │ Go │
│Refine│ │ PRD │ │ Impl │ │Debug │ │ Gate │ │Live │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘
对应的 7 个 slash 命令:
| 命令 | 功能 | 核心原则 |
|---|---|---|
| /spec | 编写规格说明书 | 规格先行 |
| /plan | 规划任务分解 | 小而原子 |
| /build | 增量构建 | 一次一个切片 |
| /test | 测试验证 | 测试即证明 |
| /review | 代码审查 | 提升代码健康度 |
| /code-simplify | 简化代码 | 清晰 > 巧妙 |
| /ship | 交付上线 | 更快更安全 |
三、核心技术技能深度解析
3.1 规格驱动开发(Spec-Driven Development)
这是整个框架的基石。我愿称之为"AI 编程最重要的技能,没有之一"。
3.1.1 核心工作流
SPECIFY ──→ PLAN ──→ TASKS ──→ IMPLEMENT
│ │ │ │
▼ ▼ ▼ ▼
Human Human Human Human
reviews reviews reviews reviews
关键点:
- 在写任何代码之前,必须先写规格说明书
- 规格是人和 AI 之间的"共享事实来源"
- 代码没有规格 = 猜测
3.1.2 规格模板(可以直接抄)
# Spec: [项目/功能名称]
## Objective
[我们要构建什么,为什么。用户故事或验收标准。]
## Tech Stack
[框架、语言、关键依赖及版本]
## Commands
[构建、测试、lint、开发命令]
Build: npm run build
Test: npm test -- --coverage
Lint: npm run lint --fix
## Project Structure
[目录结构及说明]
src/ → 应用源码
src/components → React 组件
src/lib → 共享工具
tests/ → 单元和集成测试
## Code Style
[代码示例 + 关键约定]
## Testing Strategy
[测试框架、位置、覆盖率要求、测试级别]
## Boundaries
- Always: [必须做的]
- Ask first: [需要先问的]
- Never: [绝对不能做的]
## Success Criteria
[如何判断完成——具体、可测试的条件]
## Open Questions
[任何需要人工输入的未解决问题]
3.1.3 我的使用感受
讲真,我以前觉得写规格是浪费时间。现在用了 agent-skills 之后,我的想法完全变了。
上周我让 Claude Code 做一个文件上传功能。按照老习惯,我直接说"帮我做个文件上传功能,支持 PDF 和图片,大小限制 10MB"。
结果 AI 做了两版都不满意。第一版用了 AWS S3,第二版用了本地存储,但业务场景需要的是阿里云 OSS。
如果我用了 /spec 技能,AI 会先问我:
- 你希望文件存储在哪里?S3?本地?还是云存储?
- 有没有文件类型白名单?
- 上传失败要不要重试?重试策略是什么?
- 大文件要不要分片?
这就是规格的力量——它把模糊的需求变成了可执行的验收标准。
3.2 测试驱动开发(TDD)
这是让我最惊艳的技能。agent-skills 把 Google 内部测试实践完整搬出来了。
3.2.1 红绿重构循环
RED ──→ GREEN ──→ REFACTOR
│ │ │
▼ ▼ ▼
测试失败 代码通过 重构优化
3.2.2 测试金字塔
╱╲
╱ ╲ E2E 测试 (~5%)
╱ ╲ 完整用户流程,真浏览器
╱──────╲
╱ ╲ 集成测试 (~15%)
╱ ╲ 组件交互,API 边界
╱────────────╲
╱ ╲ 单元测试 (~80%)
╱ ╲ 纯逻辑,隔离,毫秒级
──────────────────
3.2.3 Beyonce 规则
"If you liked it, you should have put a test on it."
基础设施变更、重构、迁移——这些不是测试的责任来catch你的bug,你自己要负责。如果一个变更破坏了代码而你没有测试覆盖,那就是你的问题。
3.2.4 状态测试 vs 交互测试
// ✅ 正确:测试函数做什么(状态测试)
it('returns tasks sorted by creation date, newest first', async () => {
const tasks = await listTasks({ sortBy: 'createdAt', sortOrder: 'desc' });
expect(tasks[0].createdAt.getTime())
.toBeGreaterThan(tasks[1].createdAt.getTime());
});
// ❌ 错误:测试函数内部如何工作(交互测试)
it('calls db.query with ORDER BY created_at DESC', async () => {
await listTasks({ sortBy: 'createdAt', sortOrder: 'desc' });
expect(db.query).toHaveBeenCalledWith(
expect.stringContaining('ORDER BY created_at DESC')
);
});
为什么重要? 交互测试会在你重构时失败,即使行为完全没变。状态测试只关心输入输出,不关心内部实现。
3.2.5 DAMP over DRY
在生产代码中,DRY(Don't Repeat Yourself)是正确的。但在测试中,DAMP(Descriptive And Meaningful Phrases)更好:
// ✅ DAMP:每个测试独立可读
it('rejects tasks with empty titles', () => {
const input = { title: '', assignee: 'user-1' };
expect(() => createTask(input)).toThrow('Title is required');
});
it('trims whitespace from titles', () => {
const input = { title: ' Buy groceries ' };
const task = createTask(input);
expect(task.title).toBe('Buy groceries');
});
// ❌ 过度 DRY:共享设置掩盖了每个测试实际验证的内容
3.2.6 实战代码:Bug 复现模式
当收到 bug 报告时,不要直接修复。按这个流程来:
// 步骤 1:写一个复现测试(应该 FAIL)
it('sets completedAt when task is completed', async () => {
const task = await taskService.createTask({ title: 'Test' });
const completed = await taskService.completeTask(task.id);
expect(completed.status).toBe('completed');
expect(completed.completedAt).toBeInstanceOf(Date); // 这里会失败!
});
// 步骤 2:修复 bug
export async function completeTask(id: string): Promise<Task> {
return db.tasks.update(id, {
status: 'completed',
completedAt: new Date(), // 之前漏掉了
});
}
// 步骤 3:测试通过 → bug 修复 + 回归防护
3.3 代码简化(Code Simplification)
这个技能解决了一个经典问题:为什么 AI 写的代码能跑但看不懂?
3.3.1 Chesterton's Fence(切斯特顿栅栏)
"如果你要拆掉一条栅栏,必须先理解它为什么存在。"
AI 经常在不理解业务背景的情况下"优化"代码。这个技能强制 AI 在简化之前先理解代码的原始意图。
3.3.2 500 行规则
每个文件不超过 500 行。如果超过,问自己:
- 能拆分成更小的模块吗?
- 有重复代码可以提取吗?
- 注释和文档能帮助理解吗?
3.3.3 简化检查清单
- [ ] 函数是否只有一个职责?
- [ ] 变量命名是否清晰?(不包含 ai、temp、data 这种泛泛之名)
- [ ] 是否有隐藏的副作用?
- [ ] 复杂逻辑能否用更简单的表达?
- [ ] 是否有不必要的抽象?(过度工程)
- [ ] 错误处理是否清晰?
3.4 调试与错误恢复
这是每个 AI 编程者的痛。agent-skills 提出了一个五步诊断法:
┌─────────────┐
│ 1. Reproduce│ 复现问题
└──────┬──────┘
▼
┌─────────────┐
│ 2. Localize │ 定位范围
└──────┬──────┘
▼
┌─────────────┐
│ 3. Reduce │ 简化问题
└──────┬──────┘
▼
┌─────────────┐
│ 4. Fix │ 修复
└──────┬──────┘
▼
┌─────────────┐
│ 5. Guard │ 防护
└─────────────┘
核心原则
- Stop-the-line 规则:任何测试失败都要立即停止,直到问题被解决
- Safe Fallbacks:修复时要考虑降级方案
- Zero-Trust Console:生产代码必须零控制台错误和警告
四、安装与实战
4.1 Claude Code 安装(推荐)
# 从 Marketplace 安装
/plugin marketplace add addyosmani/agent-skills
/plugin install agent-skills@addy-agent-skills
# 如果遇到 SSH 错误(没有配置 SSH key)
git config --global url."https://github.com/".insteadOf "git@github.com:"
# 本地开发
git clone https://github.com/addyosmani/agent-skills.git
claude --plugin-dir /path/to/agent-skills
4.2 Cursor 安装
将任意 SKILL.md 复制到 .cursor/rules/ 目录,或者直接引用 skills/ 目录。
4.3 Gemini CLI 安装
# 从仓库安装
gemini skills install https://github.com/addyosmani/agent-skills.git --path skills
# 从本地克隆安装
gemini skills install ./agent-skills/skills/
4.4 Windsurf 安装
将技能内容添加到 Windsurf rules 配置中。详见 docs/windsurf-setup.md。
五、我的踩坑记录与解决方案
5.1 坑 1:SSH 密钥问题
问题:按照官方文档安装时出现 Permission denied (publickey) 错误。
原因:Marketplace 通过 SSH clone 仓库,但用户没有配置 GitHub SSH key。
解决方案:
# 方案 1:配置 SSH key(推荐)
# 生成密钥
ssh-keygen -t ed25519 -C "your_email@example.com"
# 添加到 GitHub:https://github.com/settings/keys
# 方案 2:全局切换到 HTTPS
git config --global url."https://github.com/".insteadOf "git@github.com:"
5.2 坑 2:技能没有被激活
问题:安装了技能但 AI 没有按照技能工作。
原因:没有使用正确的 slash 命令,或者 IDE 没有正确加载技能。
解决方案:
- 使用 /spec、/plan、/build 等命令显式激活
- 检查 IDE 是否支持该技能(Claude Code 支持最好)
- 查看 .claude/commands/ 目录确认命令已注册
5.3 坑 3:技能覆盖不完整
问题:某些场景没有对应的技能。
原因:agent-skills 目前主要针对 Web/前端开发场景。
解决方案:
- 参考 docs/skill-anatomy.md 创建自定义技能
- 可以在 skills/ 目录下添加新的技能
六、与传统开发流程的对比
| 维度 | 传统开发 | AI 开发 + agent-skills |
|---|---|---|
| 规格文档 | 有,但常过时 | 实时更新,与代码同步 |
| 测试覆盖 | 靠自觉 | 技能强制要求 |
| 代码审查 | 人工 | 自动化 + 人工 |
| 调试 | 靠经验 | 五步诊断法结构化 |
| 上线 | 手动部署 | 自动化流水线 |
七、相关论文与参考资料
agent-skills 吸收了 Google 十余年的工程实践,相关论文和资料包括:
-
《 Software Engineering at Google》
- 作者:Titus Winters, Tom Manshreck, Hyrum Wright
- 链接:abseil.io/resources/s…
- 贡献:测试金字塔、Beyonce 规则、代码审查规范
-
Google Engineering Practices
- 链接:google.github.io/eng-practic…
- 贡献:Code Review 指南、TDD 最佳实践
-
Hyrum's Law(黑尔斯定律)
- 描述:API 的可见行为,即使未文档化,也会被用户依赖
- 相关论文:www.hyrulslaw.com/
-
Chesterton's Fence(切斯特顿栅栏)
- 起源:G.K. Chesterton 的文学作品
- 应用于软件工程:任何代码改动前需先理解其存在理由
八、总结:为什么这个项目值得你关注?
8.1 核心价值
- 工程化 AI 编程:把资深工程师的思维框架变成 AI 可执行的技能
- 多 IDE 支持:Claude Code、Cursor、Gemini CLI、Windsurf 都能用
- 实战验证:源自 Google 真实工程实践,已经过大量项目验证
- 持续迭代:活跃开发中,每周都有更新
8.2 我的推荐
- 如果你用 Claude Code:一定要安装,这是目前支持最好的
- 如果你用 Cursor:把核心技能复制到 .cursor/rules/
- 如果你做前端:frontend-ui-engineering 和 testing-patterns 是必读
8.3 行动建议
- 今天就安装 agent-skills
- 用 /spec 命令写一个完整的需求规格
- 用 /test 命令写测试,然后实现功能
- 感受一下"AI 也能写出生产级代码"的体验
参考资料:
- GitHub: github.com/addyosmani/…
- Addy Osmani Twitter: twitter.com/addyosmani
- 软件工程 at Google: abseil.io/resources/s…
本文由 AI 辅助编写,使用 agent-skills 进行工程流程管理。