동생아, 디버깅으로 인생 갈아넣기 전에 이것만은 꼭 새겨들어라.
1. 로그를 찍어라. 무조건, 반드시, 아무리 간단해 보여도.
나는 “이 정도는 당연히 잘 되겠지”라고 생각하며 로그 없이 코드를 짰다가 얼마나 많은 밤을 샜는지 모른다. 그 “당연한” 부분에서 버그가 터진다. 무조건 터진다.
# 이렇게 하지 마라
result = some_function(data)
process_result(result)
# 이렇게 해라, 제발
print(f"입력 데이터: {data}")
result = some_function(data)
print(f"함수 결과: {result}")
process_result(result)
형이 3일 밤새서 찾은 버그가 사실 입력 데이터가 None이었던 거였다. 로그 한 줄이면 30분에 끝날 일을.
2. 문제를 재현할 수 있게 만들어라
“가끔 안 돼요”, “랜덤하게 터져요” 이런 말 하는 순간 너는 지옥에 발을 담그는 거다. 재현이 안 되면 고칠 수도 없다.
- 정확히 언제 터지는지 기록해라
- 어떤 입력에서 터지는지 파악해라
- 최소한의 재현 코드를 만들어라
형은 한 달 동안 “가끔 터지는” 버그 때문에 머리털이 다 빠졌다. 알고보니 타임존 문제였는데, 재현 케이스를 만들었으면 하루면 찾을 수 있었을 것을.
3. 가정을 의심해라. 특히 너 자신의 가정을.
“이 변수는 당연히 숫자일 거야”, “이 함수는 항상 성공할 거야”, “사용자는 정상적인 값만 입력할 거야”
아니다. 절대 아니다.
내가 “당연히”라고 생각한 모든 것들이 버그의 온상이었다. 변수 타입 체크해라, 함수 리턴값 검증해라, 사용자 입력 validation 해라.
4. 고무 오리와 대화해라 (진짜로)
동료에게 설명하다가 “아 잠깐, 여기가 문제네요”라고 말한 경험 있을 거다. 그게 바로 고무 오리 디버깅이다.
오리 인형 하나 사서 책상에 놓고, 버그 설명해줘라. 바보같아 보여도 진짜 효과 있다. 형은 이거 때문에 동료들한테 미친놈 소리 들었지만, 버그는 확실히 빨리 찾았다.
5. 이분 탐색으로 범위를 좁혀라
1000줄 코드에서 버그 찾는다고 1000줄 다 보지 마라. 미친다.
- 절반 주석처리해서 버그가 사라지는지 확인
- 사라지면 그 절반에 문제 있음
- 안 사라지면 나머지 절반에 문제 있음
- 반복
이렇게 하면 10번 안에 문제 구간 찾는다. 형은 이걸 몰라서 며칠씩 삽질했다.
6. 버전 관리의 힘을 믿어라
“어제까지 잘 됐는데 갑자기 안 돼요” 하는 순간, git blame이 너의 구원자다.
git log --oneline
git diff HEAD~1 # 마지막 커밋과 비교
git bisect start # 이분탐색으로 문제 커밋 찾기
코드 한 줄 바꿀 때마다 커밋해라. 나중에 후회한다.
7. 테스트 케이스를 먼저 만들어라
버그 고치기 전에 그 버그를 재현하는 테스트를 만들어라. 고친 후에도 그 테스트가 통과하는지 확인해라.
def test_bug_reproduction():
# 이 테스트는 버그 때문에 실패해야 함
result = buggy_function(problematic_input)
assert result == expected_output
테스트 없이 고치면 다른 곳이 터진다. 보장한다.
8. 스택 오버플로우는 신이다. 하지만 맹신하지 마라.
99% 확률로 너와 같은 문제를 겪은 사람이 있다. 하지만 코드 복붙만 하지 말고 이해하고 써라.
형은 스택 오버플로우 답변 그대로 복붙했다가 보안 취약점 만든 적 있다. 이해하고 써라.
9. 휴식을 취해라. 진짜로.
3시간 넘게 같은 버그와 씨름하고 있으면 뇌가 굳는다. 산책하러 나가라. 샤워해라. 밥 먹어라.
형이 일주일 동안 못 찾은 버그를, 휴식 후 10분 만에 찾은 적이 한두 번이 아니다.
10. 문서를 읽어라. API 문서, 라이브러리 문서, 전부.
“아마 이럴 거야”로 추측하지 마라. 공식 문서에 답이 있다.
특히 에러 메시지 무시하지 마라. 에러 메시지는 버그가 뭔지 친절하게 알려주는 거다. 영어 무서워하지 말고 한 줄 한 줄 읽어라.
마지막으로 하고 싶은 말
디버깅은 탐정 놀이다. 재미있을 수도 있다. 하지만 밤새우면서 할 필요는 없다.
위의 것들을 지켰다면 나는 지금보다 훨씬 덜 지쳐있었을 거고, 머리도 덜 빠졌을 거고, 연인과도 덜 싸웠을 것이다.
동생아, 제발 나 같은 삽질하지 마라. 코드는 도구일 뿐이고, 인생이 더 소중하다.
P.S. 정말로 막히면 동료에게 도움 요청해라. 혼자 끙끙대는 게 미덕이 아니다. 30분 설명으로 해결될 일을 3일 동안 붙잡고 있지 마라.