23장 디버깅
목차
- 23.1 디버깅 이슈 소개
- 23.2 결함 발견
- 23.3 결함 수정
- 23.4 디버깅에서 심리학적으로 고려해야 할 사항
- 23.5 디버깅 도구 - 분명한 도구와 그렇지 않은 도구
디버깅은 프로그램에서 발견한 오류의 근본적인 원인을 수정하는 과정이다. 대부분의 프로젝트에서 디버깅이 전체 개발 시간의 50%를 차지한다.
23.1 디버깅 이슈 소개
디버깅을 통해 배울 수 있는 점
- 개발 중인 프로그램에 관해 배울 수 있다.
- 자신이 저지른 실수에 관해 배울 수 있다.
- 자신의 코드를 읽어야 하는 사람의 관점으로부터 코드의 품질에 관해 배울 수 있다.
- 문제를 해결하는 방법을 배울 수 있다.
- 결함을 수정하는 방법을 배울 수 있다.
이 책에서는 비효과적인 디버깅 접근 방법에 대해서도 설명하는데 내 이야기를 하는 것 같았다. 추측으로 결함을 찾고, 결과를 화면에 출력하면서 디버깅을 해왔다. 또한 근본적인 문제 해결보다는 증상을 사라지게 하기 위한 디버깅을 했는데 반성하는 시간이 되었다.
23.2 결함 발견
결함을 찾는 효과적인 접근 방법
- 오류를 재현한다.
- 오류("결점")의 원인을 찾아낸다.
a. 결함을 만들어내는 데이터를 수집한다.
b. 수집된 데이터를 분석하고 결함에 대한 가설을 세운다.
c. 프로그램을 테스트하거나 코드를 살펴봄으로써 가설을 증명하거나 반증할 방법을 결정한다.
d. 2(c)에서 규명한 절차를 사용하여 가설을 증명하거나 반증한다. - 결함을 수정한다.
- 수정 내용을 테스트한다.
- 유사한 오류를 찾는다.
결함을 찾는 데 도움이 되는 팁
- 가설을 세우기 위해서 사용할 수 있는 모든 데이터를 사용하라.
- 오류를 만드는 테스트 케이스를 개선하라.
- 단위 테스트에서 코드를 다루어라.
- 도구를 사용하라.
- 여러 가지 방법으로 오류를 발생시켜라.
- 더 많은 가설을 세우기 위해서 더 많은 데이터를 만들어라.
- 부정적 테스트의 결과를 사용하라.
- 가능한 가설에 대해서 브레인스토밍하라.
- 연습장을 준비해서 시도해 볼 목록을 만들어라.
- 의심스러운 코드 영역을 좁혀라.
- 이전에 결함이 있었던 클래스와 루틴을 의심하라.
- 최근에 변경한 코드를 검사하라.
- 의심스러운 코드 영역을 확장하라.
- 점진적으로 통합하라.
- 일반적인 결함을 검사한다.
- 프로그램에 대해 다른 사람과 이야기를 나누어라.
- 문제로부터 떨어져 휴식을 취하라.
23.3 결함 수정
결함을 수정할 때는 문제를 먼저 이해하고 수정해야 한다. 모든 프로그램 코드를 이해할 필요는 없지만 적어도 결함이 발생한 주변 코드들은 충분한 이해를 한 후 코드를 변경해야 한다. 또한 이전에 말했듯 증상이 아니라 문제를 해결해야 한다. 아래 예제는 전형적인 증상을 해결하는 잘못된 예제다.
수정해야 할 코드
for (claimNumber = 0; claimNumber < numClaims[client]; claimNumber++) {
sum[client] = sum[client] + claimAmount[claimNumber];
}
위의 코드에서 client가 45일 때 sum의 값이 $3.45 차이로 틀렸다고 가정해보자.
문제가 아닌 증상을 해결한 잘못된 코드
for (claimNumber = 0; claimNumber < numClaims[client]; claimNumber++) {
sum[client] = sum[client] + claimAmount[claimNumber];
}
if (client == 45) {
sum[45] = sum[45] + 3.45;
}
위의 코드의 문제는 이번에는 3.45가 다르지만, 다른 환경 또는 다음 날은 3.45가 아니라 다른 값일 수도 있다는 것이다. 초기화 오류로 인해 발생한 문제일 가능성이 클텐데 이는 지금 당장의 증상을 해결하기 위한 임시 방편에 불과하고, 코드의 품질을 크게 떨어뜨린다.
23.4 디버깅에서 심리학적으로 고려해야 할 사항
사람은 보고 싶은 대로 보는 경향이 있다. 특히 자신이 작성한 코드는 이렇게 작성했겠지 하고 넘어가는 경우가 많다. 나 또한 이런 경험을 많이 했고, 내가 작성한 코드를 다른 사람에게 보여줄 때 문제가 다시 보이는 경우가 여러 번 있었다. 최대한 자신의 코드와 심리적 거리를 두고 디버깅을 할 때, 발견하지 못한 결함을 발견할 수 있다.
23.5 디버깅 도구 - 분명한 도구와 그렇지 않은 도구
디버깅 도구
- 소스코드 비교 도구
- 컴파일러 경고 메시지
- 확장된 문법과 논리 검사
- 실행 프로파일러
- 테스트 프레임워크/비계
- 디버거
디버거는 훌륭한 두뇌 활동을 대신할 수 없다. 하지만 어떠한 경우에는 두뇌 활동이 훌륭한 디버거를 대신할 수 없기도 하다. 머리로 생각하고 디버거를 사용하는 것이 가장 효과적이다.
현재 진행중인 프로젝트에서 문제가 발생하면 console.log를 찍어가며 문제를 해결했다. 앞에서 화면에 출력문만을 사용해 디버깅하는 것에 대한 이야기를 읽었을 때 굉장히 찔렸다. JS에서 사용할 수 있는 좋은 디버거를 찾아보고, 결함을 빠르게 찾고 올바르게 수정할 수 있는 좋은 개발자가 되야겠다.