共计 1894 个字符,预计需要花费 5 分钟才能阅读完成。
用户故事:没有 skill 的日子
记得刚入行时接手过一个用户管理系统,登录、注册、权限校验的逻辑全挤在同一个 500 行的 auth.py 文件里。当需要给移动端单独开发短信登录时,我不得不复制粘贴大半代码,结果两个地方的密码加密逻辑后来出现了不一致。更糟的是,当老板突然要求增加第三方 OAuth 登录时,我发现这些散落在各处的认证逻辑像一团乱麻——这就是典型的 模块耦合 和复用困难 问题。

什么是 skill?
Skill 不是单纯的技术名词,而是一种设计哲学。它必须具备三大特征:
- 可组合性(Composable):像乐高积木一样能自由拼接,比如用户认证 skill 可以无缝对接权限管理 skill
- 原子性(Atomic):每个 skill 只解决一个具体问题,比如发送验证码 skill 不应该包含验证逻辑
- 上下文无关性(Context-Free):不依赖外部状态,同样的输入永远得到相同输出
与普通函数 / 类的区别在于:
- 函数可能是过程式的,而 skill 强制接口契约
- 类比 skill 更重,常包含状态管理
- 微服务是物理隔离,skill 是逻辑隔离
实战:用户认证 skill
下面用 Python 实现一个生产可用的认证 skill(关键代码已简化):
# 行号 1 -30
from datetime import datetime, timedelta
import jwt
from functools import wraps
class AuthSkill:
"""契约式定义:必须实现 validate 和 generate_token"""
def __init__(self, secret_key):
self.secret_key = secret_key
@staticmethod
def concurrency_guard(func):
"""装饰器:防止高频并发调用"""
locks = {}
@wraps(func)
def wrapper(*args, **kwargs):
key = f'{func.__name__}_{args[1]}' # 以用户名作为锁键
if key not in locks:
locks[key] = threading.Lock()
with locks[key]:
return func(*args, **kwargs)
return wrapper
@concurrency_guard
def validate(self, username, password):
if not 6 <= len(password) <= 20:
raise ValueError("密码长度需 6 -20 位")
# 实际项目会查数据库
return username == "admin" and password == "123456"
def generate_token(self, user_id, expires=3600):
payload = {
'user_id': user_id,
'exp': datetime.utcnow() + timedelta(seconds=expires)
}
return jwt.encode(payload, self.secret_key, algorithm='HS256')
这个实现体现了几个关键点:
- 通过类方法显式声明契约(类似接口)
- 使用装饰器处理并发问题
- 输入验证与业务逻辑分离
进阶讨论
粒度控制黄金法则
根据我们的性能测试数据(JMeter 压测结果):
- 单个 skill 的理想响应时间应 <50ms
- 代码行数建议 50-150 行
- 依赖项不超过 3 个第三方库
基准测试方法:
- 使用 PyTest 基准测试插件
- 模拟 1000 次 / 秒的调用频率
- 监控第 95 百分位响应时间
版本兼容策略
| 策略类型 | 适用场景 | 实现成本 |
|---|---|---|
| 强制更新 | 安全关键型 skill | ★★☆ |
| 多版本并行 | 长期维护的系统 | ★★★ |
| 自动降级 | 用户体验优先的场景 | ★★☆ |
生产环境避坑指南
反模式预警
- 上帝 skill:超过 300 行代码的 skill 必然可以拆分
- 隐形耦合:skill 之间通过全局变量通信
- 过度包装:简单的 CRUD 操作没必要 skill 化
监控必备字段
{
"skillId": "auth_v2",
"duration": 45.2,
"contextFingerprint": "md5(userId+ip)",
"errorCode": ""
}
测试覆盖率建议
- 基础路径:80%(Happy Path)
- 异常路径:100%(如网络超时、数据库断开)
- 边界情况:密码长度刚好 6 位 /20 位等
思考题
当你已经积累了大量 skill,如何设计一个能自动识别 ” 登录 + 权限检查 ” 可以组合成 ” 安全网关 ” 的智能系统?或许可以尝试:
- 给每个 skill 打语义标签
- 定义输入输出类型系统
- 用有向无环图检测合法组合
下次当你看到又长又乱的代码时,不妨问问自己:这段逻辑能拆成几个 skill?
正文完
