Skip to content

Cẩm nang phỏng vấn

Các pattern này xuất hiện liên tục trong phỏng vấn system design và coding. Trang này ánh xạ chúng với những câu hỏi bạn thực sự sẽ được hỏi.

Cách dùng trang này

  1. Tìm chủ đề phỏng vấn bạn đang chuẩn bị
  2. Đọc các trang pattern được liên kết trong từng phần (hiểu cơ chế, không chỉ tên gọi)
  3. Chạy trực quan hoá tương tác — người phỏng vấn rất thích ứng viên biết vẽ và giải thích
  4. Thử các bài tập — chúng được cấu trúc giống bài coding interview

Phỏng vấn System Design

"Thiết kế một Rate Limiter"

Đây là câu hỏi system design phổ biến nhất. Bạn cần:

Khái niệmPatternCâu nên nói
Thuật toán token bucketRate Limiter"Tôi sẽ dùng token bucket — nó xử lý burst tới sức chứa trong khi giữ tốc độ refill đều"
Rate limit phân tánConsistent Hashing"Với nhiều node, tôi hash IP client tới các instance rate limiter cụ thể để tránh phối hợp giữa các node"
Cửa sổ trượt dự phòngRing Buffer"Ring buffer có thể theo dõi timestamp request trong biến thể cửa sổ trượt"

"Thiết kế một Cache"

Khái niệmPatternCâu nên nói
Chính sách loại bỏLRU Cache"LRU với linked list hai chiều + hash map cho get/put/evict O(1)"
Chống cache stampedeSemaphore"Dùng semaphore để chỉ một request tính giá trị, các request khác chờ"
Định tuyến cache phân tánConsistent Hashing"Consistent hashing cho phép thêm/bớt node cache mà không phải tái phân phối toàn bộ"
Negative cacheBloom Filter"Một Bloom filter ở phía trước tránh tra cache với các key chắc chắn không tồn tại"

"Thiết kế một Key-Value Store"

Khái niệmPatternCâu nên nói
Đường ghiLSM Tree"Ghi vào WAL, rồi memtable. Khi memtable đầy, flush thành SSTable đã sắp xếp trên đĩa"
Tối ưu đọcBloom Filter"Mỗi SSTable có một Bloom filter — bỏ qua file chắc chắn không chứa key"
Khôi phục sau crashWAL + Checkpointing"WAL đảm bảo bền vững. Checkpoint định kỳ giới hạn thời gian khôi phục"
CompactionMerge Iterator"Gộp k SSTable đã sắp xếp bằng min-heap"
XoáTombstone"Không thể xoá khỏi SSTable bất biến — ghi một tombstone, dồn nén sau"

"Thiết kế một Database phân tán"

Khái niệmPatternCâu nên nói
ReplicationWAL + State Machine"Raft: replicate các entry WAL, áp vào state machine theo thứ tự"
ConsistencyLogical Clock"Lamport timestamp cho thứ tự tổng quát, vector clock cho consistency nhân quả"
Phân vùngConsistent Hashing"Consistent hashing với virtual node để phân bố đều"
Anti-entropyMerkle Tree"So sánh root Merkle giữa các replica để tìm điểm khác biệt trong O(log n)"
Đọc đồng thờiMVCC"Mỗi transaction thấy một snapshot nhất quán — reader không bao giờ chặn writer"
Giải quyết xung độtTombstone + Logical Clock"Last-write-wins bằng so sánh vector clock, tombstone cho việc xoá"

"Thiết kế một Task Scheduler"

Khái niệmPatternCâu nên nói
Hàng đợi ưu tiênMin Heap"Min-heap theo deadline/priority — peek O(1), insert O(log n)"
Lập lịch công bằngWork Stealing"Worker rảnh lấy việc từ queue bận — Go runtime làm đúng như vậy"
Cắt thời gianCooperative Scheduling"Mỗi task yield sau một time slice — React Scheduler làm vậy để giữ dưới 16ms"
Giới hạn concurrencySemaphore"Semaphore với N permit giới hạn số task chạy đồng thời"
Phụ thuộc taskDependency Graph"DAG các task, thực thi theo thứ tự topo"

"Thiết kế một Message Queue"

Khái niệmPatternCâu nên nói
Buffer phía producerRing Buffer"Ring buffer kích thước cố định để enqueue/dequeue không cấp phát"
Kiểm soát luồng phía consumerBackpressure"Nếu consumer chậm, tín hiệu cho producer giảm tốc — không bỏ thông điệp"
Giao hàng theo thứ tựLogical Clock"Lamport timestamp đảm bảo thứ tự nhân quả giữa các partition"
Ghi theo lôBatch Processing"Gom thông điệp, fsync theo lô — Kafka làm vậy để có throughput"
Bền vữngWAL"Log append-only trên đĩa — replay để khôi phục"

"Thiết kế một API Gateway"

Khái niệmPatternCâu nên nói
Rate limitingRate Limiter"Token bucket theo client, theo endpoint"
Circuit breakingCircuit Breaker"Nếu tỉ lệ lỗi backend vượt ngưỡng, mở mạch và fail nhanh"
Chính sách retryRetry with Backoff"Backoff theo cấp số nhân với jitter để tránh thundering herd"
Pipeline requestMiddleware Chain"Auth → rate limit → transform → route → response — các handler có thể ghép"
Khám phá serviceRegistry"Service tự đăng ký, gateway tra cứu theo tên"

Phỏng vấn Coding

Thiết kế cấu trúc dữ liệu

