retrospective-facilitation

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Retrospective Facilitation

迭代回顾会议引导

Overview

概述

Retrospectives are critical ceremonies for team learning and continuous improvement. Effective facilitation creates psychological safety, encourages honest feedback, and drives tangible improvements.
迭代回顾会议是团队学习和持续改进的关键仪式。有效的引导能够营造心理安全感,鼓励坦诚反馈,并推动切实的改进。

When to Use

适用场景

  • End of sprint (regular cadence)
  • Major milestone completion
  • Project closure
  • After significant events or incidents
  • Team transitions or staff changes
  • Technology implementations
  • Process evaluations
  • 冲刺阶段结束时(定期开展)
  • 重大里程碑完成后
  • 项目收尾时
  • 重大事件或事故发生后
  • 团队过渡或人员变动时
  • 技术实施完成后
  • 流程评估时

Instructions

操作指南

1. Retrospective Planning

1. 回顾会议规划

yaml
Retrospective Planning:

Event: Sprint 23 Retrospective
Date: Friday, Jan 17, 2025
Duration: 60 minutes
Location: Conference Room B / Zoom

Facilitator: Sarah (Scrum Master)
Participants: 8 team members
Invite: Product Owner (optional)

---

Retrospective Goals:
  1. Celebrate sprint successes
  2. Identify what went well
  3. Identify what could improve
  4. Commit to specific improvements
  5. Build team cohesion

Format: "Went Well / Didn't Go Well / Ideas"
Tool: Miro board for virtual collaboration

Pre-Retrospective Preparation:
  - Send survey: anonymous feedback (24hrs before)
  - Gather sprint metrics (velocity, bugs, etc.)
  - Review sprint goals and outcomes
  - Prepare starter questions
  - Set up physical/virtual space

Success Criteria:
  - 100% team attendance
  - Minimum 3 actionable improvements identified
  - Team feels heard and valued
  - Action items assigned with owners
yaml
Retrospective Planning:

Event: Sprint 23 Retrospective
Date: Friday, Jan 17, 2025
Duration: 60 minutes
Location: Conference Room B / Zoom

Facilitator: Sarah (Scrum Master)
Participants: 8 team members
Invite: Product Owner (optional)

---

Retrospective Goals:
  1. Celebrate sprint successes
  2. Identify what went well
  3. Identify what could improve
  4. Commit to specific improvements
  5. Build team cohesion

Format: "Went Well / Didn't Go Well / Ideas"
Tool: Miro board for virtual collaboration

Pre-Retrospective Preparation:
  - Send survey: anonymous feedback (24hrs before)
  - Gather sprint metrics (velocity, bugs, etc.)
  - Review sprint goals and outcomes
  - Prepare starter questions
  - Set up physical/virtual space

Success Criteria:
  - 100% team attendance
  - Minimum 3 actionable improvements identified
  - Team feels heard and valued
  - Action items assigned with owners

2. Facilitation Techniques

2. 引导技巧

python
undefined
python
undefined

Retrospective facilitation framework

Retrospective facilitation framework

class RetrospectiveFacilitator: FORMATS = { 'Start-Stop-Continue': { 'description': 'What should we start, stop, continue doing?', 'duration_minutes': 45, 'best_for': 'Process improvements' }, 'Went-Well-Improve': { 'description': 'What went well? What can we improve?', 'duration_minutes': 45, 'best_for': 'General retrospectives' }, 'Sailboat': { 'description': 'Wind (helping), Anchor (hindering), Rocks (risks)', 'duration_minutes': 60, 'best_for': 'Identifying blockers and enablers' }, 'Timeline': { 'description': 'Walk through sprint chronologically', 'duration_minutes': 60, 'best_for': 'Complex sprints with incidents' } }
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):
    """Create timed agenda"""
    return {
        'Opening': {
            'duration_minutes': 5,
            'activities': [
                'Welcome and goals',
                'Set psychological safety',
                'Explain format'
            ]
        },
        'Data Gathering': {
            'duration_minutes': 15,
            'activities': [
                'Individual reflection (5 min)',
                'Silent brainstorming on board (10 min)'
            ]
        },
        'Discussion': {
            'duration_minutes': 20,
            'activities': [
                'Group clustering similar items',
                'Discuss themes and patterns',
                'Ask clarifying questions'
            ]
        },
        'Improvement Planning': {
            'duration_minutes': 15,
            'activities': [
                'Vote on priority items',
                'Create action items',
                'Assign owners'
            ]
        },
        'Closing': {
            'duration_minutes': 5,
            'activities': [
                'Summarize decisions',
                'Commit to improvements',
                'Appreciate team'
            ]
        }
    }

