Mở đăng ký khóa học Fullstack qua Zoom. Tham khảo tại đây

Thư Viện Câu Hỏi Phỏng Vấn

Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.

Interactive Practice Tổng cộng 4,442 câu hỏi độc bản

Luyện Tập Phỏng Vấn Thử

Mô phỏng áp lực phỏng vấn thật với đồng hồ đếm ngược từng câu, tự đánh giá phản xạ và đo lường độ sẵn sàng của bạn.

Vui lòng đăng nhập để tham gia luyện tập và lưu tiến độ phỏng vấn.
Tất cả công nghệ .Net (39) ADO.NET (44) Agile scrum (33) Android (40) Angular (40) API Design (40) Arrays (40) ASP.NET (42) ASP.NET MVC (40) ASP.NET Web API (49) Availability & Reliability (40) Azure (49) Backtracking (40) Big-O Notation (35) Binary Tree (40) Bit Manipulation (40) Blockchain (45) C# (45) Caching (50) CAP Theorem (45) CDN (45) Concurrency (49) Cosmos DB (44) Cryptography (40) CSS (40) Data Structures (40) Databases (35) DDD (42) Dependency Injection (50) Design pattern (45) Devops (50) Divide & Conquer (40) Docker (43) Dynamic Programming (40) Entity Framework (40) Fibonacci Series (35) Flutter (40) Git (40) Go lang (40) Graph Theory (40) GraphQL (40) Greedy Algorithms (40) Hash Tables (40) Heaps and Maps (35) HTML (40) Ionic (45) IOS (45) Java (73) Javascript (81) jQuery (40) Kotlin (50) Kubernetes (11) Laravel (41) Layering & Middleware (44) Linked Lists (45) LINQ (40) Load Balancing (45) Microservices (44) Mongodb (45) MySQL (44) Net core (44) next.js (52) Node.js (40) NoSQL (48) Objective-C (40) OOP (44) Package Managerment (50) PHP (40) PostgreSQL (44) PWA (40) Python (41) Queues (44) React Native (48) React.js (45) Reactive Programming (50) Recursion (45) Redis (40) Ruby (44) Ruby on Rails (48) Rust (40) Searching (45) SOA (42) Software Architecture (44) Software Testing (40) Sorting (48) Spring (45) SQL (37) SQL Server (45) Stacks (44) Strings (50) Swift (45) System Design (56) Systems Design (7) T-SQL (39) Trees (49) Trie (35) Typescript (44) Unit testing (49) UX Design (50) Vue.js (50) Web security (40) WebSockets (49) Xamarin (40)
46

Trong kiến trúc Microservices, làm thế nào để duy trì trạng thái kết nối WebSocket đồng nhất khi người dùng kết nối qua các Instance khác nhau của Server?

Middle

Trong môi trường Microservices, các WebSocket server thường được scale theo chiều ngang (horizontal scaling). Khi một client kết nối vào Instance A, nhưng thông điệp cần gửi lại đến từ Instance B, hệ thống sẽ gặp lỗi không tìm thấy socket. Giải pháp tiêu chuẩn là sử dụng một Pub/Sub mechanism như Redis Pub/Sub hoặc NATS.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
47

Làm thế nào để tối ưu hóa việc quản lý bộ nhớ khi server phải duy trì hàng chục nghìn kết nối WebSocket đồng thời?

Middle

Khi số lượng kết nối tăng lên, mỗi socket object sẽ chiếm một lượng RAM đáng kể. Để tối ưu hóa, cần áp dụng các chiến lược sau:

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
48

Sự khác biệt giữa việc xử lý dữ liệu WebSocket theo hướng Event-Driven so với Request-Response truyền thống trong kiến trúc hệ thống?

Middle

Trong mô hình Request-Response (HTTP), client chủ động yêu cầu và server phản hồi. Trong WebSocket (Event-Driven), server có khả năng chủ động đẩy dữ liệu xuống client ngay khi có thay đổi (Push model).

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
49

Khi triển khai WebSocket qua Nginx làm Reverse Proxy, tại sao cần cấu hình các header 'Upgrade' và 'Connection'?

Middle

WebSocket bắt đầu bằng một HTTP Handshake. Nếu Nginx không được cấu hình đúng, nó sẽ hiểu nhầm đây là một request HTTP thông thường và đóng kết nối sau khi nhận phản hồi, hoặc không chuyển tiếp được yêu cầu nâng cấp giao thức.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
50

Trong kiến trúc Kotlin Coroutines, sự khác biệt giữa Dispatchers.Default và Dispatchers.IO là gì, và tại sao việc chọn sai Dispatcher lại dẫn đến suy giảm hiệu năng nghiêm trọng trong các ứng dụng Enterprise?

