Chào bạn, đây là bản tài liệu đầy đủ và chi tiết nhất cho toàn bộ bộ câu hỏi trong ảnh (bao gồm cả phần Thuật toán và Backend). Tôi đã tối ưu cấu trúc để bạn dễ dàng copy và học tập.
TÀI LIỆU ÔN TẬP PHỎNG VẤN BACKEND DEVELOPER
I. CÂU HỎI PHỎNG VẤN CƠ BẢN
1. Lập trình OOP là gì?
Trả lời: OOP (Object-Oriented Programming) là phương pháp lập trình dựa trên khái niệm đối tượng (Object). Thay vì tập trung vào các hàm xử lý, OOP tập trung vào các thực thể có thuộc tính (data) và hành động (methods).
4 Tính chất: Đóng gói (Encapsulation), Kế thừa (Inheritance), Đa hình (Polymorphism), Trừu tượng (Abstraction).
Ví dụ: Lớp
Carcó thuộc tínhcolor,brandvà hành độngdrive().
2. Kế thừa là gì? Tại sao cần sử dụng?
Trả lời: Là khả năng một lớp (Con) sử dụng lại các thuộc tính và phương thức của lớp khác (Cha).
Lý do: Giảm trùng lặp mã nguồn (DRY - Don't Repeat Yourself), dễ dàng mở rộng và quản lý code tập trung.
Ví dụ: Lớp cha
Animalcó hàmeat(). Các lớp conCat,Dogkế thừaAnimalđể dùng chung hàmeat()mà không cần viết lại.
3. Sự khác nhau giữa Overloading và Overriding?
Overloading (Nạp chồng): Trong cùng một class, các hàm cùng tên nhưng khác tham số (số lượng hoặc kiểu dữ liệu). Xảy ra lúc Compile-time.
Overriding (Ghi đè): Lớp con viết lại hàm đã có ở lớp cha với cùng tên và tham số để thay đổi logic. Xảy ra lúc Run-time.
4. Interface và Abstract Class có thể thay thế cho nhau không?
Trả lời: Không.
Abstract Class: Dùng cho các lớp có cùng bản chất (is-a). Có thể chứa cả hàm có logic và hàm trừu tượng.
Interface: Dùng như một bản "hợp đồng" về khả năng (can-do). Một lớp có thể implement nhiều Interface nhưng chỉ kế thừa một Abstract class.
5. Luồng Login hoạt động như thế nào?
User gửi
username/passwordqua HTTPS.Server kiểm tra Database. Nếu đúng, tạo ra Token (như JWT).
Server trả Token về cho Client (Browser/Mobile).
Client lưu Token vào
LocalStoragehoặcHttpOnly Cookie.Các request sau, Client gửi Token ở Header để Server xác thực.
6. Cách Server nhận biết Request là Login API?
Trả lời: Dựa vào Routing. Server lắng nghe các request và so khớp đường dẫn (URL) và Method.
Ví dụ: Nếu URL là
/api/v1/auth/loginvà Method làPOST, Server sẽ kích hoạt controller xử lý đăng nhập.
7. Cách gửi Token lên Server?
Trả lời: Cách chuẩn nhất là gửi qua HTTP Header:
Authorization: Bearer <token_của_bạn>
8. JWT là gì? Gồm phần nào? Verify như thế nào?
Trả lời: JWT là một chuỗi mã hóa an toàn để truyền thông tin giữa các bên.
3 Phần: Header (Thuật toán), Payload (Thông tin user), Signature (Chữ ký).
Verify: Server dùng
Secret Keyđể băm lại Header + Payload. Nếu kết quả giống Signature đính kèm thì token là thật. Nếu hacker sửa Payload, Signature sẽ bị sai ngay lập tức.
9. Cách Logout trên nhiều thiết bị?
Trả lời:
Sử dụng Blacklist trên Redis: Lưu các token bị hủy vào Redis cho đến khi chúng hết hạn.
Refresh Token Rotation: Khi đổi pass, xóa toàn bộ bản ghi Refresh Token cũ trong DB, buộc mọi thiết bị phải login lại.
10. So sánh Access Token và Refresh Token?
Access Token: Thời gian sống ngắn (vài phút), dùng để gọi API trực tiếp. Lưu ở bộ nhớ tạm.
Refresh Token: Thời gian sống dài (vài ngày/tháng), dùng để đổi lấy Access Token mới khi cái cũ hết hạn. Lưu ở Database hoặc HttpOnly Cookie.
II. CÂU HỎI LOGIC & THUẬT TOÁN
1. Selection Sort và Insertion Sort
Selection Sort (Sắp xếp chọn): Tìm phần tử nhỏ nhất trong mảng chưa sắp xếp và đổi chỗ nó với phần tử đầu tiên.
Insertion Sort (Sắp xếp chèn): Lấy từng phần tử và "chèn" nó vào đúng vị trí trong mảng đã được sắp xếp trước đó (giống cách xếp bài tây).
Demo: Cả hai có độ phức tạp trung bình là $O(n^2)$. Chỉ nên dùng cho mảng nhỏ.
2. Cộng 2 số nguyên lớn
Vấn đề: Các kiểu dữ liệu như int hay long không chứa nổi số có hàng trăm chữ số.
Giải pháp: Chuyển số thành String. Duyệt từ cuối chuỗi lên đầu, cộng từng chữ số và xử lý biến "nhớ" (carry).
3. Nối 2 mảng đã sắp xếp (Merge)
Giải pháp: Dùng 2 con trỏ i và j đặt ở đầu 2 mảng. So sánh phần tử tại i và j, cái nào nhỏ hơn thì cho vào mảng kết quả rồi tăng con trỏ đó lên. Tiếp tục cho đến khi hết cả 2 mảng.
III. KIẾN THỨC BACKEND (INFRASTRUCTURE)
1. Docker
Image: Một cái "khuôn" đóng gói sẵn code, thư viện, môi trường (như một file nén).
Container: Một "thực thể" chạy từ Image. Có thể bật/tắt dễ dàng.
Volume: Nơi lưu dữ liệu bền vững. Nếu Container bị xóa, dữ liệu trong Volume vẫn còn (dùng cho Database).
Network: Giúp các container (như App và DB) nói chuyện được với nhau.
2. Kubernetes (K8s)
Vai trò: Quản lý hàng nghìn Container cùng lúc. Tự động khởi động lại nếu Container chết (Self-healing), tự động mở rộng (Scaling).
Node: Một máy vật lý hoặc máy ảo trong cụm K8s.
3. Apache (LAMPP), Caddy, Nginx
Nginx/Caddy: Đóng vai trò là Reverse Proxy và Web Server. Nó đứng đầu để nhận request từ user, sau đó điều hướng về các container phía sau. Caddy nổi tiếng vì tự động cấu hình SSL (HTTPS) miễn phí.