Interview Defense · git-verified

Bám sát CV. Bị đào sâu vẫn đứng vững.

Bộ ôn phỏng vấn cho Trần Nam Phong — Frontend / Agentic Developer. Mọi câu trả lời neo vào commit thật của bạn trong TWDAgentsHub, Shiru, MoneyFi. Đào càng sâu càng đáng tin — vì bạn thật sự viết phần khó nhất.

MCP + Orchestrator TWDAgentsHub — bạn là tác giả chính
100% / ~94% Shiru admin / frontend
162 commits MoneyFi boost engine
2 landmine phải hạ tông — đã có sẵn câu
01

Chiến lược cốt lõi

Phỏng vấn không kiểm tra "có làm không" — nó kiểm tra hiểu sâu tới đâucó trung thực về ranh giới đóng góp không. Vũ khí mạnh nhất: git lịch sử đứng về phía bạn.

1

Đúng động từ sở hữu — chọn TRƯỚC khi trả lời

I built / I own phần bạn là tác giả chính · I co-led / contributed phần bạn #2 · I integrated / consumed phần đồng nghiệp viết. Sai động từ = bị bắt bài. Đúng động từ = vừa sâu vừa tin.

2

Trả lời theo TẦNG, đừng đổ hết

claim 1 câu → kiến trúc → 1 quyết định/tradeoff → 1 war story. Dừng sau mỗi tầng để interviewer kéo bạn xuống sâu hơn. Đổ hết = nghe như học vẹt.

3

STAR-C cho mọi war story

Situation → Task → Action → Result → Change ("nếu làm lại tôi sẽ…"). Câu "what I'd change" làm bạn trông như senior, không phải coder thừa hành.

4

Bridging khi bị hỏi chỗ không sâu

Công nhận ranh giới → bắc cầu sang phần bạn ĐÃ làm: "Phần X là platform infra của team; cái tôi sở hữu và build lên trên là Y — để tôi nói về Y."

5

Specifics = credibility

Thả tên thật: BullMQ upsertJobScheduler, Redis SETNX, AsyncMutex, generateObject + Zod, ICP 0–100, squarified treemap. Con số + tên riêng > tính từ.

02

Ownership Map (git-verified)

Đây là lưới an toàn. Mọi project đều là TEAM project — nhưng commit chứng minh bạn sở hữu đúng những phần khó. Claim theo cột "Nói thế nào".

Phần việcVerdictNói thế nào
TWDAgentsHub — MCP server + ~20 toolsOwn"Tôi xây MCP layer"
TWDAgentsHub — LLM orchestratorOwn"Tôi build orchestrator"
TWDAgentsHub — lead agents / WF2 scoring / TelegramOwn"Tôi build lead pipeline"
TWDAgentsHub — chat-widget + admin-uiOwn"Tôi build cả 2 frontend"
TWDAgentsHub — ERP adaptersCo-led"Tôi đồng chủ trì adapter layer"
TWDAgentsHub — LLM provider factory (api/src/llm)Hedge"Platform infra, tôi consume qua fast/smart tier"
Shiru — admin console (cả repo)Sole owner"Tôi là sole owner — AUA, treemap, KYB, XLSX"
Shiru — frontend (~94%)Own"Tôi phụ trách chính FE"
Shiru — KYB backend + mailOwn"Tôi owner KYB backend"
Shiru — auth password / account-deletion / usernameCo-led"Tôi viết các DTO & flow này"
Shiru — multi-chain token resolutionHedge"Đồng nghiệp BE viết resolver core, tôi integrate"
MoneyFi — boost engine (treasure/countdown/tier/claim)Own"Tôi build boost engine (162 commit)"
MoneyFi — dual-wallet + VPN/geo gating (client)Own"Tôi build onboarding 2 ví + region gate"
MoneyFi — geo worker endpointNote"Teammate deploy worker; tôi build lớp client consume"
MoneyFi — tổng thể sản phẩm (team lớn)Contributed"Tôi build phần user-facing" — KHÔNG nói "tôi build MoneyFi"
moneyfi-SDK-example (~86%)OwnReference tích hợp SDK, của bạn
⚠️ Chỉ 2 chỗ PHẢI hạ tông — học thuộc câu trả lời trung thực, nói thật 1 lần ở đây mua được độ tin cho mọi thứ bạn claim:

• LLM provider factory (TWDAgentsHub): "Cái factory fast/smart tier qua Anthropic/OpenAI/Google là platform infra anh tech lead set up. Cái tôi build LÊN TRÊN là orchestrator quyết định stage nào dùng tier nào — tier rẻ/nhanh cho intent routing & scoring, tier smart cho planning & synthesis. Tôi own phần orchestration & tradeoff cost/latency, không phải cái SDK wrapper."

• Multi-chain token resolution (Shiru): "Resolver đó — CoinGecko + CMC + LiFi + DB cache — chủ yếu là của một đồng nghiệp backend. Tôi integrate từ phía KYB/portfolio. Tôi giải thích được cách nó chạy, nhưng tôi nói thẳng là không phải tác giả core."
03

War Stories — STAR-C (kể trong 90 giây)

Mỗi project 1 câu chuyện "cái khó tôi đã giải". Click để mở. Tập kể trôi từ trí nhớ theo nhãn S/T/A/R/C.

