Phỏng vấn vị trí Node.js & Backend JS không chỉ đòi hỏi bạn biết viết code chạy được, mà còn cần hiểu sâu về kiến trúc bất đồng bộ và hiệu năng. Bài viết này sẽ mổ xẻ những lỗi khiến ứng viên rớt oan uổng và cách lật ngược thế cờ.
Hiểu sai về Event Loop và luồng xử lý (Single-threaded)
Nhiều ứng viên khi được hỏi 'Node.js là đơn luồng (single-threaded) phải không?' liền trả lời ngay 'Đúng vậy, nó chỉ chạy một luồng duy nhất'. Câu trả lời này chỉ đúng một nửa và thiếu đi sự tinh tế về mặt kiến trúc hệ thống.
Thực tế, JavaScript chạy trên Main Thread duy nhất, nhưng môi trường runtime Node.js (thông qua libuv) lại duy trì một Thread Pool để xử lý các tác vụ nặng như I/O, crypto hay file system. Việc thiếu sót chi tiết này sẽ khiến bạn mất điểm trước các Senior/Lead interviewer.
- Nói Node.js hoàn toàn đơn luồng mà quên mất Thread Pool trong libuv
- Nhầm lẫn giữa Main Thread (thực thi JS) và các tác vụ background
- Không giải thích được cơ chế non-blocking I/O hoạt động ra sao
Xử lý bất đồng bộ kém và lạm dụng Promise Chaining rối rắm
Khi đối mặt với các câu hỏi về async/await hoặc xử lý lỗi bất đồng bộ, nhiều bạn thường viết code thiếu try/catch hoặc dùng promise chaining chằng chịt. Điều này thể hiện kinh nghiệm thực chiến chưa cao và dễ gây rò rỉ bộ nhớ hoặc unhandled rejections.
Hãy luôn nhớ rằng code bất đồng bộ sạch sẽ, dễ đọc và kiểm soát lỗi chặt chẽ là tiêu chí hàng đầu của một Backend Engineer chuyên nghiệp.
- Quên bắt lỗi trong async function dẫn đến crash ứng dụng
- Dùng Promise.all sai cách khi các tác vụ độc lập bị lồng ghép tuần tự
- Không biết cách sử dụng các công cụ trace bất đồng bộ
Bỏ qua quản lý Memory Leak và tối ưu hóa hiệu năng
Khi được hỏi về tối ưu hóa hệ thống, câu trả lời kinh điển của ứng viên là 'dùng cluster mode' hoặc 'thêm cache Redis'. Tuy nhiên, nhà tuyển dụng muốn nghe về việc bạn kiểm soát bộ nhớ ra sao và nhận biết closure gây rò rỉ thế nào.
Việc không nắm được cách Garbage Collection hoạt động trong V8 engine sẽ khiến bạn khó lòng giải thích được các bài toán scale hệ thống lớn.
- Không biết cách đọc heap snapshot hay sử dụng clinic.js
- Lạm dụng global variables hoặc quên gỡ bỏ event listeners
- Thiếu kiến thức thực tế về cách V8 quản lý bộ nhớ
Thiết kế RESTful API thiếu chuẩn mực và lơ là bảo mật
Rất nhiều bạn chỉ tập trung vào logic nghiệp vụ mà bỏ qua các Best Practices khi thiết kế API như mã trạng thái HTTP (status codes), phân trang (pagination), hoặc rate limiting.
Ngoài ra, việc không chủ động nhắc đến các vấn đề bảo mật cơ bản như Helmet, CORS hay validate input cũng là điểm trừ lớn.
- Dùng sai HTTP status codes (ví dụ: trả về 200 kèm lỗi ở body)
- Bỏ quên việc validate input đầu vào bằng Joi hoặc Zod
- Không đề cập đến các lỗ hổng phổ biến như Injection hay XSS
Ghi nhớ nhanh
- Nắm vững kiến trúc cốt lõi như Event Loop và libuv Thread Pool thay vì chỉ học thuộc lý thuyết bề nổi.
- Luôn chú trọng xử lý lỗi triệt để trong code bất đồng bộ với try/catch và proper status codes.
- Thể hiện tư duy tối ưu hóa hiệu năng và phòng tránh memory leak khi bàn về hệ thống lớn.
- Luôn kết hợp các best practices về bảo mật và thiết kế API chuẩn RESTful vào câu trả lời phỏng vấn.