System Design Primer Kho tàng mà dev nào cũng nên bookmark
Repo 350k+ stars giúp bạn hiểu cách thiết kế hệ thống lớn, từ scalability đến database sharding, kèm Anki flashcards để ôn mọi lúc mọi nơi.
Nguyễn Nhật Long
@nguyennhatlong1303
Nếu bạn đã từng ngồi trong một buổi phỏng vấn system design và cảm thấy não mình trống rỗng khi interviewer hỏi "Design a URL shortener like bit.ly" hay "How would you design Twitter's feed?", thì bạn không cô đơn đâu. Mình cũng từng ở vị trí đó, và cái repo mà mình sắp nói tới đây system-design-primer của donnemartin chính là thứ đã thay đổi hoàn toàn cách mình tiếp cận system design.
Repo này hiện tại đã hơn 350k stars trên GitHub. Con số đó không phải tự nhiên mà có. Nó là một trong những open source project được star nhiều nhất trên toàn bộ GitHub, và lý do rất đơn giản: nó giải quyết đúng pain point mà hầu hết dev đều gặp kiến thức system design bị phân tán khắp nơi, không có một chỗ nào tổng hợp đủ tốt, đủ sâu, và đủ có cấu trúc.
Vấn đề thật sự mà repo này giải quyết
Mình nhớ hồi mới đi làm được 2 năm, mình code khá ổn, giải algorithm cũng tạm được, nhưng khi ai đó hỏi "Tại sao dùng message queue ở đây thay vì gọi API trực tiếp?" hay "Khi nào nên dùng SQL, khi nào nên dùng NoSQL?" thì mình chỉ biết trả lời chung chung kiểu "tùy trường hợp". Nghe rất senior nhưng thực ra là không biết gì cả.
System design là một topic cực kỳ rộng. Bạn cần hiểu về networking, database, caching, load balancing, CDN, message queues, microservices, consistency patterns, availability patterns... Mỗi topic đó lại có thể viết cả một cuốn sách. Và trên internet, tài liệu thì nhiều nhưng chất lượng không đồng đều có bài viết quá hàn lâm, có bài lại quá nông.
system-design-primer gom tất cả lại thành một learning path có cấu trúc. Nó không chỉ liệt kê concept mà còn đi sâu vào trade-offs cái mà theo mình là quan trọng nhất trong system design. Bởi vì trong thực tế, không có giải pháp nào là hoàn hảo, mọi thứ đều là trade-off.
Cấu trúc nội dung bên trong
Điều mình thích nhất ở repo này là cách nó tổ chức kiến thức. Thay vì dump một đống link rồi bảo "đọc đi", nó chia thành các layer rất rõ ràng.
Đầu tiên, bạn sẽ đi qua scalability fundamentals bắt đầu từ một video lecture kinh điển của Harvard về scalability, rồi đến một bài article đi sâu hơn. Đây là foundation, và mình khuyên anh em đừng skip phần này dù bạn nghĩ mình đã biết. Mình đã đọc lại phần này sau 3 năm đi làm và vẫn thấy có những insight mới.
Sau đó, repo đi vào từng topic cụ thể. Mình tóm tắt các nhóm chính:
Mỗi topic đều có phần giải thích concept, kèm pros/cons rõ ràng, và link đến tài liệu chuyên sâu hơn nếu bạn muốn đào sâu. Cái hay là nó không cố nhồi nhét mọi thứ vào một chỗ mà biết khi nào nên dừng lại và point bạn đến resource phù hợp hơn.
| Nhóm chủ đề | Các topic chính | Độ quan trọng khi phỏng vấn |
|---|---|---|
| **Networking & Communication** | DNS, CDN, Load Balancer, Reverse Proxy, REST vs RPC | Rất cao |
| **Data Layer** | SQL vs NoSQL, Replication, Sharding, Federation | Rất cao |
| **Caching** | Client caching, CDN caching, Web server caching, Database caching, Application caching | Cao |
| **Asynchronism** | Message queues, Task queues, Back pressure | Cao |
| **Consistency & Availability** | CAP theorem, Consistency patterns, Availability patterns | Trung bình - Cao |
| **Security** | Encryption, Authentication, Authorization | Trung bình |
Phần practice cái mà nhiều tài liệu khác thiếu
Theo kinh nghiệm của mình, đọc lý thuyết system design mà không practice thì cũng như đọc sách dạy bơi mà không xuống hồ. Repo này có một section mà mình đánh giá cực kỳ giá trị: System design interview questions with solutions.
Nó đưa ra các bài toán thực tế như:
- Design Pastebin.com (hoặc Bit.ly)
- Design the Twitter timeline and search
- Design a web crawler
- Design the data structures for a social network
- Design a key-value store for a search engine
- Design a chat system
Mỗi bài đều có sample solution kèm theo discussion, code, và diagram. Cái này quan trọng lắm vì khi bạn tự design xong, bạn cần một cái gì đó để so sánh, để biết mình đang thiếu gì, đang over-engineer chỗ nào.
Mình thường làm theo flow này: đọc đề → tự vẽ diagram trên giấy hoặc Excalidraw → viết ra các component chính → rồi mới mở solution ra so sánh. Cách này hiệu quả hơn nhiều so với đọc solution trước.
Anki flashcards vũ khí bí mật
Đây là feature mà ít người để ý nhưng cực kỳ powerful. Repo cung cấp sẵn 3 bộ Anki flashcard decks:
Anki dùng spaced repetition một phương pháp học đã được chứng minh khoa học là hiệu quả hơn rất nhiều so với đọc đi đọc lại. Ý tưởng là bạn sẽ được hỏi lại những gì bạn sắp quên, đúng thời điểm bạn cần ôn lại.
| Deck | Nội dung | Số lượng cards |
|---|---|---|
| System Design Deck | Các concept cốt lõi: CAP, consistency, caching, etc. | ~150+ cards |
| System Design Exercises Deck | Các bài tập design kèm gợi ý | ~50+ cards |
| OOP Design Exercises Deck | Bài tập object-oriented design | ~40+ cards |
Mình đã dùng bộ flashcard này trong khoảng 3 tháng trước khi phỏng vấn, mỗi ngày review khoảng 15-20 phút trên điện thoại lúc đi bus, lúc chờ cơm, lúc nào rảnh là lôi ra. Kết quả là khi vào phỏng vấn, mình có thể recall ngay lập tức các concept mà không cần suy nghĩ lâu. Ví dụ interviewer hỏi về consistency patterns, mình có thể rattle off ngay weak consistency, eventual consistency, strong consistency kèm use case cụ thể cho từng cái.
Đi sâu vào một ví dụ: Trade-offs trong database selection
Để bạn thấy repo này dạy kiểu gì, mình lấy một ví dụ cụ thể. Khi nói về SQL vs NoSQL, repo không chỉ nói "SQL có ACID, NoSQL có scalability" rồi dừng lại. Nó đi sâu vào khi nào nên dùng cái nào và tại sao.
Với SQL (relational databases), repo giải thích rõ các technique để scale:
- Master-slave replication: Master handle write, slaves handle read. Tăng read throughput nhưng nếu master die thì phải promote slave lên, có risk mất data nếu chưa replicate kịp.
- Master-master replication: Cả hai đều handle write. Tăng availability nhưng phải deal với conflict resolution, complexity tăng lên đáng kể.
- Federation (functional partitioning): Split database theo function ví dụ user database riêng, product database riêng. Giảm read/write traffic trên mỗi database nhưng join across databases thì phức tạp kinh khủng.
- Sharding: Split data theo một shard key ví dụ user ID. Giảm traffic và tăng throughput nhưng rebalancing data khi thêm shard thì là cả một vấn đề.
- Denormalization: Lưu redundant data để tránh expensive joins. Tăng read performance nhưng write phức tạp hơn và data có thể inconsistent.
Bạn thấy không? Mỗi technique đều có pros và cons rõ ràng. Và đây chính là cách system design thực sự hoạt động bạn không tìm giải pháp hoàn hảo, bạn tìm giải pháp phù hợp nhất với constraints của bài toán.
Mình thấy cái này hay ở chỗ nó train bạn tư duy theo kiểu "everything is a trade-off" thay vì "cái này tốt hơn cái kia". Khi bạn mang mindset này vào buổi phỏng vấn, interviewer sẽ thấy bạn suy nghĩ như một engineer thực sự chứ không phải đang recite sách.
Ai nên dùng repo này và dùng như thế nào
Mình thấy có 3 nhóm người sẽ benefit nhiều nhất:
Dev có 1-3 năm kinh nghiệm muốn level up: Đây là giai đoạn bạn đã code đủ giỏi nhưng chưa thực sự hiểu big picture. Repo này sẽ cho bạn mental model để nhìn hệ thống ở mức cao hơn. Mình khuyên nhóm này đọc từ đầu đến cuối, không skip phần nào.
Dev đang chuẩn bị phỏng vấn: Focus vào phần practice questions và Anki flashcards. Lập một schedule ôn tập khoảng 1-2 tháng, mỗi tuần tackle 2-3 design problems. Đừng cố nhồi hết trong 1 tuần kiến thức system design cần thời gian để digest.
Senior dev muốn review lại kiến thức: Bạn có thể dùng nó như reference material. Mỗi khi cần giải thích một concept cho junior trong team, mình hay quay lại repo này để check xem mình có miss trade-off nào không.
Anh em lưu ý một điều: repo này là starting point, không phải destination. Nó cho bạn breadth rất tốt nhưng depth thì bạn cần tự đào sâu thêm qua các resource mà nó link tới. Ví dụ muốn hiểu sâu về distributed systems thì phải đọc thêm paper, đọc thêm sách như "Designing Data-Intensive Applications" của Martin Kleppmann.
Một vài tips khi sử dụng
Sau mấy năm dùng repo này, mình rút ra vài điều:
Thứ nhất, đừng đọc passive. Mỗi khi đọc xong một section, hãy tự hỏi: "Nếu mình đang design system X, mình sẽ apply cái này ở đâu?" Ví dụ đọc xong phần caching, hãy nghĩ về project hiện tại của bạn chỗ nào có thể thêm cache? Cache ở layer nào? Cache invalidation strategy nào phù hợp?
Thứ hai, vẽ diagram. System design là visual thinking. Đọc text thôi thì rất khó hình dung data flow giữa các component. Mình recommend dùng Excalidraw hoặc draw.io để vẽ lại architecture diagram cho mỗi bài practice.
Thứ ba, discuss với người khác. Nếu bạn có đồng nghiệp cũng đang học system design, hãy ngồi lại mock interview cho nhau. Một người đóng vai interviewer, một người design. Sau đó swap. Cái này hiệu quả gấp 10 lần tự học một mình vì bạn phải articulate suy nghĩ ra bằng lời, và người kia sẽ challenge những assumption của bạn.
Cuối cùng, repo này hoàn toàn open source và vẫn đang được maintain. Bạn có thể contribute bằng cách fix lỗi, cải thiện nội dung, hoặc thêm bản dịch đã có bản tiếng Việt rồi nhưng vẫn cần cập nhật thêm. Đây cũng là một cách hay để vừa học vừa đóng góp cho cộng đồng.
Nếu bạn chưa bookmark repo này thì hãy làm ngay: github.com/donnemartin/system-design-primer. Nghiêm túc mà nói, đây là một trong số ít resource mà mình recommend cho mọi dev, bất kể level nào.
Nguyễn Nhật Long
@nguyennhatlong1303Nguyễn Nhật Long is a Senior Frontend Engineer and Frontend Team Leader with 7 years of experience building real-time fintech platforms. Specializing in React, Next.js, TypeScript, and React Native, shipping 10+ products across Web, Mobile, Telegram Mini-Apps, and Web3.
Thấy hay? Chia sẻ cho bạn bè!