GN⁺: 디버깅: 가장 찾기 어려운 문제까지 해결하는 필수 규칙 (2004)
(dwheeler.com)-
데이비드 A. 휠러의 리뷰
- 데이비드 J. 아간스의 "Debugging: The 9 Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems"는 소프트웨어 및 하드웨어 개발자를 위한 필수적인 디버깅 책으로 평가됨.
- 이 책은 특정 기술이 아닌 버그를 찾고 수정하는 기본 원칙을 설명하며, 초보자나 중급 개발자에게 특히 유용함.
- 책은 "아홉 가지 규칙"을 중심으로 구성되어 있으며, 각 규칙에 대한 설명과 적용 방법을 담고 있음.
-
아홉 가지 규칙
- 시스템 이해하기: 매뉴얼을 읽고, 기본을 이해하며, 도구를 잘 활용하는 것이 중요함.
- 실패 유도하기: 실패를 다시 재현하고, 간헐적인 버그의 원인을 찾는 것이 중요함.
- 생각 멈추고 관찰하기: 데이터를 먼저 수집하고, 추측에 의존하지 않음.
- 분할 정복: 문제를 좁혀가며 해결하고, 쉽게 식별할 수 있는 테스트 패턴을 사용함.
- 한 번에 하나씩 변경하기: 핵심 요소를 격리하고, 테스트를 하나씩 변경함.
- 감사 기록 유지하기: 수행한 작업과 결과를 기록하며, 모든 세부 사항이 중요할 수 있음을 이해함.
- 플러그 확인하기: 가정한 것을 의심하고, 도구를 테스트함.
- 새로운 관점 얻기: 새로운 통찰을 얻고, 경험의 목소리를 듣는 것이 중요함.
- 수정되지 않으면 고쳐지지 않음: 문제를 정말로 해결했는지 확인하고, 원인을 수정함.
-
책의 장점과 단점
- 책은 디버깅의 기본 원칙에 집중하며, 다른 기술 관련 책들과 차별화됨.
- 간헐적인 문제를 다루는 방법에 대한 실용적인 조언이 포함되어 있음.
- 책의 부록에는 관련 웹사이트와 포스터 다운로드 링크가 있음.
- 아쉬운 점으로는 모든 규칙과 하위 규칙을 한 페이지에 정리한 목록이 없다는 점과 특정 기술에 대한 구체적인 조언이 부족하다는 점이 있음.
-
결론
- 이 책은 디버깅의 기본 원칙을 배우거나 상기하는 데 유용하며, 초보자와 전문가 모두에게 도움이 됨.
- 데이비드 A. 휠러는 이 책을 강력히 추천하며, 기본 원칙의 중요성을 강조함.
Hacker News 의견
-
버그가 있는 코드를 수정하려는 유혹은 크지만, 고장 난 코드를 수정하는 것보다 작동하는 코드를 망가뜨리는 것이 더 쉬움. 크리스마스 전구 예시처럼 최소한의 작동 예시로 시작하여 문제를 찾는 것이 효과적임
-
문제 해결 시 중요한 것은 당황하지 않는 것임. 명확한 사고가 필요하며, 좋은 관리자는 문제 해결에 집중할 수 있도록 지원해 줌
-
git bisect
는 여러 커밋 중 문제를 일으킨 커밋을 찾는 데 유용함. 특히 큰 코드베이스에서 문제를 빠르게 찾을 수 있음 -
시스템을 이해하는 것이 중요하지만, 모든 매뉴얼을 읽는 것은 비현실적임. 실용적인 접근이 필요함
-
올바른 파일을 올바른 기계에서 편집하는 것이 중요함
-
문제 해결 사고방식을 기르기 위해 추천하는 책들:
- "The Martian" by Andy Weir
- "Zen and the Art of Motorcycle Maintenance"
- "The Three-Body Problem"
- "To Engineer Is Human" by Henry Petroski
- "Surely You're Joking, Mr. Feynman!"
-
추가 규칙:
- "자신의 잘못임을 의심하라". 코드 변경을 먼저 의심해야 함
- "버그를 찾으면 그와 관련된 다른 문제도 찾아라". 같은 종류의 문제가 다른 곳에서도 발생할 수 있음
- "사용자와 유지보수 프로그래머를 우선으로 최적화하라"
-
CI에 버그를 테스트로 추가하여 회귀를 방지해야 함. 수정 전후로 CI가 실패하고 성공하는지 확인해야 함
-
디버깅 후에도 작업이 끝난 것이 아님. 각 버그에 대해 세 가지 질문을 해야 함:
- 이 실수가 다른 곳에도 있는가?
- 이 버그 뒤에 숨겨진 다음 버그는 무엇인가?
- 이런 버그를 방지하기 위해 무엇을 해야 하는가?
-
최소한의 설정으로 문제를 재현하는 것이 중요함. 대부분의 경우 이렇게 하면 버그를 찾을 수 있음. 코드를 반으로 나누어 정확히 어떤 부분이 잘못되었는지 찾는 것이 효과적임