[실용주의 프로그래머] 디버깅 |
-
소프트웨어 결함은 요구사항을 오해하는 것에서 코딩 에러에 이르기까지 여러 모습으로 나타난다.
디버깅의 심리
-
디버깅은 단지 문제 해결이라는 사실을 포용하고, 그 방식으로 공략하라.
다른 사람의 버그를 발견한 후, 그 버그를 만들어낸 부정한 범죄자를 비난하는 데에 시간과 노력을 들이는 수가 있다.
하지만 기술의 전당에서는 남을 비난하기보다 문제를 고치는 데에 집중하고 싶어한다.
비난 대신 문제를 해결하라.
-
버그가 여러분의 잘못인지 다른 사람의 잘못인지는 그리 중요한 게 아니다. 어쨌거나 그 버그는 여러분의 문제로 남는다.
디버깅 사고방식
-
디버깅을 시작하기에 앞서서 올바른 사고방식을 갖는 게 중요하다.
자신의 자아를 보호하기 위해 매일 사용하는 많은 방어시설을 꺼버려야 한다.
디버깅 할 때 당황하지 마라.
-
디버깅을 할 때 근시를 조심하라. 표면에 보이는 증상만 고치려는 욕구에 저항하라.
실제 문제는 여러분이 관찰하고 있는 것에서 몇 단계 떨어져 있고, 또 다른 여러 가지와 연관되어 있을 확률이 다분하다.
항상 문제의 근본적인 원인을 발견하려고 노력하고, 그 문제의 특정한 증상만 고치려고 하지 말라.
어디에서 시작할까
-
특정 버그를 살펴보기 전에 깨끗히 컴파일된(경고문 없는)코드로 작업하고 있는지 확인하라.
우리는 일상적으로 컴파일러의 경고 레벨을 최고로 높게 맞춘다.
컴파일러가 대신 찾아 줄 수 있는 문제를 찾느라 시간을 허비한다는 건 말도 안 된다!
우리는 더 어려운 문제에 집중해야 한다.
-
제 삼자를 통하게 되면 버그 보고서의 정확도는 훨씬 더 떨어진다.
자세한 정보를 충분히 얻기 위해서는 해당 버그를 보고한 사용자가 실제로 시연하는 것을 지켜볼 필요도 있다.
디버깅 전략
-
버그를 고치는 최선의 첫 단계는 그 버그를 재현할 수 있게 만드는 것이다.
재현할 수 없다면 그 버그를 고쳤다는 것을 정확히 알 수 없다.
-
데이터를 가시화하라
-
트레이싱(tracing)
-
고무 오리
문제의 원인을 찾는데 매우 단순하지만 유용한 기법으로 누군가에게 그걸 설명하는 단순한 방법이다. 상대방은 여러분의 어깨 너머로 화면을 바라보면서 자기 머리를 계속 끄덕이다.(마치 고무 오리가 욕탕 안에서 아래위로 까닥이는 것처럼). 그 사람은 한 마디 할 필요 없다. 코드가 무엇을 해야하는지 차근차근 설명해 나가는 단순한 행위 그 자체가 문제를 화면에서 뛰쳐나와 스스로 드러나게 하기도 한다.
-
제거 과정
OS, 컴파일러 혹은 써드파티 제품에 버그가 있을 수 있다. 하지만 처음부터 그런 생각을 하진 말라. 개발하고 있는 앱 코드에 버그가 존재할 가능성이 훨씬 더 크다. 앱 코드가 라이브러리를 잘못 호출하고 있다고 가정하는 것이 라이브러리 자체에 문제가 있다고 가정하는 것보다 일반적으로 득이 된다.
‘select’ 는 망가지지 않았다.
놀람의 요소
-
어떤 버그로 놀라게 될 때(“그건 불가능해” 라고 중얼거리게 될 때), 애지중지 믿고 있던 진실들을 재평가해야만 한다. 여러분이 정말 완벽하다고 알고, 버그의 원인이라고는 생각할 수조차 없는 바로 그 연결 리스트 루틴에서, 모든 경계 조건을 테스트 했는지, 수년간 사용하고 있어서 여전히 버그가 있을 가능성이 없는 그런 코드는 없는지, 버그가 있지는 않은지..
가정하지 마라. 증명하라.
-
놀라운 버그를 마주치면, 단순히 그걸 고치는 것을 넘어서, 왜 이 실패가 더 일찍 발견되지 않았을까 생각해 볼 필요가 있다.
버그를 미리 잡을 수 있도록 단위 테스트나 다른 테스트를 수정할 필요가 있는지 고려하라.
-
버그를 고치는 데 긴 시간이 걸린다면 왜 그런지 자문하라. 다음번에는 이 버그를 좀 더 쉽게 고칠 수 있도록 할 수 있는 뭔가가 있을까? 더 나은 테스팅 훅을 만들어 넣거나, 로그 파일 분석기를 작성할 수도 있겠다.
-
만약 버그가 누군가가 내린 잘못된 가정의 결과라면, 이 문제를 전체 팀과 함께 토론하라. 한 사람이 오해했다는 것은 여러 사람이 그럴 수 있다는 이야기다.
디버깅 체크 리스트
'프로그래밍 놀이터 > Tips' 카테고리의 다른 글
[실용주의 프로그래머] 코드 생성기 (0) | 2018.10.23 |
---|---|
[실용주의 프로그래머] 텍스트 처리 (0) | 2018.10.22 |
[실용주의 프로그래머] 소스코드 관리 (0) | 2018.10.20 |
[실용주의 프로그래머] 파워 에디팅 (0) | 2018.10.19 |
[실용주의 프로그래머] 조개 놀이 (Shell Games) (0) | 2018.10.18 |
댓글