Skip to content

第8章:最佳实践与反模式 - 经验总结

前人栽树,后人乘凉;前人踩坑,后人避坑

本章导读

通过前7章的学习,你已经掌握了技能包的核心设计模式。本章将总结最佳实践、指出常见陷阱,帮助你设计出高质量、可维护的技能包。

你将学到

  • ✅ 技能设计的8大原则
  • ✅ 10种常见反模式与规避方法
  • ✅ 如何设计自己的技能包生态系统
  • ✅ 技能包协作的未来趋势

8.1 技能设计原则

原则 1:单一职责原则(SRP)

markdown
# 一个技能只做一件事

✅ Good:
  - verification: 只验证
  - tdd: 只测试驱动开发
  - review: 只审查

❌ Bad:
  - do-everything: 验证 + 测试 + 审查 + 部署

判断标准:
  能否用一句话描述这个技能的目的?
  如果包含"和"、"以及",说明职责过多。

原则 2:明确边界原则

markdown
# 清晰的输入输出

每个技能必须有:

Input:
  - 明确需要什么
  - 从哪里获取

Output:
  - 明确产出什么
  - 如何被使用

示例:

writing-plans:
  Input: requirements document
  Output: implementation plan (task_plan.md)

verification:
  Input: goal file path
  Output: pass/fail + missing items

原则 3:无状态原则

markdown
# 技能不应维护状态

❌ Bad:
  skill remembers:
    - how many times called
    - previous results
    - user preferences

✅ Good:
  skill is stateless:
    - each invocation is independent
    - no memory of previous calls
    - pure functional

优势:
  - 易于测试
  - 可并发执行
  - 结果可预测

原则 4:可测试原则

markdown
# 每个技能都应该可独立测试

测试清单:
  □ 能否独立调用?
  □ 输入是否明确?
  □ 输出是否可验证?
  □ 错误是否可捕获?
  □ 边界条件是否处理?

示例测试:

def test_verification():
    result = verification(
        goal_file="goals/test-goal.md",
        ai_assessment="Completed all tasks"
    )

    assert result['status'] in ['pass', 'fail']
    assert isinstance(result['missing_items'], list)

原则 5:错误处理原则

markdown
# 优雅的错误处理

必须包含:
  1. 捕获异常
  2. 提供清晰的错误信息
  3. 建议修复方案
  4. 记录日志

示例:

try:
    result = execute_skill()
except SkillExecutionError as e:
    logger.error(f"Skill execution failed: {e}")
    return {
        'status': 'error',
        'message': 'Failed to execute skill',
        'reason': str(e),
        'suggestion': 'Check skill configuration and try again'
    }

原则 6:可组合原则

markdown
# 技能应该易于组合

设计考虑:
  - 输出能否作为其他技能的输入?
  - 是否定义了标准的接口?
  - 是否支持链式调用?

示例:

brainstorming 输出:
  - design_doc.md

writing-plans 输入:
  - requirements: design_doc.md

链式调用:
  brainstorming → writing-plans → executing-plans

原则 7:幂等性原则

markdown
# 多次执行结果相同

重要!特别是涉及文件操作时:

✅ Good:
  create_file_if_not_exists(path)
  - 第一次:创建文件
  - 第二次:文件已存在,不创建
  - 结果:文件存在

❌ Bad:
  append_to_file(path, content)
  - 第一次:追加内容
  - 第二次:再次追加
  - 结果:内容重复

解决方案:
  检查状态,避免重复操作

原则 8:可观测原则

markdown
# 技能执行过程应该可见

必须记录:
  1. 开始时间
  2. 执行步骤
  3. 关键决策
  4. 结束时间
  5. 结果状态

示例日志:

[2024-03-24 14:30:15] Starting verification
[2024-03-24 14:30:16] Reading goal file: test-goal.md
[2024-03-24 14:30:17] Checking tests... PASSED
[2024-03-24 14:30:18] Checking requirements... PASSED
[2024-03-24 14:30:19] Checking docs... FAILED (missing updates)
[2024-03-24 14:30:20] Verification result: FAIL
[2024-03-24 14:30:21] Missing items: [Update README, Update CHANGELOG]

8.2 常见反模式

反模式 1:上帝技能(God Skill)

markdown
# 问题:一个技能做所有事情

❌ Example:

name: ultimate-development-skill
does:
  - planning
  - coding
  - testing
  - deployment
  - monitoring
  - everything