Câu hỏiPattern cốt lõiInsight chính
"Implement một LRU cache"LRU CacheHash map + linked list hai chiều, mọi thao tác O(1)
"Thiết kế trie với insert/search/startsWith"TrieMap con đệ quy, cờ isEnd
"Implement min-heap"Min HeapDựa trên mảng, siftUp khi insert, siftDown khi extract
"Thiết kế skip list"Skip ListTầng ngẫu nhiên, tìm kiếm từ tầng cao xuống thấp
"Implement Bloom filter"Bloom Filterk hàm hash, mảng bit, không âm tính giả
"Thiết kế object pool thread-safe"Object PoolAcquire/release với mutex hoặc CAS

Bài toán thuật toán

Câu hỏiPattern cốt lõiInsight chính
"Gộp K danh sách đã sắp xếp"Merge IteratorMin-heap chứa k đầu danh sách, extract-min và tiến
"Tìm trung vị trong luồng"Min HeapHai heap: max-heap cho nửa dưới, min-heap cho nửa trên
"Implement iterator làm phẳng danh sách lồng"IteratorDuyệt lười dựa trên stack
"Phát hiện chu trình trong linked list"Reference CountingHai con trỏ Floyd là cách giải chuẩn — nhưng chu trình làm vỡ ref counting, hiểu được vì sao giúp bạn nổi bật
"Serialize/deserialize cây"VisitorDuyệt pre-order để serialize, xây lại đệ quy để deserialize
"Tính khoảng cách chỉnh sửa tối thiểu"Diff / PatchQuy hoạch động trên hai chuỗi

Bài toán concurrency

Câu hỏiPattern cốt lõiInsight chính
"Implement semaphore"SemaphoreBộ đếm + mutex + condition variable
"Thiết kế thread pool"Work StealingDeque mỗi thread, lấy trộm từ đuôi
"Implement read-write lock"SemaphoreCounting semaphore cho reader chia sẻ, mutex cho writer độc quyền
"Bài toán producer-consumer"Ring Buffer + BackpressureBuffer giới hạn với wait/signal
"Bài toán bữa ăn triết gia"SemaphoreSắp thứ tự tài nguyên để chống deadlock

Người phỏng vấn thực sự tìm kiếm điều gì

Không phải về việc thuộc lòng pattern. Đây là điều phân biệt ứng viên xuất sắc:

1. Nhận thức về đánh đổi

Đừng chỉ nói "tôi sẽ dùng Bloom filter." Hãy nói:

"Bloom filter cho phép lookup O(k) trong O(m) bit bộ nhớ, với tỉ lệ dương tính giả có thể điều chỉnh. Đánh đổi là không xoá được — cho việc đó cần counting Bloom filter, dùng gấp 4 lần bộ nhớ."

Mỗi pattern trong bộ này đều có phần Khi không nên dùng — hãy đọc chúng.

2. Bối cảnh production

Đừng nói "tôi sẽ dùng một queue." Hãy nói:

"Tôi sẽ dùng ring buffer giống LMAX Disruptor — kích thước cố định, không cấp phát, và producer/consumer có thể ở các core khác nhau mà không bị tranh chấp cache-line vì chúng truy cập index khác nhau."

Phần Bằng chứng từ production của mỗi pattern cho bạn các tham chiếu này.

3. Kết hợp

Hệ thống thật kết hợp nhiều pattern. Khi thiết kế KV store, đừng chỉ nói "LSM tree." Đi qua toàn bộ stack:

"Ghi vào WAL để bền vững, rồi memtable (sắp xếp trong bộ nhớ). Khi đầy, flush thành SSTable. Mỗi SSTable có một Bloom filter để tối ưu đọc. Compaction dùng merge iterator để gộp các SSTable. Xoá dùng tombstone."

Cheat Sheet có phần Pattern Combos cho việc này.

4. Vẽ

Nếu bạn có thể vẽ cơ chế của pattern lên bảng, bạn đã hiểu nó. Nếu không, bạn mới chỉ thuộc tên. Trực quan hoá tương tác của mỗi pattern dạy bạn cần vẽ những gì.

Kế hoạch học

Sprint 1 tuần

NgàyTrọng tâmPattern
1Caching & tra cứuLRU Cache, Bloom Filter, Trie
2Storage engineWAL, LSM Tree, B+ Tree, Checkpointing
3Độ tin cậyCircuit Breaker, Rate Limiter, Retry with Backoff
4ConcurrencySemaphore, MVCC, Work Stealing
5Phân tánConsistent Hashing, Logical Clock, Merkle Tree
6Bộ nhớ & runtimeObject Pool, Arena, Reference Counting, Copy-on-Write
7Ôn tậpChạy tất cả bài tập, luyện vẽ cơ chế

Khoá tốc lực cuối tuần

Tập trung vào 10 pattern chiếm 80% các buổi phỏng vấn system design:

  1. LRU Cache — mọi câu hỏi về cache
  2. Rate Limiter — câu hỏi phỏng vấn riêng + dùng trong API gateway
  3. Consistent Hashing — mọi câu hỏi phân tán
  4. WAL — mọi câu hỏi storage/database
  5. LSM Tree — thiết kế KV store
  6. Bloom Filter — tối ưu đọc, kiểm tra thành viên tập
  7. Circuit Breaker — API gateway, microservice
  8. MVCC — concurrency database
  9. Min Heap — scheduler, gộp k, trung vị
  10. Merkle Tree — toàn vẹn dữ liệu, anti-entropy

Released under the MIT License.