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)
Khóa học Chuyên sâu Concurrency

Làm Chủ Phỏng Vấn & Nâng Cao Trình Độ Chuyên Nghiệp

Hệ thống khóa học thực chiến chuẩn Enterprise giúp bạn tự tin chinh phục mọi kỳ phỏng vấn kỹ thuật và thăng tiến thu nhập.

16

Trong kiến trúc hệ thống xử lý đồng thời, tại sao việc sử dụng các cấu trúc dữ liệu Thread-Safe (như ConcurrentHashMap) lại quan trọng hơn việc chỉ sử dụng từ khóa Synchronized trên toàn bộ phương thức?

Junior

Bản chất vấn đề

Việc sử dụng từ khóa Synchronized trên toàn bộ phương thức (Method-level synchronization) tạo ra một 'điểm nghẽn' (bottleneck) lớn. Khi một luồng đang thực thi phương thức, tất cả các luồng khác muốn truy cập vào bất kỳ thành phần nào của đối tượng đó đều phải chờ đợi, ngay cả khi chúng truy cập vào các vùng dữ liệu không liên quan đến nhau.

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...
17

Trong lập trình đồng thời cấp độ Junior, thế nào là hiện tượng Race Condition và tại sao nó thường xuất hiện khi nhiều luồng cùng truy cập một biến đếm chung?

Junior

Bản chất của Race Condition

Race Condition (Điều kiện tranh chấp) xảy ra khi hai hoặc nhiều luồng cùng đọc và ghi dữ liệu chia sẻ mà không có cơ chế đồng bộ hóa, dẫn đến kết quả phụ thuộc vào thứ tự thực thi của các luồng (thứ tự này không thể đoán trước do hệ điều hành quản lý).

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...
18

Trong lập trình đa luồng cơ bản, khái niệm Context Switching là gì và tại sao việc lạm dụng quá nhiều Thread lại làm giảm hiệu năng tổng thể của ứng dụng?

Junior

Định nghĩa Context Switching

Context Switching (Chuyển đổi ngữ cảnh) là quá trình hệ điều hành lưu lại trạng thái (Context, bao gồm giá trị thanh ghi, bộ đếm chương trình - Program Counter) của luồng đang chạy, và khôi phục trạng thái của luồng tiếp theo được lên lịch để chạy trên CPU.

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...
19

Trong mô hình lập trình bất đồng bộ, Callback Hell là gì và tại sao việc sử dụng Promise hoặc Async/Await là tiêu chuẩn bắt buộc trong phát triển Enterprise?

Junior

Định nghĩa Callback Hell

Callback Hell (Địa ngục hàm gọi lại) là hiện tượng mã nguồn trở nên lồng nhau quá nhiều tầng các hàm callback (bất đồng bộ phụ thuộc lẫn nhau), tạo thành hình dạng giống kim tự tháp (Pyramid of Doom). Hiện tượng này thường xuất hiện khi xử lý các tác vụ tuần tự như: Kết nối DB -> Truy vấn dữ liệu -> Gọi API ngoài -> Xử lý file.

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...
20

Trong lập trình đa luồng cơ bản dành cho Junior, khái niệm Context Switching là gì và tại sao việc lạm dụng quá nhiều Thread lại làm giảm hiệu năng tổng thể của ứng dụng?

Junior

Bản chất của Context Switching

Context Switching (Chuyển đổi ngữ cảnh) là quá trình CPU lưu lại trạng thái (context) của một Thread hoặc Process đang chạy, sau đó khôi phục trạng thái của một Thread hoặc Process khác để tiếp tục thực thi. Quá trình này bao gồm việc lưu các thanh ghi của CPU, con trỏ lệnh (Program Counter), và các thông tin quản lý bộ nhớ đếm.

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...
21

Phân biệt sự khác biệt cốt lõi giữa CPU-bound Task và I/O-bound Task trong lập trình đồng thời (Concurrency), và cách lựa chọn mô hình xử lý phù hợp cho từng loại.

Junior

1. Phân biệt khái niệm

  • CPU-bound Task (Tác vụ nặng về tính toán): Là các tác vụ đòi hỏi sức mạnh xử lý thuần túy của CPU như mã hóa dữ liệu, nén file, xử lý thuật toán phức tạp, xử lý ảnh. Thời gian hoàn thành phụ thuộc trực tiếp vào tốc độ và số lượng Core của CPU.
  • I/O-bound Task (Tác vụ chờ đợi vào Input/Output): Là các tác vụ mà ứng dụng phải dành phần lớn thời gian để chờ đợi phản hồi từ các hệ thống bên ngoài như truy vấn Database, gọi HTTP API, đọc ghi file từ ổ cứng, hoặc nhận dữ liệu qua mạng.

