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 (DevOps & CI/CD, Python, Bảo mật (Security)). 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.
01Container khác máy ảo (VM) ở điểm nào? Khi nào vẫn nên dùng VM?DevOps & CI/CD · Junior
Gợi ý trả lời
Ôn thêm câu hỏi DevOps & CI/CD →Container dùng chung kernel của máy chủ và cô lập bằng namespace + cgroup, nên khởi động nhanh và nhẹ; VM ảo hoá cả phần cứng và chạy một hệ điều hành riêng.
- Container: nhẹ, đóng gói ứng dụng cùng thư viện, hợp microservice và CI/CD.
- VM: cô lập mạnh hơn, chạy được kernel/OS khác (Windows trên host Linux), hợp workload cần ranh giới bảo mật rõ hoặc phần mềm cũ.
- Thực tế hai thứ thường đi cùng nhau: node Kubernetes chính là các VM trên cloud.
Hay sai: nói container "an toàn như VM". Container thoát ra host được nếu chạy
--privilegedhoặc kernel có lỗ hổng.02Bạn viết Dockerfile thế nào để image nhỏ, build nhanh và an toàn?DevOps & CI/CD · Junior
Gợi ý trả lời
Ôn thêm câu hỏi DevOps & CI/CD →Ý chính: dùng multi-stage build, sắp xếp layer để tận dụng cache, và không chạy bằng root.
FROM node:22-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:22-alpine USER node COPY --from=build /app/dist /app- Copy file khai báo dependency trước, code sau, để đổi code không phải cài lại package.
- Dùng
.dockerignoreloạinode_modules,.git, file.env. - Không nhét secret vào image (kể cả ở layer đã xoá); dùng build secret hoặc biến môi trường lúc chạy.
- Ghim phiên bản base image, quét lỗ hổng trong pipeline.
03CI, Continuous Delivery và Continuous Deployment khác nhau thế nào? Một pipeline cơ bản gồm những bước gì?DevOps & CI/CD · Junior
Gợi ý trả lời
Ôn thêm câu hỏi DevOps & CI/CD →CI là tự động build và test mỗi lần merge code; Continuous Delivery là luôn có bản sẵn sàng deploy nhưng lên production cần bấm duyệt; Continuous Deployment thì tự lên production nếu mọi bước đều qua.
Pipeline cơ bản:
- Checkout, cài dependency (có cache).
- Lint, unit test, quét bảo mật (SAST, dependency, secret).
- Build artifact/image, gắn tag theo commit SHA, đẩy lên registry.
- Deploy lên staging, chạy smoke/integration test.
- Deploy production (thủ công hoặc tự động), có cách rollback.
Người phỏng vấn muốn nghe: build một lần, dùng cùng một artifact cho mọi môi trường; chỉ cấu hình là khác nhau.
04Đoạn code
def add(item, items=[])có vấn đề gì?Python · JuniorGợi ý trả lời
Ôn thêm câu hỏi Python →Giá trị mặc định được tạo một lần khi định nghĩa hàm, không phải mỗi lần gọi. Mọi lần gọi không truyền
itemssẽ dùng chung một list, nên dữ liệu bị cộng dồn qua các lần gọi.def add(item, items=None): if items is None: items = [] items.append(item) return items- Áp dụng cho mọi giá trị mặc định mutable:
[],{},set(). - Với dataclass, dùng
field(default_factory=list). - Với Django model field, truyền hàm chứ không truyền object:
default=list, không phảidefault=[].
Hay sai: dùng
if not items:thay choif items is None:. Khi caller truyền vào list rỗng có chủ đích, hàm lại tạo list mới và caller không nhận được kết quả.- Áp dụng cho mọi giá trị mặc định mutable:
05Shallow copy và deep copy khác nhau thế nào? Phép gán
b = acó tạo bản sao không?Python · JuniorGợi ý trả lời
Ôn thêm câu hỏi Python →b = akhông sao chép gì: hai tên cùng trỏ đến một object. Sửa quabthìacũng đổi.- Shallow copy (
a.copy(),list(a),a[:],copy.copy(a)): tạo container mới nhưng các phần tử bên trong vẫn là object cũ. - Deep copy (
copy.deepcopy(a)): sao chép đệ quy toàn bộ cấu trúc.
a = [[1, 2], [3]] b = a.copy() b[0].append(99) # a cũng thành [[1, 2, 99], [3]]Hay sai: tạo ma trận bằng
[[0] * 3] * 3. Ba hàng là cùng một list, sửa một ô thì cả cột đổi theo. Viết đúng:[[0] * 3 for _ in range(3)].- Shallow copy (
06SQL injection là gì? Bạn phòng tránh trong code thế nào?Bảo mật (Security) · Junior
Gợi ý trả lời
Ôn thêm câu hỏi Bảo mật (Security) →SQL injection xảy ra khi dữ liệu người dùng được ghép thẳng vào câu SQL, khiến dữ liệu bị hiểu thành lệnh. Cách phòng chính là tách dữ liệu khỏi câu lệnh.
// Sai: ghép chuỗi db.query("SELECT * FROM users WHERE email = '" + email + "'"); // Đúng: tham số hoá db.query("SELECT * FROM users WHERE email = $1", [email]);- Dùng prepared statement hoặc ORM đúng cách; cẩn thận với các hàm cho viết raw SQL.
- Tên cột/bảng động thì kiểm tra theo danh sách cho phép.
- Tài khoản DB của ứng dụng chỉ có quyền tối thiểu.
- WAF và SAST là lớp bổ sung, không thay cho code đúng.
07Trong Kubernetes, Pod, Deployment và Service là gì và liên quan với nhau thế nào?DevOps & CI/CD · Junior
Gợi ý trả lời
Ôn thêm câu hỏi DevOps & CI/CD →Pod là đơn vị chạy nhỏ nhất (một hoặc vài container dùng chung network); Deployment quản lý số bản sao Pod và việc cập nhật; Service cho một địa chỉ ổn định để gọi tới nhóm Pod.
- Pod có thể chết và được tạo lại với IP mới, nên không gọi trực tiếp IP Pod.
- Deployment tạo ReplicaSet, hỗ trợ rolling update và rollback.
- Service chọn Pod theo label (
selector), kiểuClusterIP(nội bộ),NodePort,LoadBalancer. - Từ ngoài vào HTTP thường dùng Ingress hoặc Gateway API phía trước Service.
Hay sai: label của Pod template không khớp
selectorcủa Service, khiến Service không có endpoint nào.08Pod bị CrashLoopBackOff, bạn điều tra thế nào?DevOps & CI/CD
Gợi ý trả lời
Ôn thêm câu hỏi DevOps & CI/CD →CrashLoopBackOff nghĩa là container khởi động rồi thoát liên tục; cần tìm lý do nó thoát.
kubectl describe pod <pod> # events, exit code, OOMKilled? kubectl logs <pod> --previous # log của lần chạy trước khi chết kubectl get events --sort-by=.lastTimestamp- Exit code 137 /
OOMKilled: thiếu memory limit hoặc rò rỉ bộ nhớ. - Lỗi cấu hình: thiếu biến môi trường, Secret/ConfigMap sai, không kết nối được DB.
- Liveness probe quá gắt khiến app bị kill khi đang khởi động; cân nhắc
startupProbe. - Sai lệnh
command/args, sai kiến trúc image (arm64 và amd64).
Người phỏng vấn muốn nghe: quy trình có thứ tự, dựa vào events và log trước khi đoán.
- Exit code 137 /
09Liveness, readiness và startup probe khác nhau thế nào? Cấu hình sai thì hậu quả gì?DevOps & CI/CD
Gợi ý trả lời
Ôn thêm câu hỏi DevOps & CI/CD →Readiness quyết định Pod có nhận traffic không; liveness quyết định có restart container không; startup probe tạm hoãn hai probe kia cho tới khi app khởi động xong.
- Readiness fail: Pod bị gỡ khỏi endpoint của Service, không bị restart.
- Liveness fail: kubelet restart container.
- Startup probe hợp với app khởi động chậm (JVM, nạp model).
Lỗi hay gặp:
- Liveness kiểm tra cả DB bên ngoài: DB chậm là toàn bộ Pod bị restart dây chuyền.
- Không có readiness: rolling update đẩy traffic vào Pod chưa sẵn sàng, gây lỗi 5xx.
Người phỏng vấn muốn nghe: liveness chỉ nên kiểm tra chính process còn sống, phần phụ thuộc để cho readiness.
10Bạn hãy giới thiệu ngắn về bản thân.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á →Đây là câu mở đầu gần như chắc chắn có. Dùng công thức Hiện tại – Quá khứ – Tương lai, gói trong khoảng 1–2 phút.
- Hiện tại: vị trí, số năm kinh nghiệm, mảng/công nghệ chính.
- Quá khứ: một hai dự án hoặc thành tích liên quan nhất tới vị trí đang tuyển.
- Tương lai: vì sao bạn quan tâm tới vị trí này.
Câu mẫu: "Em là backend developer, khoảng 3 năm kinh nghiệm, chủ yếu làm Java Spring cho hệ thống thanh toán. Ở dự án gần nhất em phụ trách module đối soát và tối ưu các truy vấn báo cáo chạy chậm. Em đang tìm môi trường làm sản phẩm lâu dài để đi sâu hơn về thiết kế hệ thống, nên rất quan tâm tới vị trí này."
Hay sai: kể từ quê quán, trường cấp ba, hoặc đọc lại nguyên CV.
Bạn đã phỏng vấn ở ABBANK?
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