问题:
  - 职责过多
  - 难以维护
  - 无法复用
  - 测试困难

✅ Solution:

拆分为多个技能:
  - planning-skill
  - coding-skill
  - testing-skill
  - deployment-skill
  - monitoring-skill

反模式 2:过度抽象

markdown
# 问题:为了抽象而抽象

❌ Example:

BaseSkill → AbstractSkill → GenericSkill → ConcreteSkill

层级太多,理解成本高

✅ Solution:

保持简单:
  Skill (interface) → ConcreteSkill (implementation)

两层足够

反模式 3:隐藏的依赖

markdown
# 问题:技能之间有隐式依赖

❌ Example:

skill_a 隐式依赖 skill_b 的全局变量
但文档中没有说明

问题:
  - 执行顺序不可预测
  - 难以调试
  - 无法并行

✅ Solution:

显式声明依赖:

skill_a:
  depends_on: [skill_b]
  input: skill_b.output

反模式 4:配置地狱

markdown
# 问题:配置项过多

❌ Example:

skill 需要配置 50 个参数:
  - param1
  - param2
  - ...
  - param50

用户不知道如何配置

✅ Solution:

提供合理默认值:

skill:
  required_params: [name]  # 必须配置
  optional_params:
    - timeout: 3600  # 有默认值
    - retry: 3       # 有默认值

反模式 5:过度并行

markdown
# 问题:不必要地并行化

❌ Example:

并行执行 100 个小任务

问题:
  - Agent 启动开销大
  - 资源消耗过多
  - 实际效率降低

✅ Solution:

评估是否值得并行:

IF 任务数 < 3:
  Sequential execution

ELIF 任务独立 AND 资源充足:
  Parallel execution (max 10 agents)

ELSE:
  Batch processing

反模式 6:魔法数字

markdown
# 问题:代码中的硬编码数字

❌ Example:

if result.score > 85:
    pass

为什么是 85?为什么不是 80 或 90?

✅ Solution:

使用命名常量:

PASS_THRESHOLD = 85  # Based on industry standard

if result.score > PASS_THRESHOLD:
    pass

反模式 7:错误的消息传递

markdown
# 问题:错误信息不明确

❌ Example:

Error: Operation failed

用户不知道:
  - 什么操作失败?
  - 为什么失败?
  - 如何修复?

✅ Solution:

提供详细的错误信息:

Error: Verification failed
Reason: 3 tests did not pass
Details:
  - test_login: AssertionError at line 45
  - test_api: TimeoutError after 30s
  - test_db: ConnectionError
Suggestion: Run tests locally to debug

反模式 8:过早优化

markdown
# 问题:在需要之前就优化

❌ Example:

为了"可能的高并发"而设计复杂的缓存系统

但实际用户只有 1-2 个

✅ Solution:

先让它工作,再优化:

1. Make it work (MVP)
2. Measure performance
3. Identify bottlenecks
4. Optimize where needed

"Premature optimization is the root of all evil"
- Donald Knuth

反模式 9:忽视边界条件

markdown
# 问题:不考虑边界情况

❌ Example:

def process_file(path):
    content = read_file(path)
    return process(content)

如果:
  - path 不存在?
  - file 为空?
  - file 过大?
  - 没有权限?

都会崩溃

✅ Solution:

处理所有边界条件:

def process_file(path):
    # Check existence
    if not os.path.exists(path):
        raise FileNotFoundError(path)

    # Check size
    size = os.path.getsize(path)
    if size > MAX_FILE_SIZE:
        raise FileTooLargeError(size)

    # Check permission
    if not os.access(path, os.R_OK):
        raise PermissionError(path)

    # Process
    content = read_file(path)
    return process(content)

反模式 10:文档缺失

markdown
# 问题:技能没有文档

❌ Example:

技能代码写好了,但没有说明:
  - 如何使用
  - 输入输出是什么
  - 有什么限制

用户无法使用

✅ Solution:

提供完整文档:

---
name: skill-name
description: What this skill does
---

# Usage

## Input
- param1: Description
- param2: Description

## Output
- result: Description

## Examples

Example 1:

Invoke skill with: param1: value1 param2: value2


## Limitations
- Cannot handle X
- Requires Y

8.3 如何设计自己的技能包生态系统

步骤 1:需求分析

markdown
# 识别你的需求