def facilitate_discussion(self, feedback_items):
    """Guide productive discussion"""
    return {
        'structure': [
            {
                'step': 'Clustering',
                'action': 'Group similar items together',
                'facilitation_tip': 'Ask "Are these related?"'
            },
            {
                'step': 'Exploration',
                'action': 'Understand root causes',
                'facilitation_tip': 'Ask "Why?" 5 times'
            },
            {
                'step': 'Solution Generation',
                'action': 'Brainstorm solutions',
                'facilitation_tip': 'No criticism, defer judgment'
            },
            {
                'step': 'Prioritization',
                'action': 'Vote on what matters most',
                'facilitation_tip': 'Use dot voting'
            }
        ],
        'facilitation_questions': [
            'Can you help us understand what happened?',
            'Why do you think this happened?',
            'How can we prevent this next time?',
            'What would success look like?'
        ]
    }

def ensure_psychological_safety(self):
    """Create safe environment for honest feedback"""
    return {
        'opening_statement': '''
        This is a safe space. There's no blame here. We're all
        learning together. Everything shared stays confidential.
        ''',
        'ground_rules': [
            'Assume positive intent',
            'Criticize ideas, not people',
            'Everyone participates',
            'Listen without interrupting',
            'No side conversations'
        ],
        'practices': [
            'Use anonymous input for sensitive topics',
            'Give balanced feedback (positive & improvement)',
            'Acknowledge emotions and concerns',
            'Thank people for vulnerability'
        ]
    }
undefined
class RetrospectiveFacilitator: FORMATS = { 'Start-Stop-Continue': { 'description': 'What should we start, stop, continue doing?', 'duration_minutes': 45, 'best_for': 'Process improvements' }, 'Went-Well-Improve': { 'description': 'What went well? What can we improve?', 'duration_minutes': 45, 'best_for': 'General retrospectives' }, 'Sailboat': { 'description': 'Wind (helping), Anchor (hindering), Rocks (risks)', 'duration_minutes': 60, 'best_for': 'Identifying blockers and enablers' }, 'Timeline': { 'description': 'Walk through sprint chronologically', 'duration_minutes': 60, 'best_for': 'Complex sprints with incidents' } }
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):
    """Create timed agenda"""
    return {
        'Opening': {
            'duration_minutes': 5,
            'activities': [
                'Welcome and goals',
                'Set psychological safety',
                'Explain format'
            ]
        },
        'Data Gathering': {
            'duration_minutes': 15,
            'activities': [
                'Individual reflection (5 min)',
                'Silent brainstorming on board (10 min)'
            ]
        },
        'Discussion': {
            'duration_minutes': 20,
            'activities': [
                'Group clustering similar items',
                'Discuss themes and patterns',
                'Ask clarifying questions'
            ]
        },
        'Improvement Planning': {
            'duration_minutes': 15,
            'activities': [
                'Vote on priority items',
                'Create action items',
                'Assign owners'
            ]
        },
        'Closing': {
            'duration_minutes': 5,
            'activities': [
                'Summarize decisions',
                'Commit to improvements',
                'Appreciate team'
            ]
        }
    }

