name: design-an-interface description: "通过并行子 Agent 为模块生成多个截然不同的接口设计。用户希望设计 API、探索接口选项、比较模块形状,或提到“设计两次”时使用。"
历史对照:为同一模块设计不同接口
它用不同约束生成多个真正不同的接口,并比较调用体验和隐藏的复杂性。
本课使用下方注明的历史提交原文,帮助理解旧文章和旧提示词。请勿据此认定当前版本仍能直接调用该名称。
还不清楚 Skill、Agent、安装和调用?先读 从零开始的6节入门课。
在关系图中查看 design-an-interface 与其他技能的关联 →
先把必要的概念讲清楚
本课让你在开始实现前比较多种接口设计。接口是使用能力的约定,不是页面样式;多方案的目的,是看见第一个想法隐藏的取舍。
下面是老师补充的入门说明;原作者的要求保留在中英对照正文中。所有例子均为帮助理解而构造的教学情境。
interface / API|接口
使用者与一项能力交互时遵循的约定,包括可调用什么、传入什么、得到什么、失败怎样表示。接口可以是程序函数,也可以是网络请求。创建收藏接口接收用户和课程信息、返回收藏结果;它不需要向调用者暴露数据库表结构。这里的接口通常不是指页面外观。 本教材涉及更广义的“接口”时,还包括错误、调用顺序和约束等使用约定;不能把接口一概等同于网络 API。
module|模块
承担一组相关职责的代码单元,可以是文件、包或服务,不必等于一个文件。学习进度模块可以公开“记录进度”和“查询进度”,把计算完成比例、保存数据等细节藏在内部。划分是否合理,要看职责和依赖,不能只数文件。
deep module|深模块
用相对简单的公开接口封装较多内部复杂性。调用者只说“为这节课生成复习安排”,模块内部处理规则、时间和重复项。深是接口与实现复杂性的关系,不是目录嵌套深,也不是函数越长越好。
seam|测试接入点
作者在测试语境中指测试进入系统、触发行为并观察结果的公共边界。例如调用“收藏课程”接口,再通过“我的收藏”接口检查结果。入口可以是模块公开函数、服务接口或页面,并非一定是浏览器。选择高层稳定入口能覆盖内部多个步骤;入口少不等于测试场景少。
读原文,理解每一步为什么这样做
左右内容按小节对应;窄屏先中文、后英文。两种语言均完整展示,对应讲解紧接在小节之后。译文传达原文要求;老师讲解补充概念、原因、例子与适用边界。
name: design-an-interface description: Generate multiple radically different interface designs for a module using parallel sub-agents. Use when user wants to design an API, explore interface options, compare module shapes, or mentions "design it twice".
为一个模块探索不同接口方案
采用《软件设计的哲学》的“设计两次”思路:最先想到的方案未必最好,先生成几种差异明显的设计,再比较。
Design an Interface
Based on "Design It Twice" from "A Philosophy of Software Design": your first idea is unlikely to be the best. Generate multiple radically different designs, then compare.
流程
Workflow
1. 收集需求
开始设计之前,先把以下问题逐一弄清楚:
- [ ] 这个模块要解决什么问题?
- [ ] 谁会调用它?调用者可能是其他模块、外部使用者,也可能是测试代码。
- [ ] 调用者需要通过它完成哪些关键操作?
- [ ] 有哪些必须满足的约束?例如运行速度、与现有用法的兼容性,以及项目已经采用的设计方式。
- [ ] 哪些细节应该隐藏在模块内部?哪些能力或信息需要通过接口提供给调用者?
问用户:“模块需要做什么?谁会使用?”
1. Gather Requirements
Before designing, understand:
- [ ] What problem does this module solve?
- [ ] Who are the callers? (other modules, external users, tests)
- [ ] What are the key operations?
- [ ] Any constraints? (performance, compatibility, existing patterns)
- [ ] What should be hidden inside vs exposed?
Ask: "What does this module need to do? Who will use it?"
先确定调用者真正需要什么
模块解决什么问题、谁调用、有哪些操作、哪些信息应隐藏,都影响接口。课程推荐模块可能被页面、定时任务和测试调用,各自需求未必相同。
例如用户只想获取今天三项复习内容,接口却要求传入全部模型参数和存储配置,就把内部复杂性推给了调用者。反过来,完全不给必要控制也可能无法满足真实场景。
性能与兼容性是约束,不能只看方法名称是否漂亮。设计之前先用一两个真实调用例子说清需求。
2. 并行产生不同设计
使用 Task 工具同时启动至少三个子 Agent,每位必须提出明显不同的思路。
请为以下模块设计接口:[模块说明]
需求:[已确认需求]
本方案约束:[每位分配不同方向]
- 方案一:减少方法数量,目标最多 1—3 个。
- 方案二:提高灵活性,覆盖多种用途。
- 方案三:优化最常见的情形。
- 方案四:参考某种指定编程思想或程序库。
输出:类型与方法签名、调用示例、隐藏的内部复杂性、需要接受的取舍。
2. Generate Designs (Parallel Sub-Agents)
Spawn 3+ sub-agents simultaneously using Task tool. Each must produce a radically different approach.
Prompt template for each sub-agent:
Design an interface for: [module description]
Requirements: [gathered requirements]
Constraints for this design: [assign a different constraint to each agent]
- Agent 1: "Minimize method count - aim for 1-3 methods max"
- Agent 2: "Maximize flexibility - support many use cases"
- Agent 3: "Optimize for the most common case"
- Agent 4: "Take inspiration from [specific paradigm/library]"
Output format:
1. Interface signature (types/methods)
2. Usage example (how caller uses it)
3. What this design hides internally
4. Trade-offs of this approach
为什么要强制产生真正不同的方案
多个 Agent 若都按同一默认思路做设计,只是参数顺序不同,并没有提供有价值的选择。原文分别要求方法最少、灵活性最大、优化常用情形等不同约束,促使方案分化。
例如一个接口一调用就返回完整复习计划;另一种先建立会话再逐步提问;第三种提供可组合步骤。它们暴露的控制量和使用负担不同。
并行是产生选项的手段,不保证任何方案正确。每个方案都需展示实际用法、隐藏什么与付出什么代价。
3. 逐个展示
对每一种设计,都展示以下三部分:
- 接口签名:列出接口中的类型、方法和参数,让人看清楚它如何被调用。
- 使用示例:展示调用者在真实使用情境中会怎样使用这个接口。
- 隐藏在内部的复杂性:说明调用者不必了解、由模块内部承担的工作。
按顺序逐个讲清楚,让用户先理解每一种方案,再开始比较它们。
3. Present Designs
Show each design with:
- Interface signature - types, methods, params
- Usage examples - how callers actually use it in practice
- What it hides - complexity kept internal
Present designs sequentially so user can absorb each approach before comparison.
4. 比较设计
所有方案都展示以后,再从以下几个方面比较:
- 接口是否简单:需要学习的方法是否更少,参数是否更容易理解?
- 通用还是专用:支持多种用途的灵活性,与专注主要用途的简单性之间,怎样取舍?
- 内部实现能否高效:这种接口形状,是否允许内部采用高效的实现?
- 模块的深度:对外接口很小,却在内部承担大量复杂工作,是作者推崇的深模块;对外接口很大,内部却只做少量转发,是应当避免的浅模块。
- 是否容易正确使用:调用者按照预期使用它容易吗?它又是否容易被误用?
用连贯文字讨论,而不是用表格代替分析,突出真正的差异。
4. Compare Designs
After showing all designs, compare them on:
- Interface simplicity: fewer methods, simpler params
- General-purpose vs specialized: flexibility vs focus
- Implementation efficiency: does shape allow efficient internals?
- Depth: small interface hiding significant complexity (good) vs large interface with thin implementation (bad)
- Ease of correct use vs ease of misuse
Discuss trade-offs in prose, not tables. Highlight where designs diverge most.
从正确使用的容易程度比较,而非只看开发省不省事
接口简单、通用程度、内部实现效率、深度和误用概率,回答不同问题。最灵活的方案可能迫使初学者配置太多;最省事的实现可能让每个调用者重复做准备。
**例子:**把默认课程选择和数量处理隐藏在模块内,可以简化常见调用;但若重要的用户限制也被隐藏,结果可能不符合意图。比较要说明真实用例下的影响。
原文不按实现工作量单独评价,是为了防止只选最容易写的方案。实际项目仍会有资源约束,但不能把它当成接口设计质量的唯一尺度。
interface 在这里是模块用法,不是网页布局
以出题模块为例,方案 A 只要求传课文,直接返回题目;方案 B 让调用者配置模型、题型和校验器;方案 C 专为本网站课时设计,传课时编号后自动读取配置。
A 容易学,但特殊情形可能不方便。B 灵活,却让每个使用者理解更多参数。C 贴近当前场景,跨项目复用可能较难。它们需要比较的是这些取舍,而不是函数名字哪个漂亮。
调用示例很重要。真正写出“页面如何获得三道题”,就能看出谁承担拼装和错误处理,是否容易忘记必要参数。
原文区分内部运行效率与程序员实现工作量,要求此轮不要按后者选择。这是设计练习的侧重点;实际项目仍需结合真实约束作最终决定。
5. 综合选择
最终方案可能结合多种设计的长处。问用户:哪种最适合主要用途?其他方案中是否有值得吸收的部分?
5. Synthesize
Often the best design combines insights from multiple options. Ask:
- "Which design best fits your primary use case?"
- "Any elements from other designs worth incorporating?"
结合不同方案的优点,但不提前进入实现
最终设计可能采用简单默认入口,同时为少数确实需要的场景公开清晰选项。组合不是把所有方法都加进去,而是根据主要用例保留必要控制。
本 skill 的产物是接口设计与取舍依据,不是完整代码交付。需求或边界尚未决定时,先写实现可能让你被第一版代码绑住。
你能提出“调用者要知道什么、哪里容易误用、以后什么变化会影响它”,就开始具备评估接口的能力。
评价标准
以下评价标准来自《软件设计的哲学》:
接口简单。 方法数量更少、参数更简单,通常意味着调用者更容易学习这个接口,也更容易正确使用它。
具有通用性。 一个设计如果不需要修改就能应对未来的使用情境,便具有一定通用性。不过,也要避免为了尚不明确的用途而过度泛化。
内部实现效率。 看接口的设计是否允许内部采用高效实现,还是反而迫使内部用一种别扭、低效的方式完成工作。
模块深度。 一个很小的使用接口,背后隐藏了大量复杂性,这就是深模块。反过来,如果调用者要学习很大的接口,而模块内部实际承担的工作很少,它就是应当避免的浅模块。
Evaluation Criteria
From "A Philosophy of Software Design":
Interface simplicity: Fewer methods, simpler params = easier to learn and use correctly.
General-purpose: Can handle future use cases without changes. But beware over-generalization.
Implementation efficiency: Does interface shape allow efficient implementation? Or force awkward internals?
Depth: Small interface hiding significant complexity = deep module (good). Large interface with thin implementation = shallow module (avoid).
避免这些做法
- 多个子 Agent 交出相似方案,要确保实质差别。
- 跳过比较,价值在于对照。
- 直接开始实现,本技能只讨论接口形状。
- 根据编写实现所需的工作量评价设计。
Anti-Patterns
- Don't let sub-agents produce similar designs - enforce radical difference
- Don't skip comparison - the value is in contrast
- Don't implement - this is purely about interface shape
- Don't evaluate based on implementation effort
先作答,再看参考思路
用自己的话说明:它解决什么问题,完成后会留下什么?
请各用一句话回答。若它只做规划或解释,不要把“已开发”“已部署”写成产物。
为什么必须给不同设计者不同约束?
我已思考,查看参考思路
这样才能探索不同取舍,避免同一默认解的重复。价值在差异和比较,不在 Agent 数量。
原文中哪条要求在你的环境下可能不成立?
说出具体一句及其前提,例如工具不可用、资料缺失、已有项目约定冲突,或它只是作者偏好。把你的答案带回课堂,我们据此继续讨论。
把方法放进一个具体情境
教学案例:研究工具可以每个来源单独调用,也可一次输入问题自动搜索,或先提交任务再取结果。三者不是名称差异,而是控制权、延迟和可观察性的不同取舍。
边界与容易误读的地方
多 Agent 同意不等于设计正确。还需用真实调用场景验证,且不应因为某方案实现最省事就忽略长期误用风险。
讨论后再实践:先判断上述情境是否适用,再选择真实任务。现在无需安装、运行命令或修改现有项目。