진행 중 · 2026년 6월 7일
ds-forge
직접 만든 인터뷰 대비 플랫폼. 공개된 Lab은 N+1·커넥션 풀 고갈·데드락 같은 프로덕션 DB 장애를 실제 Spring Boot + JPA + PostgreSQL/HikariCP 백엔드에 그대로 재현하고, 자료구조 내부를 '타입 있는 상태 → SVG 뷰 → 즉시 확인' 결정론적 엔진으로 시각화한다. Next.js 15 + 컨테이너화된 Java 러너.
실제 Postgres + HikariCP에 N+1 / 풀 고갈 / 데드락 재현 · 타입 있는 상태에서 자료구조 내부 시각화 · 상태 → SVG 결정론적 렌더링 (simlab 재사용) · 컨테이너화 Java 러너, 편집 즉시 실행
- 역할
- 1인 (Claude Code 페어 프로그래밍)
- 스택
- Next.js 15 · React 19 · TypeScript · Tailwind · MDX · Spring Boot · JPA · PostgreSQL · Docker
백엔드 인터뷰를 준비하려고 만든 플랫폼인데, 빌드 한 번이 곧 코딩 연습 한 번이 되도록 설계했다. 공개된 부분은 Lab — 부하를 올리거나 코드를 고치면 결과가 즉시 눈으로 확인되는 인터랙티브 실험들이다.
Lab에 있는 것
- 프로덕션 장애 샌드박스. N+1 쿼리, 커넥션 풀 고갈, 데드락을 실제 Spring Boot + JPA + PostgreSQL 백엔드(HikariCP)에 재현한다 — SQL을 흉내 낸 게 아니라 진짜로. 트래픽이나 데이터량을 올리면 장애가 실제로 나고, 그다음 고치는 걸 본다.
- 자료구조 내부. 배열·스택·큐·HashMap 등을 손으로 그린 다이어그램이 아니라 실제 타입 있는 상태에서 시각화한다.
- 결정론적 렌더링 엔진.
타입 있는 상태 → SVG 뷰reducer 하나가 모든 시각화를 구동해서, 같은 입력이면 항상 같은 그림이 나온다. 코어는simlab(서킷 브레이커 physics)에서 재사용해 business-event 상태머신으로 re-point한 것.
왜 이렇게 생겼나
척추는 즉시 시각 확인 — 데이터를 넣으면 결정론적 뷰가 나오고, 맞는지 바로 보인다. 이 감각(상태에서 SVG, one-way 레이어 분리)은 블로그·simlab에서 그대로 넘어와서 새 렌더링 학습 곡선이 없었다. Java는 TypeScript로 흉내 내지 않고 컨테이너화된 러너로 진짜 실행되는데, 그게 DB 장애 lab의 핵심이다.
안 되는 것
공개 surface는 Lab 하나뿐이다. AI 페어링·시스템 디자인 연습 surface는 게이팅돼 있고 아직 미완성 — 인터뷰 날짜 이후에 만든 것들이라 그렇다. 백엔드 lab은 컨테이너 러너가 떠 있어야(docker-compose: Caddy + Next + Spring Boot + Postgres) 돌아가서, 프론트만 배포된 상태에선 시각화는 보이지만 실제 Postgres lab은 안 돈다.
프로젝트 로그
이 프로젝트를 만들면서 남긴 트러블슈팅 · 회고 · 업데이트의 시간순 기록.
결정 · 마일스톤
System Design Camp — widening the scope without buying the hype
결정2026년 6월 17일 · 2 분
Built a /sdcamp page covering the full system-design spectrum across 6 layers, ordered by real importance. Started from a Gemini-provided 5-layer framing but corrected two things: added the design-method layer it omitted, and rejected its 'interview system design is only 20%' claim.
Consolidating AI concepts into /ai — dropping the lossy duplicate from /concepts
결정2026년 6월 15일 · 2 분
The /concepts deck carried a derived copy of the 66 AI cards that had lost its model answers, so AI self-attack cards there showed questions with no answer. The copy was byte-identical to the dedicated /ai deck, so removed it and made /ai the single source for AI.
Cold gap-audit 4 days out: the content was ready, the graded rounds weren't drillable
결정2026년 6월 13일 · 3 분
A 7-lens anti-flattery gap-audit found the platform's content was interview-grade but the actually-graded rounds (recruiter screen, ownership question, conflict story) had no practice surface or were mis-wired. With 4 days left, the call was to fill only data-only content gaps and refocus the nav, and to NOT build the new interactive features the audit suggested — drill instead.
빌드 로그
2026년 6월 15일 주11 개 · 8 업데이트 · 1 트러블슈팅 · 2 기술 회고
Frontend vocabulary — the UI-pattern terms a backend engineer keeps not knowing
업데이트2026년 6월 17일 · 1 분
The owner kept hitting basic frontend terms (toast, banner) and not knowing them. The deck had React fundamentals but no everyday UI-pattern vocabulary, so added 26 verified cards with TS/React/CSS code (not Java).
Spend limit reset — re-verified and shipped the remaining 32 should/nice cards
업데이트2026년 6월 16일 · 1 분
The monthly Claude limit that blocked the verify pass reset, so re-ran a verify-only pass over the 32 held technical cards (all passed) and shipped them. 81 of the 89 should/nice cards are now live and fact-verified; the 8 personal-narrative ones stay held.
Filling the should/nice gaps — 49 verified cards shipped, 40 held at the spend limit
업데이트2026년 6월 16일 · 1 분
Generated 89 cards for the remaining should/nice coverage gaps, but the monthly API spend limit was hit partway through the fact-verify pass. Shipped only the 49 that passed verification; the 40 unverified (incl. 8 personal-narrative cards) are held rather than shipped unchecked.
AskCard, persisted — each card becomes a personal learning log
기술 회고2026년 6월 15일 · 1 분
The owner's real goal for the per-card ask-AI box was to record the discussion, not just get one answer — for each topic he keeps hitting things he doesn't know and wants the whole back-and-forth saved. AskCard now persists its Q&A per card to localStorage, so it survives closing the modal and reloads.
The per-card AI becomes a voice conversation, on every studyable surface
기술 회고2026년 6월 15일 · 1 분
The owner wanted to ask and hear the per-card AI by voice — an actual conversation, not typing — and wanted it on system design and phrases too. AskCard now records by mic, transcribes, asks, and speaks the answer back, with the persisted history intact, and it now lives on concepts, AI, system design, LLD, and phrases.
Finishing the bilingual sweep — Move trade-offs and behavioral STAR get their English twins
업데이트2026년 6월 15일 · 2 분
The standing rule is that every Korean study field needs an English twin. The Move Decks' trade-offs and applies-to notes and the behavioral STAR breakdowns were still Korean-only, so translated all 452 strings and rendered both languages.
Code walkthrough goes bilingual — and a sweep for the Korean-only stragglers
업데이트2026년 6월 15일 · 1 분
The owner's standing rule is that every Korean field needs an English twin. The code walkthrough was Korean-only, so generated an English version 1:1 for all 202 cards and rendered both. A field-by-field sweep then surfaced the remaining Korean-only content to fix next.
Coverage audit — stop trusting a hand-built deck, measure what's missing
업데이트2026년 6월 15일 · 2 분
The owner is prepping for an interview trusting only this deck, and asking concurrency terms surfaced that a lot was missing. Rather than patch ad hoc, ran a 9-domain coverage audit (canonical interview topics vs the real deck inventory) to make every gap visible, then started filling the MUST gaps — concurrency first (20 cards).
MUST-gap fill, batches 2-3 — JVM, DSA, distributed, LLD, and the one missing AI card
업데이트2026년 6월 15일 · 1 분
Continued filling the coverage-audit MUST gaps: 31 more /concepts cards (JVM internals, MVCC, system-design estimation/scaling, DSA, distributed-systems depth, LLD patterns) and the one genuinely-missing AI card (vector indexing). 52 cards added total across the three batches.
Last 7 MUST gaps filled — and not fabricating a STAR to do it
업데이트2026년 6월 15일 · 2 분
Closed the final 7 MUST-level coverage gaps across three decks (concepts, phrases, dbperf). Routed the trust-battery / no-surprises gaps to phrase cards (how to articulate them) instead of inventing behavioral STAR stories. MUST coverage is now complete; only should/nice depth remains.
Sparring + AI-audit moved to gpt-5 — and the empty-response trap of reasoning models
트러블슈팅2026년 6월 15일 · 1 분
Upgraded the two adversarial features (sparring, ai-audit) from gpt-4o to gpt-5. The first deploy 502'd with 'unparseable model response' because gpt-5 spent the entire token budget on hidden reasoning; fixed by raising max_completion_tokens and setting reasoning_effort low.
2026년 6월 8일 주22 개 · 6 업데이트 · 6 트러블슈팅 · 8 기술 회고 · 2 사용성 회고
An 'ask AI' button on every card — so the user never has to trust me
기술 회고2026년 6월 14일 · 1 분
After I'd called the study content done before it was verified, the owner stopped trusting the static text outright. Rather than ask him to trust the next round of fixes, added a per-card 'ask AI' box that sends the card's own content as grounding so he can fact-check, clarify, or get examples live — and it's told to flag the card if it's wrong, not defend it.
Deep study layer — model answers for every self-attack, and code explained line by line
기술 회고2026년 6월 14일 · 1 분
The concept and AI cards showed self-attack questions with no model answer, and code with thin comments. Added a senior model answer plus a Korean 'why' for every probe (revealed on tap so you try first), and a function-by-function Korean walkthrough of every code snippet — so each card is an hour-long lesson. The verify stage was rate-limited, so the content shipped generate-only with that flagged.
Fact-checking all 202 cards from source — 45 real errors, no forced changes
트러블슈팅2026년 6월 14일 · 1 분
After repeatedly claiming the study content was done when it wasn't fully verified, ran a pass where 41 agents each read cards from the actual source and fact-checked code, code explanations, English, and model answers. It corrected 23 more cards on top of an earlier 22 — 45 real errors across 202, about a fifth of the deck.
Re-ran the rate-limited verify — 22 wrong model answers, corrected
트러블슈팅2026년 6월 14일 · 1 분
The deep-study layer shipped generate-only because the verify stage was rate-limited. Re-running the fact-check found 22 model answers across 21 cards that were technically wrong — about 3.5% of the generated answers — and corrected them, so the answers are now verified, not just generated.
140 active-vocab cards — the gap was connectors and retrieval, not word count
업데이트2026년 6월 13일 · 2 분
Owner asked how many words he needs to speak actively and for a vocabulary list. The honest answer: functional fluency is ~2,000–3,000 active word families he mostly already knows passively — the real gap is active retrieval under pressure and the connective tissue that keeps speech flowing. Added 140 native-verified high-leverage cards (connectors, hedges, flexible/ownership verbs, engineering collocations) instead of a rare-word list.
AI Audit mode — train default-to-AI by auditing what the AI proposes
기술 회고2026년 6월 13일 · 2 분
The owner's root anxiety is not being able to tell whether AI output is right — which is exactly the JD's default-to-AI grade. Built a voice mode that inverts the spar: the AI proposes a system design or code with planted flaws, and you audit it out loud (restate, flag the risk, ask a clarifying question); it scores understanding and catching, then teaches what you missed.
Auditing Codex's 14k lines of drill content found 4 errors I'd have memorized
트러블슈팅2026년 6월 13일 · 3 분
Codex added ~14k lines of interview-drill content in one commit. A prior Gemini review covered architecture and security but explicitly skipped per-drill content. A content-accuracy audit (review then independent adversarial confirm) found 4 real factual errors in the memorize-and-say material — including an inverted p99 definition and a coin-change DP snippet that crashes.
Backfilling the data/AI jargon I'd scoped out — corpus, vector DB, ETL and 33 more
업데이트2026년 6월 13일 · 1 분
The owner asked what 'corpus' is, then 'why did you leave it out?' He was right — the jargon deck had been scoped to infra/process/git and skipped data and AI-infra terms entirely. Added 36 native-verified cards for that category.
Added English to the Korean-only concept fields — subtitle, probes, failure modes
업데이트2026년 6월 13일 · 1 분
The owner is here to study real English, and Concept Atlas + AI Camp had several study fields in Korean only — the subtitle, the self-attack probes, and the failure modes. The main explanation already had English (rawEn/explainEn), but these did not. Added real-workplace-English versions for all 202 cards and render them alongside the Korean.
84 everyday English phrases, generated then rewritten by a picky native
업데이트2026년 6월 13일 · 1 분
Added 84 everyday and workplace English phrase cards to /phrases across 12 real-life situations. After this session's audits caught errors in raw-generated content, every card went through a second independent native-correctness pass that rewrites or rejects textbook phrasing before it ships.
Expanded 202 concept code snippets from one-liners to verified worked examples
기술 회고2026년 6월 13일 · 2 분
The Concept Atlas and AI Camp code fields averaged 2.9 lines — sketches, not something you could learn the mechanism from. A generate-then-verify workflow rewrote all 202 into complete worked examples (avg 27 lines), each independently correctness-checked, then integrated with html.unescape and template-literal escaping.
A workplace-jargon deck — 76 terms like sidecar and canary, with how they're used
업데이트2026년 6월 13일 · 2 분
The owner kept hitting workplace and infra jargon he'd never heard — sidecar, canary, dark launch, toil, bikeshedding — and felt lost. Generated and native-verified 76 high-frequency jargon cards, each with the meaning, a real sentence using it, and the common misuse to avoid, and routed the long tail to the on-demand term finder.
Turning scattered decks into a start-to-finish learning path
업데이트2026년 6월 13일 · 2 분
Concept Atlas, AI Camp, and Phrases were grouped by domain — useful for lookup, useless for learning in order. Added an AI-built curriculum: ordered stages per deck and a default '순서대로' view that walks the cards from beginner to advanced, numbered.
Listen mode — building the one thing that actually lost the interview
기술 회고2026년 6월 13일 · 2 분
The owner failed an interview for a specific reason: he couldn't parse fast native English in real time and the conversation broke down. The whole platform was speaking-heavy, and its listening surfaces showed the partner's line as text — so the ear never trained. Built a no-subtitles fast-listening drill that reproduces the interview condition.
Phone fix — modal header crushed the title to one word per line
사용성 회고2026년 6월 13일 · 1 분
On the phone, the detail-modal header rendered the title and situation text one word per line. The header was a single flex row where the action buttons ate the width and the flex-1 title block collapsed. Stacked the header on mobile and grouped the buttons into a wrapping container; fixed across phrases, concepts, ai, and checks.
Move Decks enriched — every engineering principle now has tools, trade-offs, an example, and code
기술 회고2026년 6월 13일 · 1 분
Move Decks are the engineering first-principles the sparring and AI-audit graders reason from, but each move only had a seed line, a raw-English line, an explanation, and probes. Enriched all 25 via generate-then-verify: each now carries the real tools it applies to, its actual trade-offs (always shown), a concrete Offer-FSM example, and a verified code snippet.
Name It — turning a raw description into the precise term and a senior's question
기술 회고2026년 6월 13일 · 1 분
The owner named a real fluency gap: he knows the concept but not the English term, so he asks questions clumsily. Built a reverse-glossary mode — dump a raw description and get the precise term(s), a one-line definition, the polished way a senior would ask the question, and related terms.
Quality sweep of all 38 screens — killing the number and label contradictions
트러블슈팅2026년 6월 13일 · 2 분
A cold content-quality inspection of every screen found the platform broadly interview-ready, with the real risk being self-contradicting numbers and labels — the things said out loud in the interview. Fixed nine: a costing story whose throughput and line counts disagreed with themselves, a TTS voice that was computed per accent then hardcoded to alloy, slug labels leaking on the intro screen, and a few mismatched copy and model labels.
System-design drill content: 8 errors including DDL that won't run and capacity math that's off
트러블슈팅2026년 6월 13일 · 2 분
Ran the same generate-then-adversarially-verify accuracy pass over the system-design and DB content (sdtopics.ts, lld.ts, dbperf.ts). Eight confirmed errors: a CREATE TABLE/INDEX pair that fails to run, two wrong read:write ratios spoken verbatim, a DynamoDB-tagged Postgres schema, and several cases where the prose claimed the code handled an edge it didn't.
Sparring upgraded to a real adversarial agent — memory, escalation, teach-on-miss, gpt-5.4
기술 회고2026년 6월 13일 · 2 분
The /sparring drill was a stateless single-turn judge, so it couldn't corner you on your own earlier answers. Gave it conversation memory, a relentless escalating prompt, teach-on-miss (explain the concept when you're lost, then re-ask), and switched the model to gpt-5.4 — which required swapping max_tokens for max_completion_tokens and dropping the custom temperature.
Treadmill+iPad usability pass — fixing 3 shared components fixed 20+ screens
사용성 회고2026년 6월 13일 · 2 분
The app is used all day on a treadmill via iPad. A 35-screen audit found tiny tap targets, sub-14px drill content, and hover-only completion checks as the recurring killers. Fixing SiteHeader, TrackedList, and SpeakGate plus the talk screen fixed the high-severity issues across 20+ screens at once.
ECS deploy reported PHONE LIVE while UpdateService had silently failed
트러블슈팅2026년 6월 11일 · 1 분
A deploy script used the short service name instead of the CloudFormation-generated one; update-service threw ServiceNotFoundException, no rollout happened, but the final health curl hit the old container and printed success. Verification now compares running-task image digest to the pushed ECR digest.