def facilitate_discussion(self, feedback_items):
    """Guide productive discussion"""
    return {
        'structure': [
            {
                'step': 'Clustering',
                'action': 'Group similar items together',
                'facilitation_tip': 'Ask "Are these related?"'
            },
            {
                'step': 'Exploration',
                'action': 'Understand root causes',
                'facilitation_tip': 'Ask "Why?" 5 times'
            },
            {
                'step': 'Solution Generation',
                'action': 'Brainstorm solutions',
                'facilitation_tip': 'No criticism, defer judgment'
            },
            {
                'step': 'Prioritization',
                'action': 'Vote on what matters most',
                'facilitation_tip': 'Use dot voting'
            }
        ],
        'facilitation_questions': [
            'Can you help us understand what happened?',
            'Why do you think this happened?',
            'How can we prevent this next time?',
            'What would success look like?'
        ]
    }

def ensure_psychological_safety(self):
    """Create safe environment for honest feedback"""
    return {
        'opening_statement': '''
        This is a safe space. There's no blame here. We're all
        learning together. Everything shared stays confidential.
        ''',
        'ground_rules': [
            'Assume positive intent',
            'Criticize ideas, not people',
            'Everyone participates',
            'Listen without interrupting',
            'No side conversations'
        ],
        'practices': [
            'Use anonymous input for sensitive topics',
            'Give balanced feedback (positive & improvement)',
            'Acknowledge emotions and concerns',
            'Thank people for vulnerability'
        ]
    }
undefined

3. Action Item Tracking

3. 行动项跟踪