Middle

Phân tích cơ chế

  • Dispatchers.Default: Được tối ưu hóa cho các tác vụ tiêu tốn CPU (CPU-intensive), ví dụ như tính toán thuật toán, xử lý ảnh, hoặc phân tích dữ liệu lớn. Nó sử dụng một Thread Pool có kích thước bằng số nhân CPU của máy.
  • Dispatchers.IO: Được thiết kế cho các tác vụ chặn (blocking) như đọc/ghi file, truy vấn Database, hoặc gọi API qua mạng. Nó sử dụng một Thread Pool linh hoạt, có thể mở rộng lên đến 64 thread (hoặc nhiều hơn tùy cấu hình) để đảm bảo các tác vụ I/O không làm nghẽn luồng xử lý chính.

Tại sao chọn sai gây suy giảm hiệu năng?

Nếu sử dụng Dispatchers.Default cho các tác vụ I/O, số lượng thread bị giới hạn sẽ khiến các tác vụ I/O phải chờ đợi nhau (queueing), dẫn đến hiện tượng nghẽn cổ chai. Ngược lại, nếu dùng Dispatchers.IO cho các tác vụ tính toán nặng, việc chuyển đổi ngữ cảnh (context switching) liên tục giữa quá nhiều thread sẽ gây lãng phí tài nguyên CPU và làm chậm ứng dụng.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
51

Cơ chế 'Value Classes' (trước đây là inline classes) trong Kotlin giúp tối ưu hóa bộ nhớ như thế nào, và khi nào bạn nên sử dụng chúng thay vì các Data Classes thông thường?

Middle

Bản chất cơ chế

Value Classes cho phép bao bọc một giá trị duy nhất (ví dụ: String, Int) vào một kiểu dữ liệu mới mà không tạo thêm đối tượng (object) trên Heap tại thời điểm runtime. Trình biên dịch sẽ thay thế việc sử dụng class này bằng giá trị nguyên thủy bên trong nó.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
52

Trong Kotlin, cơ chế 'StateFlow' và 'SharedFlow' khác nhau như thế nào về mặt quản lý trạng thái, và tại sao StateFlow lại yêu cầu giá trị khởi tạo ban đầu?

Middle

So sánh cơ chế

  • StateFlow: Là một dạng đặc biệt của SharedFlow, được thiết kế để đại diện cho một trạng thái (State). Nó luôn giữ lại giá trị mới nhất và phát giá trị đó cho bất kỳ Subscriber mới nào ngay khi họ đăng ký.
  • SharedFlow: Là một luồng sự kiện (Event) linh hoạt hơn, không yêu cầu giá trị khởi tạo và có thể cấu hình cơ chế phát lại (replay) tùy ý.

Tại sao StateFlow yêu cầu giá trị khởi tạo?

Vì StateFlow đại diện cho một trạng thái hiện tại của hệ thống (ví dụ: Loading, Success, Error). Để đảm bảo tính toàn vẹn, bất kỳ thành phần nào truy cập vào StateFlow đều phải nhận được một trạng thái hợp lệ ngay lập tức, tránh trường hợp trạng thái bị rỗng (null) gây lỗi logic.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
53

Giải thích cơ chế 'Tail Recursion' trong Kotlin. Tại sao việc sử dụng từ khóa 'tailrec' lại quan trọng đối với các thuật toán đệ quy trong môi trường Enterprise?

Middle

Cơ chế hoạt động

Đệ quy thông thường có thể gây ra lỗi StackOverflowError nếu độ sâu của đệ quy quá lớn do mỗi lần gọi hàm đều tạo một Stack Frame mới. Từ khóa tailrec cho phép trình biên dịch Kotlin tối ưu hóa đệ quy bằng cách chuyển đổi nó thành một vòng lặp (loop) ở cấp độ bytecode.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
54

Trong Kotlin, cơ chế 'Exception Handling' với 'runCatching' có ưu điểm gì so với khối 'try-catch' truyền thống, và tại sao cần cẩn trọng khi sử dụng nó trong các logic nghiệp vụ phức tạp?

Middle

Ưu điểm của runCatching

  • Functional Style: Cho phép viết code theo phong cách hàm, dễ dàng kết hợp với các toán tử như map, getOrElse, recover.
  • Encapsulation: Kết quả được đóng gói trong một đối tượng Result<T>, giúp việc truyền tải kết quả thành công hoặc thất bại qua các tầng (layer) trở nên nhất quán.

