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, Cloud (AWS, Azure, GCP), Java). 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.
01Frontend cần chú ý gì về bảo mật: XSS, CSRF, CORS? Nên lưu access token ở đâu?JavaScript & TypeScript · Senior
Gợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →- XSS: kẻ tấn công chèn script chạy trên trang của bạn. Phòng: framework tự escape khi render; tránh
innerHTML,v-html,dangerouslySetInnerHTMLvới dữ liệu người dùng (nếu bắt buộc thì sanitize); cấu hình Content-Security-Policy. - CSRF: trang lạ khiến trình duyệt gửi request kèm cookie của người dùng. Phòng: cookie
SameSite=LaxhoặcStrict, CSRF token, kiểm traOrigin. - CORS: là cơ chế trình duyệt nới lỏng same-origin policy, do server cấu hình. Nó không phải lớp bảo vệ API khỏi người gọi ngoài trình duyệt.
Lưu token:
localStoragetiện nhưng script XSS nào cũng đọc được.- Cookie
HttpOnly+Secure+SameSitethì JS không đọc được, nhưng phải tính đến CSRF.
Người phỏng vấn muốn nghe: không có chỗ lưu nào an toàn tuyệt đối; chặn XSS mới là việc quan trọng nhất, vì có XSS thì mọi cách lưu đều bị lợi dụng.
- XSS: kẻ tấn công chèn script chạy trên trang của bạn. Phòng: framework tự escape khi render; tránh
02Phân biệt
var,letvàconst. Hoisting và temporal dead zone là gì?JavaScript & TypeScript · JuniorGợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →varcó phạm vi hàm, cònlet/constcó phạm vi block ({}).constkhông cho gán lại biến, nhưng object hay array bên trong vẫn sửa được.- Hoisting: khai báo được "kéo" lên đầu phạm vi.
varđược khởi tạo sẵn làundefined, nên dùng trước khi khai báo không báo lỗi. let/constcũng được hoist nhưng chưa khởi tạo. Truy cập trước dòng khai báo némReferenceError; khoảng đó gọi là temporal dead zone.- Function declaration được hoist cả phần thân, nên gọi được trước khi định nghĩa.
console.log(a); // undefined console.log(b); // ReferenceError var a = 1; let b = 2;Người phỏng vấn muốn nghe: mặc định dùng
const, cần gán lại mới dùnglet, và gần như không dùngvartrong code mới.- Hoisting: khai báo được "kéo" lên đầu phạm vi.
03
==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:
04IaaS, PaaS và SaaS khác nhau thế nào? Cho ví dụ dịch vụ thuộc từng loại.Cloud (AWS, Azure, GCP) · Junior
Gợi ý trả lời
Ôn thêm câu hỏi Cloud (AWS, Azure, GCP) →Khác nhau ở chỗ bạn tự quản lý tới tầng nào: IaaS bạn lo từ hệ điều hành trở lên, PaaS bạn chỉ lo code và dữ liệu, SaaS bạn chỉ dùng phần mềm.
- IaaS: máy ảo EC2, Azure Virtual Machines, Compute Engine.
- PaaS: Elastic Beanstalk, Azure App Service, Cloud Run, các DB quản lý sẵn như RDS, Cloud SQL.
- SaaS: email, bộ văn phòng, CRM dùng qua trình duyệt.
Người phỏng vấn muốn nghe: mô hình trách nhiệm chung (shared responsibility). Nhà cung cấp lo hạ tầng vật lý; cấu hình bảo mật, quyền truy cập và dữ liệu vẫn là việc của bạn ở mọi mô hình.
05Region và Availability Zone là gì? Thiết kế thế nào để ứng dụng không chết khi một AZ gặp sự cố?Cloud (AWS, Azure, GCP) · Junior
Gợi ý trả lời
Ôn thêm câu hỏi Cloud (AWS, Azure, GCP) →Region là một vùng địa lý; mỗi region có nhiều Availability Zone, là các trung tâm dữ liệu tách biệt về điện, mạng, làm mát nhưng nối với nhau độ trễ thấp.
Để chịu được mất một AZ:
- Chạy ứng dụng ở ít nhất 2 AZ, đứng sau load balancer.
- Dùng Auto Scaling group/managed instance group trải trên nhiều AZ.
- Database bật chế độ Multi-AZ (bản standby ở AZ khác, failover tự động).
- Ứng dụng stateless, session để ở Redis hoặc DB.
Hay sai: đặt NAT Gateway hoặc một thành phần duy nhất ở một AZ, tạo điểm lỗi đơn mà không để ý.
06Vì sao
Stringlà immutable? Khi nào dùngStringBuilderthay choString?Java · JuniorGợi ý trả lời
Ôn thêm câu hỏi Java →Stringbất biến: mọi thao tác "sửa" đều tạo object mới. Nhờ vậy nó an toàn khi chia sẻ giữa nhiều thread, dùng làm key choHashMapđược (hash không đổi) và JVM có thể dùng chung qua string pool.- Nối chuỗi trong vòng lặp bằng
+tạo nhiều object trung gian, nên dùngStringBuilder:
var sb = new StringBuilder(); for (String s : items) sb.append(s).append(','); String result = sb.toString();StringBuffergiốngStringBuildernhưng các method cósynchronized, chậm hơn và hiếm khi cần.- Nối vài chuỗi trên một dòng thì cứ dùng
+, compiler đã tối ưu sẵn.
Người phỏng vấn muốn nghe: bạn hiểu lý do thiết kế (an toàn, hash, pool), không chỉ thuộc định nghĩa.
- Nối chuỗi trong vòng lặp bằng
07Closure 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ớ.
08
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.09Event 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.10Vì sao bạn muốn rời công ty hiện tại?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á →Trả lời thật nhưng hướng về phía trước: nói điều bạn đang tìm kiếm, không kể xấu nơi cũ.
Lý do chấp nhận được: muốn thử thách mới, muốn làm sản phẩm, dự án kết thúc, công ty tái cấu trúc, thu nhập chưa tương xứng (nói khéo).
Câu mẫu: "Em đã làm 2 năm ở dự án outsourcing, học được nhiều về quy trình và làm việc với khách nước ngoài. Giờ em muốn gắn bó lâu dài với một sản phẩm để thấy được tác động của những gì mình làm, và vị trí bên mình đúng hướng đó."
Hay sai: chê sếp, chê đồng nghiệp, kể chuyện drama. Người phỏng vấn sẽ nghĩ bạn cũng sẽ nói về công ty họ như vậy. Nếu nhảy việc nhiều, chuẩn bị lời giải thích cho từng lần.
Bạn đã phỏng vấn ở Vietlink?
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