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.

Tất cả công nghệ .Net (39) ADO.NET (33) Agile scrum (43) Android (44) Angular (121) API Design (53) Arrays (19) ASP.NET (52) ASP.NET MVC (35) ASP.NET Web API (32) Availability & Reliability (2) Azure (53) Backtracking (7) Big-O Notation (16) Binary Tree (19) Bit Manipulation (9) Blockchain (42) C# (105) Caching (2) CAP Theorem (2) CDN (2) Concurrency (2) Cosmos DB (50) Cryptography (4) CSS (63) Data Structures (69) Databases (50) DDD (2) Dependency Injection (4) Design pattern (23) Devops (32) Divide & Conquer (2) Docker (38) Dynamic Programming (10) Entity Framework (57) Fibonacci Series (4) Flutter (136) Git (63) Go lang (60) Graph Theory (19) GraphQL (71) Greedy Algorithms (7) Hash Tables (25) Heaps and Maps (10) HTML (73) Ionic (29) IOS (75) Java (141) Javascript (137) jQuery (95) Kotlin (60) Kubernetes (27) Laravel (90) Layering & Middleware (2) Linked Lists (17) LINQ (30) Load Balancing (2) Microservices (30) Mongodb (27) MySQL (58) Net core (66) Node.js (119) NoSQL (2) Objective-C (33) OOP (75) Package Managerment (60) PHP (78) PostgreSQL (50) PWA (22) Python (82) Queues (11) React Native (38) React.js (116) Reactive Programming (11) Recursion (5) Redis (25) Ruby (79) Ruby on Rails (121) Rust (88) Searching (18) SOA (2) Software Architecture (3) Software Testing (11) Sorting (13) Spring (78) SQL (43) SQL Server (66) Stacks (10) Strings (17) Swift (89) Systems Design (50) T-SQL (43) Trees (31) Trie (8) Typescript (100) Unit testing (22) UX Design (74) Vue.js (84) Web security (45) WebSockets (25) Xamarin (81)
16

Giải thuật Tìm kiếm Nhị phân (Binary Search) hoạt động trên nguyên lý nào? Làm thế nào để tối ưu hóa tránh lỗi tràn số (integer overflow) khi tính chỉ số giữa (mid)?

Middle

Tìm kiếm Nhị phân hoạt động trên mảng đã được sắp xếp dựa trên nguyên lý Chia để trị (Divide and Conquer), liên tục chia đôi không gian tìm kiếm:

  1. Cơ chế: So sánh phần tử cần tìm với phần tử ở giữa (mid). Nếu bằng, trả về chỉ số. Nếu nhỏ hơn, thu hẹp phạm vi tìm kiếm về nửa bên trái. Nêu lớn hơn, thu hẹp về nửa bên phải.
  2. Lỗi tràn số (Integer Overflow): Công thức tính thông thường là mid = (low + high) / 2. Nếu lowhigh đều là các số nguyên lớn, tổng của chúng có thể vượt quá giới hạn lưu trữ tối đa của kiểu số nguyên (ví dụ: 2^31 - 1 trong Java/C++), dẫn đến giá trị âm hoặc kết quả sai lệch.
  3. Tối ưu hóa: Thay đổi công thức tính mid thành mid = low + (high - low) / 2. Công thức này đảm bảo không bao giờ xảy ra tràn số vì hiệu high - low luôn là số dương nhỏ hơn giới hạn, và khi cộng vào low cũng không vượt quá high. Độ phức tạp thời gian là O(log n) và không gian là O(1).
17

Hãy giải thích cách ứng dụng Cấu trúc dữ liệu Ngăn xếp (Stack) để kiểm tra tính hợp lệ của các dấu ngoặc đóng mở trong một chuỗi biểu thức?

Middle

