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, Mobile (Android, iOS, Flutter), AI / Machine Learning). 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 19 có những gì mới đáng chú ý? Actions,
useActionStatevàuseOptimisticgiải quyết vấn đề gì?ReactJS · SeniorGợi ý trả lời
Ôn thêm câu hỏi ReactJS →React 19 tập trung vào việc xử lý thao tác bất đồng bộ (gửi form, mutation) gọn hơn:
- Actions: truyền hàm async vào
<form action={fn}>hoặc chạy trongstartTransition. React tự theo dõi trạng thái pending, lỗi, và reset form. useActionState: giữ kết quả của action (thông báo lỗi, dữ liệu trả về) và cờisPending.useFormStatus: component con (nút submit) đọc trạng thái pending của form cha mà không cần truyền props.useOptimistic: hiện kết quả ngay (like, thêm comment) trong lúc chờ server, tự quay về nếu lỗi.use(): đọc Promise hoặc Context, gọi được trong điều kiện.refđược truyền như prop thường, ít cầnforwardRef.
Người phỏng vấn muốn nghe: những API này bỏ bớt code tự quản lý
isLoading,errorvà rollback, và kết hợp tự nhiên với Server Actions trong Next.js.- Actions: truyền hàm async vào
02Khi 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.03Custom 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.04Kotlin coroutines: suspend function, scope, dispatcher và structured concurrency là gì?Mobile (Android, iOS, Flutter)
Gợi ý trả lời
Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →Coroutine là tác vụ nhẹ có thể tạm dừng (suspend) mà không chặn thread.
suspend funchỉ gọi được từ coroutine hoặc từ suspend function khác.- Scope quyết định vòng đời:
viewModelScope,lifecycleScopetự huỷ coroutine khi ViewModel hoặc màn hình bị huỷ. - Dispatcher quyết định chạy ở đâu:
Main,IO,Default. - Structured concurrency: coroutine con gắn với cha; cha huỷ thì con huỷ, con lỗi thì lan lên cha (trừ khi dùng
SupervisorJob).
viewModelScope.launch { val user = withContext(Dispatchers.IO) { repo.fetchUser() } _state.value = UiState.Success(user) }Hay sai: dùng
GlobalScopegây rò rỉ; bắtCancellationExceptiontrongcatch (e: Exception)mà không ném lại, làm hỏng cơ chế huỷ.- Scope quyết định vòng đời:
05Swift concurrency: async/await, Task, actor và @MainActor hoạt động thế nào?Mobile (Android, iOS, Flutter)
Gợi ý trả lời
Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →Swift concurrency đưa bất đồng bộ vào ngôn ngữ, cùng với kiểm tra data race lúc biên dịch (chặt hơn từ Swift 6).
async/await: viết code bất đồng bộ tuần tự, thay cho completion handler lồng nhau.Task { }tạo tác vụ mới;async letvàTaskGroupchạy song song có cấu trúc. Task hỗ trợ huỷ hợp tác quaTask.checkCancellation().actor: kiểu tham chiếu mà trạng thái bên trong chỉ được truy cập tuần tự, tránh data race. Gọi từ ngoài phảiawait.@MainActor: đảm bảo code chạy trên main thread, dùng cho ViewModel và UI.Sendable: đánh dấu kiểu an toàn khi chuyển giữa các vùng concurrency.
@MainActor final class ProfileViewModel: ObservableObject { @Published var user: User? func load() async { user = try? await api.fetchUser() } }Hay sai: actor reentrancy: sau mỗi
await, trạng thái của actor có thể đã bị thay đổi.06Khi nào bạn chọn prompt engineering, RAG hay fine-tuning?AI / Machine Learning
Gợi ý trả lời
Ôn thêm câu hỏi AI / Machine Learning →Bắt đầu từ cách rẻ và nhanh nhất, chỉ nâng cấp khi đo được là chưa đủ.
- Prompting: thử đầu tiên; chỉ dẫn rõ, ví dụ mẫu (few-shot), định dạng đầu ra có cấu trúc.
- RAG: khi mô hình thiếu kiến thức (tài liệu nội bộ, dữ liệu thay đổi thường xuyên), cần trích dẫn nguồn.
- Fine-tuning: khi cần đổi hành vi ổn định (văn phong, định dạng, tác vụ hẹp lặp lại), hoặc muốn dùng mô hình nhỏ rẻ hơn thay mô hình lớn. Kỹ thuật như LoRA giảm chi phí.
Fine-tuning không phải cách tốt để nhồi kiến thức mới hay thay đổi liên tục; RAG hợp hơn.
Người phỏng vấn muốn nghe: có bộ đánh giá trước để so sánh các phương án bằng số liệu.
07Bạn chọn cách quản lý state thế nào: Context, Redux Toolkit, Zustand hay TanStack Query?ReactJS
Gợi ý trả lời
Ôn thêm câu hỏi ReactJS →Trước hết phân loại state:
- Server state (dữ liệu từ API): dùng TanStack Query hoặc SWR. Chúng lo cache, loading, refetch, đồng bộ. Phần lớn "global state" trong app thực ra thuộc loại này.
- UI state cục bộ:
useState/useReducerngay trong component. - State trên URL (bộ lọc, trang): để trên query string, chia sẻ link được.
- Client state toàn cục thật sự (giỏ hàng, theme, user đang đăng nhập): Context nếu ít thay đổi; Zustand hoặc Redux Toolkit nếu thay đổi thường xuyên hoặc logic phức tạp.
Redux Toolkit hợp khi team lớn cần quy ước chặt và DevTools mạnh. Zustand gọn nhẹ hơn.
Hay sai: gom state hay thay đổi vào một Context lớn. Mọi component dùng Context đó render lại mỗi lần bất kỳ giá trị nào đổi. Hãy tách Context, hoặc dùng thư viện có selector.
08Stale closure trong React là gì? Vì sao
setIntervaltronguseEffectcứ in ra giá trị cũ?ReactJSGợi ý trả lời
Ôn thêm câu hỏi ReactJS →Mỗi lần render tạo ra hàm mới, "chụp" lại props và state của lần render đó. Nếu effect chỉ chạy một lần, callback bên trong mãi thấy giá trị lúc mount.
useEffect(() => { const id = setInterval(() => { setCount(count + 1); // count luôn là 0 }, 1000); return () => clearInterval(id); }, []);Cách sửa:
- Dùng functional update:
setCount(c => c + 1), không cần đọccount. - Khai báo đúng dependency (effect chạy lại khi giá trị đổi, nhớ cleanup).
- Với giá trị chỉ cần đọc mới nhất mà không muốn chạy lại effect: lưu vào
useRef.
Hay sai: tắt cảnh báo
exhaustive-depscủa ESLint cho xong. Cảnh báo đó thường chính là dấu hiệu stale closure.- Dùng functional update:
09React Server Components là gì? Trong Next.js App Router, khi nào dùng Server Component và khi nào cần
"use client"?ReactJS · SeniorGợi ý trả lời
Ôn thêm câu hỏi ReactJS →Server Component chạy trên server (lúc build hoặc lúc request), có thể
awaitdữ liệu trực tiếp từ DB hoặc API, và không gửi JavaScript của nó xuống trình duyệt. Trong App Router, component mặc định là Server Component.- Dùng Server Component cho: lấy dữ liệu, render nội dung tĩnh, dùng secret hoặc thư viện nặng chỉ cần ở server.
- Cần
"use client"khi dùng state, effect, sự kiện (onClick), API trình duyệt (window,localStorage). "use client"đánh dấu ranh giới: mọi module được import từ file đó đều vào bundle client.- Server Component có thể truyền Server Component khác vào Client Component qua
children. - Props truyền từ server sang client phải serialize được (không truyền hàm thường; Server Action thì được).
Hay sai: đặt
"use client"ở layout gốc, biến cả app thành client và mất lợi ích. Hãy đẩy phần tương tác xuống các component lá.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 ở DatVietVAC Group Holdings?
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