Learning Outcome & Exercises: System Design
Tổng kết chương System Design: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/system-design.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Trình bày một bài thiết kế theo khung 45 phút: requirement, ước lượng, API, data model, kiến trúc, deep dive, failure.
- Ước lượng QPS, storage và bandwidth có ghi giả định.
- Chỉ ra bottleneck và failure mode, và nêu trade-off của từng lựa chọn.
2. Basic: URL Shortener có số liệu
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Design doc 1 trang: requirement, ước lượng 100M URL/tháng, API, schema, cách sinh ID, cache.
Bài liên quan: Khung trả lời phỏng vấn, Requirement, SLO, capacity, URL Shortener
Hoàn thành khi:
- Bảng ước lượng có giả định
- Sơ đồ kiến trúc (ASCII hoặc Mermaid)
3. Intermediate: Ticket booking & flash sale
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Thiết kế chống bán trùng ghế khi 100k người vào cùng lúc: hàng đợi, giữ chỗ có hạn, rate limit; sequence diagram cho happy path và hết hạn giữ chỗ.
Bài liên quan: Ticket Booking, Flash sale, Rate limiting
Hoàn thành khi:
- 2 sequence diagram
- Bảng failure mode → cách xử lý
4. Challenge: Payment / banking transfer
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Thiết kế chuyển khoản với ledger, idempotency, reconciliation; phân tích khi region chính sập.
Bài liên quan: Payment, Banking transfer, Multi-region
Hoàn thành khi:
- Design doc có RPO/RTO
- Liên kết tới lab distributed (outbox) và concurrency (lost update)
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | URL Shortener có số liệu | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | Ticket booking & flash sale | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Payment / banking transfer | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/system-design. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về System Design, câu nào hay gặp nhất và trả lời sao?
Q1. Bắt đầu một câu hỏi system design thế nào?
🇻🇳 Tiếng Việt:
Em không vẽ ngay. Em hỏi để chốt requirement chức năng và phi chức năng, ước lượng tải, rồi mới đưa API, data model, kiến trúc đơn giản nhất chạy được, sau đó deep dive vào phần khó nhất và failure.
🇬🇧 English:
I do not start drawing. I clarify functional and non-functional requirements, estimate the load, then propose the API, the data model and the simplest working architecture, and only then deep dive into the hardest part and the failure modes.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (URL Shortener có số liệu) được coi là xong khi nào?
Bảng ước lượng có giả định; Sơ đồ kiến trúc (ASCII hoặc Mermaid). Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (Ticket booking & flash sale) được coi là xong khi nào?
2 sequence diagram; Bảng failure mode → cách xử lý. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Payment / banking transfer) được coi là xong khi nào?
Design doc có RPO/RTO; Liên kết tới lab distributed (outbox) và concurrency (lost update). Chưa có code chạy và bằng chứng thì chưa tính là xong.