javascript
// Converting retrospective insights to action items

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) {
    // High priority: before next sprint starts
    // Medium: during next sprint
    // Low: next 2 sprints
    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'
      }))
    };
  }
}
javascript
// Converting retrospective insights to action items

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) {
    // High priority: before next sprint starts
    // Medium: during next sprint
    // Low: next 2 sprints
    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. Retrospective Templates

4. 回顾会议模板

yaml
Retrospective Report:

Sprint: Sprint 23 (Jan 7 - Jan 17, 2025)
Facilitator: Sarah
Attendees: 8 engineers, 1 PM
Duration: 60 minutes

---

What Went Well:
  - Shipped feature 3 days early
  - Zero critical bugs in production
  - Great collaboration between frontend/backend
  - Mentoring of new team member
  - Faster code review cycle (2 → 1 day avg)

Celebrated:
  - Front-end team for UI excellence
  - DevOps for infrastructure stability
  - QA for thorough testing

---

What Could Be Improved:
  1. Unclear requirements caused rework (2 developers, 8 hours)
     Root Cause: PO wasn't available early in sprint
     Severity: Medium

  2. Testing infrastructure flaky (3 instances)
     Root Cause: Increased test load, needs optimization
     Severity: High

  3. Documentation gaps in API changes
     Root Cause: Developers focused on feature delivery
     Severity: Low

  4. Long standup meetings (averaging 20 mins)
     Root Cause: Too many status details
     Severity: Medium

---

Action Items Committed:

1. Daily PO availability window (9-10am)
   Owner: Product Manager
   Due: Sprint 24 Start (Jan 21)
   Priority: High

2. Optimize test infrastructure
   Owner: DevOps Lead
   Due: Sprint 24 Mid-point (Jan 28)
   Priority: High
   Estimated Effort: 16 hours

3. Standup time-boxing
   Owner: Scrum Master
   Due: Next Sprint (Jan 21)
   Priority: Medium
   Method: 5-minute timebox, detailed issues in follow-up

4. API documentation template
   Owner: Tech Lead
   Due: Sprint 24 Start (Jan 21)
   Priority: Low

---

Metrics:
  Velocity: 85 story points (vs 80 planned)
  Bugs Found: 2 (both fixed in sprint)
  Code Review Cycle: 23 hours avg (target: 24)
  Team Morale (1-5): 4.2/5

---

Team Feedback:
  "Best sprint in a while!"
  "Would like more focus on code quality"
  "Great support from the team"
yaml
Retrospective Report:

Sprint: Sprint 23 (Jan 7 - Jan 17, 2025)
Facilitator: Sarah
Attendees: 8 engineers, 1 PM
Duration: 60 minutes

---

What Went Well:
  - Shipped feature 3 days early
  - Zero critical bugs in production
  - Great collaboration between frontend/backend
  - Mentoring of new team member
  - Faster code review cycle (2 → 1 day avg)

Celebrated:
  - Front-end team for UI excellence
  - DevOps for infrastructure stability
  - QA for thorough testing

---

What Could Be Improved:
  1. Unclear requirements caused rework (2 developers, 8 hours)
     Root Cause: PO wasn't available early in sprint
     Severity: Medium

  2. Testing infrastructure flaky (3 instances)
     Root Cause: Increased test load, needs optimization
     Severity: High

  3. Documentation gaps in API changes
     Root Cause: Developers focused on feature delivery
     Severity: Low

  4. Long standup meetings (averaging 20 mins)
     Root Cause: Too many status details
     Severity: Medium

---

Action Items Committed:

1. Daily PO availability window (9-10am)
   Owner: Product Manager
   Due: Sprint 24 Start (Jan 21)
   Priority: High

2. Optimize test infrastructure
   Owner: DevOps Lead
   Due: Sprint 24 Mid-point (Jan 28)
   Priority: High
   Estimated Effort: 16 hours

3. Standup time-boxing
   Owner: Scrum Master
   Due: Next Sprint (Jan 21)
   Priority: Medium
   Method: 5-minute timebox, detailed issues in follow-up

4. API documentation template
   Owner: Tech Lead
   Due: Sprint 24 Start (Jan 21)
   Priority: Low

---

Metrics:
  Velocity: 85 story points (vs 80 planned)
  Bugs Found: 2 (both fixed in sprint)
  Code Review Cycle: 23 hours avg (target: 24)
  Team Morale (1-5): 4.2/5

---

Team Feedback:
  "Best sprint in a while!"
  "Would like more focus on code quality"
  "Great support from the team"

Best Practices

最佳实践

✅ DO

✅ 建议

  • Hold retrospectives regularly (every sprint)
  • Create psychological safety upfront
  • Use varied formats to maintain engagement
  • Include the whole team
  • Focus on systems, not individuals
  • Convert insights to specific action items
  • Assign clear owners and due dates
  • Track and celebrate completed actions
  • Review previous actions at start
  • Thank people for participation and honesty
  • 定期召开回顾会议(每个冲刺阶段一次)
  • 提前营造心理安全感
  • 使用多样化的形式保持参与度
  • 让整个团队参与进来
  • 关注系统问题,而非个人
  • 将洞察转化为具体的行动项
  • 明确分配负责人和截止日期
  • 跟踪并庆祝已完成的行动
  • 在会议开始时回顾之前的行动项
  • 感谢大家的参与和坦诚反馈

❌ DON'T

❌ 避免

  • Blame individuals or teams
  • Let dominant voices control discussion
  • Create action items without owners
  • Have retrospectives without follow-up
  • Ignore difficult feedback
  • Focus only on what went wrong
  • Hold retrospectives when people are tired/stressed
  • Skip closing/celebration
  • Mix retrospectives with status meetings
  • Ignore patterns across multiple retrospectives
  • 指责个人或团队
  • 让强势声音主导讨论
  • 创建没有负责人的行动项
  • 召开回顾会议却不跟进
  • 忽视负面反馈
  • 只关注做得不好的地方
  • 在大家疲惫或压力大的时候召开回顾会议
  • 跳过收尾/庆祝环节
  • 将回顾会议与状态会议混为一谈
  • 忽视多次回顾会议中出现的模式

Retrospective Tips

回顾会议小贴士

  • Rotate formats every 3-4 sprints to maintain engagement
  • Use anonymous input for sensitive feedback
  • Time-box discussion to stay focused
  • Focus on 3-5 improvements, not 20 action items
  • Review and celebrate progress on previous actions
  • 每3-4个冲刺阶段更换一次形式,以保持参与度
  • 对敏感反馈使用匿名输入方式
  • 为讨论设置时间限制,保持专注
  • 聚焦3-5项改进,而非20个行动项
  • 回顾并庆祝之前行动项的进展