2. Mô hình xử lý tối ưu

  • Đối với CPU-bound Task:
    • Mô hình tối ưu là Multithreading với số lượng Thread xấp xỉ bằng số lượng Core vật lý của CPU.
    • Việc tạo nhiều Thread hơn số Core sẽ gây ra hiện tượng Context Switching lãng phí vì CPU lúc nào cũng ở trạng thái 100% công suất.
  • Đối với I/O-bound Task:
    • Mô hình tối ưu là Asynchronous / Event-driven Non-blocking (ví dụ như Node.js Event Loop, Java NIO, hoặc Async/Await trong C#).
    • Thay vì block một Thread trong lúc chờ đợi I/O phản hồi, hệ thống sẽ giải phóng Thread đó để xử lý các request khác, và chỉ quay lại xử lý tiếp tục khi có sự kiện I/O hoàn thành.

3. Kinh nghiệm thực chiến

Khi thiết kế API backend, Junior cần phân loại rõ ràng bản chất của từng API. Các API thực hiện báo cáo thống kê phức tạp (CPU-bound) nên được tách biệt ra các Worker riêng hoặc sử dụng Queue (như RabbitMQ, Kafka) để xử lý nền, tránh làm nghẽn Main Thread phục vụ các request HTTP thông thường.

22

Trong môi trường lập trình đa luồng, hiện tượng Thread Interference (Can thiệp luồng) xảy ra khi nào và làm thế nào để ngăn chặn nó ở mức cơ bản?

Junior

1. Bản chất của Thread Interference

Thread Interference xảy ra khi hai hoặc nhiều luồng cùng truy cập và thực hiện thao tác ghi (write) lên cùng một biến hoặc vùng nhớ chia sẻ mà không có cơ chế kiểm soát đồng bộ. Do các thao tác tăng giá trị (ví dụ: count++) không phải là Atomic (nguyên tử) mà bao gồm 3 bước riêng biệ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...
23

Giải thích khái niệm Race Condition trong lập trình đồng thời và phân biệt nó với Thread Interference. Cho ví dụ thực tế.

Junior

1. Phân biệt khái niệm

  • Thread Interference (Can thiệp luồng): Là một dạng lỗi cụ thể xảy ra khi các luồng ghi đè dữ liệu lẫn nhau do thiếu tính nguyên tử (Atomicity).
  • Race Condition (Điều kiện tranh chấp): Là một lỗi logic tổng quát hơn, xảy ra khi tính đúng đắn của chương trình phụ thuộc vào thứ tự thực thi ngẫu nhiên hoặc thời gian chạy của các luồng (Timing/Ordering). Mọi Thread Interference đều là Race Condition, nhưng không phải Race Condition nào cũng là Thread Interference (có thể xảy ra ngay cả khi chỉ đọc dữ liệu nhưng sai thứ tự thời gian).

2. Ví dụ thực tế trong hệ thống Enterprise

Xét tính năng trừ tiền trong ví điện tử của người 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...
24

Trong mô hình lập trình bất đồng bộ (Asynchronous Programming), Callback Hell là gì và tại sao việc sử dụng Promise hoặc Async/Await là tiêu chuẩn bắt buộc trong Enterprise?

Junior

1. Bản chất của Callback Hell

Callback Hell (còn gọi là Pyramid of Doom) xảy ra trong lập trình bất đồng bộ khi các hàm callback được lồng vào nhau quá sâu (Nested Callbacks). Hiện tượng này thường xuất hiện khi phải thực hiện chuỗi các tác vụ I/O tuần tự bất đồng bộ (Ví dụ: Đọc file -> Gửi HTTP Request -> Lưu vào Database -> Gửi Email).

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...
25

Trong kiến trúc hệ thống, sự khác biệt cốt lõi giữa mô hình Multithreading và Asynchronous Programming là gì? Khi nào nên ưu tiên sử dụng mỗi loại?

Junior

Phân tích bản chất

  • Multithreading: Hệ điều hành cấp phát nhiều luồng (thread) để thực thi các tác vụ song song. Mỗi luồng có stack riêng, tiêu tốn tài nguyên bộ nhớ (RAM) và yêu cầu cơ chế Context Switching phức tạp.
  • Asynchronous Programming: Dựa trên cơ chế Event Loop (như trong Node.js) hoặc Task-based (như trong C#/.NET). Nó không tạo luồng mới mà tận dụng I/O non-blocking để xử lý nhiều yêu cầu trên một luồng duy nhất.

Khi nào nên sử dụng?

  • Multithreading: Phù hợp cho các tác vụ CPU-bound (xử lý ảnh, mã hóa, tính toán phức tạp) để tận dụng tối đa đa nhân CPU.
  • Asynchronous: Phù hợp cho các tác vụ I/O-bound (truy vấn database, gọi API bên thứ ba, đọc ghi file) để tăng khả năng chịu tải (throughput) mà không làm treo hệ thống.

Lưu ý thực chiến

Sử dụng sai mô hình dẫn đến lãng phí tài nguyên hoặc gây nghẽn Event Loop, làm giảm hiệu năng hệ thống nghiêm trọng.

26

Tại sao việc sử dụng biến toàn cục (Global Variable) trong môi trường đa luồng lại nguy hiểm và cách giải quyết vấn đề này trong lập trình Enterprise?

Junior

Bản chất vấn đề

Biến toàn cục chia sẻ vùng nhớ chung giữa các luồng. Khi nhiều luồng cùng đọc và ghi vào một biến tại cùng một thời điểm, hiện tượng Data Race xảy ra, dẫn đến dữ liệu bị sai lệch hoặc crash ứ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...
27

Trong các ứng dụng Microservices, làm thế nào để đảm bảo tính nhất quán của dữ liệu khi có nhiều service cùng cập nhật một tài nguyên thông qua các tiến trình bất đồng bộ?

Junior

Chiến lược xử lý

Để giải quyết bài toán này, kiến trúc Enterprise thường áp dụng các mẫu thiết kế 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...
28

Giải thích khái niệm Thread Pool và tại sao việc tạo mới một luồng (Thread) cho mỗi request là một anti-pattern trong hệ thống Enterprise?

Junior

Tại sao tạo mới luồng là Anti-pattern?

  • Chi phí khởi tạo: Việc cấp phát bộ nhớ và khởi tạo luồng tốn kém tài nguyên CPU và thời gian.
  • Rủi ro hệ thống: Nếu số lượng request quá lớn, việc tạo vô hạn luồng sẽ gây ra lỗi OutOfMemoryException hoặc làm kiệt quệ tài nguyên hệ thống (Thread Exhaustion).

Cơ chế Thread Pool

  • Thread Pool duy trì một tập hợp các luồng đã được khởi tạo sẵn. Khi có tác vụ mới, hệ thống sẽ lấy một luồng từ pool để xử lý, sau đó trả lại luồng đó vào pool thay vì hủy bỏ.
  • Điều này giúp tái sử dụng tài nguyên và giới hạn số lượng luồng tối đa, bảo vệ hệ thống khỏi các cuộc tấn công từ chối dịch vụ (DoS) do quá tải request.

Lời khuyên

Luôn cấu hình kích thước Thread Pool phù hợp với tài nguyên phần cứng (CPU cores) và đặc thù của ứng dụng.

29

Trong lập trình bất đồng bộ, sự khác biệt giữa 'Blocking' và 'Non-blocking' ảnh hưởng thế nào đến hiệu năng của một Web Server?

Junior

Phân tích

  • Blocking: Khi một luồng thực hiện tác vụ I/O, nó sẽ đứng yên chờ đợi kết quả. Trong thời gian đó, luồng này không thể xử lý bất kỳ yêu cầu nào khác. Nếu tất cả luồng trong pool đều bị block, server sẽ không thể tiếp nhận thêm request mới.
  • Non-blocking: Luồng gửi yêu cầu I/O và ngay lập tức quay lại xử lý các tác vụ khác. Khi I/O hoàn tất, một callback hoặc sự kiện sẽ thông báo để xử lý kết quả.

Tác động hiệu năng

  • Blocking dẫn đến hiện tượng 'Thread Starvation' (đói luồng), làm tăng thời gian phản hồi (latency) và giảm khả năng mở rộng (scalability).
  • Non-blocking giúp server xử lý hàng ngàn kết nối đồng thời với số lượng luồng tối thiểu, tối ưu hóa việc sử dụng tài nguyên phần cứng.

Lưu ý

Lập trình Non-blocking thường khó debug hơn do luồng xử lý không tuần tự, cần nắm vững cơ chế Promise/Async-Await để quản lý luồng dữ liệu.

30

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...
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