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 (Python, ReactJS, SQL & Database). 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.
01Một API viết bằng Python (Django hoặc FastAPI) phản hồi chậm. Bạn tối ưu theo thứ tự nào?Python · Senior
Gợi ý trả lời
Ôn thêm câu hỏi Python →Đo trước, tối ưu chỗ tốn nhất trước. Phần lớn trường hợp nút thắt là DB và gọi mạng, không phải tốc độ của Python.
- Đo: APM hoặc tracing (OpenTelemetry) để biết thời gian nằm ở DB, API ngoài hay code. Profile bằng
py-spy(gắn vào process đang chạy) hoặccProfile. - DB: xử lý N+1, thêm index phù hợp, chỉ lấy cột cần (
only,values), phân trang. - Cache: Redis cho dữ liệu đọc nhiều, ít đổi; nhớ chiến lược invalidate.
- Việc nặng hoặc không cần trả ngay (gửi email, xuất file): đẩy sang Celery hoặc queue.
- Gọi nhiều API ngoài: chạy song song, đặt timeout.
- Cuối cùng mới tới tối ưu thuật toán, hoặc đưa đoạn nặng CPU sang thư viện C hay service khác.
Hay sai: viết lại sang async hoặc đổi ngôn ngữ trước khi biết thời gian thực sự bị tiêu ở đâu.
- Đo: APM hoặc tracing (OpenTelemetry) để biết thời gian nằm ở DB, API ngoài hay code. Profile bằng
02Bạn tổ chức một codebase Python lớn nhiều người cùng làm như thế nào: type hints, quản lý dependency, chất lượng code?Python · Senior
Gợi ý trả lời
Ôn thêm câu hỏi Python →Python linh hoạt nên dự án lớn dễ rối; cần công cụ để bắt lỗi trước khi chạy.
- Type hints + type checker (
mypyhoặcpyright) chạy trong CI. DùngProtocolcho interface,TypedDicthoặc dataclass thay cho dict tự do. - Validate dữ liệu ở biên (request, config, message) bằng Pydantic; bên trong tin vào kiểu đã kiểm.
- Dependency: môi trường ảo riêng, file lock để build tái lập được (
uv, Poetry hoặc pip-tools). Tách dependency dev và production. - Lint/format tự động:
ruffthay cho nhiều công cụ cũ; chạy qua pre-commit và CI. - Cấu trúc: chia theo domain, tách logic nghiệp vụ khỏi framework để test không cần DB hay HTTP.
- Test bằng
pytestvới fixture; test tích hợp cho các luồng chính.
Người phỏng vấn muốn nghe: bạn hiểu type hints không kiểm tra lúc runtime, nên vẫn cần validate dữ liệu đầu vào.
- Type hints + type checker (
03Decorator hoạt động thế nào? Hãy viết một decorator đo thời gian chạy của hàm.Python
Gợi ý trả lời
Ôn thêm câu hỏi Python →Decorator là hàm nhận một hàm và trả về hàm mới bọc quanh nó.
@timerchỉ là cú pháp ngắn củafunc = timer(func).import functools, time def timer(func): @functools.wraps(func) def wrapper(*args, **kwargs): start = time.perf_counter() try: return func(*args, **kwargs) finally: print(func.__name__, time.perf_counter() - start) return wrapperfunctools.wrapsgiữ lại__name__, docstring của hàm gốc, quan trọng cho log và debug.- Decorator có tham số (ví dụ
@retry(times=3)) cần thêm một lớp hàm bên ngoài. - Ví dụ thực tế:
@app.getcủa FastAPI,@login_requiredcủa Django,@functools.lru_cache.
Hay sai: decorator viết kiểu đồng bộ bọc hàm
async def. Kết quả là đo thời gian tạo coroutine chứ không phải thời gian chạy.04React 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
05Khi 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.06Composite index (index nhiều cột) hoạt động ra sao? Thứ tự cột có quan trọng không?SQL & Database
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Có. Composite index sắp xếp theo cột đầu, rồi đến cột thứ hai trong cùng giá trị cột đầu, v.v. Vì vậy nó chỉ dùng hiệu quả khi query dùng các cột từ trái sang (leftmost prefix).
Với
INDEX (status, created_at):WHERE status = 'paid' AND created_at > ...: dùng tốt.WHERE status = 'paid' ORDER BY created_at DESC: dùng cho cả lọc lẫn sắp xếp.WHERE created_at > ...(không có status): thường không dùng được.
Nguyên tắc chọn thứ tự: cột so sánh bằng (
=) đặt trước, cột so sánh khoảng hoặc sắp xếp đặt sau. Nếu index chứa đủ mọi cột query cần (covering index) thì DB không phải đọc lại bảng.Hay sai: tạo riêng index cho từng cột rồi nghĩ rằng chúng sẽ kết hợp hiệu quả như một composite index.
07GIL là gì? Vậy khi nào dùng threading, multiprocessing hay asyncio?Python
Gợi ý trả lời
Ôn thêm câu hỏi Python →GIL (Global Interpreter Lock) trong CPython chỉ cho một thread chạy bytecode Python tại một thời điểm. Vì vậy threading không tăng tốc tác vụ nặng CPU, nhưng vẫn hữu ích cho I/O vì GIL được nhả ra khi chờ mạng, đĩa.
- I/O, số lượng vừa phải, thư viện blocking:
threadinghoặcThreadPoolExecutor. - I/O rất nhiều kết nối đồng thời:
asynciovới thư viện async (httpx,asyncpg). - Nặng CPU:
multiprocessinghoặcProcessPoolExecutor, hoặc dùng thư viện viết bằng C như NumPy (nhả GIL khi tính toán).
Từ Python 3.13 có bản build free-threaded (không GIL) tuỳ chọn, nhưng chưa phải mặc định và còn phụ thuộc thư viện hỗ trợ.
Người phỏng vấn muốn nghe: bạn phân biệt được bài toán I/O-bound và CPU-bound trước khi chọn công cụ.
- I/O, số lượng vừa phải, thư viện blocking:
08Trong Django ORM, lỗi N+1 query là gì? Phân biệt
select_relatedvàprefetch_related.PythonGợi ý trả lời
Ôn thêm câu hỏi Python →N+1 là khi lấy danh sách bằng 1 query, rồi mỗi phần tử truy cập quan hệ lại sinh thêm 1 query. Ví dụ duyệt 50 bài viết và in
post.author.namesẽ thành 51 query.select_related: dùng SQLJOIN, cho quan hệ trỏ tới một object (ForeignKey,OneToOne).prefetch_related: chạy query riêng rồi ghép trong Python, cho quan hệ nhiều (ManyToMany, reverseForeignKey).
posts = (Post.objects .select_related("author") .prefetch_related("tags"))Phát hiện bằng Django Debug Toolbar, hoặc
assertNumQueriestrong test.Hay sai: gọi
.filter()trên quan hệ đã prefetch bên trong vòng lặp. Lệnh đó tạo query mới và bỏ qua dữ liệu prefetch; dùngPrefetch(..., queryset=...)để lọc ngay từ đầu.09Context manager (
with) là gì? Làm sao tự viết một context manager?PythonGợi ý trả lời
Ôn thêm câu hỏi Python →Context manager đảm bảo việc "mở" và "dọn dẹp" luôn đi cùng nhau, kể cả khi có exception: đóng file, trả connection, nhả lock, rollback transaction.
Cách nhanh nhất là dùng
contextlib.contextmanager:from contextlib import contextmanager @contextmanager def db_transaction(conn): try: yield conn conn.commit() except Exception: conn.rollback() raise- Cách đầy đủ: viết class có
__enter__và__exit__(self, exc_type, exc, tb). Nếu__exit__trả vềTruethì exception bị nuốt. - Bản async:
async with,__aenter__/__aexit__hoặcasynccontextmanager.
Hay sai: quên
raiselại exception trong khốiexcept, khiến lỗi bị che mất và code phía sau tưởng mọi thứ đã thành công.- Cách đầy đủ: viết class có
10Bạn nghĩ sao về việc làm thêm giờ (OT)?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ẳng thắn và cân bằng: sẵn sàng khi thật sự cần, nhưng không coi OT kéo dài là bình thường.
Câu mẫu: "Em sẵn sàng làm thêm khi có việc gấp như sự cố production hay trước một đợt release quan trọng. Nhưng nếu OT diễn ra thường xuyên, em nghĩ cần xem lại cách estimate hoặc phạm vi, và em sẽ chủ động nêu điều đó với team. Em cũng muốn hỏi thêm: ở team mình OT thường xảy ra trong trường hợp nào và được tính như thế nào ạ?"
Đây cũng là lúc bạn tìm hiểu ngược: OT có được trả lương hoặc nghỉ bù theo quy định không, tần suất ra sao. Câu trả lời của họ cho bạn biết nhiều về văn hoá công ty.
Hay sai: hứa "OT thoải mái" để lấy điểm, rồi vào làm mới thấy không chịu nổi.
Bạn đã phỏng vấn ở VinSmart Future?
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