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 (JavaScript & TypeScript, Project Manager & Product Owner). 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.
01
==và===khác nhau thế nào? Những giá trị nào là falsy?JavaScript & TypeScript · JuniorGợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →===so sánh cả kiểu lẫn giá trị.==ép kiểu trước khi so, nên cho ra kết quả khó đoán:"0" == 0làtrue,[] == falsecũngtrue.- Các giá trị falsy:
false,0,-0,0n,"",null,undefined,NaN. Mọi thứ khác là truthy, kể cả[],{}và"0". NaN === NaNlàfalse; dùngNumber.isNaN(x).- Ngoại lệ hay được chấp nhận:
x == nullđể bắt cảnulllẫnundefined.
Hay sai: viết
const page = input || 1. Khi người dùng nhập0, giá trị bị thay bằng1. Dùng nullish coalescinginput ?? 1để chỉ thay khi lànullhoặcundefined.- Các giá trị falsy:
02Closure là gì? Giải thích kết quả của vòng lặp
for (var i...)vớisetTimeout.JavaScript & TypeScript · JuniorGợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →Closure là khi một hàm "nhớ" được các biến ở phạm vi nơi nó được tạo ra, kể cả sau khi hàm bên ngoài đã chạy xong.
for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 0); } // In ra 3, 3, 3varchỉ có một biếnicho cả vòng lặp. Khi callback chạy, vòng lặp đã xong vàibằng 3.- Đổi sang
letthì mỗi vòng lặp có mộtiriêng, in ra 0, 1, 2.
Ứng dụng thực tế: tạo biến private, hàm factory, debounce, memoize, và các hook trong React.
Hay sai: closure giữ tham chiếu đến biến chứ không chụp lại giá trị. Closure giữ object lớn quá lâu (ví dụ trong listener không gỡ) cũng là nguồn rò rỉ bộ nhớ.
03
thistrong JavaScript được xác định thế nào? Arrow function khác function thường ở điểm nào?JavaScript & TypeScript · JuniorGợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →Với function thường,
thisphụ thuộc vào cách gọi, không phải nơi định nghĩa:obj.method():thislàobj.- Gọi hàm trơn
fn():undefinedtrong strict mode (module và class luôn là strict). new Fn(): object mới được tạo.fn.call(x),fn.apply(x),fn.bind(x):thislàx.
Arrow function không có
thisriêng; nó lấythiscủa phạm vi bao ngoài. Arrow function cũng không cóargumentsvà không dùng được vớinew.const btn = { label: "OK", click() { setTimeout(() => console.log(this.label)); } };Hay sai: truyền
obj.methodlàm callback (setTimeout(obj.method)) rồi mấtthis. Cách sửa:bind, hoặc bọc trong arrow function.04Bạn estimate công việc cho team như thế nào? Story point khác ước lượng theo giờ ra sao?Project Manager & Product Owner · Junior
Gợi ý trả lời
Ôn thêm câu hỏi Project Manager & Product Owner →Estimate là việc của cả team, không phải PM tự đặt rồi giao xuống.
- Story point: đo độ lớn tương đối (khối lượng, độ phức tạp, rủi ro), so với một story mẫu. Hay dùng planning poker với dãy gần Fibonacci để cả team thảo luận chỗ hiểu khác nhau.
- Giờ/ngày công: cần khi báo giá dự án outsourcing, hợp đồng fixed-price hoặc lập kế hoạch nguồn lực.
- Với dự án lớn: chia nhỏ (WBS), estimate theo khoảng (lạc quan, khả dĩ, bi quan), cộng buffer cho rủi ro, tích hợp, test, sửa bug.
- Dùng dữ liệu cũ (velocity, dự án tương tự) để kiểm tra lại.
Hay sai: đổi story point ra giờ một cách cứng nhắc, hoặc dùng velocity để so sánh hiệu suất giữa các team.
05Bạn dùng Jira (hoặc công cụ tương tự) để theo dõi tiến độ dự án như thế nào?Project Manager & Product Owner · Junior
Gợi ý trả lời
Ôn thêm câu hỏi Project Manager & Product Owner →Công cụ chỉ hữu ích khi team cập nhật thật và bạn nhìn đúng chỉ số.
- Cấu trúc: Epic cho tính năng lớn, Story/Task cho việc trong sprint, Bug riêng; có quy ước đặt tên và trạng thái thống nhất.
- Board phản ánh đúng workflow của team (To Do, In Progress, Code Review, Testing, Done).
- Theo dõi: burndown/burnup của sprint, việc bị kẹt lâu ở một cột, số bug mở theo mức độ.
- Dashboard hoặc báo cáo định kỳ cho khách hàng/sếp: tiến độ theo milestone, rủi ro, quyết định cần họ đưa ra.
- Kết hợp Confluence hoặc wiki cho tài liệu, biên bản họp.
Người phỏng vấn muốn nghe: bạn dùng dữ liệu để phát hiện vấn đề sớm (ví dụ ticket nằm ở cột Testing quá lâu là dấu hiệu thiếu tester), không chỉ để báo cáo.
06Event loop của JavaScript hoạt động thế nào? Đoạn code sau in ra theo thứ tự nào?JavaScript & TypeScript
Gợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →JavaScript chạy trên một thread. Code đồng bộ chạy hết trên call stack trước, sau đó event loop lấy việc từ hàng đợi. Microtask (Promise
.then,await,queueMicrotask) luôn được chạy hết trước khi sang macrotask tiếp theo (setTimeout, sự kiện I/O, sự kiện người dùng).console.log(1); setTimeout(() => console.log(2)); Promise.resolve().then(() => console.log(3)); console.log(4); // 1, 4, 3, 2- Trên trình duyệt, việc render thường diễn ra giữa các macrotask.
- Một vòng lặp đồng bộ dài, hoặc chuỗi microtask không dứt, sẽ làm treo giao diện.
Người phỏng vấn muốn nghe:
setTimeout(fn, 0)không chạy ngay mà chỉ được xếp hàng, và vì sao microtask được ưu tiên.07So sánh
Promise.all,Promise.allSettled,Promise.racevàPromise.any. Xử lý lỗi với async/await thế nào?JavaScript & TypeScriptGợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →Cả bốn đều chạy nhiều Promise song song, khác nhau ở cách kết thúc:
all: chờ tất cả thành công; một cái lỗi là reject ngay.allSettled: chờ tất cả xong, trả về trạng thái từng cái; không bao giờ reject.race: lấy kết quả (thành công hay lỗi) của cái xong đầu tiên; hay dùng để đặt timeout.any: lấy cái thành công đầu tiên; chỉ reject khi tất cả đều lỗi.
try { const [user, orders] = await Promise.all([getUser(id), getOrders(id)]); } catch (err) { showError(err); }Hay sai:
awaitlần lượt trong vòng lặp các request không phụ thuộc nhau, khiến tổng thời gian cộng dồn. Ngược lại, gọiPromise.allvới hàng nghìn request cùng lúc có thể làm quá tải server; khi đó cần giới hạn số request đồng thời.08Trong TypeScript,
interfacevàtypekhác nhau thế nào? Phân biệtany,unknownvànever.JavaScript & TypeScriptGợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →Cả hai đều mô tả hình dạng object và phần lớn trường hợp dùng thay nhau được.
interfacecó thể gộp khai báo (declaration merging) vàextends; hợp để mô tả object, API công khai.typemô tả được union, tuple, kiểu ánh xạ, kiểu điều kiện:type Status = "idle" | "loading".
Ba kiểu đặc biệt:
any: tắt kiểm tra kiểu, lỗi lọt qua compiler.unknown: nhận mọi giá trị nhưng bắt buộc thu hẹp kiểu trước khi dùng. Hợp cho dữ liệu từJSON.parse, API,catch (e).never: giá trị không bao giờ xảy ra; dùng để bắt thiếu case trongswitch.
function assertNever(x: never): never { throw new Error("Unhandled: " + x); }Hay sai: dùng
as SomeTypeđể ép dữ liệu từ API. Đó chỉ là lời hứa với compiler; muốn chắc chắn phải validate lúc runtime (ví dụ bằng Zod).09Giữa sprint, bạn thấy team khó hoàn thành sprint goal. Bạn làm gì?Project Manager & Product Owner
Gợi ý trả lời
Ôn thêm câu hỏi Project Manager & Product Owner →Phát hiện sớm, nói thật sớm, và chọn phương án cùng team và PO.
- Tìm nguyên nhân: estimate sai, phát sinh việc ngoài kế hoạch, bị block bởi bên khác, có người nghỉ.
- Gỡ block trước: liên hệ team khác, khách hàng, xin môi trường, quyết định nhanh các điểm chờ.
- Cùng PO thương lượng phạm vi: giữ những gì quan trọng nhất cho sprint goal, đẩy phần còn lại sang sprint sau.
- Thông báo cho stakeholder kèm kế hoạch mới, không đợi tới ngày review.
- Retrospective: tìm nguyên nhân gốc để điều chỉnh planning lần sau.
Hay sai: bắt team OT để kịp mà không đổi gì về phạm vi. Làm một lần có thể được, nhưng lặp lại thì chất lượng giảm và người giỏi sẽ nghỉ.
10Bạn thấy mình ở đâu sau 2–3 năm nữa?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á →Người phỏng vấn muốn biết mục tiêu của bạn có khớp với hướng phát triển ở công ty và bạn có định gắn bó không.
- Nêu hướng phát triển cụ thể, thực tế: đi sâu chuyên môn (senior, chuyên gia một mảng) hay quản lý (lead, PM).
- Kèm kế hoạch: kỹ năng cần học, trách nhiệm muốn nhận thêm.
- Gắn với cơ hội ở vị trí đang ứng tuyển.
Câu mẫu: "Trong 2–3 năm tới em muốn trở thành senior có thể tự thiết kế và chịu trách nhiệm một module lớn, đồng thời hướng dẫn được các bạn mới. Em đang học thêm về thiết kế hệ thống và thấy team bên mình có nhiều bài toán ở quy mô lớn, rất hợp để em phát triển theo hướng đó."
Hay sai: "Em muốn mở công ty riêng" hoặc "em chưa nghĩ tới". Cũng đừng nói muốn ngồi vào chỗ của người đang phỏng vấn.
Bạn đã phỏng vấn ở Saigon Technology?
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