XP Practices
Ngôn ngữ • Language
- VI
- EN
XP Practices – “thói quen làm việc” của team XP
XP mạnh nhất ở chỗ: nó không chỉ nói “làm theo Agile”, mà nói thẳng team nên làm gì mỗi ngày để giữ chất lượng kỹ thuật cao.
TL;DR – XP Practices trong 1 phút
- XP practices thường xoay quanh 2 nhóm:
- Planning & collaboration: Planning Game (Release Planning + Iteration Planning), Small Releases, On-site Customer (Whole Team), Customer/Acceptance Tests.
- Technical excellence: Continuous Integration (CI), Test-Driven Development (TDD), Pair Programming, Simple Design, Refactoring, Coding Standards, Collective Code Ownership, Sustainable Pace (40-hour week), System Metaphor.
- PMI-ACP hay gài theo kiểu:
- “Bỏ test/CI để chạy deadline” → ngược XP.
- “Chỉ một người được sửa module” → ngược collective ownership.
- “OT triền miên” → ngược sustainable pace.
Khi gặp câu hỏi nói về engineering practices / technical excellence, hãy nghĩ ngay đến XP: TDD, CI, refactoring, pair programming, coding standards, collective code ownership, acceptance tests, sustainable pace (40-hour week), on-site customer/whole team.
- XP practices là gì?
XP practices là những “việc team XP làm thường xuyên” để:
- giữ chất lượng phần mềm cao, và
- nhận feedback sớm (từ customer và từ test),
- giảm rủi ro “làm xong mới biết sai”.
Nói vui cho dễ nhớ:
- Scrum giống “lịch sinh hoạt & cách quản việc” của team (Sprint, Daily, Review, Retro).
- XP giống “bộ thói quen kỹ thuật” để code sạch, ít lỗi, dễ nâng cấp.
- Planning Game – XP gọi planning là “game”
Trong XP, “planning activities” đôi khi được gọi là games (Planning Game). Bạn có thể coi nó gồm 2 lớp:
2.1 Release Planning (lập kế hoạch phát hành)
- Release = thứ “đưa tới tay người dùng” (installable/usable).
- Release Planning = quyết định:
- release tới sẽ gồm những tính năng nào,
- cần bao nhiêu iteration để ra được một bản release đủ dùng.
Điểm hay gặp trong đề (và cần nói “chuẩn PMI” cho an toàn):
- Kết thúc mỗi iteration nên tạo ra working software / usable increment (demo được, chạy được, có thể đưa lên staging).
- Business có thể chưa chọn deploy production ngay (ví dụ: timing thị trường, kiểm soát rủi ro, hoặc gom đủ “mảnh” để release có ý nghĩa).
- Vì vậy, release planning thường bàn: “muốn ship một release có ý nghĩa với user thì cần bao nhiêu iteration/increment.”
Vai trò quyết định “cái gì vào release” là ai?
- Trong XP: Customer / On-site Customer quyết định ưu tiên theo nhu cầu business.
- Team dev cung cấp ước lượng và trao đổi về khả năng thực hiện.
Ví dụ đời thường:
- Làm hệ thống “invoices + payments”:
- Chỉ có “danh sách khách hàng” → chưa đủ dùng.
- Có “tạo hoá đơn” → vẫn chưa đủ dùng.
- Có “thu tiền” → tốt hơn.
- Nhưng business nói “phải có thanh toán thẻ tín dụng” mới gọi là “release có ý nghĩa”. => Release Planning là lúc customer nói: “Muốn release được, phải đủ các mảnh này.”
2.2 Iteration Planning (lập kế hoạch cho 1 vòng lặp)
- Trong XP: Iteration thường tương đương ý nghĩa với Sprint trong Scrum.
- Một iteration thường là timebox ngắn (hay gặp 1–2 tuần; một số team dùng dài hơn, tối đa khoảng vài tuần).
Iteration Planning tương tự Sprint Planning:
- Customer giải thích “iteration này muốn deliver cái gì”.
- Developers chia nhỏ thành tasks, ước lượng thời gian/effort.
- Team dự báo phạm vi dựa trên dữ liệu đã làm được trước đó (velocity/throughput).
Ví dụ dễ hình dung:
- Hỏi thợ sơn “sơn phòng này mất bao lâu?”
→ họ dựa vào “phòng tương tự trước đây sơn mất bao lâu”. - Team Agile cũng vậy: dựa vào dữ liệu iteration trước để biết iteration này “ôm được bao nhiêu”.
- Small Releases – release nhỏ, thường xuyên (thậm chí lên test environment)
Small Releases = ra phiên bản nhỏ, đều đặn, để:
- tăng visibility cho customer,
- nhận feedback sớm,
- giảm rủi ro “đợi cuối mới kiểm”.
Lưu ý thực tế/đề thi hay gài:
- “release nhỏ” không bắt buộc nghĩa là “đẩy thẳng production”.
- Nhiều team XP đ ẩy bản nhỏ lên test/staging environment trước để chạy test kỹ, cho customer dùng thử, rồi mới production.
Kết quả:
- progress rõ ràng hơn,
- chất lượng được giữ nhờ test chặt,
- customer “sờ được” sản phẩm sớm.
- Customer / Acceptance Tests – “test đúng nghĩa phải do người dùng định nghĩa”
Customer Tests (hiểu như acceptance tests theo góc nhìn business):
- Customer mô tả một hoặc vài bài test để chứng minh “phần mềm đáp ứng yêu cầu”.
- Team biến nó thành test có thể chạy được, lý tưởng là tự động hoá.
Để “bắt keyword” chắc hơn cho PMI-ACP, nhớ 2 tầng test hay bị hỏi lẫn:
- Unit Tests (dev-centric): bảo vệ logic nhỏ, hỗ trợ TDD, giúp refactor không sợ “gãy”.
- Acceptance/Customer Tests (business-centric): chứng minh “đúng nhu cầu”, thường là end-to-end theo luồng nghiệp vụ.
Vì sao customer phải là người “định nghĩa test quan trọng”?
- Dev giỏi đến đâu vẫn có thể làm “đúng kỹ thuật” nhưng không đúng nhu cầu.
- Người dùng/business mới biết “thế nào là dùng được”.
Ví dụ:
- Customer nói: “Tôi muốn test theo luồng: tạo hoá đơn → gửi hoá đơn → nhận thanh toán thẻ ngay.”
- Team sẽ tìm cách automate/verify luồng đó.
4.1 On-site Customer / Whole Team – XP “kéo customer lại gần team”
On-site Customer (thường đi kèm tinh thần Whole Team) nghĩa là:
- Có đại diện business/customer luôn sẵn sàng trả lời câu hỏi, làm rõ yêu cầu, ưu tiên, tiêu chí chấp nhận.
- Mục tiêu: giảm “đợi phản hồi 3 ngày”, giảm hiểu sai → giảm rework.
Lưu ý “phiên bản hiện đại” (team phân tán):
- “On-site” không nhất thiết là ngồi cùng phòng. Có thể là customer proxy/PO luôn available qua chat/call trong giờ làm để team hỏi là có câu trả lời nhanh.
Nói đời thường:
- Bạn xây nhà mà chủ nhà không bao giờ nghe máy thì thợ phải “đoán ý” → dễ sửa đi sửa lại.
- On-site customer giúp team hỏi là có câu trả lời nhanh, làm đúng ngay từ đầu.
Nếu câu hỏi nhấn mạnh “đảm bảo đúng nhu cầu người dùng” + “đo bằng điều kiện chấp nhận” → nghĩ đến acceptance/customer tests và on-site customer/whole team.
- Collective Ownership • Coding Standards • Sustainable Pace
5.1 Collective Code Ownership (ai cũng “có quyền” sửa code)
Collective Code Ownership nghĩa là:
- Bất kỳ cặp dev nào cũng có thể sửa phần code nào đó khi cần.
- Không có “đây là code của Bob, cấm ai đụng”.
Lợi ích:
- nhiều người nhìn → ít lỗi hơn,
- chia sẻ kiến thức → giảm rủi ro khi một dev nghỉ/điều chuyển,
- tránh “kẹt cổ chai” do một người giữ kiến thức.
5.2 Coding Standards (Agile không có nghĩa là “code bừa”)
Coding Standards giúp:
- code nhìn như “một người viết”,
- dễ đọc, dễ review, dễ maintain,
- phù hợp với collective ownership (ai cũng sửa được vì code thống nhất).
5.3 Sustainable Pace (nhịp độ bền vững) = “40-hour week” trong XP classic
Sustainable Pace nhấn mạnh:
- đôi khi OT ngắn hạn có thể xảy ra,
- nhưng OT lặp lại dài hạn là không bền (burnout, bug tăng, chất lượng giảm).
Trong XP “cổ điển”, bạn sẽ gặp từ khoá 40-hour week — ý chính vẫn là:
- làm việc theo nhịp độ bền vững,
- không lấy “heroic overtime” làm chiến lược.
PMI-ACP rất thích tinh thần:
- tối ưu giá trị dài hạn,
- không đánh đổi chất lượng bằng kiệt sức.
- System Metaphor – dùng ẩn dụ để team “nhìn cùng một thứ”
Metaphor trong XP là:
- một cách mô tả hệ thống bằng hình ảnh/ẩn dụ dễ hiểu
- để customer và dev cùng “đồng bộ” cách hiểu.
Ví dụ:
- “Module hoá đơn giống như một nhân viên kế toán công nợ (accounts receivable) – nhiệm vụ là đảm bảo tiền được thu về.”
Vì sao nó hữu ích?
- Vấn đề khó nhất của dự án thường là: customer tưởng một kiểu, dev hiểu một kiểu.
- Metaphor giúp giảm “lệch pha”, tạo ngôn ngữ chung.
Ghi chú “PMI-safe”:
- Đây là practice kiểu classic XP; nhiều team hiện đại dùng domain language / ubiquitous language (ngôn ngữ chung của nghiệp vụ) để đạt mục tiêu tương tự.
- CI • TDD • Pair Programming – bộ 3 hay gặp nhất trong đề
7.1 Continuous Integration (CI)
Continuous Integration = tích hợp code thường xuyên vào mainline và kiểm tra liên tục:
- build + chạy test tự động,
- lỗi lòi ra sớm trước khi “đắp thêm tầng”.
Lý do:
- code mới có thể vô tình làm “gãy” code cũ (bug, crash, regression).
- CI giúp phát hiện sớm, sửa rẻ.
7.2 Test-Driven Development (TDD)
TDD = viết test trước, rồi viết code để pass test. Cách phổ biến: Red → Green → Refactor.
Nghe “lạ” nhưng dễ hiểu bằng ví dụ học thi:
- Bạn làm đề thử trước để biết “đề hay hỏi gì”.
- Rồi bạn học vào đúng chỗ để làm được đề.
- Kết quả: học có mục tiêu, ít lan man.
7.3 Pair Programming (pair code) — 2 người code 1 việc, nhưng không phải “2 người làm 1 việc cho vui”
Pair Programming = 2 dev cùng làm một story/task trên cùng một “luồng suy nghĩ”:
- Driver: người gõ code, xử lý chi tiết ngay trước mắt.
- Navigator: người quan sát, soi lỗi, nghĩ hướng tổng thể (logic, edge cases, thiết kế, test, naming).
Nói đời thường: Driver là “tay lái”, Navigator là “người ngồi bên nhắc đường + nhắc coi chừng ổ gà”.
Vì sao XP thích pair code?
- Review real-time: lỗi nhỏ được bắt ngay, khỏi đợi PR mới thấy.
- Chia sẻ kiến thức nhanh: codebase không bị “một người một cõi” → hỗ trợ Collective Ownership.
- Chất lượng ổn định hơn: ít bug, ít rework → về lâu dài thường nhanh hơn dù nhìn bề ngoài “tốn 2 người”.
Làm pair code kiểu “chuẩn XP” (rất hay lên đề)
- Luân phiên vai trò (driver ↔ navigator) mỗi 15–30 phút, hoặc khi chuyển đoạn việc.
- Navigator không ngồi im: phải actively review, nghĩ test cases, hỏi “nếu user làm X thì sao?”.
- Ưu tiên pair khi:
- code rủi ro cao (payment, security),
- module khó,
- onboarding người mới,
- bug “lặp đi lặp lại” khó trị.