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.
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.
Cơ chế hoạt động của các loại Join (INNER, LEFT, RIGHT, FULL) khác nhau như thế nào về mặt tập hợp dữ liệu?
Phân tích cơ chế
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...
Sự khác biệt giữa Table Variable và Temporary Table trong T-SQL là gì và khi nào nên chọn loại nào?
So sánh chi tiế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...
Làm thế nào để tránh vấn đề Deadlock khi thực hiện các thao tác cập nhật dữ liệu đồng thời trong T-SQL?
Nguyên nhân gây Deadlock
Deadlock xảy ra khi hai hoặc nhiều tiến trình cùng giữ khóa (lock) trên các tài nguyên mà tiến trình kia đang cần, dẫn đến trạng thái chờ đợi vô hạ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...
Làm thế nào để phân biệt sự khác nhau giữa Delegate Pattern và Closure trong Swift khi truyền dữ liệu giữa các View Controller và khi nào nên dùng cái nào?
Trong lập trình iOS với Swift, Delegate Pattern và Closure là hai phương pháp phổ biến để truyền dữ liệu hoặc thông báo sự kiện ngược lại giữa các thành phần (ví dụ từ Child View Controller về Parent View Controller).
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...
Access Control trong Swift (private, fileprivate, internal, public, open) hoạt động như thế nào và best practices khi áp dụng vào kiến trúc dự án?
Access Control giúp ẩn chi tiết triển khai của mã nguồn, tăng tính đóng gói và bảo mật trong ứng dụng Swift.
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...
Defer statement trong Swift là gì và các kịch bản thực tế nào nên áp dụng để tránh rò rỉ tài nguyên?
Câu lệnh defer trong Swift dùng để lên lịch thực thi một đoạn mã ngay trước khi phạm vi (scope) hiện tại kết thúc, bất kể phạm vi đó kết thúc như thế nào (thông qua return, break, hay ném ra lỗi throw).
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...
Sự khác nhau giữa Type Casting (as?, as!, as) trong Swift là gì và cách xử lý an toàn khi làm việc với kiểu dữ liệu đa hình (Polymorphism)?
Type Casting trong Swift là cách kiểm tra kiểu của một thể hiện hoặc xử lý thể hiện đó như thể nó là một kiểu siêu lớp hoặc lớp con khác trong cùng hệ thống phân cấp.
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...
Lazy Stored Properties trong Swift là gì? Khi nào nên sử dụng và những cạm bẫy hiệu năng cần tránh?
Lazy Stored Property là thuộc tính mà giá trị ban đầu của nó không được tính toán hoặc khởi tạo cho đến lần truy cập đầu tiê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...
Sự khác biệt cốt lõi giữa Stored Procedures và Ad-hoc Queries trong SQL là gì và khi nào một Junior nên ưu tiên sử dụng Stored Procedures?
Phân tích bản chất
- Ad-hoc Queries: Là các câu lệnh SQL được gửi trực tiếp từ ứng dụng tới Database Management System (DBMS) mỗi khi cần thực thi. Mỗi câu lệnh thường phải trải qua quá trình phân tích cú pháp (parsing), tối ưu hóa (query optimization) và biên dịch (compilation) lại từ đầu.
- Stored Procedures: Là tập hợp các câu lệnh SQL được biên dịch sẵn và lưu trữ trực tiếp bên trong cơ sở dữ liệu. Lần gọi đầu tiên sẽ tạo execution plan, và các lần gọi sau sẽ tái sử dụng plan này.
Lợi ích khi sử dụng Stored Procedures
- Hiệu năng (Performance): Giảm tải thời gian biên dịch nhờ tái sử dụng execution plan và giảm lưu lượng mạng truyền tải giữa ứng dụng và database.
- Bảo mật (Security): Giảm thiểu rủi ro tấn công SQL Injection vì các tham số thường được truyền qua SqlParameter một cách an toàn.
- Bảo trì (Maintainability): Logic nghiệp vụ tập trung tại database, giúp dễ dàng cập nhật mà không cần biên dịch lại mã nguồn ứng dụng.
Khi nào Junior nên sử dụng?
- Khi thực hiện các tác vụ phức tạp liên quan đến nhiều bảng và cần bảo mật cao.
- Khi cần chuẩn hóa dữ liệu đầu vào qua các hệ thống khác nhau gọi chung một thủ tục.
Ví dụ minh họa Stored Procedures
CREATE PROCEDURE sp_GetEmployeeByDepartment
@DepartmentID INT
AS
BEGIN
SELECT EmployeeID, FullName, Salary
FROM Employees
WHERE DepartmentID = @DepartmentID;
END;
Kinh nghiệm thực chiến: Không nên lạm dụng Stored Procedures cho toàn bộ ứng dụng vì sẽ làm giảm khả năng kiểm soát version control của mã nguồn ứng dụng và gây khó khăn khi scale ứng dụng sang các hệ thống ORM hiện đại.
Làm thế nào để nhận biết và xử lý tình huống N+1 Query Problem trong các ứng dụng kết nối SQL thông qua ORM?
Khái niệm N+1 Query Problem
N+1 Query Problem xảy ra khi ứng dụng thực hiện 1 câu lệnh SQL để lấy danh sách bảng cha (1 query), sau đó thực hiện thêm N câu lệnh SQL riêng lẻ để lấy dữ liệu bảng con cho từng bản ghi trong danh sách đó (N queries). Điều này làm suy giảm nghiêm trọng hiệu năng hệ thống khi số lượng bản ghi lớ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...
Vai trò của Primary Key và Foreign Key trong việc duy trì tính toàn vẹn dữ liệu (Data Integrity) tại cấp độ cơ sở dữ liệu là gì?
Phân tích bản chất
- Primary Key (Khóa chính):
- Đảm bảo tính duy nhất (Uniqueness) cho mỗi bản ghi trong bảng.
- Tuyệt đối không được chứa giá trị NULL (Not Null).
- Thường được tự động tạo một clustered index để tối ưu hóa tốc độ tìm kiếm.
- Foreign Key (Khóa ngoại):
- Thiết lập mối quan hệ giữa hai bảng (Parent - Child).
- Đảm bảo tính toàn vẹn tham chiếu (Referential Integrity), ngăn chặn việc chèn dữ liệu con khi dữ liệu cha không tồn tại.
Các thiết lập quan trọng khi cấu hình Foreign Key
ON DELETE CASCADE: Khi bản ghi cha bị xóa, các bản ghi con liên quan cũng bị xóa tự động.ON DELETE RESTRICT / NO ACTION: Ngăn cản việc xóa bản ghi cha nếu vẫn còn bản ghi con tham chiếu.ON DELETE SET NULL: Đặt giá trị khóa ngoại ở bảng con thành NULL khi bản ghi cha bị xóa.
Ví dụ minh họa
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
CustomerName VARCHAR(100)
);
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE,
CustomerID INT,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES Customers(CustomerID)
ON DELETE CASCADE
);
Kinh nghiệm thực chiến: Không nên bỏ qua việc khai báo Foreign Key trong database chỉ vì lý do muốn tăng tốc độ chèn dữ liệu. Việc kiểm soát logic ở tầng ứng dụng không an toàn bằng việc ép buộc ràng buộc trực tiếp tại tầng database.
Sự khác biệt giữa kiểu dữ liệu VARCHAR và CHAR trong SQL là gì và việc lựa chọn sai ảnh hưởng như thế nào đến hiệu năng?
Phân tích bản chất
- CHAR (Character):
- Là kiểu dữ liệu chuỗi có độ dài cố định (fixed-length).
- Nếu chuỗi ngắn hơn độ dài khai báo, hệ thống sẽ tự động độn thêm khoảng trắng (spaces) vào cuối cho đủ kích thước.
- Tốc độ truy xuất nhanh hơn một chút đối với các trường có độ dài đồng nhất do kích thước bản ghi cố định.
- VARCHAR (Variable Character):
- Là kiểu dữ liệu chuỗi có độ dài thay đổi (variable-length).
- Chỉ lưu trữ đúng số lượng ký tự thực tế cộng thêm một vài byte metadata để quản lý chiều dài.
- Tiết kiệm dung lượng lưu trữ đáng kể khi dữ liệu có chiều dài biến động.
Ảnh hưởng đến hiệu năng
- Dung lượng lưu trữ: Sử dụng
CHARcho các cột có chiều dài thay đổi lớn (như ghi chú, địa chỉ) sẽ làm lãng phí nghiêm trọng dung lượng ổ cứng và bộ nhớ đệm (Buffer Pool). - Index Performance: Kích thước bản ghi lớn hơn làm giảm số lượng bản ghi trên mỗi trang dữ liệu (Page), dẫn đến việc tăng số lần đọc đĩa (Disk I/O) khi thực hiện Index Scan.
Ví dụ minh họa
-- Sử dụng CHAR cho mã định danh có độ dài cố định chính xác 10 ký tự
EmployeeCode CHAR(10),
-- Sử dụng VARCHAR cho họ tên có độ dài thay đổi
FullName VARCHAR(100)
Kinh nghiệm thực chiến: Luôn ưu tiên sử dụng VARCHAR cho các cột văn bản có độ dài không cố định, và chỉ dùng CHAR khi chắc chắn rằng mọi dữ liệu nhập vào đều có độ dài hoàn toàn bằng nhau (ví dụ: mã quốc gia, mã hash cố định).
Các bước cơ bản cần thực hiện khi phân tích và tối ưu hóa một câu lệnh SQL chậm (Slow Query) là gì?
Quy trình tối ưu hóa một Slow Query
- Xác định câu lệnh chậm: Sử dụng công cụ giám sát như SQL Server Profiler, Slow Query Log trong MySQL, hoặc APM tools để khoanh vùng câu lệnh gây nghẽn.
- Phân tích Execution Plan: Sử dụng lệnh
EXPLAINhoặc xem Graphical Execution Plan để hiểu cách cơ sở dữ liệu thực thi truy vấn. - Kiểm tra Index: Phát hiện các hiện tượng Table Scan / Clustered Index Scan không cần thiết và đề xuất tạo Non-Clustered Index phù hợp.
- Tối ưu cấu trúc truy vấn: Tránh dùng
SELECT *, hạn chế sử dụng hàm trên cột điều kiện (sẽ làm mất tác dụng của Index), và tối ưu hóa các phép nốiJOIN.
Ví dụ phân tích bằng EXPLAIN
EXPLAIN SELECT * FROM Orders WHERE CustomerID = 5 AND OrderDate >= '2023-01-01';
- Nếu cột
CustomerIDhoặcOrderDatekhông có Index, hệ thống sẽ quét toàn bộ bảng (Table Scan). - Giải pháp là tạo Composite Index:
CREATE INDEX IX_Orders_Customer_Date ON Orders(CustomerID, OrderDate);
Lưu ý quan trọng
- Không phải lúc nào có Index cũng tốt. Index làm tăng tốc độ đọc nhưng làm chậm tốc độ ghi (
INSERT,UPDATE,DELETE). - Tránh lạm dụng các toán tử phủ định như
NOT IN,!=,<>vì chúng thường khó tận dụng được Index.
Kinh nghiệm thực chiến: Khi làm việc với dữ liệu lớn, hãy luôn kiểm tra xem các cột tham gia vào mệnh đề WHERE, JOIN, ORDER BY đã được đánh chỉ mục đúng cách hay chưa trước khi nghĩ đến việc tối ưu phần cứng.
Trong kiến trúc hệ thống phân tán, cơ chế Dead Letter Queue (DLQ) đóng vai trò gì và tại sao một lập trình viên Junior cần phải cấu hình nó cho các tác vụ xử lý hàng đợi?
Bản chất của Dead Letter Queue (DLQ)
DLQ là một hàng đợi đặc biệt được sử dụng để lưu trữ các thông điệp (messages) không thể xử lý thành công sau một số lần thử lại (retries) nhất định.
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...
Sự khác biệt giữa cơ chế Pull-based và Push-based trong việc tiêu thụ dữ liệu từ Queue là gì và khi nào nên ưu tiên sử dụng từng loại?
Cơ chế Push-based (Consumer-driven)
- Cách hoạt động: Message Broker chủ động đẩy dữ liệu tới Consumer ngay khi có message mới.
- Ưu điểm: Độ trễ (latency) thấp, phản hồi gần như tức thì.
- Nhược điểm: Dễ gây quá tải (overload) cho Consumer nếu lưu lượng message tăng đột biến (spike).
Cơ chế Pull-based (Polling)
- Cách hoạt động: Consumer chủ động gửi yêu cầu để lấy dữ liệu từ Queue.
- Ưu điểm: Consumer có quyền kiểm soát tốc độ xử lý (backpressure), tránh bị sập hệ thống do quá tải.
- Nhược điểm: Tốn tài nguyên mạng và CPU do phải liên tục kiểm tra (polling) nếu không có dữ liệu.
Lời khuyên thực chiến
Sử dụng Push-based khi hệ thống cần xử lý thời gian thực (real-time). Sử dụng Pull-based khi bạn cần kiểm soát tải trọng (load balancing) và đảm bảo tính ổn định cho các dịch vụ xử lý nặng.
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.
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.


