回顾引导 概述 回顾是团队学习和持续改进的关键仪式。有效的引导可以创造心理安全感,鼓励诚实反馈,并推动实际改进。 何时使用
- 冲刺结束(定期节奏)
- 重大里程碑完成
- 项目关闭
- 重大事件或事故之后
- 团队过渡或人员变动
- 技术实施
- 流程评估
指令
1. 回顾计划
回顾计划: 事件:冲刺23回顾 日期:2025年1月17日,星期五 时长:60分钟 地点:会议室B / Zoom 引导者:Sarah(Scrum Master) 参与者:8名团队成员 邀请:产品负责人(可选)
回顾目标:
- 庆祝冲刺成功
- 确定进展顺利的事项
- 确定可以改进的事项
- 承诺具体改进
- 建立团队凝聚力 格式:“进展顺利/不顺利/想法” 工具:Miro板用于虚拟协作 回顾前准备:
- 发送调查:匿名反馈(24小时前)
- 收集冲刺指标(速度,错误等)
- 审查冲刺目标和结果
- 准备启动问题
- 设置物理/虚拟空间
成功标准:
- 100%团队出席
- 至少确定3个可操作的改进
- 团队感到被听到和重视
- 行动项分配给所有者
2. 引导技巧
回顾引导框架
class RetrospectiveFacilitator: FORMATS = { ‘Start-Stop-Continue’: { ‘description’: ‘我们应该开始做什么,停止做什么,继续做什么?’, ‘duration_minutes’: 45, ‘best_for’: ‘流程改进’ }, ‘Went-Well-Improve’: { ‘description’: ‘进展顺利的是什么?我们可以改进什么?’, ‘duration_minutes’: 45, ‘best_for’: ‘一般回顾’ }, ‘Sailboat’: { ‘description’: ‘风(帮助),锚(阻碍),岩石(风险)’, ‘duration_minutes’: 60, ‘best_for’: ‘识别阻碍和促进因素’ }, ‘Timeline’: { ‘description’: ‘按时间顺序走过冲刺’, ‘duration_minutes’: 60, ‘best_for’: ‘有事故的复杂冲刺’ } }
def __init__(self, team_size, format_type='Went-Well-Improve'):
self.team_size = team_size
self.format = format_type
self.duration = self.FORMATS[format_type]['duration_minutes']
self.agenda = self.create_agenda()
def create_agenda(self):
"""创建定时议程"""
return {
'Opening': {
'duration_minutes': 5,
'activities': [
'欢迎和目标',
'设置心理安全感',
'解释格式'
]
},
'Data Gathering': {
'duration_minutes': 15,
'activities': [
'个人反思(5分钟)',
'在板上进行无声头脑风暴(10分钟)'
]
},
'Discussion': {
'duration_minutes': 20,
'activities': [
'将类似项目分组',
'讨论主题和模式',
'提出澄清问题'
]
},
'Improvement Planning': {
'duration_minutes': 15,
'activities': [
'对优先事项进行投票',
'创建行动项',
'分配所有者'
]
},
'Closing': {
'duration_minutes': 5,
'activities': [
'总结决定',
'承诺改进',
'感谢团队'
]
}
}
def facilitate_discussion(self, feedback_items):
"""引导富有成效的讨论"""
return {
'structure': [
{
'step': '聚类',
'action': '将类似项目分组在一起',
'facilitation_tip': '问“这些相关吗?”'
},
{
'step': '探索',
'action': '了解根本原因',
'facilitation_tip': '问“为什么?”5次'
},
{
'step': '解决方案生成',
'action': '头脑风暴解决方案',
'facilitation_tip': '不批评,推迟判断'
},
{
'step': '优先级排序',
'action': '投票决定最重要的事项',
'facilitation_tip': '使用点投票'
}
],
'facilitation_questions': [
'你能帮助我们理解发生了什么吗?',
'为什么你认为这发生了?',
'我们下次如何预防?',
'成功会是什么样子?'
]
}
def ensure_psychological_safety(self):
"""为诚实反馈创建安全环境"""
return {
'opening_statement': '''
这是一个安全的空间。这里没有责任。我们所有人都在一起学习。分享的一切都保密。
''',
'ground_rules': [
'假设积极意图',
'批评想法,而不是人',
'每个人都参与',
'不打断地倾听',
'没有边会话'
],
'practices': [
'对敏感话题使用匿名输入',
'给出平衡反馈(积极和改进)',
'承认情绪和关注点',
'感谢人们的脆弱性'
]
}
3. 行动项跟踪
将回顾洞察转化为行动项
class ActionItemManagement {
createActionItem(feedback, team) {
return {
id: ACTION-${Date.now()},
title: feedback.title,
description: feedback.description,
priority: feedback.priority || ‘Medium’,
owner: feedback.owner,
dueDate: this.calculateDueDate(feedback),
successCriteria: [
${feedback.title} completed,
‘Results verified in next sprint’,
‘Team confirms improvement’
],
resources: feedback.estimatedHours || 4,
dependencies: feedback.dependencies || [],
status: ‘New’,
createdDate: new Date()
};
}
calculateDueDate(item) { // 高优先级:在下一个冲刺开始之前 // 中等:在下一个冲刺期间 // 低:接下来的2个冲刺 const daysFromNow = { ‘High’: 7, ‘Medium’: 14, ‘Low’: 21 };
const dueDate = new Date();
dueDate.setDate(dueDate.getDate() + (daysFromNow[item.priority] || 14));
return dueDate;
}
trackActionItems(items) { return { total: items.length, byStatus: { new: items.filter(i => i.status === ‘New’).length, inProgress: items.filter(i => i.status === ‘In Progress’).length, completed: items.filter(i => i.status === ‘Completed’).length, blockedPercent: (items.filter(i => i.status === ‘Blocked’).length / items.length * 100).toFixed(1) }, summary: items.map(item => ({ id: item.id, title: item.title, owner: item.owner, dueDate: item.dueDate, status: item.status, completion: item.completion || 0 })) }; }
reviewCompletedItems(previousRetro) {
return {
totalCommitted: previousRetro.actionItems.length,
completed: previousRetro.actionItems.filter(i => i.status === ‘Completed’).length,
completionRate: ${(previousRetro.actionItems.filter(i => i.status === 'Completed').length / previousRetro.actionItems.length * 100).toFixed(1)}%,
celebration: ‘Celebrate completed items!’,
carryOver: previousRetro.actionItems.filter(i => i.status !== ‘Completed’).map(i => ({
…i,
reason: ‘Not completed’,
recommendation: ‘Revisit in next retrospective’
}))
};
}
}
4. 回顾模板
回顾报告:
冲刺:冲刺23(2025年1月7日至1月17日) 引导者:Sarah 参与者:8名工程师,1名PM 时长:60分钟
进展顺利的事项:
- 功能提前3天交付
- 生产中没有关键错误
- 前端/后端之间的良好协作
- 新团队成员的指导
- 更快的代码审查周期(平均2→1天)
庆祝:
- 前端团队的UI卓越
- DevOps的基础设施稳定性
- QA的全面测试
可以改进的事项:
-
需求不明确导致返工(2名开发人员,8小时) 根本原因:PO在冲刺初期不可用 严重性:中等
-
测试基础设施不稳定(3个实例) 根本原因:测试负载增加,需要优化 严重性:高
-
API变更的文档空白 根本原因:开发人员专注于功能交付 严重性:低
-
长时间的站立会议(平均20分钟) 根本原因:状态详细信息太多 严重性:中等
承诺的行动项:
-
每日PO可用性窗口(上午9-10点) 所有者:产品经理 截止日期:冲刺24开始(1月21日) 优先级:高
-
优化测试基础设施 所有者:DevOps负责人 截止日期:冲刺24中点(1月28日) 优先级:高 估计工作量:16小时
-
站立会议时间限制 所有者:Scrum Master 截止日期:下一个冲刺(1月21日) 优先级:中等 方法:5分钟时间限制,详细问题后续跟进
-
API文档模板 所有者:技术负责人 截止日期:冲刺24开始(1月21日) 优先级:低
指标: 速度:85个故事点(计划80个) 发现的错误:2个(冲刺中都已修复) 代码审查周期:平均23小时(目标:24) 团队士气(1-5):4.2/5
团队反馈: “最近最好的冲刺!” “希望更关注代码质量” “团队的支持很棒”
最佳实践
✅ 做
- 定期举行回顾(每个冲刺)
- 提前创建心理安全感
- 使用不同的格式以保持参与度
- 包括整个团队
- 专注于系统,而不是个人
- 将洞察转化为具体的行动项
- 分配清晰的所有者和截止日期
- 跟踪和庆祝完成的行动
- 在开始时回顾上一个行动
- 感谢人们的参与和诚实
❌ 不做
- 责备个人或团队
- 让主导声音控制讨论
- 没有所有者的行动项
- 没有后续的回顾
- 忽略困难的反馈
- 只关注哪里出了问题
- 在人们疲劳/压力下举行回顾
- 跳过结束/庆祝
- 将回顾与状态会议混合
- 忽略多个回顾中的模式
回顾提示
- 每3-4个冲刺轮换一次格式,以保持参与度
- 对敏感反馈使用匿名输入
- 限制讨论时间以保持专注
- 专注于3-5个改进,而不是20个行动项
- 回顾并庆祝上一个行动的进展