30 Case Study Thực Chiến Cho Leader Trong Dự Án Angular Enterprise
🎯 Mục Tiêu Bài Viết
Đây là bộ 30 case study cực thực chiến dành cho Leader/Tech Lead trong dự án Angular enterprise — đặc biệt là môi trường outsource, deadline gắt, requirement đổi liên tục.
Format: Tình huống → Dấu hiệu → Cách xử lý → Câu nên nói → Bài học
📋 Mục Lục
| # | Nhóm | Tình huống |
|---|---|---|
| 1–6 | 🔍 Code Review | Conflict review, defensive dev, PR lớn, nitpick… |
| 7–11 | 🐛 Bug & Quality | Chậm fix bug, estimate sai, regression, debt… |
| 12–16 | 🔧 Refactor & Tech | Dev chống refactor, chống test, nợ kỹ thuật… |
| 17–21 | 🤝 QA & Process | QA căng thẳng, bug triage, release pressure… |
| 22–26 | 📋 PM & Scope | PM ép deadline, scope creep, requirement liên tục đổi… |
| 27–30 | 🌐 Client & Delivery | Client đổi yêu cầu, UAT fail, demo sụp, go-live risk… |
🔍 Nhóm 1: Code Review
1) Dev cãi code review gay gắt
Tình huống: Dev không chấp nhận comment, tranh luận kéo dài trên PR, dùng ngôn ngữ phòng thủ.
Dấu hiệu:
- “Em làm vậy vì lý do X, Y, Z” nhưng không giải quyết concern
- Đóng comment mà không fix
- Tone ngày càng căng
Cách xử lý:
- Không tranh luận thêm trên PR
- Chuyển sang call 10–15 phút để giải quyết
- Tập trung vào: risk, maintainability, consistency — không phải ai đúng
- Sau call, tóm tắt quyết định vào PR comment để có record
Câu nên nói:
“Mình không cần đồng ý tuyệt đối, mình cần chốt được giải pháp giảm risk nhất cho cả team.”
💡 Bài học: Review culture phải được xây dựng từ trước — không chờ tới lúc conflict.
2) PR quá lớn, reviewer không muốn review
Tình huống: Dev submit PR 50–100 files, reviewer ngại review, approve cho xong.
Dấu hiệu:
- PR open nhiều ngày không có comment
- Review comment rất ít, chủ yếu approve
- Bug lọt qua sau merge
Cách xử lý:
- Đặt rule: PR tối đa X files / Y lines (ví dụ: 20 files, 400 lines)
- Hướng dẫn cách tách PR:
- PR 1: infrastructure / setup
- PR 2: core logic
- PR 3: UI / integration
- Với PR lớn không thể tránh: yêu cầu walkthrough ngắn trước khi review
Câu nên nói:
“PR này quá lớn để review hiệu quả. Mình cần tách nhỏ để chất lượng review thực sự có giá trị.”
💡 Bài học: PR nhỏ không phải overhead — đó là cách giảm risk thực tế.
3) Reviewer chỉ nitpick style, bỏ qua logic
Tình huống: Review toàn comment về spacing, naming, format — bỏ qua bug logic, missing edge case.
Dấu hiệu:
- Comment nhiều nhưng không substantive
- Logic bug lọt qua
- Dev cảm thấy review vô nghĩa
Cách xử lý:
- Phân loại comment theo priority:
🔴 Must fix → bug, security, data issue
🟡 Should fix → logic, performance, maintainability
🟢 Nice to have → style, naming (có thể auto-fix bằng linter)
- Auto-format bằng Prettier/ESLint để loại bỏ style debate
- Hướng review vào: correctness, edge case, test coverage
Câu nên nói:
“Style thì để linter lo. Review của mình tập trung vào logic và risk.”
💡 Bài học: Review tốt là review có giá trị, không phải review nhiều.
4) Senior không muốn review code của junior
Tình huống: Senior thấy review junior mất thời gian, code chất lượng thấp, hay bỏ qua.
Dấu hiệu:
- PR của junior open lâu không có review
- Khi review thì comment kiểu thất vọng, không constructive
- Junior không cải thiện vì không có guidance
Cách xử lý:
- Đặt kỳ vọng rõ với senior: review là coaching, không phải phán xét
- Pair review: senior ngồi cùng junior giải thích
- Đặt SLA review: PR phải có first review trong X giờ
- Rotate reviewer để không senior nào bị overload
Câu nên nói với senior:
“Review junior là đang multiply output của em — 1 giờ review đúng cách tiết kiệm 5 giờ fix sau.”
💡 Bài học: Senior tốt không chỉ merge PR — senior tốt nâng chất lượng cả team.
5) Review comment không được follow up
Tình huống: Reviewer comment, dev sửa một phần, comment cũ chưa resolve nhưng PR được merge.
Dấu hiệu:
- Thread comment open nhưng PR merged
- Cùng lỗi xuất hiện lại ở PR sau
- Reviewer cảm thấy comment vô dụng
Cách xử lý:
- Rule: tất cả comment phải được resolve hoặc có response rõ trước khi merge
- Phân biệt resolve:
- Fixed: đã sửa
- Won’t fix: có lý do rõ ràng, được reviewer acknowledge
- Deferred: tạo ticket riêng, linked vào PR
- Reviewer là người resolve comment, không phải author
Câu nên nói:
“Comment chưa được resolve nghĩa là conversation chưa xong. Không merge khi còn open thread.”
💡 Bài học: Review loop chưa đóng là technical debt ngay từ đầu.
6) Không ai muốn review Angular module phức tạp
Tình huống: Module phức tạp (state management, lazy loading, complex form) — ai cũng review qua loa.
Dấu hiệu:
- Approve nhanh mà không hiểu
- Bug ở module này nhiều sau release
- Không ai nhận làm owner module đó
Cách xử lý:
- Chỉ định module owner rõ ràng
- Yêu cầu author viết module doc ngắn trước khi review:
- Mục đích module
- Flow chính
- Các decision quan trọng
- Pair review với người hiểu domain nhất
- Với Angular: checklist riêng cho module phức tạp:
☑️ Change detection strategy ☑️ Memory leak (unsubscribe) ☑️ Lazy loading
boundary ☑️ Error handling ☑️ State mutation pattern
💡 Bài học: Module phức tạp cần reviewer phù hợp, không phải reviewer ngẫu nhiên.
🐛 Nhóm 2: Bug & Quality
7) Dev chậm fix bug, hay để tồn đọng
Tình huống: Bug log xong nhưng dev không nhận, hoặc nhận rồi để đó hàng tuần.
Dấu hiệu:
- Bug list dài, nhiều ticket “In Progress” nhưng không tiến
- Dev không update ticket
- Bug cũ tích lũy thành núi
Cách xử lý:
- Bug triage 2 lần/tuần: review list, assign, unblock
- SLA rõ theo severity:
🔴 Critical → fix trong 4h
🟠 High → fix trong 1 ngày
🟡 Medium → fix trong sprint
🟢 Low → backlog, có deadline
- Không để bug “in progress” quá 2 ngày không có update
Câu nên nói:
“Bug không phải optional. Bug blocker phải có owner và ETA rõ trong vòng 1 giờ sau khi được assign.”
💡 Bài học: Bug list phản ánh sức khỏe của process, không chỉ chất lượng code.
8) Estimate sai liên tục — team không học được
Tình huống: Sprint sau sprint, estimate lệch thực tế, nhưng không ai phân tích nguyên nhân.
Dấu hiệu:
- Velocity không ổn định
- Estimate thường quá lạc quan
- Team estimate kiểu “cảm tính”
Cách xử lý:
- Sau mỗi sprint: retrospective estimate
- Estimate bao nhiêu?
- Actual bao nhiêu?
- Lệch vì lý do gì?
- Phân loại nguyên nhân lệch:
🔍 Hiểu sai requirement
🧩 Dependency không lường trước
⚙️ Technical complexity cao hơn
🐛 Bug / rework không dự đoán
🤒 Capacity team thay đổi
- Dùng historical data để calibrate estimate sau
Câu nên nói:
“Estimate sai không phải lỗi. Không học từ estimate sai mới là vấn đề.”
💡 Bài học: Estimate tốt hơn qua data và retrospection, không phải chỉ qua kinh nghiệm cảm tính.
9) Regression xuất hiện sau mỗi lần release
Tình huống: Fix bug này, sinh bug khác. Release nào cũng có regression.
Dấu hiệu:
- Bug report tăng sau release
- Cùng area code có bug nhiều lần
- Team mất tin tưởng vào release
Cách xử lý:
- Phân tích root cause của regression:
- Thiếu test coverage?
- Code coupling cao?
- Không có regression test?
- Với Angular: tập trung coverage ở:
☑️ Service logic (unit test) ☑️ Component interaction (integration test) ☑️
Critical user flow (e2e)
- Thêm regression test ngay sau khi fix bug
- Pre-release checklist cho area hay bị regression
Câu nên nói:
“Mỗi bug fix phải đi kèm test case để nó không bao giờ quay lại.”
💡 Bài học: Regression là tín hiệu của thiếu safety net, không chỉ thiếu cẩn thận.
10) Team không viết test, lấy lý do “không có thời gian”
Tình huống: Mọi người đều đồng ý test quan trọng nhưng thực tế PR nào cũng không có test.
Dấu hiệu:
- Coverage thấp hoặc không đo
- Test chỉ được viết khi bị nhắc
- “Sprint này gấp, test sau” — và “sau” không bao giờ đến
Cách xử lý:
- Đưa test vào Definition of Done — không có test = không done
- Bắt đầu nhỏ: không cần 100% coverage ngay
- Sprint 1: test cho service layer
- Sprint 2: test cho critical component
- Sprint 3: test cho user flow quan trọng
- Pair programming cho test khó
- Code review reject PR không có test cho logic quan trọng
Câu nên nói:
“Không có thời gian viết test = không có thời gian làm đúng. Mình cần re-scope nếu vậy.”
💡 Bài học: Test không phải thêm việc — test là bảo hiểm cho mọi thay đổi sau.
11) Technical debt tích lũy, team bắt đầu sợ chạm vào legacy code
Tình huống: Codebase Angular cũ, nhiều any, không có test, component quá lớn. Ai cũng ngại modify.
Dấu hiệu:
- Estimate tăng dần cho cùng loại task
- Dev nói “cẩn thận khu vực này” như disclaimer
- Bug ở legacy area nhiều hơn area mới
Cách xử lý:
- Map ra debt areas theo impact:
🔴 High risk, high touch → xử lý sớm
🟡 High risk, low touch → document kỹ, test trước khi touch
🟢 Low risk → để sau
- Rule: Boy Scout Rule — mỗi lần chạm file, cải thiện một chút
- Allocate 15–20% sprint capacity cho tech improvement
- Không refactor toàn bộ cùng lúc — incremental và có test
Câu nên nói:
“Chúng ta không cần refactor toàn bộ. Chúng ta cần mỗi sprint cải thiện một chút để debt không lớn hơn.”
💡 Bài học: Legacy code không phải vấn đề kỹ thuật — đó là vấn đề strategy và discipline.
🔧 Nhóm 3: Refactor & Tech
12) Dev chống refactor vì sợ break
Tình huống: Đề xuất refactor Angular module, dev phản đối vì sợ introduce bug.
Dấu hiệu:
- “Đang chạy ổn, sửa làm gì”
- Không muốn refactor trừ khi bị ép
- Refactor xong hay có regression
Cách xử lý:
- Validate concern: sợ break là hợp lý nếu không có test
- Test trước, refactor sau:
- Viết test characterization cho behavior hiện tại
- Refactor trong khi test xanh
- Verify behavior không đổi
- Tách refactor thành PR nhỏ, không trộn với feature
Câu nên nói:
“Mình không refactor để thay đổi behavior. Mình refactor để code dễ thay đổi hơn về sau. Test sẽ bảo vệ mình.”
💡 Bài học: Refactor không có test là mạo hiểm. Refactor có test là đầu tư.
13) Dev chỉ muốn code feature, không muốn đụng vào architecture
Tình huống: Team Angular tập trung ship feature, bỏ qua structure: component quá lớn, service làm quá nhiều việc, module không tách đúng.
Dấu hiệu:
- Component > 500 lines
- Service inject nhiều dependencies không liên quan
- Module boundary không rõ
Cách xử lý:
- Đặt architecture guideline rõ trong Angular project:
📐 Component: chỉ presentation logic
🔧 Service: single responsibility
📦 Module: feature boundary rõ
🔄 State: centralized, predictable
- Architecture review định kỳ (không phải chỉ code review)
- Tech Lead phải approve architecture decision trước khi code
Câu nên nói:
“Feature nhanh hôm nay nhưng architecture sai sẽ làm mọi feature sau chậm lại. Mình cần đúng từ đầu.”
💡 Bài học: Architecture không phải việc một lần — đó là quyết định liên tục trong từng feature.
14) Không ai muốn maintain shared library / common module
Tình huống: Team dùng chung component library hoặc shared module nhưng không ai nhận ownership.
Dấu hiệu:
- Shared component bị copy-paste thay vì reuse
- Bug trong shared component không được fix vì “không phải việc của tôi”
- Breaking change không được communicate
Cách xử lý:
- Chỉ định owner rõ cho từng shared module
- Shared module có changelog và version
- Breaking change phải có migration guide
- Không được modify shared module mà không notify owner
Câu nên nói:
“Shared code cần được đối xử nghiêm túc hơn feature code — nó ảnh hưởng tất cả mọi người.”
💡 Bài học: Shared code không có owner = tài sản chung không ai bảo vệ.
15) Performance issue trong Angular app bị ignore
Tình huống: App load chậm, change detection chạy nhiều, memory leak — nhưng không ai xử lý vì “vẫn chạy được”.
Dấu hiệu:
- User complain app lag
- Profiler cho thấy change detection triggered quá nhiều
- Memory tăng dần theo thời gian dùng
Cách xử lý:
- Đo trước khi optimize: Chrome DevTools, Angular DevTools
- Checklist performance Angular:
☑️ OnPush ChangeDetection ở leaf component ☑️ TrackBy trong *ngFor ☑️
Unsubscribe trong ngOnDestroy ☑️ Lazy load module ☑️ Pure pipe thay vì method
trong template
- Allocate time trong sprint cho performance audit định kỳ
Câu nên nói:
“Performance issue không phải chờ user complain mới xử lý. Mình cần monitor và fix proactively.”
💡 Bài học: Performance là feature, không phải afterthought.
16) Team không đồng ý về Angular pattern nên dùng
Tình huống: Dev A dùng NgRx, dev B muốn Signal, dev C muốn service + BehaviorSubject. Code inconsistent.
Dấu hiệu:
- Cùng loại vấn đề có 3 cách giải khác nhau trong codebase
- PR review tốn thời gian vì debate pattern
- New member confused về “cách đúng”
Cách xử lý:
- Tổ chức ADR (Architecture Decision Record) session
- Đánh giá theo tiêu chí:
- Complexity vs use case
- Team familiarity
- Long-term maintainability
- Ra decision rõ, documented, áp dụng từ sprint tiếp theo
- Không nhất thiết phải migrate code cũ ngay — nhưng code mới phải theo pattern mới
Câu nên nói:
“Mình không cần pattern hoàn hảo nhất, mình cần pattern nhất quán nhất trong codebase này.”
💡 Bài học: Consistency quan trọng hơn perfection trong team setting.
🤝 Nhóm 4: QA & Process
17) QA và Dev căng thẳng liên tục
Tình huống: QA hay log bug mà dev thấy không hợp lý, dev reopen ticket mà QA không đồng ý.
Dấu hiệu:
- Ticket ping-pong nhiều vòng
- QA và Dev không muốn sync trực tiếp
- Leader bị kéo vào phân xử liên tục
Cách xử lý:
- Rule cứng: tranh luận trên ticket chỉ 2 lần, sau đó sync call 10 phút
- Căn cứ luôn là: requirement, acceptance criteria, approved demo
- Không ai “thắng” — mục tiêu là product đúng
- Retrospective định kỳ để phân tích pattern xung đột
Câu nên nói:
“QA và Dev cùng goal: ship sản phẩm tốt. Conflict là signal có gì đó chưa rõ trong process, không phải do người.”
💡 Bài học: QA-Dev tension thường là symptom của requirement chưa đủ rõ, không phải do con người.
18) QA không đủ thời gian test trước release
Tình huống: Dev done sát deadline, QA chỉ có 1–2 ngày để test toàn bộ.
Dấu hiệu:
- Test phase luôn bị squeeze
- QA phải skip test case để kịp
- Bug lọt qua production nhiều
Cách xử lý:
- Shift-left: QA tham gia từ đầu sprint
- Review AC khi grooming
- Chuẩn bị test case song song với dev
- Test incremental khi từng phần dev done
- Time-box QA phase ngay từ đầu sprint — không để QA là phần bị cắt cuối
Câu nên nói:
“Nếu QA chỉ có 1 ngày test, đó là sprint planning failure, không phải QA failure.”
💡 Bài học: QA phase bị squeeze là dấu hiệu sprint overcommit.
19) Release bị block vì QA tìm thấy bug critical sát deadline
Tình huống: Ngày release, QA log bug severity high. Cả team panic, không biết release hay hold.
Cách xử lý:
- Không panic — ra quyết định theo data:
| Câu hỏi | Để quyết định |
|---|---|
| Bug ảnh hưởng bao nhiêu % user? | Severity thực tế |
| Có workaround không? | Có thể release với note không? |
| Fix mất bao lâu? | Delay bao nhiêu nếu hold? |
| Risk nếu release với bug này? | So với risk delay |
- Leader chốt quyết định với đủ thông tin, không để team tự đoán
Câu nên nói:
“Mình cần 15 phút để đánh giá impact và quyết định. Không panic, không rush quyết định khi thiếu thông tin.”
💡 Bài học: Release decision là risk management, không phải pass/fail exam.
20) Staging environment không ổn định, QA không test được
Tình huống: Staging hay down, data sai, config khác production. QA không verify được.
Dấu hiệu:
- QA block vì environment
- Test kết quả không đáng tin cậy
- “Staging ổn nhưng production lỗi”
Cách xử lý:
- Assign environment owner — ai chịu trách nhiệm staging stability
- Environment health check routine
- Infrastructure as Code cho consistency
- Separate test data management
- Nếu không thể fix nhanh: document known issues để QA biết tránh
Câu nên nói:
“Staging không ổn định là blocker cho cả team. Đây là infrastructure investment cần ưu tiên.”
💡 Bài học: Môi trường test tệ = chi phí ẩn rất lớn cho cả team.
21) Không ai làm test automation, manual test mãi
Tình huống: Team biết cần automation test nhưng không bao giờ bắt đầu.
Dấu hiệu:
- Regression test luôn manual
- QA bottleneck trước mỗi release
- Cùng test case chạy đi chạy lại mỗi sprint
Cách xử lý:
- Bắt đầu từ critical path, không từ toàn bộ:
- Login flow
- Core business flow
- High-risk area
- Dùng Playwright/Cypress — bắt đầu với 5–10 test có giá trị cao
- Integrate vào CI/CD — automation chỉ có giá trị khi chạy tự động
- Track: số manual test được replace bởi automation
Câu nên nói:
“Mình không cần 100% automation ngay. Mình cần bắt đầu với phần có giá trị nhất và build từ đó.”
💡 Bài học: Test automation là investment, không phải cost — nhưng chỉ khi được dùng đúng.
📋 Nhóm 5: PM & Scope
22) PM ép deadline không thực tế
Tình huống: PM commit với client timeline mà không hỏi team. Team bị đặt vào thế buộc phải gồng.
Cách xử lý:
- Không nói “không làm được” — nói “làm được với những điều kiện sau”:
✅ Nếu scope giảm X
✅ Nếu dependency Y được resolve trước ngày Z
✅ Nếu team được thêm A resource
- Đưa ra 3 scenarios:
- Full scope: cần thêm 2 tuần
- MVP scope: kịp deadline
- Critical only: kịp deadline và ít risk nhất
Câu nên nói:
“Mình muốn giúp PM giữ commitment với client. Để làm được vậy, mình cần chọn 1 trong 3 options này.”
💡 Bài học: Leader không chỉ bảo vệ team — leader phải tạo ra lựa chọn cho stakeholder.
23) Scope creep — task cứ lớn dần trong sprint
Tình huống: Task ban đầu nhỏ, nhưng qua clarification cứ thêm requirement, estimate tăng gấp đôi.
Dấu hiệu:
- Task reopen nhiều lần
- “À nhân tiện làm thêm…“
- Sprint velocity giảm dần
Cách xử lý:
- Freeze scope khi sprint bắt đầu — chỉ accept change khi có trade-off rõ
- Với yêu cầu mới: log ticket mới, không nhét vào task hiện tại
- Visible scope change log trong sprint
Câu nên nói:
“Phần này là out of scope ban đầu. Mình sẽ tạo ticket mới và đưa vào sprint sau, hoặc trade-off với task khác nếu urgent.”
💡 Bài học: Scope creep không phải lỗi của BA — đó là failure của scope management.
24) Requirement đổi liên tục, team mất định hướng
Tình huống: Requirement thay đổi 2–3 lần/tuần. Team không biết đang build cái gì nữa.
Dấu hiệu:
- Dev hỏi nhau “cái này còn dùng không?”
- Nhiều code chưa release đã obsolete
- Team mất motivation
Cách xử lý:
- Freeze requirement theo sprint — chỉ đổi trong grooming của sprint tiếp theo
- Mỗi thay đổi phải có: lý do, impact, người approve
- Giữ decision log accessible cho cả team
- Communicate rõ với BA/PM: change cost không chỉ là effort mà còn là context switch và morale
Câu nên nói:
“Mình support business agility, nhưng change không có process sẽ phá velocity và chất lượng. Đây là cái giá thực sự.”
💡 Bài học: Agile không có nghĩa là change bất cứ lúc nào — agile là change có kiểm soát.
25) PM muốn estimate cho feature chưa có requirement
Tình huống: PM hỏi “cái này làm mất mấy ngày?” trong khi requirement còn chưa rõ.
Cách xử lý:
- Không từ chối hoàn toàn — đưa ra range estimate với điều kiện:
📊 High-level estimate: X–Y ngày
⚠️ Assumptions: [list rõ]
❓ Unknowns: [list rõ]
📅 Confident estimate: sau khi có requirement đầy đủ
- Giải thích: estimate không chính xác sẽ gây hại hơn là không estimate
Câu nên nói:
“Mình có thể cho rough estimate là 3–7 ngày, nhưng nó có thể sai hoàn toàn nếu assumption X sai. Mình cần Y thông tin để estimate chính xác hơn.”
💡 Bài học: Rough estimate với điều kiện tốt hơn confident estimate sai.
26) Velocity thấp liên tục, PM nghi ngờ team không effort
Tình huống: Nhiều sprint liên tiếp không đạt target. PM bắt đầu đặt câu hỏi về năng suất.
Cách xử lý:
- Không defend cảm tính — phân tích data:
- Velocity trend qua các sprint
- Breakdown: feature work vs bug fix vs tech debt vs meeting
- External blocker: dependency, environment, requirement change
- Đề xuất velocity improvement plan cụ thể
Câu nên nói:
“Mình có data về velocity breakdown. Phần lớn capacity đang bị ăn bởi X và Y — đây là cách mình sẽ xử lý để cải thiện.”
💡 Bài học: Velocity thấp thường có nguyên nhân hệ thống — không chỉ là effort cá nhân.
🌐 Nhóm 6: Client & Delivery
27) Client liên tục đổi requirement sau khi đã approved
Tình huống: Client approve requirement, team build xong, client lại nói “ý tôi không phải vậy”.
Dấu hiệu:
- “Trên giấy đồng ý nhưng thực tế lại khác”
- UAT nhiều issue unexpected
- Team rework nhiều
Cách xử lý:
- Demo sớm và thường xuyên — đừng chờ tới UAT
- Với requirement phức tạp: prototype/wireframe trước khi code
- Approval phải kèm example / scenario cụ thể, không chỉ description chung
- Change sau approval = change request với cost rõ ràng
Câu nên nói:
“Để tránh surprise ở cuối, mình sẽ demo phần này sớm để client confirm hướng trước khi build tiếp.”
💡 Bài học: Demo sớm là bảo hiểm rẻ nhất cho rework.
28) UAT fail nặng — client không hài lòng
Tình huống: UAT có quá nhiều issue. Client disappointed, timeline delay, team mất tinh thần.
Cách xử lý: Không blame — phân tích nguyên nhân theo categories:
| Category | Ví dụ | Action |
|---|---|---|
| Real defect | Code sai logic | Fix trong sprint |
| Requirement gap | Chưa capture | Re-plan với BA |
| Expectation mismatch | Hiểu khác nhau | Clarify + align |
| Enhancement | Muốn thêm tính năng | Backlog / change request |
- Communicate rõ với client: không phải tất cả đều là bug
Câu nên nói với client:
“Chúng tôi đã phân tích issue list. X items là defect sẽ được fix trong Y ngày. Z items cần clarify thêm với BA. W items là enhancement nằm ngoài scope ban đầu.”
💡 Bài học: UAT fail không phải thất bại của team — đó là cơ hội để align trước khi production.
29) Demo sụp trước mặt client / stakeholder
Tình huống: Demo environment down, tính năng chính có bug, login không được — ngay trước mặt client.
Cách xử lý ngay lập tức:
- Không panic — acknowledge thẳng: “Chúng tôi gặp issue kỹ thuật, xin lỗi về inconvenience”
- Chuyển sang demo backup plan:
- Screenshot / video đã prepare sẵn
- Demo trên local đã stable
- Mô tả flow bằng slides
- Commit timeline fix và follow up
Prevent cho lần sau:
☑️ Demo environment lock 24h trước
☑️ Demo script chạy thử trước 2h
☑️ Backup: video record của flow chính
☑️ Hotspot backup cho internet
☑️ Không deploy mới trước demo < 2h
💡 Bài học: Demo failure không phải thảm họa nếu bạn handle professionally và có backup plan.
30) Go-live risk cao — leader phải quyết định release hay hold
Tình huống: Ngày go-live, còn tồn tại một số issue. PM muốn release, QA muốn hold, client đang chờ.
Framework quyết định:
STEP 1: Categorize issues
🔴 Blocker: chặn core function → hold
🟡 Workaround available → release với note
🟢 Minor / cosmetic → release, fix post go-live
STEP 2: Assess risk
- % user bị impact
- Có rollback plan không
- Support team sẵn sàng không
STEP 3: Communicate
- Stakeholder biết known issues
- Fix timeline rõ ràng
- Monitoring plan post go-live
Câu nên nói:
“Mình recommend release với known issues X và Y vì chúng có workaround và ảnh hưởng < 5% user. Issues A sẽ được fix trong 24h sau go-live. Team sẽ monitor chặt trong 48h đầu.”
💡 Bài học: Go-live decision tốt là decision có đủ thông tin và có plan B, không phải decision không có risk.
🧰 Framework Tổng Hợp Cho Leader Angular Enterprise
Khi có conflict trong team
1. Lắng nghe cả hai phía (riêng)
2. Identify: kỹ thuật hay cá nhân?
3. Kéo về objective chung
4. Chốt decision bằng data/criteria
5. Document và communicate
Khi có áp lực deadline
1. Đừng absorb áp lực vào team ngay
2. Analyze: scope, capacity, dependency
3. Đưa ra options với trade-off rõ
4. PM/stakeholder chọn option
5. Commit và execute
Khi có quality issue
1. Không blame cá nhân
2. Find root cause: skill? process? tooling?
3. Fix systemic issue, không chỉ symptom
4. Measure: trước và sau fix
5. Prevent recurrence
Khi có client issue
1. Acknowledge nhanh, không defend
2. Phân loại: defect / gap / expectation / enhancement
3. Communicate timeline và plan
4. Follow up đúng hẹn
5. Retrospect để prevent lần sau
📌 Quick Reference: Câu Nên Nói Theo Tình Huống
| Tình huống | Câu nên nói |
|---|---|
| PR quá lớn | “Mình cần tách PR này để review có chất lượng thực sự.” |
| Estimate sai | “Estimate sai không phải lỗi. Không học từ estimate sai mới là vấn đề.” |
| Deadline áp lực | “Mình có 3 options với trade-off khác nhau. PM chọn option nào?” |
| Requirement đổi | “Change này có impact X. Nếu accept, mình cần Y.” |
| QA-Dev conflict | “Mình quay về requirement đã chốt để tìm source of truth.” |
| Demo fail | “Chúng tôi gặp issue kỹ thuật. Đây là backup plan của mình.” |
| Go-live risk | “Đây là known issues, workaround, và timeline fix.” |
| Tech debt | “Debt này sẽ cost X effort về sau. Mình đề xuất xử lý trong Y sprint.” |
| Chống refactor | “Test trước, refactor sau. Test sẽ bảo vệ mình.” |
| UAT fail | “Mình phân loại: defect fix trong X ngày, gap cần clarify, enhancement là scope mới.” |