Mảng này KHÔNG đòi hỏi fresher biết vận hành thực tế Jenkins/K8s. Interviewer ngân hàng chỉ cần thấy: (1) bạn dùng Git thành thạo ở mức làm việc nhóm, (2) hiểu đúng khái niệm Docker/CI/CD/Maven, (3) có ý thức về quy trình kiểm soát thay đổi và bảo mật — thứ ngân hàng coi trọng hơn cả kỹ năng tool.
clone / add / commit / push / pull, status / log / diff; khái niệm working directory → staging area → repository.checkout/switch, feature branch workflow, Git Flow ở mức khái niệm (main/develop/feature/hotfix).pom.xml, dependency, lifecycle clean → compile → test → package → install; mvn package tạo ra file JAR..gitignore.git stash, git revert vs git reset (khái niệm: revert an toàn cho branch chung, reset chỉ dùng local).docker build / run / ps / logs, port mapping -p 8080:8080, biến môi trường -e.v1.0.0), dùng khi release.Hướng trả lời:
main/develop, làm xong tạo Pull Request, thành viên khác review rồi mới merge.git pull (hoặc git fetch + merge) để cập nhật code mới nhất, giảm khả năng conflict.<<<<<<< HEAD ... ======= ... >>>>>>>; mở file, đọc hiểu cả hai phía thay đổi, chọn/kết hợp code đúng, xoá marker, chạy lại app/test để chắc chắn không vỡ, rồi git add + commit.Ý ăn điểm: kể một conflict CỤ THỂ từng gặp trong đồ án (ví dụ hai người cùng sửa một service). Góc ngân hàng: nhấn mạnh "vì vậy em hiểu tại sao ngân hàng bắt buộc mọi thay đổi qua PR + review — code chạm đến tiền và dữ liệu khách hàng thì không ai được tự ý sửa trực tiếp trên nhánh chính".
Lỗi cần tránh: trả lời "nhóm em push thẳng lên main" (báo động đỏ); giải conflict bằng cách "chọn Accept All Current Changes" máy móc; không test lại sau khi resolve.
Hướng trả lời:
Ý ăn điểm: nói được "golden rule of rebase". Góc ngân hàng: lịch sử Git là một phần audit trail — ngân hàng cần truy vết ai sửa gì, khi nào; nên môi trường ngân hàng thường ưu tiên merge (giữ nguyên lịch sử) trên nhánh chung.
Lỗi cần tránh: nói "rebase tốt hơn merge" chung chung; không biết rebase viết lại lịch sử; lẫn rebase với revert.
Hướng trả lời:
git fetch: tải commit mới từ remote về local (cập nhật origin/main), chưa động vào code đang làm — an toàn, chỉ để xem có gì mới.git pull = fetch + merge (hoặc + rebase nếu cấu hình): vừa tải vừa gộp ngay vào nhánh hiện tại — tiện nhưng có thể sinh conflict bất ngờ.fetch trước để xem thay đổi (git log origin/main), chủ động chọn thời điểm merge.Ý ăn điểm: công thức "pull = fetch + merge" + nói được vì sao fetch an toàn hơn. Lỗi cần tránh: trả lời "giống nhau"; nói fetch làm thay đổi working directory.
Hướng trả lời:
Ý ăn điểm — góc ngân hàng: đây là yêu cầu tuân thủ (compliance), không chỉ là thói quen tốt. Với hệ thống xử lý giao dịch tiền, một dòng code sai có thể gây sai lệch số dư; ngân hàng cần chứng minh với kiểm toán rằng không một thay đổi nào vào production mà không qua ít nhất một người duyệt (nguyên tắc four-eyes / maker-checker — giống như giao dịch viên nhập lệnh phải có kiểm soát viên duyệt).
Lỗi cần tránh: coi review là "hình thức, mất thời gian"; không biết branch protection tồn tại.
Hướng trả lời:
.class hoặc bản thiết kế); container là instance đang chạy của image (như object được new từ class). Một image chạy ra nhiều container.FROM eclipse-temurin:17-jre
WORKDIR /app
COPY target/myapp.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Ý ăn điểm: phép so sánh class/object cho image/container; nói "cùng một image được test ở UAT chính là thứ chạy ở prod". Góc ngân hàng: ngân hàng có nhiều môi trường (dev → SIT → UAT → prod); Docker đảm bảo thứ đã kiểm thử là thứ được deploy, loại bỏ rủi ro "prod cấu hình khác UAT" — rủi ro vận hành lớn với hệ thống giao dịch.
Lỗi cần tránh: nói "Docker là máy ảo nhẹ" rồi dừng lại (phải nói được điểm khác cốt lõi: chung kernel); lẫn lộn image và container; nói Docker "tự động scale" (đó là việc của Kubernetes).
Hướng trả lời:
Ý ăn điểm — góc ngân hàng: rollback nhanh bằng image cũ chính là một phần của rollback plan mà quy trình change management ngân hàng bắt buộc phải có trước mỗi lần release. Lỗi cần tránh: chỉ nói "Docker phổ biến nên dùng"; không nêu được lợi ích cụ thể nào.
Hướng trả lời:
checkout code → build (mvn package) → unit test → build Docker image → push registry → deploy dev → deploy UAT (test) → APPROVAL → deploy prod.Jenkinsfile; tương tự GitHub Actions/GitLab CI.Ý ăn điểm: phân biệt Delivery/Deployment + nói được vì sao ngân hàng thường dừng ở Delivery (con người approve bước cuối). Nhắc "mọi lần deploy đều được log lại phục vụ audit". Lỗi cần tránh: nói CI/CD chỉ là "deploy tự động" (bỏ quên phần test); nói "tự động thì bỏ luôn approval cho nhanh" — ngược triết lý ngân hàng.
Hướng trả lời:
mvn package mặc định chạy test trước khi đóng gói; cờ -DskipTests chỉ dùng khi thật sự hiểu mình đang làm gì.Ý ăn điểm: cụm "fail fast" và "quality gate". Góc ngân hàng: một bug tính lãi sai lọt qua vì "skip test cho nhanh" là ví dụ tốt để nói về chi phí của lỗi. Lỗi cần tránh: trả lời "thì skip test đi ạ".
mvn package thực hiện những bước nào?Hướng trả lời:
~/.m2), chuẩn hoá cấu trúc project, và tự động hoá build theo lifecycle.pom.xml khai báo thông tin project + dependency:<project>
<groupId>com.example</groupId>
<artifactId>banking-demo</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
mvn package = validate → compile (biên dịch source) → test (chạy unit test, fail thì dừng) → package (đóng gói JAR/WAR vào target/).clean xoá target/; install copy JAR vào local repo; deploy đẩy lên remote repo (Nexus). Gradle là lựa chọn tương đương, dùng script Kotlin/Groovy, build nhanh hơn nhờ incremental build — khái niệm giống nhau.Ý ăn điểm: nói rõ "package tự chạy compile và test trước" — nhiều fresher không biết lifecycle là chuỗi tích luỹ. Góc ngân hàng: dependency được khai báo tường minh trong pom.xml giúp kiểm soát phiên bản thư viện và lỗ hổng bảo mật (ví dụ sự cố Log4j — ngân hàng phải rà soát mọi pom.xml để biết hệ thống nào dính). Lỗi cần tránh: nói Maven chỉ là "chỗ tải thư viện"; không biết JAR nằm ở target/; lẫn phase với plugin/goal (không cần sa đà — nắm phase là đủ).
Tình huống A — đã từng dùng Docker/cloud (kể trung thực theo mức đã làm):
mvn package ra file JAR, viết Dockerfile đóng gói cùng JRE 17, docker build ra image rồi chạy docker run -p 8080:8080. Database em chạy bằng container PostgreSQL riêng (hoặc docker-compose gộp app + DB). Sau đó em đưa lên [Render/Railway/EC2...], cấu hình connection string qua biến môi trường chứ không hardcode."Tình huống B — chưa từng deploy thật (trả lời trung thực + chứng minh hiểu khái niệm):
mvn spring-boot:run, DB MySQL cài trên máy. Em chưa deploy lên server thật, nhưng em đã tìm hiểu quy trình: build JAR bằng mvn package, viết Dockerfile để đóng gói, chạy container và map port; nếu có thời gian em sẽ thử trên một VPS hoặc dịch vụ free-tier."application-dev.properties, còn thông tin kết nối prod phải nằm ngoài code."Ý ăn điểm: trung thực + cho thấy hiểu bức tranh (build → đóng gói → cấu hình → chạy) dù chưa làm hết; câu chốt về quy trình ngân hàng ở cả hai tình huống. Lỗi cần tránh: nói dối đã dùng Kubernetes/AWS rồi bị hỏi sâu và vỡ trận (interviewer ngân hàng rất hay đào tiếp); trả lời cụt lủn "em chưa deploy bao giờ" mà không thể hiện đã tìm hiểu.
Hướng trả lời:
spring.datasource.password=${DB_PASSWORD}), file config local đưa vào .gitignore, chỉ commit file mẫu application-example.properties.application-dev.properties, application-uat.properties, application-prod.properties; kích hoạt bằng --spring.profiles.active=prod.Ý ăn điểm — góc ngân hàng: đây là lỗi bảo mật kinh điển của fresher và là câu interviewer ngân hàng dùng để lọc ý thức bảo mật. Nói thêm: ở ngân hàng, dev thậm chí không được biết mật khẩu DB production — secret do team vận hành quản lý qua vault/secret manager, app nhận lúc runtime. Lỗi cần tránh: "em để trong application.properties và push lên GitHub luôn ạ" — trả lời thật thà kiểu này mà không kèm "giờ em biết đó là sai và cách sửa là..." sẽ mất điểm nặng.
Hướng trả lời:
Jenkinsfile.Ý ăn điểm: câu "khái niệm giống GitHub Actions, khác cú pháp" + lý do self-hosted. Lỗi cần tránh: chém đã cấu hình Jenkins master/agent; hoặc hoảng loạn "em không biết gì về Jenkins" rồi im lặng.
Hướng trả lời:
Ý ăn điểm: liên kết chuỗi Docker → nhiều container → cần orchestration; biết OpenShift là "K8s phiên bản doanh nghiệp". Góc ngân hàng: giờ cao điểm chuyển tiền (lễ Tết, ngày trả lương) hệ thống cần scale nhanh rồi thu lại — đó chính là bài toán K8s giải. Lỗi cần tránh: cố trình bày Pod/Deployment/Service khi không nắm chắc — sa lầy đúng vùng mình yếu nhất.
git revert khác git reset? Lỡ commit sai lên nhánh chung thì làm gì?Hướng trả lời:
reset: dịch chuyển nhánh về commit cũ, xoá lịch sử phía sau → chỉ an toàn trên nhánh local chưa push.revert: tạo commit mới đảo ngược thay đổi của commit sai → lịch sử được giữ nguyên, an toàn cho nhánh chung.revert; không reset + force push vì phá lịch sử của cả team.Ý ăn điểm — góc ngân hàng: revert giữ nguyên dấu vết "đã có lỗi và đã sửa" — đúng tinh thần audit trail: ngân hàng không xoá lịch sử, kể cả lịch sử sai (giống bút toán kế toán: sai thì ghi bút toán điều chỉnh, không tẩy sổ). Lỗi cần tránh: đề xuất force push lên nhánh chung.
Định vị đúng kỳ vọng. VPBank không kỳ vọng fresher vận hành Jenkins/Kubernetes/OpenShift thực tế — các JD liệt kê chúng là "hiểu biết là lợi thế". Chiến thuật đúng: trả lời khái niệm chính xác, thành thật về giới hạn, và luôn kèm một câu thể hiện tinh thần học ("em đã tự tìm hiểu X, chưa có cơ hội dùng thật, em muốn được học ở môi trường có quy trình chuẩn như ngân hàng"). Interviewer ngân hàng đánh giá cao thành thật + ý thức quy trình hơn là danh sách buzzword.
Sợi chỉ đỏ để lồng vào mọi câu trả lời: ngân hàng = kiểm soát thay đổi (change management) + phân quyền (dev không tự deploy prod) + audit trail (mọi thứ truy vết được) + bảo mật (secret không vào Git). Cứ mỗi câu tooling, gắn được một trong bốn ý này là bạn nổi bật hẳn so với fresher chỉ thuộc định nghĩa.
2–3 việc làm nhanh trước phỏng vấn (1–2 buổi tối):
feat: add transfer API validation thay vì update, fix bug), tạo ít nhất 1 branch + 1 PR tự merge để có cái mà kể. Kiểm tra kỹ không có password/API key nào trong repo và trong history.docker build + docker run -p 8080:8080 trên máy mình. Chỉ 30 phút nhưng biến câu trả lời "em có biết Docker" thành "em đã docker hoá đồ án của em".on: push → jobs: build → steps: checkout, setup-java, mvn package để khi bị hỏi Jenkins có cái quy chiếu; nếu chưa từng, đọc lướt một Jenkinsfile mẫu 15 dòng trên mạng để quen mặt chữ stage('Build'), stage('Test'), stage('Deploy').Câu thoát hiểm vạn năng khi bị hỏi vượt tầm (K8s networking, Jenkins agent, Helm...): "Phần này em mới dừng ở mức khái niệm là [nói đúng 1–2 câu khái niệm]; em chưa làm thực tế nên không dám nói sâu, nhưng em đã quen cách tự học qua việc [Docker hoá đồ án / dùng Actions], em tin sẽ bắt nhịp nhanh." — vừa trung thực, vừa không để khoảng lặng, vừa chốt bằng điểm mạnh.