Ngăn xếp hoạt động theo nguyên lý LIFO (Last In, First Out - Vào sau, Ra trước), cực kỳ thích hợp để kiểm tra các cấu trúc lồng nhau như dấu ngoặc.

  • Thuật toán:
    1. Khởi tạo một stack rỗng.
    2. Duyệt qua từng ký tự của chuỗi biểu thức từ trái sang phải.
    3. Nếu gặp dấu ngoặc mở ((, [, {), ta đẩy (push) nó vào stack.
    4. Nếu gặp dấu ngoặc đóng (), ], }):
      • Kiểm tra nếu stack rỗng: Trả về false ngay lập tức (thừa ngoặc đóng).
      • Lấy phần tử đỉnh stack ra (pop) và kiểm tra xem nó có phải là dấu ngoặc mở tương ứng cùng loại hay không. Nếu không khớp, trả về false.
    5. Sau khi duyệt hết chuỗi, nếu stack trống hoàn toàn thì chuỗi hợp lệ (trả về true). Nếu stack vẫn còn phần tử thì chuỗi không hợp lệ (thừa ngoặc mở, trả về false).
  • Độ phức tạp: Thời gian O(n) và không gian O(n) cho việc lưu trữ stack.
18

Thuật toán tham lam (Greedy Algorithm) hoạt động dựa trên nguyên lý nào? Tại sao nó không luôn luôn cho ra kết quả tối ưu toàn cục? Cho ví dụ?

Middle

Thuật toán tham lam hoạt động trên nguyên lý: Tại mỗi bước đi, luôn đưa ra lựa chọn tốt nhất tại thời điểm hiện tại (lựa chọn tối ưu cục bộ - local optimal) với hy vọng rằng các lựa chọn này sẽ dẫn đến lời giải tối ưu toàn cục (global optimal).

  • Hân chế: Thuật toán tham lam không bao giờ nhìn lại hoặc thay đổi các quyết định đã đưa ra ở bước trước. Nó thiếu cái nhìn tổng thể về không gian trạng thái, do đó dễ bị rơi vào bẫy tối ưu cục bộ mà bỏ lỡ đường đi tốt nhất.
  • Ví dụ (Bài toán thối tiền lẻ): Hệ thống tiền lẻ có các mệnh giá: 1, 3, 4 đô la. Ta cần thối lại số tiền là 6 đô la với số tờ tiền ít nhất.
    • Tiếp cận Tham lam: Chọn tờ lớn nhất trước là 4 -> còn 2 đô la -> chọn 2 tờ 1 đô la. Tổng cộng cần 3 tờ (4, 1, 1).
    • Tiếp cận Tối ưu: Chọn 2 tờ 3 đô la. Tổng cộng chỉ cần 2 tờ (3, 3). Thuật toán tham lam đã thất bại trong việc tìm lời giải tối ưu toàn cục.
19

Nguyên lý hoạt động của phương pháp Chia để trị (Divide and Conquer) là gì? Nêu 3 thuật toán kinh điển sử dụng phương pháp này?

Middle

Phương pháp Chia để trị giải quyết bài toán phức tạp bằng cách chia nó thành các bài toán con nhỏ hơn cùng loại, giải quyết các bài toán con một cách độc lập, sau đó kết hợp các kết quả đó lại để có lời giải cho bài toán ban đầu.

  • 3 Bước cốt lõi:
    1. Divide (Chia): Chia bài toán lớn thành các bài toán con nhỏ hơn.
    2. Conquer (Trị): Giải quyết các bài toán con một cách đệ quy. Nếu bài toán con đủ nhỏ (Base Case), ta giải quyết trực tiếp.
    3. Combine (Kết hợp): Gộp kết quả của các bài toán con để tạo thành lời giải cuối cùng.
  • 3 Thuật toán kinh điển:
    1. Merge Sort: Chia mảng thành 2 nửa, sắp xếp đệ quy từng nửa rồi gộp hai nửa đã sắp xếp lại trong O(n).
    2. Quick Sort: Phân chia mảng quanh một phần tử chốt (pivot) sao cho bên trái nhỏ hơn pivot và bên phải lớn hơn pivot, sau đó sắp xếp đệ quy hai phần.
    3. Binary Search: Chia đôi mảng đã sắp xếp và chỉ chọn một nửa thích hợp để tiếp tục tìm kiếm đệ quy hoặc lặp.
20

Sự khác biệt giữa Integration Testing (Kiểm thử tích hợp) và Unit Testing (Kiểm thử đơn vị)? Tại sao cần Mocking trong Unit Test?

