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, Golang, C/C++ & Embedded). 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.
04
deferhoạt động thế nào? Vòng lặpforkết hợp goroutine và closure có thay đổi gì từ Go 1.22?GolangGợi ý trả lời
Ôn thêm câu hỏi Golang →deferhoãn lời gọi hàm đến khi hàm bao ngoài kết thúc (kể cả khi panic), chạy theo thứ tự LIFO. Tham số của lời gọi được tính ngay lúc gặpdefer, không phải lúc chạy.for i := 0; i < 3; i++ { defer fmt.Println(i) // in 2, 1, 0 }- Đừng
defer f.Close()trong vòng lặp mở hàng nghìn file: chúng chỉ đóng khi hàm kết thúc. Tách thân vòng lặp thành hàm riêng.
Về vòng lặp: trước Go 1.22, biến vòng lặp dùng chung cho mọi lần lặp nên goroutine hay closure thường thấy giá trị cuối cùng. Từ Go 1.22, mỗi lần lặp có biến riêng (khi
go.modkhai báo 1.22 trở lên), nên lỗi này không còn.Người phỏng vấn muốn nghe: bạn biết thay đổi này phụ thuộc phiên bản trong
go.mod.- Đừng
05Goroutine leak là gì? Làm sao phát hiện và phòng tránh?Golang · Senior
Gợi ý trả lời
Ôn thêm câu hỏi Golang →Goroutine leak là goroutine bị chặn mãi mãi và không bao giờ kết thúc, giữ theo bộ nhớ và tài nguyên nó tham chiếu. Số goroutine tăng dần theo thời gian là dấu hiệu rõ nhất.
Nguyên nhân hay gặp:
- Gửi vào channel mà bên nhận đã bỏ đi (ví dụ đã trả về vì timeout).
- Nhận từ channel không bao giờ được gửi hoặc đóng.
- Vòng lặp chạy nền không kiểm tra
ctx.Done(). - HTTP response không đóng
Body.
ch := make(chan Result, 1) // buffer 1: goroutine gửi xong vẫn thoát được go func() { ch <- slowCall() }() select { case r := <-ch: return r, nil case <-ctx.Done(): return Result{}, ctx.Err() }Phát hiện: theo dõi
runtime.NumGoroutine(), xem profile goroutine quanet/http/pprof, dùng thư việngoleaktrong test.Người phỏng vấn muốn nghe: mỗi goroutine bạn tạo phải có câu trả lời rõ ràng cho câu hỏi "nó kết thúc khi nào?".
06Undefined behavior trong C/C++ là gì? Cho ví dụ và cách phát hiện.C/C++ & Embedded · Senior
Gợi ý trả lời
Ôn thêm câu hỏi C/C++ & Embedded →Undefined behavior (UB) là những thao tác mà chuẩn ngôn ngữ không quy định kết quả. Compiler được phép giả định UB không bao giờ xảy ra và tối ưu theo giả định đó, nên lỗi có thể chỉ lộ ra ở bản build
-O2hoặc trên một compiler khác.Ví dụ hay gặp:
- Tràn số nguyên có dấu (tràn số không dấu thì được định nghĩa là quay vòng).
- Truy cập mảng ngoài phạm vi, dereference con trỏ null hoặc dangling.
- Đọc biến chưa khởi tạo, data race giữa các thread.
- Vi phạm strict aliasing, vd. ép
float*sangint*rồi đọc (nên dùngmemcpyhoặcstd::bit_casttừ C++20).
Phát hiện: bật cảnh báo
-Wall -Wextra, chạy test với-fsanitize=address,undefined, dùng static analysis (clang-tidy, cppcheck, MISRA checker).Người phỏng vấn muốn nghe: "chạy đúng trên máy tôi" không chứng minh code không có UB.
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
09Why are you interested in this role?Phỏng vấn tiếng Anh
Gợi ý trả lời
Ôn thêm câu hỏi Phỏng vấn tiếng Anh →"I've been working on payment systems for three years, and I'm really interested in building products at a larger scale. From the job description, your team is redesigning the transaction platform, which matches my experience and what I want to learn next. I also like that you have a strong engineering culture with code reviews and technical sharing. I believe I can contribute quickly and keep growing here."
Mẹo: nối ba ý: kinh nghiệm của bạn, điều công ty đang làm, điều bạn muốn học. Dùng chi tiết từ JD để cho thấy bạn đã tìm hiểu. Tránh mở đầu bằng lương hay "because your company is big".
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 ở IVC (ISB Vietnam)?
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