| name | systematic-debugging |
| description | Use when encountering any bug, test failure, or unexpected behavior. Enforces a strict reproduce-first, root-cause-first, failing-test-first debugging workflow before fixing. |
Systematic Debugging
์๊ฒฉํ ๋๋ฒ๊น
์ํฌํ๋ก์ฐ๋ค. ๋ฒ๊ทธ, ํ
์คํธ ์คํจ, ์๊ธฐ์น ์์ ๋์์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ค.
ํต์ฌ ๋ชฉ์ ์ ์ธ ๊ฐ์ง๋ค.
- ์ฆ์์ด ์๋๋ผ ์์ธ์ ๊ณ ์น๋ค.
- ์ถ์ธก ๊ธฐ๋ฐ ์์ ์ ๋ง๋๋ค.
- ์คํจ๋ฅผ ํ
์คํธ๋ก ๊ณ ์ ํ ๋ค ์์ ํ๋ค.
Hard Gates
๋ค์ ๊ท์น์ ์์ธ ์์ด ๋ฐ๋ฅธ๋ค.
- ์ฌํ ๋๋ ๊ด์ธก ๊ฐ๋ฅ ์ํ๋ฅผ ๋ง๋ค๊ธฐ ์ ์๋ ์์ ํ์ง ์๋๋ค.
- ์์ธ ๊ฐ์ค์ ๋ช
์ํ๊ธฐ ์ ์๋ ์์ ํ์ง ์๋๋ค.
- ์คํจ ํ
์คํธ ๋๋ ๋๋ฑํ ์ฌํ ์ฅ์น๋ฅผ ๋ง๋ค๊ธฐ ์ ์๋ ์์ ํ์ง ์๋๋ค.
- ํ ๋ฒ์ ํ๋์ ๊ฐ์ค๋ง ๊ฒ์ฆํ๋ค.
- ์์ ์ "while I'm here" ๋ฆฌํฉํฐ๋ง์ ๊ธ์งํ๋ค.
- ์์ ์๋๊ฐ 3๋ฒ ์คํจํ๋ฉด ์ถ๊ฐ ํจ์น ์ ์ ๊ตฌ์กฐ์ ๋ฌธ์ ๋ฅผ ์์ฌํ๋ค.
์ด ๊ณผ์ ์ ์ด๊ธฐ๋ ๊ฒ์ ๋๋ฒ๊น
์คํจ๋ก ๋ณธ๋ค.
When To Use
๋ค์ ์ํฉ์ด๋ฉด ์ด ์คํฌ์ ์ฌ์ฉํ๋ค.
- ํ
์คํธ๊ฐ ์คํจํ ๋
- ์ด์ ๋๋ ๋ก์ปฌ์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ๋
- ์์๊ณผ ๋ค๋ฅธ ์๋ต, ์ํ, ๋ ๋๋ง, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๋
- ์ฑ๋ฅ ์ ํ, ํ์์์, ๋ ์ด์ค ์ปจ๋์
, ๊ฐํ ์คํจ๋ฅผ ์กฐ์ฌํ ๋
- ์ด๋ฏธ ํ ๋ฒ ์ด์ ๊ณ ์ณค๋๋ฐ ๋ค์ ๊นจ์ก์ ๋
๋ค์ ํ๊ณ๋ ํ์ฉํ์ง ์๋๋ค.
- "๊ฐ๋จํด ๋ณด์ฌ์ ๋ฐ๋ก ๊ณ ์น๋ฉด ๋๋ค"
- "์๊ฐ์ด ์์ผ๋ ์ผ๋จ ํจ์นํ๊ณ ๋ณด์"
- "์ด๊ฑฐ ๊ฐ์ผ๋๊น ๊ทธ๋ฅ ๋ฐ๊ฟ๋ณด์"
Required Output Contract
์ด ์คํฌ์ ์ฌ์ฉํ ๋๋ ๋ด๋ถ์ ์ผ๋ก ์๋ ํญ๋ชฉ์ ๋ฐ๋์ ๊ณ ์ ํ๋ค.
- Problem statement: ๋ฌด์์ด ์๋ชป๋์๋์ง ํ ๋ฌธ์ฅ์ผ๋ก ์ ์
- Reproduction path: ์ด๋ป๊ฒ ์คํจ๋ฅผ ์ฌํํ๊ฑฐ๋ ๊ด์ธกํ ์ง
- Evidence: ์ค์ ๊ด์ธก ๊ฒฐ๊ณผ
- Root-cause hypothesis: ์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๊ณ ๋ณด๋์ง
- Failing guard: ์คํจ ํ
์คํธ, ์ฌํ ์คํฌ๋ฆฝํธ, ๋ก๊ทธ ๊ฒ์ฆ ์ค ํ๋
- Fix: ์์ธ์ ๋ํ ๋จ์ผ ์์
- Verification: ์์ ํ ์ฌํ ๊ฒฝ๋ก์ ๊ด๋ จ ํ
์คํธ ๊ฒฐ๊ณผ
์ด 7๊ฐ ์ค ๋น ์ง ํญ๋ชฉ์ด ์์ผ๋ฉด ์์ง ๋๋ ์ผ์ด ์๋๋ค.
Workflow
๋ฐ๋์ ์๋ ์์๋ก ์งํํ๋ค.
Phase 1. Define The Problem
๋จผ์ ๋ฌธ์ ๋ฅผ ์ถ์ฝํ๋ค.
- ์ค์ ๊ธฐ๋ ๋์์ ๋ฌด์์ธ๊ฐ
- ์ค์ ๊ด์ธก ๋์์ ๋ฌด์์ธ๊ฐ
- ์ํฅ ๋ฒ์๋ ์ด๋๊น์ง์ธ๊ฐ
- ํญ์ ์ฌํ๋๋๊ฐ, ๊ฐํ์ ์ธ๊ฐ
์ถ๋ ฅ ํ์:
Problem: <expected> but got <actual> under <condition>
์ฆ์๊ณผ ์ถ์ธก์ ์์ง ์๋๋ค.
Good: Product detail API returns 500 when brand is null.
Bad: Serializer is broken because brand mapping seems wrong.
Phase 2. Reproduce Or Instrument
์์ ์ ์ ์คํจ๋ฅผ ๋ค์ ๋ณผ ์ ์์ด์ผ ํ๋ค.
์ฐ์ ์์:
- ๊ธฐ์กด ํ
์คํธ๋ก ์ฌํ
- ์ต์ ํตํฉ ํ
์คํธ๋ก ์ฌํ
- ๋จ์ ํ
์คํธ๋ก ์ฌํ
- ์ฌํ ์คํฌ๋ฆฝํธ ๋๋ ๋ช
๋ น์ผ๋ก ๊ด์ธก
- ๋ก๊ทธ/๊ณ์ธก ์ถ๊ฐ ํ ๊ด์ธก
๊ท์น:
- ์ฌํ ๊ฒฝ๋ก๋ ๊ฐ๋ฅํ ํ ๊ฐ์ฅ ์๊ฒ ๋ง๋ ๋ค.
- UI์์๋ง ๋ณด์ด๋ ๋ฒ๊ทธ๋ผ๋ ๋ ์๋ ๊ณ์ธต์์ ์ฌํ ๊ฐ๋ฅํ๋ฉด ๊ทธ์ชฝ์ ์ ํธํ๋ค.
- ๊ฐํ ์คํจ๋ฉด ๋ก๊ทธ, ์
๋ ฅ, ์๊ฐ, ๋์์ฑ ์กฐ๊ฑด์ ์ถ๊ฐํด ๊ด์ธก์ฑ์ ๋์ธ๋ค.
- ์ฌํ๋์ง ์์ผ๋ฉด ์์ ์ผ๋ก ๋์ด๊ฐ์ง ๋ง๊ณ ๊ด์ธก ์๋จ์ ๋๋ฆฐ๋ค.
์ฌํ ๋ถ๊ฐ ์ํ์์ ํด์ผ ํ ์ผ:
- ์
๋ ฅ๊ฐ ๊ธฐ๋ก
- ํ๊ฒฝ ์ฐจ์ด ํ์ธ
- ์ต๊ทผ ๋ณ๊ฒฝ์ ํ์ธ
- ๊ฒฝ๊ณ ์ง์ ๋ณ ๋ก๊ทธ ์ถ๊ฐ
- ๋์ผ ์ฆ์์ ๋ง๋๋ ๋ ์์ ์กฐ๊ฑด ํ์
Phase 3. Gather Evidence
๊ด์ธก ๊ฐ๋ฅํ ์ฌ์ค๋ง ๋ชจ์๋ค.
ํญ์ ํ์ธํ ๊ฒ:
- ์๋ฌ ๋ฉ์์ง์ ์คํํธ๋ ์ด์ค ์ ๋ฌธ
- ์คํจ ์
๋ ฅ๊ฐ
- ์ต๊ทผ ๋ณ๊ฒฝ ํ์ผ ๋๋ ์ปค๋ฐ
- ํ๊ฒฝ/์ค์ ์ฐจ์ด
- ํธ์ถ ๊ฒฝ๋ก์ ๋ฐ์ดํฐ ํ๋ฆ
๋ฉํฐ ์ปดํฌ๋ํธ ๋ฌธ์ ์์๋ ๊ฒฝ๊ณ๋ง๋ค ํ์ธํ๋ค.
์์:
- controller -> application -> service -> repository
- client -> API -> external service
- scheduler -> batch service -> database
๊ฐ ๊ฒฝ๊ณ์์ ํ์ธํ ๊ฒ:
- ๋ฌด์์ด ๋ค์ด์๋๊ฐ
- ๋ฌด์์ด ๋๊ฐ๋๊ฐ
- ์ด๋ค ๊ฐ์ด ๋ณํ๋์๋๊ฐ
- ์ด๋ค ์กฐ๊ฑด์์๋ง ๊นจ์ง๋๊ฐ
๋ฌธ์ ์์น๋ฅผ ํน์ ํ๊ธฐ ์ ์๋ ๊ณ ์น์ง ์๋๋ค.
Phase 4. Isolate Root Cause
์์ธ ํ๋ณด๋ฅผ ํ๋๋ง ์ธ์ด๋ค.
ํ์:
Hypothesis: <root cause> because <evidence>
์ข์ ๊ฐ์ค์ ์กฐ๊ฑด:
- ๋จ์ผ ์์ธ์ ๊ฐ๋ฆฌํจ๋ค
- ๊ด์ธก ์ฆ๊ฑฐ์ ์ฐ๊ฒฐ๋๋ค
- ์์ ์คํ์ผ๋ก ๋ฐ์ฆ ๊ฐ๋ฅํ๋ค
๋์ ๊ฐ์ค์ ์:
- "์ด๋๊ฐ ๋น๋๊ธฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ๋ค"
- "์ง๋ ฌํ ์ชฝ ์ ์ฒด๊ฐ ๋ถ์์ ํ ๋ฏํ๋ค"
์์ธ์ ์์ค๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ค. ์ค๋ฅ๊ฐ ๊น์ ์คํ์์ ๋ณด์ด๋ฉด ์ฆ์์ด ์๋๋ผ ์
๋ ฅ์ ์ถ์ฒ๋ฅผ ์ถ์ ํ๋ค.
Phase 5. Lock The Failure
์์ ์ ์ ์คํจ๋ฅผ ๊ณ ์ ํ๋ค.
์ฐ์ ์์:
- ์๋ํ๋ failing test
- ๊ธฐ์กด ํ
์คํธ์ ํ๊ท ์ผ์ด์ค ์ถ๊ฐ
- ์ต์ ์ฌํ ์คํฌ๋ฆฝํธ
- ๋ก๊ทธ/์ด์ค์
๊ธฐ๋ฐ ์์ ๊ฒ์ฆ ์ฅ์น
๊ท์น:
- ๊ฐ๋ฅํ๋ฉด ์๋ํ ํ
์คํธ๋ฅผ ๋ง๋ ๋ค.
- ์์ ์ ์๋ ์คํจํด์ผ ํ๋ค.
- ์์ ํ์๋ ๊ฐ์ ๊ฒฝ๋ก์์ ํต๊ณผํด์ผ ํ๋ค.
- ํ
์คํธ ์ด๋ฆ์ ๋ฌด์์ด ๊นจ์ก๋์ง ๋๋ฌ๋ด์ผ ํ๋ค.
์๋ํ ํ
์คํธ๋ฅผ ์ธ ์ ์์ผ๋ฉด test-driven-development ์คํฌ์ ํจ๊ป ์ฌ์ฉํ๋ค.
Phase 6. Implement A Single Fix
์์ ์ ํ๋์ ๊ฐ์ค๋ง ๋ค๋ฃฌ๋ค.
ํ์ฉ:
- ์์ธ์ ์ง์ ๋์ํ๋ ์ต์ ์ฝ๋ ๋ณ๊ฒฝ
- ๊ฒ์ฆ์ ํ์ํ ์ต์ํ์ ๋ณด์กฐ ์์
๊ธ์ง:
- ๊ด๋ จ ์์ด ๋ณด์ด๋ ์ฌ๋ฌ ์์ ๋ฌถ๊ธฐ
- ๋ฆฌํฉํฐ๋ง ๊ฒธ ์์
- ํฌ๋งท/์ ๋ฆฌ/์ด๋ฆ ๋ณ๊ฒฝ ๋ผ์๋ฃ๊ธฐ
- ๊ทผ๊ฑฐ ์๋ null-guard ์ถ๊ฐ
- ์์ธ ์ผํค๊ธฐ
์คํจํ๋ฉด ์ฆ์ ๋ค์ Phase 1 ๋๋ Phase 3์ผ๋ก ๋์๊ฐ๋ค. ์ด์ ๊ฐ์ค์ด ํ๋ ธ๋ค๋ ๋ป์ด๋ค.
Phase 7. Verify And Close
์๋๋ฅผ ๋ชจ๋ ๋ง์กฑํด์ผ ์ข
๋ฃํ๋ค.
- ์๋ ์ฌํ ๊ฒฝ๋ก๊ฐ ๋ ์ด์ ์คํจํ์ง ์๋๋ค.
- ์ failing guard๊ฐ ํต๊ณผํ๋ค.
- ๊ด๋ จ ํ
์คํธ๊ฐ ๊นจ์ง์ง ์๋๋ค.
- ์์ ์ด ์ฆ์์ด ์๋๋ผ ์์ธ์ ๋ง๋๋ค๋ ์ค๋ช
์ด ๊ฐ๋ฅํ๋ค.
๊ฐํ ๋ฒ๊ทธ๋ผ๋ฉด ํ ๋ฒ ํต๊ณผ๋ก ๋๋ด์ง ์๋๋ค. ๋ฐ๋ณต ์คํ ๋๋ ์กฐ๊ฑด ๋ณํ ํ ๊ฒ์ฆ์ด ํ์ํ๋ค.
Stop Conditions
๋ค์ ์ํฉ์ด๋ฉด ๋ฉ์ถ๊ณ ํ๋ ์์ ๋ค์ ์ก๋๋ค.
1. Reproduction Failed
์ฌ๋ฌ ๋ฒ ์๋ํด๋ ์ฌํ์ด ์ ๋๋ฉด:
- ๊ด์ธก ์๋จ์ด ๋ถ์กฑํ์ง ๋ณธ๋ค.
- ํ๊ฒฝ ์ฐจ์ด๊ฐ ์๋์ง ๋ณธ๋ค.
- ๋ฌธ์ ์ ์๊ฐ ์๋ชป๋์๋์ง ๋ณธ๋ค.
์ฌํ์ด ์ ๋๋๋ฐ ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ ๊ธ์ง๋ค.
2. Three Failed Fixes
์ธ ๋ฒ ์ฐ์์ผ๋ก ์์ ์ด ๋น๋๊ฐ๋ฉด ์ด๋ ๊ฒ ํ๋จํ๋ค.
- ํ์ฌ ์ดํด๊ฐ ํ๋ ธ๊ฑฐ๋
- ๋ฌธ์ ๊ฐ ๊ณต์ ์ํ, ๊ฒฝ๊ณ ์ค๊ณ, ์ฑ
์ ๋ถ๋ฆฌ ๊ฐ์ ๊ตฌ์กฐ ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค
์ด ์์ ๋ถํฐ๋ "๋ค ๋ฒ์งธ ๋์ง"์ด ์๋๋ผ ๊ตฌ์กฐ ๋
ผ์๊ฐ ํ์ํ๋ค.
3. No Failing Guard
์คํจ ํ
์คํธ๋ ๋๋ฑํ ์ฌํ ์ฅ์น๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉด, ์๋ฃ๋ก ์ ์ธํ์ง ์๋๋ค. ์ต์ํ ์ฌํ ๋ช
๋ น๊ณผ ๊ด์ธก ๊ฒฐ๊ณผ๋ฅผ ๋จ๊ธด๋ค.
Red Flags
์๋ ์๊ฐ์ด ๋ค๋ฉด ์ฆ์ ๋ฉ์ถ๊ณ ์ ๋จ๊ณ๋ก ๋์๊ฐ๋ค.
- "์ด ์ค๋ง ๋ฐ๊ฟ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค"
- "๋ก๊ทธ๋ ๋์ค์ ๋ณด๊ณ ์ผ๋จ ์์ ํด๋ณด์"
- "ํ
์คํธ๋ ๋์ค์ ์ถ๊ฐํ์ง ๋ญ"
- "ํ ๋ฒ์ ์ด๊ฒ๋ ์ ๊ฒ๋ ๊ฐ์ด ๊ณ ์น์"
- "์๋ฌ๋ ์ฌ๋ผ์ก์ผ๋ ์์ธ์ ๋ชฐ๋ผ๋ ๋๋ค"
Minimal Checklist
์คํ ์ค์๋ ์๋ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ค๋ก ๊ฒ์ฆํ๋ค.
Completion Standard
์ด ์คํฌ์ ์๋ฃ ๊ธฐ์ค์ "์ฝ๋๊ฐ ๋ฐ๋์๋ค"๊ฐ ์๋๋ค.
์๋ฃ ๊ธฐ์ค:
- ๋ฌธ์ ์ ์๊ฐ ๋ช
ํํ๋ค
- ์คํจ๊ฐ ์์ ์ ์ ๊ณ ์ ๋์๋ค
- ์์ ์ด ์์ธ๊ณผ ์ฐ๊ฒฐ๋๋ค
- ๊ฒ์ฆ ๊ฒฐ๊ณผ๊ฐ ๋จ์ ์๋ค
์ด ๋ค ๊ฐ์ง๊ฐ ์์ผ๋ฉด ๋๋ฒ๊น
์ ๋๋ ๊ฒ์ด ์๋๋ค.