Vòng đời dự án Trung bình 7 phút đọc

Retrospective và Post-Mortem: không đổ lỗi, hữu dụng, được track

Cách chạy retrospective team đổi hành vi và post-mortem giảm sự cố lặp. Template cộng kỷ luật theo dõi action giữ chúng dính.

Mục lục
  1. Khi nào retro / post-mortem chính thức trở nên quan trọng?
  2. Cái giá khi bỏ retro và post-mortem là gì?
  3. Format retro tối thiểu trông thế nào?
  4. Template post-mortem tối thiểu trông thế nào?
  5. Scale lên đa team ra sao?
  6. Retro / post-mortem có thể tự tạo ra những lỗi nào?
  7. Khi nào retro chi tiết là quá liều?
  8. Đi tiếp từ đây như thế nào?

Khả năng học của một team chính là lợi thế bền vững duy nhất khi dự án ngày càng lớn. Retrospective biến từng sprint thành một thí nghiệm nhỏ; còn post-mortem biến từng sự cố thành một thay đổi ở cấp hệ thống. Chương này giới thiệu format, template, và kỷ luật theo dõi để cả hai không trở thành kịch.

Khi nào retro / post-mortem chính thức trở nên quan trọng?

Có ba tín hiệu chính.

Sự cố lặp lại. Cùng kiểu bug, cùng kiểu trễ, cùng kiểu ma sát với stakeholder - khi chúng quay lại, nghĩa là bài học lần trước đã không dính được. Một post-mortem có action item là cách trả lời đúng.

Team đang lớn lên hoặc đang xoay người. Thành viên mới chưa có lịch sử của team. Retro chính là nơi ngữ cảnh được chuyển sang.

Chất lượng đi xuống một cách lặng lẽ. Bug bò lên dần, deploy chậm hơn, on-call bị page nhiều hơn. Retro làm lộ trend này ra trước khi nó kịp biến thành một sự cố lớn.

Nếu team đang ổn định, ship trơn tru, sự cố hiếm xảy ra, nhịp retro nhẹ (mỗi tháng một lần) là đủ. Chương sprint execution cũng cung cấp một bề mặt ở cấp standup để bắt vấn đề giữa các retro. Chỉ bỏ qua post-mortem cho những sự cố thực sự không đáng kể.

Cái giá khi bỏ retro và post-mortem là gì?

Có ba kiểu lỗi thường gặp.

Cùng pattern bug lặp lại. Ba lần trong sáu tháng cùng một kiểu regression được ship ra. Khi không có post-mortem, team coi mỗi lần như một sự cố một-lần riêng lẻ; còn cái gap bên dưới (không có integration test, không có canary deploy) thì vẫn nguyên đó.

Quy trình trôi dần. Standup dài lê thê, retro ngắn lại, doc thưa dần. Không ai nhận ra vì không có bề mặt review nào bắt được điều đó.

Attrition trong im lặng. Engineer cảm thấy không được lắng nghe. Họ ngừng nêu vấn đề. Rồi họ rời đi. Buổi phỏng vấn nghỉ việc cuối cùng làm lộ ra những gì retro đáng lẽ phải bắt được.

Format retro tối thiểu trông thế nào?

Cho team 5 người, vào cuối sprint:

# Retrospective — Sprint 2026-12

## Cái gì tốt (5 phút)
- Luồng refund ship đúng hạn
- Engineer mới ramp nhanh nhờ pairing
- Không sự cố production sprint này

## Cái gì đau (10 phút)
- Stripe sandbox flaky 3 ngày, chặn Bob
- Thêm scope giữa sprint cho khách VIP (không dùng template)
- Queue review PR tăng lên 8 PR cuối tuần

## Nên thử gì (10 phút)
- Action: Tài liệu hoá đường escalation Stripe-flake
  - Owner: Bob
  - Hạn: cuối sprint kế
- Action: Dùng template điều chỉnh giữa sprint mỗi lần
  - Owner: PM
  - Hạn: ngay

## Action retro trước (check trạng thái)
- [x] Thêm WIP limit vào review PR (XONG; queue giảm)
- [ ] Refresh runbook luồng refund (kéo qua; Carol sở hữu)
- [x] Chuyển standup sang 10 giờ (XONG; engineer vui hơn)

Phần "Action retro trước" chính là kỷ luật giúp retro thật sự dính. Nếu không có nó, các action item sẽ được thêm vào rồi quên đi.

Template post-mortem tối thiểu trông thế nào?

Sau một sự cố P1 hoặc P2, trong vòng 48 giờ:

# Post-Mortem: {{ Tiêu đề sự cố }} — 2026-06-13

## Tóm tắt
{{ Hai câu: cái gì xảy ra, ai bị ảnh hưởng, dài bao lâu }}

## Timeline
| Giờ (UTC) | Sự kiện |
|-----------|---------|
| 14:32 | Deploy v2.4.1 |
| 14:38 | Alert error rate nổ (0.8%) |
| 14:42 | On-call bị page; điều tra bắt đầu |
| 14:55 | Quyết roll back |
| 15:01 | Rollback xong; metric về baseline |
| 15:15 | All clear |

## Tác động
- {{ X khách bị ảnh hưởng }}
- {{ Thời gian: 33 phút }}
- {{ Tác động doanh thu: ước $Y }}

