노트

러버덕 디버깅

Rubber Duck Debugging

개발 문화#debugging · 연결된 개념 4개

쉽게 말하면

러버덕 디버깅은 동생에게 수학 문제 풀이를 설명하다가 '아, 여기서 부호를 잘못 넘겼네' 하고 스스로 깨닫는 것과 같아요. 듣는 쪽이 고무 오리여도 말로 하나하나 짚는 순간 머릿속에서 건너뛴 단계가 드러나요.

비유가 깨지는 곳 동생과 달리 오리는 정말 아무 말도 안 해요. 효과는 설명하는 행위에서 나오니, 도움 요청 글에 시도한 것·기대한 결과·실제 결과를 정리하다 답을 찾기도 해요.

책상 위 고무 오리에게 코드를 한 줄씩 설명하다 보면 스스로 문제를 발견하게 된다는 방법이다. 『실용주의 프로그래머』(The Pragmatic Programmer)에 소개되며 널리 알려졌다. 오리는 아무 말도 하지 않는다. 효과는 설명하는 행위 자체에서 나온다.

왜 통하나

  • 머릿속에서는 건너뛰던 단계를 말로 하려면 하나하나 밟아야 한다. "여기서 이 값은 당연히 있고..."라고 말하는 순간 그 '당연히'가 의심스러워진다
  • 남이 이해할 수 있게 설명하려면 문제를 다시 정의해야 한다 → 디버깅 문제 정의 5단계
  • 도움 요청 글을 쓰는 것도 같은 효과가 있다. 시도한 것, 기대한 결과, 실제 결과를 정리하다가 답이 보이기도 한다

막혔을 때 함께 쓰는 방법들

  • 쉬기: 커피, 산책, 점심, 샤워. 쉬는 동안 머리가 계속 일한다
  • 같이 보기: 다른 사람은 다른 도구와 질문을 가져온다
  • 조사 마감 정하기: "30분 안에 못 찾으면 물어본다"
  • 내 코드가 정말 실행되는지 확인하기: 고친 코드가 실제로 실행 경로에 있지 않아서 아무 변화가 없는 경우가 의외로 많다
  • 하기 싫은 일 하기: 미뤄 둔 로그 분석이나 문서 읽기가 답인 경우가 많다

막혔을 때 한 발 물러서 생각을 정리하는 습관은 이너 게임의 STOP과 비슷하다. 다른 전략은 디버깅 포켓 가이드 (개요)에 있다.

출처: The Pragmatic Programmer, 20th Anniversary Edition David Thomas, Andrew Hunt

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 테스트 주도 개발 (TDD)

    코드를 쓰기 전에 실패하는 자동화된 테스트부터 쓰고, 그 테스트를 통과시킨 뒤 중복을 없애는 짧은 주기를 반복하는 개발 방식. 켄트 벡이 정리했다.

  • 알고리즘 문제 풀이 접근법

    낯선 문제를 만났을 때 바로 코드를 쓰기보다 따르는 다섯 단계. 수학자 폴리아(George Pólya)의 『어떻게 문제를 풀 것인가』(*How to Solve It*)에서 이어지는 흐름이다.

  • 섣부른 최적화

    "섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.

  • 언어적 안티패턴

    이름, 타입, 주석이 말하는 것과 코드가 실제로 하는 일이 어긋나는 것. 읽는 사람을 잘못된 추측으로 이끈다.

  • 프로그래머의 뇌 (책 개요)

    코드를 읽고 쓰고 배울 때 뇌의 기억 체계가 어떻게 움직이는지를 인지과학으로 설명하는 펠리너 헤르만스의 책.

보기 옵션