Tổng quan bài thiết kế
Cách đọc và luyện một bài thiết kế trên site: các phần của trang bài, cách dùng ba mức quy mô và bảng hạ tầng, cùng thứ tự làm bài từ dễ đến khó.
Cấu trúc một trang bài thiết kế
Mỗi bài thiết kế (/bai/...) đi theo đúng thứ tự của Khung trả lời 45 phút. Nhờ vậy, đọc bài cũng là luyện khung. Cấu trúc này cũng gần với cách Grokking chia mỗi bài thiết kế: yêu cầu chức năng và phi chức năng kèm ước lượng tài nguyên, thiết kế và API, rồi đánh giá theo yêu cầu phi chức năng.1
| Phần | Nội dung | Tương ứng bước |
|---|---|---|
| Hiểu đề | Giới thiệu, yêu cầu chức năng, yêu cầu phi chức năng có số, ngoài phạm vi | 1. Yêu cầu |
| Thực thể và API | Các thực thể chính, endpoint chính | 3. Thực thể và API |
| Thiết kế tổng thể | Mỗi yêu cầu chức năng một khối: giải thích và luồng xử lý từng bước | 4. Thiết kế tổng thể |
| Đào sâu | 3–4 câu hỏi khó, mỗi câu có phương án từ kém tới tốt kèm trade-off | 5. Đào sâu |
| Hạ tầng theo quy mô | Ba mức: phép tính, bảng hạ tầng, sơ đồ, chi phí, nút thắt | 2. Ước lượng và 6. Mở rộng |
| Trong phỏng vấn | Câu nên nói, bẫy hay gặp | Toàn buổi |
| Bài liên quan | Link tới khái niệm, pattern, công nghệ dùng trong bài | Ôn tập |
Cách luyện một bài
- Chỉ đọc phần Hiểu đề. Che phần còn lại.
- Tự làm 30–45 phút trên giấy hoặc Excalidraw: ước lượng, API, sơ đồ, chọn 2 vấn đề để đào sâu.
- So phần Thiết kế tổng thể. Sơ đồ của bạn có đáp ứng đủ từng yêu cầu chức năng không?
- So phần Đào sâu. Bạn có nhận ra đúng vấn đề khó không? Phương án của bạn nằm ở mức kém, khá hay tốt? Cách xếp mức kém đến tốt là của khoá học; nguyên tắc nền từ Grokking là không có một đáp án đúng duy nhất, mỗi thành phần có ưu nhược và mỗi thiết kế có điểm yếu cần tự nêu ra.2
- Đọc phần Hạ tầng theo quy mô theo cách ở mục dưới.
- Ghi lại 2–3 ý bỏ sót và mở bài liên quan để đọc thêm.
Mẹo: đọc mục "Trong phỏng vấn" cuối bài trước khi làm lại bài lần hai. Các câu nên nói ở đó là những câu tóm tắt quyết định chính, rất hợp để mở đầu phần đào sâu.
Dùng ba mức quy mô
Phần hạ tầng có ba tab: Khởi đầu (~10.000 DAU), Tăng trưởng (~1 triệu DAU), Quy mô lớn (50 triệu+ DAU). Ý nghĩa từng mức được mô tả trong Giới thiệu khoá học và Hạ tầng theo quy mô.
Mỗi mức gồm:
- Phép tính: các dòng ước lượng có phép nhân chia rõ ràng. Thử tự tính trước rồi so.
- Bảng hạ tầng: từng thành phần, công nghệ chọn, số lượng, cấu hình và lý do.
- Sơ đồ: kiến trúc ở mức đó.
- Chi phí: khoảng USD mỗi tháng, chỉ là ước lượng của khoá học (không lấy từ sách).3
- Thay đổi so với mức trước và nút thắt sẽ vỡ đầu tiên khi lên mức sau.
Cách đọc theo chiều ngang cũng phản ánh quan niệm hệ thống tiến hoá theo vòng lặp (bắt đầu đơn giản, gặp nút thắt thì đổi thiết kế) và quan niệm khi một khía cạnh tăng từ 10 lần trở lên thì thiết kế cũ có thể không còn đúng.45 Cách đọc hiệu quả nhất là đọc theo chiều ngang: so sánh cùng một dòng trong bảng qua ba mức. Ví dụ dòng database đi từ một Postgres managed, sang Postgres có replica, rồi sang shard hoặc Cassandra. Với mỗi thay đổi, tự hỏi: nút thắt nào ở mức trước buộc phải đổi?
Đọc bảng hạ tầng
| Cột | Cách đọc |
|---|---|
| Thành phần | Vai trò trong hệ thống: API, database, cache, queue, worker, CDN |
| Lựa chọn | Công nghệ cụ thể. Mở bài công nghệ tương ứng nếu chưa quen |
| Số lượng | Thường tính theo công thức max(2, ceil(đỉnh / 600)) cho API Node.js (quy tắc ước lượng của khoá học)3 |
| Cấu hình | vCPU và RAM mỗi node |
| Lý do | Vì sao chọn và vì sao đủ ở mức này |
Kiểm tra lại số lượng bằng Máy tính hạ tầng. Nếu số của bạn khác bảng, xem lại giả định: số request mỗi người, hệ số đỉnh, tỉ lệ đọc ghi. Cách tính chi tiết ở Chọn server. Grokking tính số server bằng cách chia số request mỗi giây cho năng lực một server, và nhấn mạnh ở mức thiết kế chỉ cần ước lượng thô để có cận trên hợp lý.6
Lưu ý: cấu hình và chi phí là ước lượng thận trọng. Chúng đủ để lập luận trong phỏng vấn, chưa đủ để mua hạ tầng thật khi chưa load test.
Thứ tự bài từ dễ đến khó
Nhóm 1: làm quen. Ít thành phần, một vấn đề chính rõ ràng.
| Bài | Pattern chính |
|---|---|
| Rút gọn link | Scale đọc, sinh ID |
| Rate limiter | Redis, thuật toán đếm |
| Cache phân tán | Consistent hashing, sharding |
| Theo dõi giá | Tác vụ định kỳ, thông báo |
| Tổng hợp tin tức | Crawl, scale đọc |
Nhóm 2: trung bình. Có tranh chấp, quy trình nhiều bước hoặc đọc ghi lớn.
| Bài | Pattern chính |
|---|---|
| Đặt vé sự kiện | Tranh chấp tài nguyên, đột biến tải |
| Booking và tracking container | Quy trình nhiều bước, outbox |
| Hệ thống thông báo | Tác vụ dài, fan-out |
| Job scheduler | Tác vụ dài, khoá phân tán |
| Dropbox | File lớn, đồng bộ |
| Yelp | Tìm kiếm gần, scale đọc |
| Tìm kiếm bài viết | Search index, CDC |
| Leetcode | Tác vụ dài, sandbox |
| Top K | Scale ghi, xử lý luồng |
| File lớn, feed | |
| Strava | Scale ghi, dữ liệu vị trí |
| Tinder | Tìm kiếm gần, tranh chấp nhẹ |
| Web crawler | Tác vụ dài, hàng đợi lớn |
Nhóm 3: khó. Nhiều vấn đề cùng lúc, cần realtime, nhất quán mạnh hoặc thông lượng rất lớn.
| Bài | Pattern chính |
|---|---|
| News feed | Fan-out, scale đọc |
| Ứng dụng chat | Realtime, scale ghi |
| Live comments | Realtime, fan-out lớn |
| Gọi xe | Tìm kiếm gần, tranh chấp |
| Giao hàng nội thành | Tìm kiếm gần, quy trình nhiều bước |
| Flash sale | Tranh chấp, đột biến ×100 |
| Đấu giá online | Tranh chấp, realtime |
| YouTube | File lớn, tác vụ dài |
| Ad click aggregator | Scale ghi, xử lý luồng |
| Giám sát metric | Scale ghi, time-series |
| Cờ vua online | Realtime, trạng thái ván |
| Ứng dụng chat với AI | Streaming, GPU, quota |
| Hệ thống thanh toán | Quy trình nhiều bước, idempotency |
| Sàn giao dịch chứng khoán | Độ trễ thấp, thứ tự lệnh |
| Google Docs | Realtime, giải quyết xung đột |
Gợi ý lộ trình
Phân nhóm độ khó và cột "Pattern chính" ở trên là đánh giá của khoá học.7 Làm 2–3 bài nhóm 1 trước để quen khung. Sau đó xen kẽ nhóm 2 và nhóm 3 theo pattern: làm Đặt vé sự kiện rồi Flash sale để thấy cùng pattern tranh chấp ở hai mức độ. Làm Ứng dụng chat rồi Live comments cho realtime. Cách nhóm này giúp bạn thấy điểm chung, từ đó nhận ra pattern nhanh hơn khi gặp đề mới. Danh sách pattern và bài tương ứng có ở Tổng quan pattern.
Nguồn trích dẫn
-
Grokking Modern System Design · ch.34 Design a URL Shortening Service (TinyURL) · mục "How will we design a URL shortening service?" và bài "Requirements of TinyURL's Design". ↩
-
Grokking Modern System Design · ch.2 System Design Interviews · bài "How to Perform Well", mục "Discuss trade-offs". ↩
-
Quy tắc ước lượng của khoá học, xem bài Chọn server. Không phải số liệu trích từ sách. ↩ ↩2
-
Grokking Modern System Design · ch.1 Introduction · mục "About this course" ("Iterative process"). ↩
-
Grokking Modern System Design · ch.2 System Design Interviews · bài "What Is a System Design Interview?", mục "Possible questions for every SDI". ↩
-
Grokking Modern System Design · ch.5 Back-of-the-envelope Calculations · bài "Put Back-of-the-envelope Numbers in Perspective" (phần ước lượng số server ở mức thiết kế) và bài "Examples of Resource Estimation", mục "Number of servers required". ↩
-
Chưa có nguồn trong thư viện: thư viện không xếp độ khó hay gán pattern cho từng đề; bảng này là biên tập của khoá học. ↩