name: 团队拓扑设计 description: “用于组织设计的团队拓扑方法论。涵盖四种基本团队类型、三种交互模式、认知负荷评估、逆向康威操作和团队演化模式。适用于设计对齐架构的团队结构。” allowed-tools: 读取, 写入, 全局搜索, 文本搜索, 任务
团队拓扑设计
一种现代团队组织方法,优化快速变更流,同时管理认知负荷。
何时使用此技能
关键词: 团队拓扑, 流对齐, 平台, 使能, 复杂子系统, 交互模式, 协作, X即服务, 促进, 认知负荷, 逆向康威, 康威定律, 团队API, 团队边界, 快速流
在以下情况使用此技能:
- 设计或重组团队结构
- 对齐团队与软件架构
- 减少团队的认知负荷
- 改进变更交付流
- 应用逆向康威操作
- 定义团队交互和边界
- 规划组织演化
康威定律
“任何设计系统的组织都将产生一个设计,其结构是该组织通信结构的副本。” — Melvin Conway, 1968
影响
康威定律:
观察: "架构反映通信结构"
影响:
- "团队结构塑造系统架构"
- "孤岛团队创建孤岛系统"
- "跨职能团队创建集成系统"
- "团队边界成为系统边界"
逆向康威:
原则: "设计组织以匹配期望的架构"
方法: "如果您想要某种系统架构,就相应地构建团队"
警告: "架构和团队结构会随时间重新对齐"
四种团队类型
1. 流对齐团队
流对齐团队:
定义: "团队对齐于一个有价值的工流"
特征:
- "对价值流的端到端责任"
- "跨职能(开发、运维、测试、用户体验等)"
- "长期存在,产品导向"
- "拥有一个或多个有限上下文"
- "主要团队类型(多数团队)"
规模: "5-9名成员"
示例:
- "客户入职团队"
- "结账体验团队"
- "移动应用团队"
- "B2B集成团队"
拥有:
- "面向客户的功能"
- "特定用户旅程"
- "有限上下文"
- "完整软件生命周期"
不拥有:
- "共享基础设施"
- "复杂专业组件"
- "跨领域能力"
成功指标:
- "变更前置时间"
- "部署频率"
- "客户满意度"
- "服务恢复时间"
2. 平台团队
平台团队:
定义: "团队提供内部服务以减少流对齐团队的认知负荷"
特征:
- "将内部团队视为客户"
- "提供自服务能力"
- "关注开发者体验"
- "作为内部产品团队运营"
- "减少团队间重复"
规模: "5-9名成员(可随平台规模扩展)"
示例:
- "开发者平台团队"
- "基础设施团队"
- "数据平台团队"
- "机器学习平台团队"
提供:
- "自服务基础设施"
- "CI/CD流水线"
- "监控和可观察性"
- "通用库和框架"
不做:
- "为最终用户构建功能"
- "规定团队工作方式"
- "创建瓶颈"
成功指标:
- "资源供应时间"
- "平台采用率"
- "开发者满意度得分"
- "支持票减少"
3. 使能团队
使能团队:
定义: "团队帮助流对齐团队采用新能力"
特征:
- "与其他团队的临时合作"
- "提升技能而非构建"
- "识别模式和最佳实践"
- "交叉传播知识"
- "与每个团队有限的生命周期"
规模: "3-6名成员(小型、专业化)"
示例:
- "DevOps使能团队"
- "安全倡导团队"
- "架构指导团队"
- "敏捷教练团队"
活动:
- "培训和研讨会"
- "结对编程/群体会话"
- "创建指南和操作手册"
- "识别障碍"
不做:
- "构建生产系统"
- "永久嵌入"
- "把关"
合作模式:
初始: "评估团队需求"
活跃: "紧密合作(数周)"
移交: "使团队自给自足"
跟进: "定期检查"
成功指标:
- "能力采用率"
- "团队独立时间"
- "实践在组织内传播"
4. 复杂子系统团队
复杂子系统团队:
定义: "团队负责需要深度专业知识的组件"
特征:
- "需要重专业专长"
- "复杂性会压倒流团队"
- "与其他团队的清晰接口"
- "稀有团队类型(多数组织有0-2个)"
规模: "3-9名成员(专业导向)"
示例:
- "视频编码团队"
- "金融建模团队"
- "机器学习算法团队"
- "实时数据处理团队"
何时适用:
- "数学/科学密集型组件"
- "监管复杂性"
- "深度领域专长"
- "需要多年专业学习"
何时不适用:
- "任何团队都能学习的通用复杂性"
- "应成为平台的组件"
- "历史知识囤积"
成功指标:
- "接口稳定性"
- "子系统的准确性/性能"
- "消费者的支持负担"
三种交互模式
协作
协作模式:
定义: "两个团队紧密合作以实现共享目标"
特征:
- "高带宽通信"
- "共享发现和创新"
- "临时边界模糊"
- "密集但时间限制"
适用情况:
- "快速发现阶段"
- "新集成"
- "新颖问题"
- "建立共享理解"
持续时间: "时间限制(数周至数月)"
警告信号:
- "协作持续超过6个月"
- "永久依赖"
- "团队无法独立工作"
过渡至: "发现后转为X即服务"
X即服务
X即服务模式:
定义: "一个团队向另一个团队提供具有清晰接口的服务"
特征:
- "清晰的API/合约"
- "最小化协调需求"
- "提供团队拥有服务演化"
- "消费团队无需深度参与"
适用情况:
- "成熟、稳定的接口"
- "平台到流对齐"
- "减少认知负荷"
- "扩展交互"
成功因素:
- "良好文档化的API"
- "自服务供应"
- "SLA协议"
- "清晰的支持渠道"
反模式:
- "简单请求过多会议"
- "所有事情都需要票队列"
- "隐藏复杂性"
促进
促进模式:
定义: "一个团队帮助另一个团队学习或采用能力"
特征:
- "教学而非执行"
- "临时,有移交"
- "目标是独立性"
- "使能团队主要模式"
适用情况:
- "能力建设"
- "新实践采用"
- "障碍移除"
- "交叉传播"
合作周期:
评估: "理解团队需求"
教学: "主动指导/培训"
支持: "可用解答问题"
退出: "团队自给自足"
反模式:
- "永久依赖"
- "为他们做工作"
- "把关知识"
认知负荷
认知负荷类型
认知负荷类型:
内在:
定义: "来自问题空间本身的负荷"
示例:
- "业务领域复杂性"
- "任务的技术复杂性"
- "监管要求"
策略: "无法消除,但可训练应对"
外在:
定义: "来自环境/过程的负荷"
示例:
- "遗留系统怪癖"
- "差工具"
- "不明确需求"
策略: "通过平台、自动化最小化"
相关:
定义: "来自学习和成长的负荷"
示例:
- "学习新技术"
- "探索新领域"
- "构建心理模型"
策略: "投资于此——构建能力"
认知负荷评估
认知负荷评估:
问题:
领域复杂性:
- "团队拥有多少领域?"
- "所需领域知识的深度如何?"
- "领域规则变更频率如何?"
技术复杂性:
- "团队维护多少系统?"
- "技术多样性如何?"
- "存在多少遗留代码?"
环境摩擦:
- "多少时间花在非价值工作上?"
- "需要与多少其他团队协调?"
- "部署过程有多痛苦?"
评分:
1_3: "可管理——团队可专注价值"
4_6: "升高——一些开销影响流"
7_9: "过载——需要减少范围"
10: "关键——团队无法有效运行"
红旗:
- "团队拥有超过3个有限上下文"
- "超过50%时间花在协调上"
- "上下文切换导致高缺陷率"
- "倦怠指标"
团队规模启发式
团队规模:
邓巴数:
5: "核心工作组"
15: "扩展团队带协调"
50: "部门边界"
150: "组织边界"
两披萨规则:
描述: "团队应由两披萨喂养"
实际规模: "5-9名成员"
理由: "通信开销呈指数增长"
布鲁克斯定律:
陈述: "向延迟项目添加人员使其更延迟"
影响: "团队应从开始就正确规模"
逆向康威操作
原则
逆向康威:
定义: "设计组织以实现期望架构"
过程:
1: "定义期望目标架构"
2: "识别有限上下文及其关系"
3: "设计团队结构以反映期望架构"
4: "允许团队演化其拥有的架构"
示例:
期望架构: "具有清晰边界的独立微服务"
团队设计: "流对齐团队各拥有1-2个服务"
平台: "共享基础设施作为平台团队"
结果: "架构自然演化以匹配团队结构"
实施步骤
逆向康威实施:
步骤1_架构愿景:
活动:
- "定义目标有限上下文"
- "映射上下文间集成模式"
- "识别共享能力(平台)"
- "文档化接口和依赖"
输出: "带边界的目標架構圖"
步骤2_团队映射:
活动:
- "映射有限上下文到潜在团队"
- "识别平台团队需求"
- "评估使能团队要求"
- "标记复杂子系统候选"
输出: "初始团队结构提案"
步骤3_认知负荷验证:
活动:
- "评估每个提议团队的负荷"
- "如过载则调整范围"
- "验证技能可用性"
- "计划使能支持"
输出: "验证团队结构"
步骤4_交互设计:
活动:
- "定义初始交互模式"
- "识别协作需求"
- "设计平台接口"
- "计划团队API"
输出: "团队交互图"
步骤5_演化计划:
活动:
- "定义过渡时间线"
- "计划技能发展"
- "设计反馈机制"
- "建立审查节奏"
输出: "组织过渡路线图"
团队API
定义
团队API:
定义: "团队如何与其他团队交互的显式接口"
组件:
服务提供:
- "团队提供什么"
- "如何消费服务"
- "SLA和承诺"
通信:
- "主要联系渠道"
- "响应时间期望"
- "升级路径"
工作方式:
- "协作偏好"
- "会议可用性"
- "决策过程"
代码和制品:
- "仓库位置"
- "文档"
- "API规范"
好处:
- "减少模糊性"
- "扩展交互"
- "支持异步工作"
- "支持团队自治"
团队API模板
# 团队API: {团队名称}
## 使命
{团队目的的1-2句话}
## 我们提供的服务
| 服务 | 描述 | 如何请求 | SLA |
|------|------|----------|-----|
| {服务} | {做什么} | {渠道} | {响应时间} |
## 我们拥有什么
- {有限上下文}
- {系统/仓库}
- {文档位置}
## 交互偏好
- **首选联系:** {Slack频道、电子邮件等}
- **办公时间:** {何时可用于同步讨论}
- **请求过程:** {如何提出请求}
## 当前交互模式
| 团队 | 模式 | 持续时间 | 备注 |
|------|------|----------|------|
| {团队} | {协作/X即服务/促进} | {时间框架} | {上下文} |
## 依赖
### 我们依赖
- {团队/服务}: {我们需要什么}
### 谁依赖我们
- {团队}: {他们从我们这里需要什么}
## 我们跟踪的指标
- {指标1}
- {指标2}
## 反馈渠道
- {如何提供反馈}
团队演化模式
演化触发
演化触发:
增长负荷:
信号: "团队认知负荷增加"
选项:
- "沿有限上下文拆分团队"
- "为共享关注创建平台团队"
- "剥离复杂子系统"
成熟协作:
信号: "协作模式持续太久"
行动: "过渡到X即服务"
重复使能:
信号: "多团队需要相同能力"
行动: "移至平台团队"
专家瓶颈:
信号: "专家知识创建瓶颈"
选项:
- "创建复杂子系统团队"
- "使团队构建能力"
拆分团队
团队拆分:
何时拆分:
- "团队拥有太多有限上下文(>3)"
- "认知负荷持续高"
- "团队规模超过9"
- "存在清晰领域边界"
如何拆分:
识别边界: "找到领域/代码中的自然接缝"
确保可行性: "每个新团队必须独立可行"
计划过渡: "逐步移交,非大爆炸"
维护接口: "与旧团队保持X即服务"
反模式:
- "按技术层拆分(UI团队、API团队)"
- "拆分无清晰所有权"
- "创建太多小团队"
团队合并
团队合并:
何时合并:
- "协作开销太多"
- "团队太小无效"
- "有限上下文密切相关"
- "人工边界导致摩擦"
如何合并:
评估合适: "合并负荷可管理吗?"
计划集成: "技能如何结合?"
重新定义范围: "新团队的有限上下文"
更新交互: "修订团队API"
.NET/C# 上下文
团队到架构对齐
namespace Organization.TeamDesign;
// 团队拓扑设计模型
public record Team
{
public required string Name { get; init; }
public required TeamType Type { get; init; }
public required string Mission { get; init; }
public required int Size { get; init; }
public List<string> BoundedContexts { get; init; } = [];
public CognitiveLoadAssessment? CognitiveLoad { get; init; }
public TeamApi? Api { get; init; }
}
public enum TeamType
{
StreamAligned,
Platform,
Enabling,
ComplicatedSubsystem
}
public record TeamInteraction
{
public required string FromTeam { get; init; }
public required string ToTeam { get; init; }
public required InteractionMode Mode { get; init; }
public string? Purpose { get; init; }
public DateOnly? StartDate { get; init; }
public DateOnly? PlannedEndDate { get; init; }
}
public enum InteractionMode
{
Collaboration,
XAsAService,
Facilitating
}
public record CognitiveLoadAssessment
{
public required DateOnly AssessmentDate { get; init; }
public required int DomainComplexityScore { get; init; } // 1-10
public required int TechnicalComplexityScore { get; init; } // 1-10
public required int EnvironmentalFrictionScore { get; init; } // 1-10
public int TotalScore => DomainComplexityScore +
TechnicalComplexityScore +
EnvironmentalFrictionScore;
public LoadLevel Level => TotalScore switch
{
<= 9 => LoadLevel.Manageable,
<= 18 => LoadLevel.Elevated,
<= 24 => LoadLevel.High,
_ => LoadLevel.Critical
};
public string? Notes { get; init; }
public List<string> Recommendations { get; init; } = [];
}
public enum LoadLevel
{
Manageable,
Elevated,
High,
Critical
}
public record TeamApi
{
public required string TeamName { get; init; }
public required string Mission { get; init; }
public List<ServiceOffering> Services { get; init; } = [];
public CommunicationPreferences? Communication { get; init; }
public List<string> OwnedSystems { get; init; } = [];
public List<Dependency> DependsOn { get; init; } = [];
public List<Dependency> DependedOnBy { get; init; } = [];
}
public record ServiceOffering(
string Name,
string Description,
string RequestChannel,
string Sla
);
public record CommunicationPreferences(
string PreferredChannel,
string OfficeHours,
string RequestProcess
);
public record Dependency(
string TeamName,
string Description
);
团队拓扑分析器
public class TeamTopologyAnalyzer
{
public TeamTopologyAssessment Analyze(IEnumerable<Team> teams, IEnumerable<TeamInteraction> interactions)
{
var teamList = teams.ToList();
var interactionList = interactions.ToList();
return new TeamTopologyAssessment
{
TotalTeams = teamList.Count,
TeamsByType = teamList.GroupBy(t => t.Type)
.ToDictionary(g => g.Key, g => g.Count()),
StreamAlignedRatio = CalculateStreamAlignedRatio(teamList),
CognitiveLoadWarnings = IdentifyCognitiveLoadWarnings(teamList),
InteractionConcerns = IdentifyInteractionConcerns(interactionList),
Recommendations = GenerateRecommendations(teamList, interactionList)
};
}
private decimal CalculateStreamAlignedRatio(List<Team> teams)
{
if (teams.Count == 0) return 0;
var streamAligned = teams.Count(t => t.Type == TeamType.StreamAligned);
return (decimal)streamAligned / teams.Count;
}
private List<string> IdentifyCognitiveLoadWarnings(List<Team> teams)
{
var warnings = new List<string>();
foreach (var team in teams)
{
if (team.CognitiveLoad?.Level >= LoadLevel.High)
{
warnings.Add($"团队 '{team.Name}' 具有 {team.CognitiveLoad.Level} 认知负荷");
}
if (team.BoundedContexts.Count > 3)
{
warnings.Add($"团队 '{team.Name}' 拥有 {team.BoundedContexts.Count} 个有限上下文(推荐最大:3)");
}
if (team.Size > 9)
{
warnings.Add($"团队 '{team.Name}' 有 {team.Size} 名成员(超过两披萨规模)");
}
}
return warnings;
}
private List<string> IdentifyInteractionConcerns(List<TeamInteraction> interactions)
{
var concerns = new List<string>();
// 检查长期运行协作
var longCollaborations = interactions
.Where(i => i.Mode == InteractionMode.Collaboration)
.Where(i => i.StartDate.HasValue &&
i.StartDate.Value.AddMonths(6) < DateOnly.FromDateTime(DateTime.Today));
foreach (var collab in longCollaborations)
{
concerns.Add($"'{collab.FromTeam}' 和 '{collab.ToTeam}' 之间的协作可能持续太久——考虑过渡到X即服务");
}
return concerns;
}
private List<string> GenerateRecommendations(List<Team> teams, List<TeamInteraction> interactions)
{
var recommendations = new List<string>();
// 检查流对齐比率
var ratio = CalculateStreamAlignedRatio(teams);
if (ratio < 0.6m)
{
recommendations.Add("考虑增加流对齐团队比率(当前 " +
$"{ratio:P0},推荐60-80%)");
}
// 检查缺失平台团队
var hasInfraOverhead = teams
.Where(t => t.Type == TeamType.StreamAligned)
.Any(t => t.CognitiveLoad?.EnvironmentalFrictionScore > 5);
if (hasInfraOverhead && !teams.Any(t => t.Type == TeamType.Platform))
{
recommendations.Add("考虑创建平台团队以减少流对齐团队的基础设施认知负荷");
}
return recommendations;
}
}
public record TeamTopologyAssessment
{
public int TotalTeams { get; init; }
public Dictionary<TeamType, int> TeamsByType { get; init; } = new();
public decimal StreamAlignedRatio { get; init; }
public List<string> CognitiveLoadWarnings { get; init; } = [];
public List<string> InteractionConcerns { get; init; } = [];
public List<string> Recommendations { get; init; } = [];
}
输出格式
团队拓扑文档
团队拓扑:
元数据:
组织: "{组织名称}"
日期: "{ISO-8601}"
版本: "1.0"
团队:
流对齐团队:
- 名称: "{团队名称}"
使命: "{使命}"
有限上下文:
- "{上下文1}"
规模: {N}
认知负荷: "{可管理/升高/高}"
平台团队:
- 名称: "{平台团队}"
使命: "{使命}"
服务:
- "{服务1}"
规模: {N}
使能团队:
- 名称: "{使能团队}"
焦点: "{当前焦点领域}"
合作中:
- "{团队1}"
规模: {N}
复杂子系统团队:
- 名称: "{子系统团队}"
领域: "{专业领域}"
接口至:
- "{消费团队1}"
规模: {N}
交互:
- 从: "{团队A}"
至: "{团队B}"
模式: "{协作/X即服务/促进}"
目的: "{为何此交互}"
状态: "{活跃/计划中/结束中}"
演化计划:
- 触发: "{什么触发变更}"
行动: "{将变更什么}"
时间线: "{何时}"
与其他技能集成
上游
- 上下文映射 - 有限上下文 → 团队映射
- 沃德利映射 - 演化阶段 → 团队类型对齐
- TOGAF指导 - 企业架构上下文
下游
- 模块化架构 - 代码组织匹配团队
- 适应度函数 - 团队边界执行
- ADR管理 - 文档化团队结构决策
参考资料
如需额外指导:
版本历史
- v1.0.0 (2025-12-26): 初始发布 - 团队拓扑设计技能
最后更新: 2025-12-26