| name | leave-the-why |
| description | Leaves the WHY beside non-obvious decisions โ in commit messages, PR descriptions, and short comments next to surprising code. Never writes ceremonial comments that restate the obvious WHAT; only surfaces the non-obvious reasoning that would otherwise be lost when the author moves on. ์ฝ๋๋ฅผ ์ง ์ฌ๋์ ๋จธ๋ฆฟ์์๋ง ์๋ *์*๋ฅผ ์ฝ๋ ์์ ํ ์ค๋ก ๋จ๊ธฐ๋ ์์ง๋์ด๋ง ์ฒ ํ ์คํฌ. |
| when_to_use | Use when a non-obvious decision is being made, committed, or is about to be lost โ typical moments include writing a commit message ("์ปค๋ฐํ ๊ฒ", "commit message"), drafting a PR description ("PR ์ฌ๋ฆด๊ฒ", "PR description"), encountering a workaround or hack, or answering questions like "์ด๊ฑฐ ์ ์ด๋?", "์ด์ํด ๋ณด์ด๋๋ฐ", "์ฌ๊ธฐ ์ฃผ์ ์ข", "why is this here". Actively avoids docstrings on self-explanatory code; "fix bug" / "update" / "refactor" style messages are rewritten with the actual reason. |
| allowed-tools | Read Edit Bash(git *) |
ํ ์ค. ์ฝ๋๋ ๋ฌด์์ ํ๋์ง ๋งํด์ฃผ์ง๋ง, ์๋ ๋งํด์ฃผ์ง ์๋๋ค. ๊ทธ ํ ์ค์ ๋จ๊ธด๋ค.
Why this mindset
์ง์ง ํ๋ก๊ทธ๋จ์ ์ฝ๋๊ฐ ์๋๋ผ, ๋ง๋ ์ฌ๋ ๋จธ๋ฆฟ์์ ์ดํด์
๋๋ค (Peter Naur, "Programming as Theory Building").
๊ทธ ์ดํด๋ฅผ ๋จ๊ธฐ์ง ์์ผ๋ฉด, ๋ค์ ์ฌ๋ โ ๋ฏธ๋์ ๋ณธ์ธ์ ํฌํจํด์ โ ์ ๊ฐ์ ์๋ฆฌ๋ฅผ ๋ค์ ํค๋งต๋๋ค.
๋ฌด์์ ์ฝ๋๋ฅผ ์ฝ์ผ๋ฉด ์ ์ ์์ต๋๋ค. ํ์ง๋ง ์๋ ๊ทธ ์๋ฆฌ์ ์์ผ๋ฉด ์์ ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ๋จ๊ธธ ๊ฐ์น๊ฐ ์๋ ๋จ ํ ๊ฐ์ง๋ ์์
๋๋ค.
Instructions
๋ชจ๋ ์ค์ ์ฃผ์์ ๋ค๋ ๊ฒ ์๋๋ค. ์๊ฐ ์ฝ๋์์ ์ ๋ณด์ด๋ ์๋ฆฌ์๋ง, ํ ์ค ๋จ๊ธด๋ค.
-
์ปค๋ฐ ๋ฉ์์ง์ ๋ฌด์์ด ์๋๋ผ ์๋ฅผ ํ ์ค๋ก.
diff๊ฐ ๋ฌด์์ด ๋ฐ๋์๋๋ ์ด๋ฏธ ๋งํด์ค๋ค. ๋ฉ์์ง๊ฐ ํ ์ผ์ ์ ๋ฐ๊ฟจ๋. "update component"ยท"fix bug"ยท"refactor" ๊ฐ์ ๊ฑด ๋ ๋ค ์ ๋งํด์ฃผ๋ ๊ฐ์ฅ ์ฝํ ๋ฉ์์ง๋ค.
- ์ฝํจ:
fix login bug
- ๊ฐํจ:
๋ก๊ทธ์ธ ์ ํ ํฐ ๋ง๋ฃ ์ง์ race condition ๋ฐฉ์ง โ ์ฌ๋ฐ๊ธ ํ ์์ฒญ์ด ๋ ๋นจ๋ฆฌ ๋์ฐฉํ๋ ์ผ์ด์ค
-
๋น์๋ช
ํ ๊ฒฐ์ ์์๋ง ์ ์ฃผ์์. ์๋ช
ํ ์ฝ๋ ์์ ์ ์ด๋ค.
ํจ์๊ฐ ๋ฌด์์ ํ๋์ง๋ ์ ์ ๋๋ค โ ์ด๋ฆ์ด ๋งํด์ค์ผ ํ๋ค. ์๋ก์ docstring("์ด ํจ์๋ X๋ฅผ ํ๋ค")์ ๋
ธ์ด์ฆ๊ฐ ๋๋ค. ์ฃผ์์ ์ฝ๋ ์ฌ๋์ด ์์ํดํ ์๋ฆฌ์๋ง.
-
์ฐํยทhackยท์ด์ํด ๋ณด์ด๋ ์ฝ๋์ ๋ฐ๋์ ์ด์ .
*"์ ์ด๋?"*๊ฐ ๋ค์ ์ฌ๋์ ์ฒซ ๋ฐ์์ผ ์๋ฆฌ์, ๊ทธ ์ง๋ฌธ์ด ๋์ค๊ธฐ ์ ์ ๋ต์ ๋๋ค. ํ ์ค์ด๋ฉด ์ถฉ๋ถํ๋ค.
// iOS Safari๊ฐ ์ฒซ ๋ ๋ ์ง์ ์ ํฐํธ ์ฌ์ด์ฆ๋ฅผ ์๋ชป ๊ณ์ฐํด์, 16px ์ด์์ผ๋ก ๊ฐ์
- ์ด ํ ์ค์ด, 6๊ฐ์ ๋ค ๋๊ตฐ๊ฐ๊ฐ "์ธ๋ฐ์์ด ๋ณด์ฌ์" ์ง์ฐ๋ ์ผ์ ๋ง๋๋ค.
-
๋ค์ ์ฌ๋์ ๋ฏธ๋์ ๋ณธ์ธ์ด๋ค.
๋ณธ์ธ์ด ํ ๋ฌ ๋ค ์๊ธฐ ์ฝ๋๋ฅผ ๋ดค์ ๋ *"๋ด๊ฐ ์ ์ด๋ ๊ฒ ํ์ง?"*์ ๋ต์ด ์์ด์ผ ํ๋ค. ์ฝ๋๋ ์ง ์ฌ๋๋ ํ ๋ฌ์ด๋ฉด ๋จ์ด ๋๋ค. ๋ฏธ๋์ ์์ ์๊ฒ ์น์ ํ ํ ์ค์ ๋จ๊ธด๋ค.
-
PR ์ค๋ช
์ ๊ฒฐ์ ์ ๋งฅ๋ฝ์ ๋ด๋๋ค.
์ด๋ค ์ต์
์ด ์์๊ณ , ์ ์ด๊ฑธ ๊ณจ๋๋์ง. ์ฝ๋๋ง ๋ณด๋ฉด ํ ๊ฐ์ง ์ ๋ต์ฒ๋ผ ๋ณด์ด์ง๋ง, ๊ฑฐ๊ธฐ์ ๋ณดํต ๊ณ ๋ฅธ ๊ธธ๊ณผ ๊ณ ๋ฅด์ง ์์ ๊ธธ์ด ์๋ค. ํ์๋ฅผ ํ ์ค ๋จ๊ธฐ๋ฉด โ ๋ค์ ์ฌ๋์ด ๊ฐ์ ๊ธธ์ ๋ค์ ์์ฌํ๋๋ผ ์ฐ๋ ์๊ฐ์ ์ค์ฌ์ค๋ค.
Examples
์ปค๋ฐ ๋ฉ์์ง โ ๋ฌด์์ด ์๋๋ผ ์:
- ์ฝํจ:
add caching
- ๊ฐํจ:
๊ฒ์ ๊ฒฐ๊ณผ ์บ์ฑ ์ถ๊ฐ โ ๋์ผ ํค์๋๋ฅผ 5๋ถ ๋ด ์ฌ๊ฒ์ํ๋ ์ฌ์ฉ์ ํจํด์ด GA์์ 30% ๊ด์ฐฐ๋จ
hack์ ํ ์ค:
const debounced = debounce(handleInput, 100);
์๋ก์ ์ฃผ์์ ์ ์:
function isValidEmail(email: string): boolean { ... }
PR ์ค๋ช
โ ๊ณ ๋ฅธ ๊ธธ๊ณผ ์ ๊ณ ๋ฅธ ๊ธธ:
"์ฅ๋ฐ๊ตฌ๋ ๋๊ธฐํ๋ฅผ ์๋ฒ ๋จ์ผ ์์ค ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ.
์ต์
์ด์๋ ํด๋ผ์ด์ธํธ ๋ง์ง๋ง ์ฐ๊ธฐ ์ฐ์ ์, ๋ค์ค ํญ์์ ์ถฉ๋ ๋น๋๊ฐ ์ธก์ ๋จ๊ณ์์ ๋๋ฌด ๋์ ์ ์ธ.
ํธ๋ ์ด๋์คํ โ ์คํ๋ผ์ธ ๋๊ธฐํ๋ ์ผ๋จ ๋นํ์ฑ. ์ถํ ๋ณ๋ ์ด์๋ก."
Pitfalls
- ๋ฌด์๋ง ์ ํ ์ปค๋ฐ ๋ฉ์์ง (
update, fix, refactor) โ 6๊ฐ์ ๋ค ๋๊ตฌ๋ ์๋ฅผ ๋ชจ๋ฆ
- ์๋ช
ํ ์ฝ๋ ์์ ์๋ก์ ์ฃผ์ โ ๋
ธ์ด์ฆ๋ง ๋๊ณ ์ง์ง ์๋ ๋ฌปํ
- ์ด์ํ ์ฐํ ์ฝ๋๋ฅผ ์ค๋ช
์์ด ๋จ๊ธฐ๊ธฐ โ ๋ค์ ์ฌ๋์ด ๋๋ ค์์ ๋ชป ๋ง์ง / ๋ชจ๋ฅด๊ณ ์ง์
- "์ฝ๋๊ฐ ๋ค ๋งํด์ค์ผ์ง" ๊ทน๋จ์ฃผ์ โ ์๋ ์ฝ๋๊ฐ ์ ๋๋ก ๋งํ์ง ์๋๋ค
- ์ฃผ์์ ๋๋ฌด ๊ธธ๊ฒ โ ๋ค์ ์ฌ๋์ด ์ ์ฝ์. ํ ์ค์ด ์ ๋ต
- ์๊ฐ ์ฝ๋์ ํจ๊ป ๊ฐฑ์ ์ ๋จ โ ๊ฑฐ์ง๋งํ๋ ์ฃผ์. ์ฝ๋๊ฐ ๋ฐ๋๋ฉด ์๋ ๊ฐ์ด.
์ฝ๋๋ ๊ฒฐ๊ณผ๋ฌผ์ด๊ณ , ์ฐ๋ฆฌ๊ฐ ์ง์ง ๋จ๊ธฐ๋ ๊ฑด ์ดํด๋ค. ๊ทธ ์ดํด๋ฅผ ๋ค์ ์ฌ๋ ์์ ์ฅ์ด์ฃผ๋ ํ ์ค์ด, ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์ฐ์ด ์๋๋ผ ๊ธธ๋ก ๋ง๋ ๋ค.