Middle
  • Unit Testing: Kiểm thử các khối mã nguồn nhỏ nhất độc lập (thường là một hàm hoặc một class) trong môi trường hoàn toàn cô lập. Tốc độ thực thi cực nhanh (vài mili giây) và không phụ thuộc vào yếu tố bên ngoài.
  • Integration Testing: Kiểm thử sự tương tác và tích hợp giữa nhiều module/thành phần với nhau, hoặc giữa ứng dụng với các hệ thống bên ngoài (như Database, API bên thứ ba).
  • Tại sao cần Mocking trong Unit Test: Unit Test yêu cầu code phải được kiểm thử cô lập. Nếu hàm cần test gọi đến database hoặc gọi API của bên thứ ba, việc kết nối thực tế sẽ làm test chạy rất chậm, không ổn định (nếu mất mạng) và có thể làm thay đổi dữ liệu thật. Mocking cho phép ta giả lập (simulate) các đối tượng phụ thuộc này để trả về kết quả định trước ngay lập tức, giúp tập trung kiểm thử đúng logic của hàm hiện tại.
  • 21

    Middleware hoạt động như thế nào trong Request Pipeline của một ứng dụng web? Cho ví dụ về xử lý Authentication và CORS?

    Middle

    Middleware hoạt động theo mô hình Onion (củ hành) hoặc Pipeline (đường ống). Khi HTTP Request gửi đến, nó đi qua một chuỗi các middleware được cấu hình sẵn trước khi chạm tới Controller xử lý chính. Response sau đó cũng đi ngược lại qua chuỗi middleware này để trả về cho client.

    • Ví dụ xử lý Authentication: Middleware kiểm tra xem Request có chứa JWT Token hợp lệ ở Header hay không. Nếu có, nó giải mã lấy thông tin người dùng gắn vào Request và gọi next() để đi tiếp. Nếu không, nó chặn Request và trả về mã lỗi 401 Unauthorized ngay lập tức.
    • Ví dụ xử lý CORS (Cross-Origin Resource Sharing): Middleware chặn các request Preflight (OPTIONS) hoặc các request thông thường để chèn thêm các header cần thiết (như Access-Control-Allow-Origin, Access-Control-Allow-Methods) vào response nhằm cho phép trình duyệt ở domain khác truy cập tài nguyên một cách hợp lệ.
    22

    Mạng phân phối nội dung (CDN) hoạt động trên nguyên lý nào? Giải thích sự khác biệt giữa cơ chế Push CDN và Pull CDN?

    Middle

    CDN hoạt động trên nguyên lý phân tán các máy chủ bộ nhớ đệm (Edge Servers) tại nhiều điểm địa lý khác nhau trên thế giới để lưu trữ bản sao dữ liệu tĩnh (ảnh, video, JS/CSS), giúp giảm độ trễ (latency) khi người dùng truy cập từ khoảng cách xa.

    • Push CDN: Lập trình viên chủ động tải (upload/push) nội dung mới lên máy chủ CDN mỗi khi có sự thay đổi. CDN là nơi lưu trữ gốc của các file này.
      • Ưu điểm: Tiết kiệm băng thông cho server gốc (Origin Server) vì CDN không cần hỏi lại server gốc để lấy file.
      • Nhược điểm: Phải tự quản lý luồng upload và cập nhật khi file thay đổi.
    • Pull CDN: Khi người dùng request một file, Edge Server của CDN sẽ kiểm tra xem đã có file đó trong cache chưa. Nếu chưa (Cache Miss), nó sẽ tự động gửi request về server gốc để kéo (pull) file đó về, lưu vào cache tại Edge Server và trả về cho người dùng.
      • Ưu điểm: Cực kỳ đơn giản khi tích hợp, CDN tự động đồng bộ hóa với server gốc.
      • Nhược điểm: Request đầu tiên của người dùng sẽ bị chậm (do cache miss phải pull từ origin).
    23

    Sự khác biệt giữa Entity và Value Object trong Domain-Driven Design (DDD) là gì? Cho ví dụ minh họa?

    Middle
  • Entity (Thực thể):
    • Là đối tượng được định danh bằng một ID duy nhất và cố định trong suốt vòng đời của nó. Cho dù các thuộc tính khác thay đổi, Entity đó vẫn là duy nhất.
    • Ví dụ: Customer (Học viên) có ID là 1. Học viên này có thể đổi tên, đổi email nhưng ID vẫn là 1 và hệ thống vẫn xác định đó là cùng một người.
  • Value Object (Đối tượng giá trị):
    • Là đối tượng không có ID riêng và được định nghĩa hoàn toàn bởi giá trị của các thuộc tính mà nó chứa. Nếu hai Value Objects có tất cả các thuộc tính giống hệt nhau, chúng được coi là tương đương.
    • Value Object là bất biến (immutable). Muốn thay đổi, ta bắt buộc phải tạo ra một thực thể Value Object mới thay thế hoàn toàn.
    • Ví dụ: Address (Địa chỉ gồm số nhà, đường, thành phố) hoặc Money (gồm số tiền và đơn vị tệ). Nếu đổi địa chỉ giao hàng, ta gán một địa chỉ hoàn toàn mới thay vì sửa đổi từng thuộc tính của địa chỉ cũ.
  • 24

    Hãy so sánh các thuật toán cân bằng tải phổ biến: Round Robin, Weighted Round Robin, Least Connections và IP Hash?

    Middle
  • Round Robin (Vòng tròn): Luân chuyển tuần tự các request đến từng server trong danh sách. Đơn giản, công bằng nếu cấu hình phần cứng các server giống hệt nhau.
  • Weighted Round Robin (Vòng tròn có trọng số): Mỗi server được gán một trọng số (weight) dựa trên năng lực xử lý (CPU, RAM). Server có trọng số lớn hơn sẽ nhận được nhiều request hơn. Phù hợp cho cụm server có cấu hình không đồng đều.
  • Least Connections (Kết nối ít nhất): Định tuyến request đến server hiện đang có ít kết nối hoạt động (active connections) nhất. Cực kỳ tối ưu cho các tác vụ cần nhiều thời gian xử lý (như tải file, truy vấn DB nặng) để tránh dồn ứ request tại một server.
  • IP Hash (Băm IP): Tính mã băm (hash) từ địa chỉ IP của client để quyết định server xử lý. Đảm bảo một client (một địa chỉ IP) luôn luôn được kết nối đến duy nhất một server cố định. Thích hợp cho các ứng dụng cần duy trì trạng thái phiên làm việc (Session Persistence) mà không có Session Store tập trung.
  • 25

    Những lỗi phổ biến nào lập trình viên thường mắc phải khi sử dụng Deferred Execution properties trong LINQ?

    Middle

    Trong phát triển dự án với LINQ, việc tối ưu hóa và quản lý tốt Deferred Execution properties là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của Deferred Execution properties dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.
    26

    Những lỗi phổ biến nào lập trình viên thường mắc phải khi sử dụng GAC (Global Assembly Cache) trong .Net?

    Middle

    Trong phát triển dự án với .Net, việc tối ưu hóa và quản lý tốt GAC (Global Assembly Cache) là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của GAC (Global Assembly Cache) dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.
    27

    Những lỗi phổ biến nào lập trình viên thường mắc phải khi sử dụng Web View wrapper trong Ionic?

    Middle

    Trong phát triển dự án với Ionic, việc tối ưu hóa và quản lý tốt Web View wrapper là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của Web View wrapper dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.
    28

    Những lỗi phổ biến nào lập trình viên thường mắc phải khi sử dụng Native Modules development trong React Native?

    Middle

    Trong phát triển dự án với React Native, việc tối ưu hóa và quản lý tốt Native Modules development là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của Native Modules development dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.
    29

    Những lỗi phổ biến nào lập trình viên thường mắc phải khi sử dụng Indexing strategies (Compound, Text) trong Mongodb?

    Middle

    Trong phát triển dự án với Mongodb, việc tối ưu hóa và quản lý tốt Indexing strategies (Compound, Text) là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của Indexing strategies (Compound, Text) dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.
    30

    Những lỗi phổ biến nào lập trình viên thường mắc phải khi sử dụng Full-duplex communication channel trong WebSockets?

    Middle

    Trong phát triển dự án với WebSockets, việc tối ưu hóa và quản lý tốt Full-duplex communication channel là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của Full-duplex communication channel dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.

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