问自己:
  1. 我经常做什么重复性工作?
  2. 哪些流程可以标准化?
  3. 哪些工具需要集成?
  4. 哪些最佳实践需要固化?

示例:
  - 代码审查流程 → code-review skill
  - 部署流程 → deployment skill
  - 文档更新流程 → documentation skill

步骤 2:架构设计

markdown
# 设计技能包架构

1. 识别技能类型:
   - 入口技能(Entry)
   - 流程技能(Process)
   - 工具技能(Tool)
   - 守护技能(Guardian)

2. 定义技能关系:
   - 依赖关系
   - 调用关系
   - 互斥关系

3. 画出架构图:

┌─────────────────────────┐
│    Entry Skills         │
├─────────────────────────┤
│    Process Skills       │
├─────────────────────────┤
│    Tool Skills          │
├─────────────────────────┤
│    Guardian Skills      │
└─────────────────────────┘

步骤 3:技能实现

markdown
# 实现每个技能

遵循模板:

---
name: skill-name
description: Clear description
TRIGGER when: [conditions]
---

# Skill Name

## Purpose
What this skill does

## Input
What it needs

## Output
What it produces

## Steps
1. Step 1
2. Step 2
3. Step 3

## Error Handling
How errors are handled

## Examples
Usage examples

步骤 4:测试验证

markdown
# 测试你的技能

单元测试:
  □ 测试单个技能的功能
  □ 测试边界条件
  □ 测试错误处理

集成测试:
  □ 测试技能之间的协作
  □ 测试完整流程
  □ 测试性能

用户测试:
  □ 让其他开发者试用
  □ 收集反馈
  □ 迭代改进

步骤 5:持续维护

markdown
# 维护你的技能包

定期:
  - 更新依赖
  - 修复 bug
  - 添加新功能
  - 改进文档
  - 收集用户反馈

版本管理:
  - 使用语义化版本
  - 记录 CHANGELOG
  - 维护向后兼容性

8.4 技能包协作的未来趋势

趋势 1:AI 驱动的智能编排

markdown
未来方向:

AI 自动判断:
  - 应该调用哪个技能
  - 技能之间的最优顺序
  - 是否需要并行执行

示例:
  AI 分析用户需求 → 自动生成技能调用流程

趋势 2:跨平台技能共享

markdown
未来方向:

技能市场:
  - 发布你的技能
  - 发现他人的技能
  - 评价和推荐

标准化接口:
  - 统一的技能格式
  - 跨平台兼容
  - 即插即用

趋势 3:自适应学习

markdown
未来方向:

技能自学习:
  - 记录执行历史
  - 分析成功率
  - 自动优化参数

个性化调整:
  - 适应用户习惯
  - 优化执行策略
  - 提供个性化建议

趋势 4:可视化编排

markdown
未来方向:

图形化界面:
  - 拖拽式技能组合
  - 流程可视化
  - 实时监控

调试工具:
  - 断点调试
  - 单步执行
  - 变量查看

本章小结

本章总结了:

  1. 8大设计原则:单一职责、明确边界、无状态、可测试、错误处理、可组合、幂等性、可观测

  2. 10种常见反模式:上帝技能、过度抽象、隐藏依赖、配置地狱、过度并行、魔法数字、错误消息、过早优化、边界条件、文档缺失

  3. 设计流程:需求分析 → 架构设计 → 技能实现 → 测试验证 → 持续维护

  4. 未来趋势:AI 编排、跨平台共享、自适应学习、可视化编排


课程总结

恭喜你完成了《技能包设计模式:从理论到实践》课程!

你现在掌握了:

  • ✅ 技能包的核心设计理念
  • ✅ 8种经典设计模式的应用
  • ✅ 最佳实践与反模式识别
  • ✅ 设计自己技能包生态系统的能力

下一步行动

  1. 选择一个实际项目
  2. 应用学到的模式
  3. 设计你的第一个技能包
  4. 持续迭代改进

记住

  • 实践出真知
  • 时间是检验真理的唯一标准
  • 用AI,但不盲从
  • 辩证统一,不神话不妖魔化

延伸阅读

最终练习

  1. 实践项目:选择一个你经常做的工作流程,设计一个技能包来自动化它。

  2. 技能审查:审查一个现有的技能包,识别其中的设计模式和反模式。

  3. 生态系统:为你的团队设计一个技能包生态系统架构图。


感谢你的学习!现在去创造属于你自己的技能包吧! 🚀

MIT Licensed