TWDAgentsHubPipeline lead "miễn nhiễm" với webhook retry & race condition
S
SituationLead vào TWDAgentsHub qua webhook của sales-agent ngoài. Mạng chập chờn → bên gửi retry cùng 1 event: gửi trùng Telegram cho team, tệ hơn là WF2 đua/gán trùng rep (2 request cùng grab 1 sales rep).
T
TaskMỗi lead chỉ được enrich + score + notify đúng một lần; gán rep phải atomic kể cả khi webhook bắn song song; chặn webhook giả.
A
Action — 3 lớp guard
  1. Idempotency: Redis SETNX + TTL 5 phút theo khoá requestId/botId:updateId — key đã tồn tại thì bỏ qua, không xử lý lại.
  2. Atomicity: AsyncMutex theo tenant bao quanh sales_assign_rep — 2 lead không thể cùng chiếm 1 rep.
  3. Authenticity: verify HMAC-SHA256 bằng timingSafeEqual trước khi đẩy vào BullMQ queue (sales-contact, retry 3 lần exp backoff).
R
ResultHết trùng notification, hết double-assign; pipeline chịu được retry/duplicate mà không sai dữ liệu CRM. Tôi chủ trì hẳn 1 đợt red-team security cho phần này.
C
ChangeAsyncMutex chỉ atomic trong 1 instance. Scale ra nhiều instance API thì tôi đổi sang distributed lock (Redis Redlock) để giữ atomic xuyên tiến trình.
ShiruLuồng KYB: upload không block, không phí công, admin không clobber
S
SituationKYB bắt user upload nhiều file lớn (tới 10MB). Ban đầu upload đồng bộ trong request → treo lâu, dễ timeout. Tệ hơn: user điền hết form + upload xong mới biết email đã đăng ký → phí công.
T
TaskLuồng KYB mượt, không block; không cho user upload phí khi email đã tồn tại; tránh 2 admin duyệt clobber nhau.
A
Action
  1. Pre-flight email check: endpoint nhẹ check-email gọi TRƯỚC khi cho upload — chặn sớm nếu email đã tồn tại.
  2. Async pipeline: request chỉ tạo record (status UPLOADING) rồi enqueue BullMQ job; worker đẩy file lên Cloudinary bằng signed params (URL có hạn), xong đổi SUBMITTED. UI poll public-status (không cần JWT).
  3. Optimistic locking ở admin approve/reject: dùng version field → người thao tác sau nhận 409 thay vì ghi đè.
  4. State machine chặn chuyển trạng thái sai (không re-approve cái đã approved).
R
ResultRequest KYB trả về ngay (không treo theo dung lượng file), user không upload phí, admin không clobber. Tôi là sole owner Shiru admin + owner KYB backend.
C
ChangeUI đang poll status mỗi vài phút; nếu làm lại tôi thay bằng SSE push (backend đã có hạ tầng notification) để realtime hơn, đỡ poll.
MoneyFiBoost engine: claim "cảm giác" tức thì, chống double-spin & tx phí
S
SituationCampaign treasure-chest: user quay (spin) để nhận thưởng bằng ticket. Spin/claim gọi blockchain + backend nên có độ trễ → UI ì, user bấm lại nhiều lần (double-spin), hoặc spin khi không đủ ticket → tx fail tốn phí.
T
TaskTrải nghiệm spin/claim tức thì về cảm giác, chính xác về dữ liệu, chặn các tx chắc-chắn-fail.
A
Action
  1. Optimistic update: spin thành công → invalidate đúng 3 query key (USER_STATISTICS, USER_TIER, CAMPAIGN_TRANSACTION_HISTORY) để TanStack Query refetch, UI cập nhật ngay.
  2. Multi-spin gộp: quay N lần, aggregate kết quả & chọn tier cao nhất theo priority special > first > normal > consolation > no_prize, show 1 modal gọn.
  3. Guard đủ ticket: kiểm tra ticket TRƯỚC khi gửi tx; thiếu → snackbar, không bắn tx.
  4. Phase detection: tự nhận Phase 1 (deposit) vs Phase 2 (spin) để bật/khoá UI đúng.
R
ResultClaim cảm giác tức thì, không double-spin sai dữ liệu, không đốt phí tx fail. Tôi owner boost engine (162 commit).
C
ChangeĐang đi đường "invalidate-refetch"; nếu làm lại tôi dùng setQueryData cập nhật cache ngay tại chỗ (true optimistic) rồi rollback nếu lỗi — mượt hơn, đỡ 1 vòng refetch.
04

Drill Q&A — Flashcards

Click card để hiện đáp án. Lọc theo project. Bấm ☆ để đánh dấu "đã thuộc" (lưu trong máy). Mục tiêu: nói trôi từ trí nhớ, không đọc.

05

Cheat-sheet khái niệm (nói 1 hơi)

Định nghĩa gọn — phải bật ra ngay khi được hỏi "X là gì?".

Never-say & câu phục hồi

❌ Tuyệt đối KHÔNG nói

  • "Tôi build toàn bộ" (bất kỳ project team nào)
  • "Tôi architect MoneyFi"
  • "Tôi viết LLM provider layer"
  • "Tôi build token resolver"
  • Bịa con số không bảo vệ được

✅ Câu phục hồi khi bí

  • Không biết: "Phần đó [teammate] làm; cái tôi nói được là phần kề bên tôi build: …" → bridge.
  • Quên chi tiết đã viết: "Để tôi dựng lại — entry point là [file/flow], quyết định mấu chốt là [tradeoff]…"
  • Bị chê "chỉ là integration": "Engineering nằm ở [concurrency guard / cost-tier / async pipeline] — để tôi chỉ chỗ không hiển nhiên."
06

Mock Mode — tự test ngẫu nhiên

Một câu hỏi ngẫu nhiên hiện lên. Tự trả lời thành tiếng → bấm "Hiện đáp án" để đối chiếu → "Câu tiếp". Mô phỏng áp lực bị hỏi bất ngờ.

Bấm "Bắt đầu" để random câu hỏi.