본문 바로가기
프로그래밍 놀이터/Tips

[실용주의 프로그래머] 디버깅

by 돼지왕 왕돼지 2018. 10. 21.
반응형

[실용주의 프로그래머] 디버깅


[실용주의 프로그래머] 디버깅, 가정하지 마라 증명하라, 디버깅 근시, 디버깅 방어시설, 디버깅 사고방식, 디버깅 전략, 디버깅의 심리, 비난 대신 문제를 해결하라, 테스트, 테스트 코드


-

소프트웨어 결함은 요구사항을 오해하는 것에서 코딩 에러에 이르기까지 여러 모습으로 나타난다.





디버깅의 심리


-

디버깅은 단지 문제 해결이라는 사실을 포용하고, 그 방식으로 공략하라.

다른 사람의 버그를 발견한 후, 그 버그를 만들어낸 부정한 범죄자를 비난하는 데에 시간과 노력을 들이는 수가 있다.

하지만 기술의 전당에서는 남을 비난하기보다 문제를 고치는 데에 집중하고 싶어한다.


비난 대신 문제를 해결하라.



-

버그가 여러분의 잘못인지 다른 사람의 잘못인지는 그리 중요한 게 아니다. 어쨌거나 그 버그는 여러분의 문제로 남는다.





디버깅 사고방식


-

디버깅을 시작하기에 앞서서 올바른 사고방식을 갖는 게 중요하다.

자신의 자아를 보호하기 위해 매일 사용하는 많은 방어시설을 꺼버려야 한다.


디버깅 할 때 당황하지 마라.



-

디버깅을 할 때 근시를 조심하라. 표면에 보이는 증상만 고치려는 욕구에 저항하라.

실제 문제는 여러분이 관찰하고 있는 것에서 몇 단계 떨어져 있고, 또 다른 여러 가지와 연관되어 있을 확률이 다분하다.

항상 문제의 근본적인 원인을 발견하려고 노력하고, 그 문제의 특정한 증상만 고치려고 하지 말라.





어디에서 시작할까


-

특정 버그를 살펴보기 전에 깨끗히 컴파일된(경고문 없는)코드로 작업하고 있는지 확인하라.

우리는 일상적으로 컴파일러의 경고 레벨을 최고로 높게 맞춘다.

컴파일러가 대신 찾아 줄 수 있는 문제를 찾느라 시간을 허비한다는 건 말도 안 된다!

우리는 더 어려운 문제에 집중해야 한다.



-

제 삼자를 통하게 되면 버그 보고서의 정확도는 훨씬 더 떨어진다.

자세한 정보를 충분히 얻기 위해서는 해당 버그를 보고한 사용자가 실제로 시연하는 것을 지켜볼 필요도 있다.





디버깅 전략


-

버그를 고치는 최선의 첫 단계는 그 버그를 재현할 수 있게 만드는 것이다.

재현할 수 없다면 그 버그를 고쳤다는 것을 정확히 알 수 없다.



-

데이터를 가시화하라



-

트레이싱(tracing)



-

고무 오리

    문제의 원인을 찾는데 매우 단순하지만 유용한 기법으로 누군가에게 그걸 설명하는 단순한 방법이다. 상대방은 여러분의 어깨 너머로 화면을 바라보면서 자기 머리를 계속 끄덕이다.(마치 고무 오리가 욕탕 안에서 아래위로 까닥이는 것처럼). 그 사람은 한 마디 할 필요 없다. 코드가 무엇을 해야하는지 차근차근 설명해 나가는 단순한 행위 그 자체가 문제를 화면에서 뛰쳐나와 스스로 드러나게 하기도 한다.



-

제거 과정

    OS, 컴파일러 혹은 써드파티 제품에 버그가 있을 수 있다. 하지만 처음부터 그런 생각을 하진 말라. 개발하고 있는 앱 코드에 버그가 존재할 가능성이 훨씬 더 크다. 앱 코드가 라이브러리를 잘못 호출하고 있다고 가정하는 것이 라이브러리 자체에 문제가 있다고 가정하는 것보다 일반적으로 득이 된다.


    ‘select’ 는 망가지지 않았다.





놀람의 요소


-

어떤 버그로 놀라게 될 때(“그건 불가능해” 라고 중얼거리게 될 때), 애지중지 믿고 있던 진실들을 재평가해야만 한다. 여러분이 정말 완벽하다고 알고, 버그의 원인이라고는 생각할 수조차 없는 바로 그 연결 리스트 루틴에서, 모든 경계 조건을 테스트 했는지, 수년간 사용하고 있어서 여전히 버그가 있을 가능성이 없는 그런 코드는 없는지, 버그가 있지는 않은지..


가정하지 마라. 증명하라.



-

놀라운 버그를 마주치면, 단순히 그걸 고치는 것을 넘어서, 왜 이 실패가 더 일찍 발견되지 않았을까 생각해 볼 필요가 있다.

버그를 미리 잡을 수 있도록 단위 테스트나 다른 테스트를 수정할 필요가 있는지 고려하라.



-

버그를 고치는 데 긴 시간이 걸린다면 왜 그런지 자문하라. 다음번에는 이 버그를 좀 더 쉽게 고칠 수 있도록 할 수 있는 뭔가가 있을까? 더 나은 테스팅 훅을 만들어 넣거나, 로그 파일 분석기를 작성할 수도 있겠다.



-

만약 버그가 누군가가 내린 잘못된 가정의 결과라면, 이 문제를 전체 팀과 함께 토론하라. 한 사람이 오해했다는 것은 여러 사람이 그럴 수 있다는 이야기다.





디버깅 체크 리스트




반응형

댓글