## Root cause (5 whys)
1. Vì sao error nhảy? - Code mới throw NullReferenceException
2. Vì sao? - Method refactor giả thiết param non-null
3. Vì sao? - Caller path legacy pass null trong 0.5% case
4. Vì sao? - Path legacy không trong test coverage
5. Vì sao? - Báo cáo coverage không review trong PR

## Cái gì tốt
- Rollback trong 30 phút (đạt target)
- Comms cập nhật khách lúc 14:50

## Cái gì không tốt
- Ngưỡng alert error rate quá thấp (0.8% nên là 0.3%)
- Không bước canary deploy cho service này

## Action item
| # | Action | Owner | Hạn | Track |
|---|--------|-------|-----|-------|
| 1 | Thêm bước canary deploy vào CI | Bob | 2026-06-30 | TICKET-1234 |
| 2 | Hạ alert error rate xuống 0.3% | Carol | 2026-06-20 | TICKET-1235 |
| 3 | Cổng coverage trong review PR | Alice | 2026-07-15 | TICKET-1236 |

## Trạng thái: Mở. Sẽ đóng khi mọi action xong.

Có ba chi tiết đáng chú ý. Timeline phải là cái thực sự đã xảy ra, chứ không phải cái chúng ta nghĩ là đã xảy ra - hãy tái dựng từ log và lịch sử channel. Phần root cause dùng phương pháp 5 whys để khoan từ dấu hiệu xuống cấp hệ thống. Còn các action item phải có ticket gắn theo, chứ không phải chỉ là ý định mơ hồ.

Scale lên đa team ra sao?

flowchart TB
    TeamA[Retro Team A] --> Org[Theme cấp tổ chức<br/>review tháng]
    TeamB[Retro Team B] --> Org
    TeamC[Retro Team C] --> Org
    Inc1[Post-mortem 1] --> Org
    Inc2[Post-mortem 2] --> Org
    Org --> Engineering[Cập nhật practice engineering<br/>vd cổng CI]

Retro của từng team vẫn nằm ở cấp team. Buổi review ở cấp tổ chức sẽ tổng hợp các theme xuyên các team (ví dụ "test flaky" lộ ra ở 3 retro liên tiếp = đây là vấn đề toàn tổ chức). Các action item xuyên team được chuyển sang team practice engineering để đẩy đi tiếp.

Retro / post-mortem có thể tự tạo ra những lỗi nào?

Khi nào retro chi tiết là quá liều?

Có hai trường hợp.

Team hai engineer đang ở trong deep flow. Đôi khi một buổi chat nhanh cuối sprint đã là đủ retro. Đừng chính thức hoá nếu team đang thật sự nói chuyện với nhau.

Một fix bằng một PR gây ra sự cố P3. Một sự cố một dòng với cách fix một dòng không cần một post-mortem 5-whys đầy đủ. Hãy ghi vào runbook của team rồi đi tiếp.

Format đầy đủ chỉ đáng thời gian khi team từ 5 người trở lên và sự cố ở mức P2 trở lên. Dưới đó, ghi chú nhẹ là chạy được.

Đi tiếp từ đây như thế nào?

Bạn đã hoàn tất nhóm lifecycle. Chương tiếp theo: 1-on-1 - artifact lãnh đạo con người, làm lộ vấn đề trước khi nó kịp đi đến retro. Sau đó, tuyển dụng và onboarding sẽ nói về cách đưa engineer mới vào team.

Câu hỏi thường gặp

Retro khác post-mortem ở đâu?
Retro diễn ra vào cuối sprint, bất kể có gì sai hay không; còn post-mortem diễn ra sau một sự cố cụ thể. Retro nhìn vào quy trình, giao tiếp, động lực team; còn post-mortem nhìn vào lỗi kỹ thuật và quy trình đã gây ra sự cố. Cả hai dùng chung một khung 'không đổ lỗi', chỉ khác về scope.
Làm sao để retro không có cảm giác như buổi trị liệu?
Bằng cấu trúc và time-box rõ. Hãy dùng format 'cái gì tốt, cái gì đau, nên thử gì' với 5 phút cho mỗi mục và 10 phút cuối cho action item. Khi hết giờ thì dừng. Retro biến thành trị liệu là khi team coi đó là không gian an toàn duy nhất để xả - tức là các channel khác (1-on-1, báo stakeholder) đã hỏng.
Kỹ thuật 5 whys là gì?
Là kỹ thuật để phân tích root cause. Hỏi 'vì sao' năm lần liên tiếp để khoan từ dấu hiệu xuống tới nguyên nhân ở cấp hệ thống. Ví dụ: dấu hiệu là 'deploy fail'. Vì sao? 'Migration khoá bảng'. Vì sao? 'Cột mới không có NOT NULL'. Vì sao? 'Template migration không bao gồm review schema'. Vì sao? 'Chúng ta không có quy trình review migration'. Vì sao? 'Trước đây chưa thành vấn đề'. Câu trả lời thứ năm chính là thay đổi hệ thống cần làm để ngăn lần kế tiếp.
Nếu action item liên tục bị bỏ qua thì sao?
Có hai pattern. Hoặc các item quá lớn (team không nhét vừa sprint kế), hoặc đơn giản là không có kỷ luật theo dõi. Cách phòng: cap action item ở 2 cái mỗi retro và review chúng ngay đầu retro kế. Khi team buộc phải nhìn lại danh sách của tuần trước trước khi thêm cái mới, áp lực đó thường tự nó giải quyết được vấn đề kỷ luật.