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 (ReactJS, SQL & Database, Golang). 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.
01React render và cập nhật DOM thế nào? Vì sao list cần
keyvà không nên dùng index làm key?ReactJS · JuniorGợi ý trả lời
Ôn thêm câu hỏi ReactJS →Mỗi lần state hoặc props đổi, React gọi lại component để tạo cây element mới, so sánh với cây cũ (reconciliation), rồi chỉ cập nhật phần DOM thật sự thay đổi.
- Với list,
keycho React biết phần tử nào là phần tử nào giữa hai lần render. Key phải ổn định và duy nhất trong list, thường làidtừ dữ liệu. - Dùng index làm key chỉ ổn khi list không bao giờ chèn, xoá hay đổi thứ tự.
Hay sai: dùng index cho list có thể xoá hoặc sắp xếp. React ghép nhầm state của item cũ sang item mới: ô input giữ nội dung của dòng đã bị xoá, checkbox tick sai dòng.
Mẹo hay được hỏi thêm: đổi
keycủa một component là cách chủ động reset toàn bộ state của nó.- Với list,
02Props và state khác nhau thế nào? Vì sao không được sửa trực tiếp state?ReactJS · Junior
Gợi ý trả lời
Ôn thêm câu hỏi ReactJS →Props là dữ liệu cha truyền xuống, component con chỉ đọc. State là dữ liệu component tự quản lý; đổi state sẽ khiến component render lại.
- React so sánh state cũ và mới bằng tham chiếu (
Object.is). Sửa trực tiếpstate.items.push(x)thì tham chiếu không đổi, React có thể không render lại, và các tối ưu nhưmemocũng hỏng. - Luôn tạo object hoặc array mới:
setItems(prev => [...prev, newItem]); setUser(prev => ({ ...prev, name: "An" }));setStatekhông cập nhật biến ngay trong lần render hiện tại. React gom nhiều lần set lại (batching) rồi mới render.
Hay sai: gọi
setCount(count + 1)ba lần liên tiếp và mong tăng 3. Kết quả chỉ tăng 1; muốn tăng 3 phải dùng dạng hàmsetCount(c => c + 1).- React so sánh state cũ và mới bằng tham chiếu (
03
useEffectdùng để làm gì? Dependency array và hàm cleanup hoạt động ra sao?ReactJS · JuniorGợi ý trả lời
Ôn thêm câu hỏi ReactJS →useEffectdùng để đồng bộ component với hệ thống bên ngoài: subscribe sự kiện, kết nối WebSocket, gọi thư viện không phải React, gọi API.- Không có dependency array: chạy sau mỗi lần render.
[]: chạy sau lần mount đầu tiên.[a, b]: chạy lại khiahoặcbđổi.- Hàm return là cleanup, chạy trước lần effect kế tiếp và khi unmount.
useEffect(() => { const id = setInterval(tick, 1000); return () => clearInterval(id); }, []);Ở development, Strict Mode cố ý chạy effect hai lần để bạn phát hiện thiếu cleanup.
Hay sai: dùng effect để tính dữ liệu dẫn xuất từ state/props (
setFullName(first + last)). Hãy tính thẳng trong lúc render; effect thừa gây render hai lần và dễ lệch dữ liệu.04WHERE và HAVING khác nhau thế nào? Thứ tự thực thi logic của một câu SELECT ra sao?SQL & Database · Junior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →WHERElọc từng dòng trước khi gom nhóm;HAVINGlọc sauGROUP BY, nên dùng được hàm tổng hợp nhưCOUNT,SUM.Thứ tự logic:
FROM/JOIN→WHERE→GROUP BY→HAVING→SELECT→DISTINCT→ORDER BY→LIMIT/OFFSET.SELECT department_id, AVG(salary) AS avg_salary FROM employees WHERE status = 'active' GROUP BY department_id HAVING AVG(salary) > 20000000;- Vì
SELECTchạy sauWHERE, bạn không dùng được alias của SELECT trong WHERE (đa số DB). - Điều kiện không cần hàm tổng hợp thì nên để ở WHERE để giảm số dòng phải gom nhóm.
Người phỏng vấn muốn nghe: bạn hiểu thứ tự logic, từ đó giải thích được vì sao alias hoặc aggregate dùng sai chỗ bị lỗi.
- Vì
05Index là gì, hoạt động thế nào? Có nên đánh index cho mọi cột không?SQL & Database · Junior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Index là cấu trúc dữ liệu phụ (thường là B-Tree) giúp tìm dòng theo giá trị cột mà không phải quét cả bảng, đổi lại tốn dung lượng và làm chậm thao tác ghi.
- B-Tree hợp với so sánh
=,<,>,BETWEEN,ORDER BY,LIKE 'abc%'. - Mỗi
INSERT/UPDATE/DELETEphải cập nhật thêm mọi index liên quan. - Cột có độ chọn lọc thấp (vd.
gender,is_deleted) đánh index riêng thường ít tác dụng.
Không nên đánh index tràn lan: chỉ thêm cho cột hay xuất hiện trong
WHERE,JOIN,ORDER BYcủa các query quan trọng, rồi kiểm tra bằngEXPLAIN.Hay sai: bọc cột trong hàm, vd.
WHERE YEAR(created_at) = 2026hoặcLOWER(email) = ..., khiến index thường trên cột đó không được dùng. Hãy viết lại thành khoảng thời gian hoặc dùng index trên biểu thức.- B-Tree hợp với so sánh
06Go xử lý lỗi như thế nào? Khi nào dùng
panic?errors.Isvàerrors.Asđể làm gì?Golang · JuniorGợi ý trả lời
Ôn thêm câu hỏi Golang →Lỗi trong Go là giá trị kiểu
error, được trả về như kết quả thông thường và phải kiểm tra tường minh.panicchỉ dành cho tình huống không thể tiếp tục hoặc lỗi lập trình (ví dụ cấu hình bắt buộc bị thiếu lúc khởi động), không dùng cho lỗi nghiệp vụ.Bọc lỗi để giữ ngữ cảnh mà không mất lỗi gốc:
if err != nil { return fmt.Errorf("load user %d: %w", id, err) } // Ở tầng trên: if errors.Is(err, sql.ErrNoRows) { /* trả 404 */ }errors.Is: so với một lỗi cụ thể trong chuỗi bọc.errors.As: lấy ra lỗi thuộc một kiểu cụ thể để đọc field của nó.recovertrongdeferdùng ở biên (middleware HTTP) để một request panic không làm sập cả server.
Hay sai: dùng
%vthay%wkhi bọc, làmerrors.Iskhông tìm thấy lỗi gốc.07Controlled component và uncontrolled component khác nhau thế nào? Khi nào dùng loại nào?ReactJS · Junior
Gợi ý trả lời
Ôn thêm câu hỏi ReactJS →Controlled: giá trị input nằm trong state React, mọi thay đổi đi qua
onChange. Uncontrolled: DOM tự giữ giá trị, bạn đọc khi cần quarefhoặc khi form submit.<input value={name} onChange={e => setName(e.target.value)} /> <input defaultValue="An" name="name" />- Controlled hợp khi cần validate ngay khi gõ, định dạng giá trị, hoặc ô này phụ thuộc ô kia.
- Uncontrolled đơn giản hơn, ít render hơn; hợp với form lớn hoặc khi dùng thư viện như React Hook Form. React 19 còn hỗ trợ truyền hàm vào
<form action>và đọc dữ liệu bằngFormData.
Hay sai: chuyển một input từ
value={undefined}sang có giá trị, khiến React cảnh báo đổi từ uncontrolled sang controlled. Khởi tạo state bằng""thay vìundefined.08Khi nào nên dùng
useMemo,useCallbackvàReact.memo? Dùng tràn lan có sao không?ReactJSGợi ý trả lời
Ôn thêm câu hỏi ReactJS →Cả ba dùng để tránh tính toán hoặc render lại không cần thiết:
useMemo: nhớ kết quả của phép tính tốn kém.useCallback: nhớ hàm, để tham chiếu không đổi giữa các lần render.React.memo: bỏ qua render component con nếu props không đổi (so sánh nông).
Chúng thường phải đi cùng nhau: truyền hàm mới mỗi lần render vào component đã
memothìmemovô tác dụng.Dùng tràn lan làm code khó đọc, tốn công so sánh dependency, và dễ sai khi thiếu dependency. Chỉ nên dùng khi đã đo bằng React DevTools Profiler và thấy chậm, hoặc khi giá trị đó là dependency của effect.
React Compiler có thể tự thêm memo khi build, giảm nhu cầu viết tay.
Người phỏng vấn muốn nghe: trước khi memo, hãy thử đưa state xuống thấp hơn hoặc truyền component qua
childrenđể giảm phạm vi render lại.09Custom hook là gì? Các quy tắc của hooks là gì và vì sao có chúng?ReactJS
Gợi ý trả lời
Ôn thêm câu hỏi ReactJS →Custom hook là hàm bắt đầu bằng
use, dùng các hook khác bên trong, để tái sử dụng logic có state giữa nhiều component (không chia sẻ state, mỗi component có bản riêng).function useDebounce(value, ms) { const [debounced, setDebounced] = useState(value); useEffect(() => { const id = setTimeout(() => setDebounced(value), ms); return () => clearTimeout(id); }, [value, ms]); return debounced; }Quy tắc: chỉ gọi hook ở cấp cao nhất của component hoặc custom hook; không gọi trong
if, vòng lặp hay saureturnsớm. Lý do: React nhận diện từng hook theo thứ tự gọi, đổi thứ tự là state bị ghép nhầm.Ngoại lệ: hook
use()của React 19 được gọi trong điều kiện.Người phỏng vấn muốn nghe: bạn bật ESLint plugin
react-hooksđể bắt các lỗi này tự động.10Kể về một thất bại hoặc sai lầm của bạn và bài học rút ra.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á →Chọn sai lầm thật, có hậu quả vừa phải, nhận trách nhiệm rõ ràng, và nhấn mạnh việc bạn đã thay đổi sau đó.
Cấu trúc: chuyện gì xảy ra, phần lỗi của bạn, bạn khắc phục ngay thế nào, bài học và thay đổi lâu dài.
Câu mẫu: "Có lần em deploy một thay đổi cấu hình lên production vào chiều thứ Sáu mà không kiểm tra kỹ trên staging, làm một tính năng lỗi khoảng một giờ. Em báo ngay cho lead, rollback và viết báo cáo sự cố. Sau đó em đề xuất checklist trước deploy và quy ước hạn chế deploy cuối tuần; team áp dụng tới giờ."
Hay sai: kể một "thất bại" thực ra là khoe, đổ lỗi cho người khác, hoặc nói mình chưa từng thất bại.
Bạn đã phỏng vấn ở Buymed?
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