Rủi ro trong logic nghiệp vụ

  • Che giấu lỗi: Nếu không xử lý kỹ, runCatching có thể nuốt chửng các lỗi quan trọng (như OutOfMemoryError hoặc các lỗi hệ thống nghiêm trọng) khiến việc debug trở nên khó khăn.
  • Lạm dụng: Việc sử dụng runCatching thay cho kiểm tra điều kiện logic (if-else) sẽ làm giảm hiệu năng do chi phí tạo đối tượng Throwable và Result.

Lời khuyên

Chỉ nên sử dụng runCatching cho các tác vụ có khả năng xảy ra lỗi ngoại cảnh không thể kiểm soát như gọi API hoặc thao tác I/O, không nên dùng để kiểm soát luồng điều khiển chính của ứng dụng.

55

Trong kiến trúc hệ thống phân tán, cơ chế Distributed Lock đóng vai trò gì và tại sao chúng ta không thể sử dụng cơ chế Lock nội bộ của ngôn ngữ lập trình để giải quyết vấn đề đồng bộ hóa giữa các Microservices?

Middle

Bản chất của Distributed Lock

Trong một hệ thống Microservices, các instance chạy trên các tiến trình hoặc server khác nhau, do đó chúng không chia sẻ chung bộ nhớ (Memory Space). Các cơ chế Lock nội bộ như synchronized trong Java hay lock trong C# chỉ có tác dụng trong phạm vi một tiến trình duy nhất.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
56

Hãy phân tích cơ chế hoạt động của Thread Pool và tại sao việc cấu hình sai kích thước (Pool Size) lại dẫn đến hiện tượng nghẽn cổ chai (bottleneck) trong hệ thống?

Middle

Cơ chế hoạt động

Thread Pool duy trì một tập hợp các luồng (worker threads) đã được khởi tạo sẵn. Khi có tác vụ mới, thay vì tạo Thread mới (chi phí tốn kém về tài nguyên hệ thống), hệ thống sẽ lấy một luồng từ Pool để thực thi, sau đó trả lại luồng đó vào Pool.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
57

Trong lập trình bất đồng bộ, tại sao việc sử dụng các Blocking Queue lại là giải pháp tối ưu cho mô hình Producer-Consumer trong các hệ thống xử lý dữ liệu lớn?

Middle

Vai trò của Blocking Queue

Blocking Queue là cấu trúc dữ liệu hỗ trợ đồng bộ hóa luồng, nơi mà các Producer (người tạo dữ liệu) và Consumer (người tiêu thụ dữ liệu) có thể tương tác mà không cần quản lý thủ công các cơ chế wait/notify.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
58

Giải thích sự khác biệt giữa cơ chế Fork-Join Framework và mô hình Thread Pool truyền thống trong việc tối ưu hóa các tác vụ tính toán song song?

Middle

Thread Pool truyền thống

Thường được thiết kế để xử lý các tác vụ độc lập (Task-based). Mỗi luồng xử lý một tác vụ từ đầu đến cuối.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
59

Trong môi trường đa luồng, tại sao việc sử dụng các biến `volatile` không đủ để đảm bảo tính an toàn cho các thao tác phức tạp như 'check-then-act'?

Middle

Bản chất của volatile

Từ khóa volatile chỉ đảm bảo tính hiển thị (Visibility) của biến giữa các luồng. Nó đảm bảo rằng khi một luồng thay đổi giá trị, các luồng khác sẽ thấy ngay lập tức. Tuy nhiên, nó KHÔNG đảm bảo tính nguyên tử (Atomicity).

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
60

Trong React Native, cơ chế Shadow Tree trong New Architecture khác biệt như thế nào so với kiến trúc cũ và nó ảnh hưởng ra sao đến hiệu năng render của các Component phức tạp?

Middle

Trong kiến trúc cũ, việc đồng bộ hóa giữa JavaScript và Native UI được thực hiện qua Bridge, dẫn đến việc truyền dữ liệu tuần tự và gây nghẽn khi có nhiều thay đổi UI. New Architecture giới thiệu Shadow Tree (dựa trên Fabric):

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
High-Ticket Mentoring
Cần Mentor Phỏng Vấn Thử 1-1 & Tối Ưu CV?

Mô phỏng phỏng vấn kỹ thuật thực tế 1-1 qua Google Meet, nhận xét chi tiết điểm mạnh/yếu và sửa CV trực tiếp cùng giảng viên Unicode.

AI Resume Scanner
Kiểm Tra CV Chuẩn ATS Miễn Phí

Tải CV của bạn lên để hệ thống AI rà soát từ khóa kỹ năng, định dạng và tính điểm chuẩn nhà tuyển dụng.

vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học