10 câu hỏi có thể gặp khi phỏng vấn
Chọn theo kỹ năng và cấp của tin (Node.js, AI / Machine Learning, JavaScript & TypeScript). Gợi ý trả lời do Drama Công Ty biên soạn để bạn ôn nhanh, không phải đề của công ty.
01Stream trong Node là gì? Backpressure là gì? Làm sao xử lý file vài GB mà không hết RAM?Node.js
Gợi ý trả lời
Ôn thêm câu hỏi Node.js →Stream xử lý dữ liệu theo từng chunk thay vì đọc hết vào bộ nhớ. Có bốn loại: Readable, Writable, Duplex, Transform.
Backpressure: khi bên ghi chậm hơn bên đọc, dữ liệu dồn lại trong bộ đệm.
write()trả vềfalseđể báo nên dừng đọc cho đến khi có sự kiệndrain.Dùng
pipelineđể tự xử lý backpressure, lỗi và dọn dẹp:import { pipeline } from "node:stream/promises"; import { createGzip } from "node:zlib"; await pipeline( fs.createReadStream("big.csv"), createGzip(), fs.createWriteStream("big.csv.gz"), );Ứng dụng: upload/download file lớn, xuất CSV từ DB theo con trỏ, proxy dữ liệu.
Hay sai: dùng
fs.readFilecho file lớn, hoặc.pipe()nối nhiều bước mà không bắt lỗi ở từng stream, khiến file descriptor bị rò.02Một endpoint làm tác vụ nặng CPU (xử lý ảnh, tạo báo cáo) làm cả server chậm theo. Bạn xử lý thế nào?Node.js
Gợi ý trả lời
Ôn thêm câu hỏi Node.js →Tác vụ CPU chạy trên main thread sẽ chặn event loop, nên mọi request khác phải chờ. Có vài hướng:
worker_threads: chạy tính toán ở thread khác trong cùng process. Nên dùng một pool worker (ví dụ thư viện Piscina) thay vì tạo worker mới cho mỗi request.- Hàng đợi công việc: API chỉ nhận yêu cầu, đẩy job vào queue (BullMQ trên Redis, RabbitMQ), trả về
202kèm mã job; worker riêng xử lý, client hỏi lại trạng thái hoặc nhận thông báo. - Tách service: nếu việc nặng là trọng tâm, viết bằng ngôn ngữ phù hợp hơn hoặc dùng dịch vụ chuyên dụng.
clusterhay PM2 chạy nhiều process giúp tận dụng nhiều core, nhưng không giải quyết việc một request nặng chặn process của nó.Người phỏng vấn muốn nghe: bạn đo được độ trễ event loop (
perf_hooks.monitorEventLoopDelay) để phát hiện vấn đề này.03Trong NestJS, module, provider và dependency injection hoạt động ra sao? Guard, interceptor, pipe khác nhau thế nào?Node.js
Gợi ý trả lời
Ôn thêm câu hỏi Node.js →NestJS tổ chức app thành module. Mỗi module khai báo controller, provider (service, repository) và
exportsnhững gì module khác được dùng. IoC container của Nest tự tạo provider và inject qua constructor.@Injectable() export class OrdersService { constructor(private readonly repo: OrdersRepository) {} }Thứ tự một request đi qua: middleware, guard, interceptor (trước), pipe, handler, interceptor (sau); exception filter bắt lỗi ở bất kỳ bước nào.
- Guard: quyết định request có được đi tiếp không (xác thực, phân quyền).
- Pipe: biến đổi và validate input (
ValidationPipevới DTO). - Interceptor: bọc quanh handler: log, đo thời gian, đổi định dạng response, cache.
Hay sai: hai provider phụ thuộc vòng tròn rồi xử lý bằng
forwardRefkhắp nơi. Thường đó là dấu hiệu nên tách lại trách nhiệm giữa các module.04Hallucination của LLM là gì? Bạn giảm thiểu nó trong sản phẩm thế nào?AI / Machine Learning
Gợi ý trả lời
Ôn thêm câu hỏi AI / Machine Learning →Hallucination là khi mô hình sinh ra nội dung nghe hợp lý nhưng sai hoặc không có căn cứ. Không loại bỏ hoàn toàn được, chỉ giảm và kiểm soát.
- Cung cấp ngữ cảnh đúng qua RAG, yêu cầu chỉ trả lời dựa trên nguồn và trích dẫn.
- Cho phép và khuyến khích trả lời "không đủ thông tin".
- Dùng đầu ra có cấu trúc (JSON schema) và kiểm tra hợp lệ bằng code.
- Với số liệu, tra cứu hoặc tính toán qua tool/API thay vì để mô hình tự nhớ.
- Kiểm tra sau sinh: đối chiếu câu trả lời với nguồn.
- Thiết kế UX hiển thị nguồn; tác vụ rủi ro cao có người duyệt.
Người phỏng vấn muốn nghe: đo tỷ lệ hallucination bằng bộ đánh giá, không chỉ dựa vào cảm giác.
05Bạn triển khai một mô hình ML lên production và theo dõi nó thế nào?AI / Machine Learning
Gợi ý trả lời
Ôn thêm câu hỏi AI / Machine Learning →Mô hình lên production là một phần mềm cần đóng gói, phiên bản hoá, giám sát và cập nhật như mọi dịch vụ khác.
- Đóng gói: lưu mô hình kèm phiên bản dữ liệu, code, siêu tham số (model registry).
- Phục vụ: API online hoặc chạy batch tuỳ yêu cầu độ trễ; dùng chung code tính đặc trưng giữa train và serve để tránh lệch.
- Triển khai an toàn: shadow hoặc canary, so sánh với mô hình cũ.
- Giám sát: độ trễ, lỗi; data drift (phân phối đầu vào thay đổi); chất lượng dự đoán khi có nhãn thật.
- Cập nhật: train lại định kỳ hoặc khi drift vượt ngưỡng, có rollback.
Hay sai: training-serving skew, xử lý đặc trưng ở hai nơi bằng hai đoạn code khác nhau.
06Debounce và throttle khác nhau thế nào? Mỗi cái dùng trong trường hợp nào?JavaScript & TypeScript
Gợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →Cả hai giới hạn số lần một hàm chạy khi sự kiện bắn liên tục.
- Debounce: chỉ chạy sau khi sự kiện ngừng một khoảng thời gian. Hợp với ô tìm kiếm gợi ý (gõ xong mới gọi API), validate form, resize xong mới tính lại layout.
- Throttle: chạy tối đa một lần mỗi khoảng thời gian. Hợp với scroll, kéo thả, theo dõi vị trí chuột.
function debounce(fn, ms) { let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), ms); }; }Hay sai: tạo hàm debounce mới mỗi lần render (trong React), khiến timer bị reset liên tục và debounce không có tác dụng. Với ô tìm kiếm, nhớ huỷ request cũ (
AbortController) để kết quả cũ không đè kết quả mới.07Process Node trên production tăng RAM liên tục rồi bị kill. Bạn tìm memory leak thế nào?Node.js · Senior
Gợi ý trả lời
Ôn thêm câu hỏi Node.js →Trước hết xác nhận có leak thật: theo dõi heap qua thời gian (
process.memoryUsage(), metrics của APM). Heap tăng rồi giảm sau GC là bình thường; chỉ tăng không giảm mới là leak.Nguyên nhân hay gặp:
- Cache trong bộ nhớ (
Map, object) không giới hạn kích thước hoặc thời hạn. - Event listener đăng ký mỗi request mà không gỡ (thường kèm cảnh báo
MaxListenersExceededWarning). - Closure giữ object lớn; timer không
clearInterval. - Mảng toàn cục lưu dữ liệu request để debug rồi quên xoá.
Cách điều tra:
- Chạy với
--inspect, mở Chrome DevTools, chụp heap snapshot trước và sau khi bắn tải, so sánh object tăng thêm và chuỗi retainers. - Dùng
--heapsnapshot-near-heap-limitđể tự chụp snapshot khi sắp hết bộ nhớ.
Người phỏng vấn muốn nghe: cache thì dùng LRU có giới hạn hoặc Redis, và biết rằng tăng
--max-old-space-sizechỉ làm lỗi đến chậm hơn.- Cache trong bộ nhớ (
08Bạn mở rộng (scale) một API Node.js thế nào? Graceful shutdown là gì và vì sao cần?Node.js · Senior
Gợi ý trả lời
Ôn thêm câu hỏi Node.js →Node một process chỉ dùng tốt một core, nên scale theo chiều ngang:
- Chạy nhiều process (cluster, PM2) hoặc nhiều container sau load balancer, Kubernetes tự tăng giảm số pod.
- App phải stateless: session, cache, rate limit, lock để ở Redis hoặc DB, không để trong bộ nhớ process.
- WebSocket nhiều instance cần adapter qua Redis pub/sub để gửi tin giữa các instance.
- Đặt giới hạn connection pool DB theo tổng số instance.
Graceful shutdown: khi nhận
SIGTERM(deploy, scale down), ngừng nhận request mới, chờ request đang chạy xong, đóng DB và queue, rồi thoát:process.on("SIGTERM", () => { server.close(async () => { await db.close(); process.exit(0); }); });Hay sai: không xử lý
SIGTERM, mỗi lần deploy lại cắt ngang request và job đang làm dở. Nên đặt thêm timeout buộc thoát nếu chờ quá lâu.09Khi xây dựng API bằng Node.js, bạn chú ý những vấn đề bảo mật nào?Node.js · Senior
Gợi ý trả lời
Ôn thêm câu hỏi Node.js →- Validate mọi input ở biên bằng schema (Zod, Joi,
class-validatortrong NestJS); chỉ nhận field cho phép để tránh mass assignment. - Injection: dùng query có tham số hoặc ORM, không nối chuỗi SQL. Với MongoDB, chặn object toán tử như
{ "$gt": "" }lọt vào điều kiện truy vấn. - Xác thực và phân quyền: kiểm tra quyền trên từng tài nguyên (user này có sở hữu đơn hàng này không), không chỉ kiểm tra đã đăng nhập.
- Rate limiting cho login, OTP, API tốn tài nguyên.
- Header bảo mật (Helmet), CORS chỉ mở cho origin cần thiết.
- Secret để trong biến môi trường hoặc secret manager, không commit; không log token, mật khẩu.
- Dependency: chạy
npm audithoặc công cụ quét trong CI, khoá phiên bản bằng lockfile.
Người phỏng vấn muốn nghe: lỗi phân quyền theo đối tượng (IDOR) rất phổ biến, và bạn biết cách phòng nó.
- Validate mọi input ở biên bằng schema (Zod, Joi,
10Bạn làm việc thế nào khi áp lực cao hoặc deadline gấp?Câu hỏi hành vi & văn hoá
Gợi ý trả lời
Ôn thêm câu hỏi Câu hỏi hành vi & văn hoá →Cho thấy bạn có cách làm cụ thể, không chỉ nói "em chịu được áp lực".
- Chia nhỏ việc, ưu tiên phần quan trọng nhất cho mục tiêu.
- Báo sớm cho lead/PM nếu thấy không kịp, đề xuất cắt phạm vi hoặc xin hỗ trợ.
- Giữ chất lượng ở phần cốt lõi; ghi lại nợ kỹ thuật để xử lý sau.
- Giữ bình tĩnh, giao tiếp ngắn gọn, rõ ràng với team.
Câu mẫu theo STAR: "Trước buổi demo cho khách, team phát hiện lỗi tích hợp chỉ còn hai ngày. Em liệt kê các phần bị ảnh hưởng, cùng PM chọn luồng nào bắt buộc phải chạy cho demo, phần còn lại hẹn bàn giao tuần sau. Demo diễn ra suôn sẻ và khách đồng ý với lịch mới."
Hay sai: khoe thức trắng nhiều đêm. Người phỏng vấn muốn thấy bạn quản lý được áp lực, không chỉ chịu đựng.
Bạn đã phỏng vấn ở Javac Technology Software Company, Ltd?
Kể lại các vòng và câu hỏi đã gặp (ẩn danh) để người sau ôn đúng trọng tâm.
Chia sẻ kinh nghiệm phỏng vấn