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, SQL & Database, 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.
01Trong 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.02Context 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ó
03Giải thích event loop của asyncio. Trong FastAPI, khi nào viết
async defvà khi nào viếtdef?Python · SeniorGợi ý trả lời
Ôn thêm câu hỏi Python →asyncio chạy nhiều coroutine trên một thread. Khi coroutine gặp
awaitmột thao tác I/O, nó nhường quyền cho event loop chạy coroutine khác. Đây là đa nhiệm hợp tác: coroutine nào khôngawaitthì chiếm luôn cả loop.Trong FastAPI:
async defkhi mọi thứ bên trong đều async (httpx.AsyncClient, driver DB async).defkhi dùng thư viện blocking (requests, ORM đồng bộ). FastAPI sẽ chạy hàm này trong threadpool, nên không chặn loop.- Gọi song song:
await asyncio.gather(fetch_a(), fetch_b()).
Hay sai: viết
async defrồi gọirequests.get()hoặctime.sleep()bên trong. Cả server đứng hình trong lúc chờ. Nếu buộc phải gọi code blocking, dùngawait asyncio.to_thread(func).Người phỏng vấn muốn nghe: async tăng khả năng xử lý đồng thời cho I/O, không làm code CPU nhanh hơn.
04Chuẩn hoá (normalization) là gì? Khi nào nên denormalize?SQL & Database
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Chuẩn hoá là tách dữ liệu để mỗi thông tin chỉ lưu ở một chỗ, tránh dư thừa và sai lệch khi cập nhật.
- 1NF: mỗi ô một giá trị nguyên tử, không lưu danh sách trong một cột.
- 2NF: cột không khoá phụ thuộc vào toàn bộ khoá chính, không chỉ một phần.
- 3NF: cột không khoá không phụ thuộc bắc cầu qua cột không khoá khác.
Denormalize khi đọc nhiều hơn ghi rất nhiều và JOIN trở thành điểm nghẽn: lưu sẵn
comment_counttrong bảng bài viết, chépcustomer_namevào đơn hàng để giữ đúng tên tại thời điểm đặt, hoặc dựng bảng báo cáo riêng.Hay sai: denormalize mà không có cơ chế đồng bộ (trigger, job, event) nên số liệu lệch dần. Hãy nói rõ cái giá phải trả là logic ghi phức tạp hơn.
05Deadlock trong database xảy ra thế nào và xử lý ra sao?SQL & Database · Senior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Deadlock là khi hai transaction giữ khoá mà bên kia cần và chờ nhau mãi. DB tự phát hiện, chọn một transaction làm nạn nhân và rollback nó.
Ví dụ: T1 khoá dòng A rồi muốn B, cùng lúc T2 khoá B rồi muốn A.
Cách giảm deadlock:
- Luôn khoá tài nguyên theo cùng một thứ tự (vd. sắp xếp theo
idtrước khi update nhiều dòng). - Giữ transaction ngắn, không chờ I/O bên ngoài khi đang giữ khoá.
- Có index phù hợp để câu
UPDATE/DELETEkhông khoá quá nhiều dòng. - Ứng dụng bắt lỗi deadlock và retry có giới hạn.
Khi điều tra: MySQL dùng
SHOW ENGINE INNODB STATUS, PostgreSQL xem log (deadlock được ghi kèm câu lệnh) vàpg_locks.Người phỏng vấn muốn nghe: bạn coi retry là bình thường nhưng vẫn tìm gốc rễ ở thứ tự khoá.
- Luôn khoá tài nguyên theo cùng một thứ tự (vd. sắp xếp theo
06Bạn đánh giá chất lượng một ứng dụng LLM (chatbot, RAG) thế nào trước khi ra mắt và mỗi lần thay đổi prompt?AI / Machine Learning · Senior
Gợi ý trả lời
Ôn thêm câu hỏi AI / Machine Learning →Xây một bộ đánh giá (eval set) đại diện cho câu hỏi thật, chạy tự động như test hồi quy mỗi khi đổi prompt, mô hình hay cách truy xuất.
- Dữ liệu: câu hỏi thật đã ẩn danh, trường hợp khó, câu hỏi ngoài phạm vi, câu cố tình phá.
- Đánh giá truy xuất: tài liệu đúng có nằm trong top-k không (recall@k).
- Đánh giá câu trả lời: đúng sự thật, bám nguồn, đầy đủ, đúng định dạng; dùng kiểm tra bằng code khi được, LLM-as-judge có rubric rõ, và người chấm mẫu để hiệu chỉnh.
- Sau ra mắt: thu phản hồi người dùng, log và soi các ca thất bại để bổ sung bộ eval.
Hay sai: chỉ thử vài câu bằng tay rồi kết luận "ổn".
07Python quản lý bộ nhớ thế nào? Một worker Python cứ tăng RAM dần, bạn tìm nguyên nhân ra sao?Python · Senior
Gợi ý trả lời
Ôn thêm câu hỏi Python →CPython dùng reference counting: object bị giải phóng ngay khi số tham chiếu về 0. Bộ thu gom
gcchạy thêm để dọn các vòng tham chiếu (A trỏ B, B trỏ A).Nguyên nhân leak hay gặp:
- Cache toàn cục (dict,
lru_cachekhông giới hạn) chỉ thêm không xoá. - Biến ở module hoặc class tích luỹ dữ liệu qua các request.
- Đọc cả file hay cả queryset lớn vào bộ nhớ thay vì xử lý theo lô.
- Extension C giữ bộ nhớ ngoài tầm GC.
Cách điều tra:
tracemalloc: chụp snapshot hai thời điểm rồi so sánh dòng code cấp phát nhiều nhất.- Theo dõi RSS theo thời gian, thử tái hiện với một loại request.
- Giải pháp tạm: cấu hình worker tự khởi động lại sau N request (Gunicorn
max_requests, Celerymax_tasks_per_child).
Người phỏng vấn muốn nghe: bạn đo trước khi đoán, và biết giải pháp tạm không thay cho việc tìm nguyên nhân.
- Cache toàn cục (dict,
08Mộ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
09Bạ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 (
10Vì sao bạn chọn ứng tuyển vào công ty chúng 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á →Câu này kiểm tra bạn có tìm hiểu không hay chỉ rải CV. Nối ba thứ: công ty, vị trí, và bạn.
- Tìm hiểu trước: sản phẩm, khách hàng, công nghệ, tin tức gần đây, đánh giá của nhân viên cũ và hiện tại.
- Chọn một hai điểm cụ thể bạn thật sự quan tâm: sản phẩm bạn từng dùng, bài toán kỹ thuật, quy mô người dùng, văn hoá làm việc.
- Nối với kinh nghiệm hoặc mục tiêu của bạn.
Câu mẫu: "Em có dùng ứng dụng của bên mình và thấy phần thanh toán rất mượt. Trong JD có nói team đang mở rộng hệ thống xử lý giao dịch, đúng mảng em đã làm hai năm. Em nghĩ mình đóng góp được ngay và cũng học được nhiều ở quy mô lớn hơn."
Hay sai: "Vì công ty lớn, lương tốt" hoặc khen chung chung áp vào công ty nào cũng được.
Bạn đã phỏng vấn ở Công ty TNHH RENDA?
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