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 (SQL & Database, DevOps & CI/CD, Node.js). 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.
01Các isolation level là gì? Dirty read, non-repeatable read, phantom read khác nhau thế nào?SQL & Database
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Isolation level quyết định một transaction thấy được bao nhiêu thay đổi của transaction khác; mức càng cao càng an toàn nhưng càng dễ tranh chấp.
- Dirty read: đọc dữ liệu transaction khác chưa commit.
- Non-repeatable read: đọc lại cùng một dòng thấy giá trị đã đổi.
- Phantom read: chạy lại cùng điều kiện thấy thêm hoặc mất dòng.
Bốn mức chuẩn: Read Uncommitted, Read Committed, Repeatable Read, Serializable. Mặc định của PostgreSQL, SQL Server, Oracle là Read Committed; MySQL InnoDB là Repeatable Read.
Thực tế các DB dùng MVCC nên hành vi có khác lý thuyết: Repeatable Read của PostgreSQL dùng snapshot nên không gặp phantom, còn InnoDB dùng gap lock cho câu đọc có khoá.
Người phỏng vấn muốn nghe: bạn biết DB mình dùng mặc định ở mức nào và đã từng xử lý lost update, vd. bằng
SELECT ... FOR UPDATEhoặc optimistic locking.02Một API chạy chậm, nghi do query. Bạn điều tra và tối ưu thế nào?SQL & Database
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Đo trước rồi mới sửa: tìm đúng query chậm, đọc execution plan, rồi chỉnh index hoặc cách viết query.
- Bật slow query log (MySQL) hoặc
pg_stat_statements(PostgreSQL) để biết query nào tốn thời gian nhất. - Chạy
EXPLAIN(PostgreSQL nên dùngEXPLAIN (ANALYZE, BUFFERS)) xem có full scan, ước lượng số dòng lệch nhiều so với thực tế, sort trên đĩa không. - Sửa theo nguyên nhân: thêm hoặc đổi composite index, bỏ hàm bọc cột, chỉ
SELECTcột cần, phân trang bằng keyset thay choOFFSETlớn. - Kiểm tra phía ứng dụng: lỗi N+1 query, thiếu connection pool, lock chờ lâu.
- Cập nhật thống kê (
ANALYZE) nếu planner ước lượng sai.
Người phỏng vấn muốn nghe: quy trình có số liệu trước/sau, không phải đoán rồi thêm index bừa.
- Bật slow query log (MySQL) hoặc
03Chuẩ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.
04Terraform state là gì? Làm việc nhóm với Terraform bạn quản lý state thế nào?DevOps & CI/CD
Gợi ý trả lời
Ôn thêm câu hỏi DevOps & CI/CD →State là file Terraform ghi lại ánh xạ giữa code và tài nguyên thật; Terraform dựa vào nó để tính
plan. Mất hoặc lệch state là nguy cơ tạo trùng hoặc xoá nhầm tài nguyên.- Lưu state ở remote backend (S3, GCS, Azure Blob, Terraform Cloud), bật versioning và mã hoá.
- Bật locking để hai người không
applycùng lúc. - Tách state theo môi trường/thành phần để giảm phạm vi ảnh hưởng.
- Không commit state lên Git: trong đó có thể chứa secret.
- Chạy
plantrong CI cho mỗi PR,applyqua pipeline có duyệt.
Hay sai: sửa tay trên console rồi quên, tạo drift; nên định kỳ chạy
planđể phát hiện.05Bạn quản lý secret (mật khẩu DB, API key) trong pipeline và Kubernetes thế nào?DevOps & CI/CD
Gợi ý trả lời
Ôn thêm câu hỏi DevOps & CI/CD →Nguyên tắc: secret không nằm trong Git, không in ra log, được cấp theo quyền tối thiểu và xoay vòng được.
- Dùng secret manager (Vault, AWS Secrets Manager, Azure Key Vault, GCP Secret Manager) làm nguồn gốc.
- Đồng bộ vào cluster bằng External Secrets Operator hoặc CSI driver; nếu phải để trong Git thì mã hoá (Sealed Secrets, SOPS).
- Kubernetes Secret mặc định chỉ base64: bật mã hoá etcd và giới hạn RBAC đọc Secret.
- CI dùng biến được che (masked), ưu tiên OIDC để lấy credential ngắn hạn thay vì key dài hạn.
- Bật quét secret khi push code.
Người phỏng vấn muốn nghe: biết base64 không phải mã hoá, và có kế hoạch xoay key khi bị lộ.
06Trong NestJS, module, provider và dependency injection hoạt động ra sao? Guard, interceptor, pipe khác nhau thế nào?Node.js
Gợi ý trả lời
Ôn thêm câu hỏi Node.js →NestJS tổ chức app thành module. Mỗi module khai báo controller, provider (service, repository) và
exportsnhững gì module khác được dùng. IoC container của Nest tự tạo provider và inject qua constructor.@Injectable() export class OrdersService { constructor(private readonly repo: OrdersRepository) {} }Thứ tự một request đi qua: middleware, guard, interceptor (trước), pipe, handler, interceptor (sau); exception filter bắt lỗi ở bất kỳ bước nào.
- Guard: quyết định request có được đi tiếp không (xác thực, phân quyền).
- Pipe: biến đổi và validate input (
ValidationPipevới DTO). - Interceptor: bọc quanh handler: log, đo thời gian, đổi định dạng response, cache.
Hay sai: hai provider phụ thuộc vòng tròn rồi xử lý bằng
forwardRefkhắp nơi. Thường đó là dấu hiệu nên tách lại trách nhiệm giữa các module.07Deadlock 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
08Khi nào chọn NoSQL (MongoDB, Redis…) thay vì SQL? Trade-off là gì?SQL & Database · Senior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Chọn theo mô hình truy cập dữ liệu, không theo xu hướng. SQL mạnh ở quan hệ, ràng buộc và transaction; NoSQL mạnh ở schema linh hoạt, mô hình dữ liệu đặc thù hoặc scale ngang dễ hơn.
- Document (MongoDB): dữ liệu dạng cây, đọc nguyên khối theo một khoá, schema thay đổi thường xuyên.
- Key-value (Redis): cache, session, rate limit, bộ đếm, hàng đợi nhỏ; dữ liệu chủ yếu nằm trong RAM.
- Wide-column, time-series, search engine: ghi khối lượng lớn, log, tìm kiếm full-text.
Trade-off: JOIN và transaction nhiều document hạn chế hoặc đắt hơn, ràng buộc dữ liệu chuyển sang tầng ứng dụng, và phải thiết kế theo query ngay từ đầu.
Người phỏng vấn muốn nghe: nhiều hệ thống dùng kết hợp, vd. PostgreSQL làm nguồn sự thật, Redis làm cache. PostgreSQL với
JSONBcũng đủ cho nhiều nhu cầu "schema linh hoạt".09Bảng có hàng trăm triệu dòng, query ngày càng chậm. Bạn dùng partitioning, sharding hay read replica?SQL & Database · Senior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Mỗi kỹ thuật giải một vấn đề khác nhau, nên cần xác định điểm nghẽn là đọc, ghi hay kích thước dữ liệu.
- Read replica: giảm tải đọc. Phải chấp nhận replication lag; luồng vừa ghi xong đọc lại nên đọc từ primary.
- Partitioning (trong một DB): chia bảng theo khoảng thời gian hoặc theo key. Query có điều kiện trên partition key chỉ quét phần liên quan, xoá dữ liệu cũ bằng
DROP PARTITIONrất nhanh. - Sharding (nhiều DB): khi một máy không chịu nổi lượng ghi hoặc dung lượng. Đổi lại phải chọn shard key cẩn thận, query xuyên shard và transaction phân tán rất khó.
Thứ tự hợp lý: tối ưu query và index, archive dữ liệu cũ, thêm replica và cache, partition, cuối cùng mới shard.
Hay sai: chọn shard key gây hot spot, vd. theo ngày tạo khiến mọi lượt ghi dồn vào một shard.
10Bạn thấy mình ở đâu sau 2–3 năm nữa?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á →Người phỏng vấn muốn biết mục tiêu của bạn có khớp với hướng phát triển ở công ty và bạn có định gắn bó không.
- Nêu hướng phát triển cụ thể, thực tế: đi sâu chuyên môn (senior, chuyên gia một mảng) hay quản lý (lead, PM).
- Kèm kế hoạch: kỹ năng cần học, trách nhiệm muốn nhận thêm.
- Gắn với cơ hội ở vị trí đang ứng tuyển.
Câu mẫu: "Trong 2–3 năm tới em muốn trở thành senior có thể tự thiết kế và chịu trách nhiệm một module lớn, đồng thời hướng dẫn được các bạn mới. Em đang học thêm về thiết kế hệ thống và thấy team bên mình có nhiều bài toán ở quy mô lớn, rất hợp để em phát triển theo hướng đó."
Hay sai: "Em muốn mở công ty riêng" hoặc "em chưa nghĩ tới". Cũng đừng nói muốn ngồi vào chỗ của người đang phỏng vấn.
Bạn đã phỏng vấn ở Onpoint?
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