제공 :
한빛 네트워크
저자 : Brian MacDonald
역자 : 조우진(
http://www.notforme.kr/)
원문 :
Debugging for beginners
누구도 완벽하지 않다. 당신의 코드 역시 완벽하지 않지만 그래도 괜찮다.
나는 지난번에 개발자들이 싫어하는
주석 달기를 논했기 때문에 개발자들을 절망하게 하는 또 다른 큰 근원인 디버깅을 다루고 싶다고 생각했다.
버그는 항상 존재한다. 프로그래밍의 역사에서 모든 개발자는 디버깅을 해야 했으며, 이는 나비들로 코드를 작성하는 전설적인 사람들까지도 마찬가지다. 숙련된 프로그래머가 된다는 것은 결코 에러를 만들지 않는 것을 의미하는 것이 아니다. 그것은 에러를 찾아서 수정하는 능력을 신장시키는 것이다. 당신이 코딩하기 시작할 때 코드를 자세히 살피고, 문법을 유의하며, 머릿속으로 실행과정을 추적하여 문제를 찾아낼 수 있을 만큼 당신의 프로그램은 아주 작을 것이다. 그러나 일단 초기 단계를 넘어서면 버그를 찾기 위한 몇 가지 도움이 필요하게 될 것이다.
통합개발환경(IDE)이 작업하도록 하라
통합개발환경(IDE)을 이야기하면서
당신의 첫 언어를 선택하는 것에 대해서 언급했을 때, 나는 디버깅할 때 좋은
통합개발환경(IDE)이 담당하는 역할을 다루었다. 대부분 통합개발환경(IDE)은 당신에게 컴파일 에러를 보고할 것이고, 때때로 에러가 무엇을 의미하는지 명확한 정보를 제공하며, 에러가 발생한 코드의 라인으로 안내할 수 있다(그러나 그곳이 언제나 정확한 지점은 아니다). 만약 당신이 int로 변수를 선언한 후에 float 타입의 값을 대입하려고 하면, 통합개발환경(IDE)은 에러의 원인으로 당신이 수정해야만 하는 곳인 실제로 변수의 선언부에 해당하는 부분을 가리킬 수도 있다.
통합개발환경(IDE)의 에러 관련 기능들보다 더욱 가치 있는 것은 브레이크 포인트와 단계별 코드실행 능력이다. 대부분의 기본적인 통합개발환경(IDE)까지도 당신이 코드를 실행하고 실행이 완료되기 전에 특정한 지점에서 멈출 수 있게 해준다. 상당수 통합개발환경(IDE)은 문제가 어디에 있는지를 결정하는데 주로 도움을 주는 정보로 프로그램 내부의 어느 포인트의 데이터를 조사하는 것을 도와준다. 만약 당신이 주어진 포인트에서 변수의 값이 무엇이어야 하는지 알고 있다면, 코드의 포인트를 전후로 하여 버그가 있는지를 알 수 있다.
아니면 코드가 당신에게 보고하도록 만들어라
통합개발환경(IDE) 도움 없이도 프로그램 작동하는 중에 당신은 여전히 변수나 함수의 값을 확인할 수 있다. 거의 모든 언어는 콘솔이나 로그파일에 메시지를 출력하는 함수를 가지고 있으며 디버깅 중에 데이터를 얻고자 이 함수를 사용할 수도 있다. 어떠한 루프 중에 count 변수의 값이 무엇인지 알고 싶은가? 콘솔에 값을 출력하면 된다. 어떤 특정한 함수가 절대 호출되지 않을까 봐 걱정되는가? 함수 호출 시 메시지를 로깅하도록 그 함수 안에 한 문장을 삽입하면 된다. 정확히 어떻게 이러한 작업을 하는지는 사용 언어에 의존하지만, 직접 당신의 작업을 위한 언어만의 도구를 만들어도 된다.
공통 에러를 알아두라
당신이 어떤 언어로 프로그래밍하고 있든지 상관없이 신입개발자들이 자주 하는 흔한 에러들이 있다. C++에서 가장 빈번한 에러 중 하나는 "x == y"처럼 동등성을 테스트하려는 의도로 "x = y"와 같은 대입 연산자를 사용하는 경우이다.
코드 블록을 설정하기 위해 중괄호 { } 를 사용하는 언어들에서는 시작과 끝의 중괄호를 위치를 잘못 두는 것도 흔한 에러이다. 이러한 경우는 통합개발환경(IDE)이 당신의 괄호를 추적하거나 코드블록을 닫을 때 표시를 제공하여 도울 수 있는 또 다른 영역이다. 많은 괄호를 사용하는 언어들은 유사한 이슈들을 가지고 있다(Lisp에 팬들이라면 반갑다!). 문자열 앞뒤에 작은따옴표나 큰따옴표를 빠뜨리는 것도 또 다른 공통적인 관련 에러이다.
변수나 함수의 네이밍 컨벤션 자체가 지표가 될 수 있지만 어떤 컨벤션을 사용하든 그것을 확실하게 고수하라. 타이포가 당신을 실수하게 만들 수 있지만 오히려 일관되지 않은 대문자 규칙이 문제를 일으킬 수 있다. 많은 언어가 myLovelyVariable과 myLovelyvariable의 구별하게 하기 때문에 네이밍 에러를 유의하여 지켜보도록 하라.
마찬가지로 만약 당신이 선택한 언어가 강한 타입의 언어라면 타입에 유의하라. 예를 들면 정수 타입으로 선언된 변수에 부동소수점 숫자를 대입하려고 시도하지 마라. 0을 제외한 모든 값을 참으로 읽는 일부 언어에서는 불린 값을 다룰 때 특히 조심해야 한다. 이는 만약 불린 값을 기대하는 함수에 정수를 넘겼을 때에 골칫거리가 될 수 있기 때문이다.
만약 당신의 언어가 다른 파일에 있는 라이브러리를 가져오거나 요구하는 경우에는 확실히 당신의 파일 안에 적절한 import 문장을 사용하여 라이브러리를 포함해야 한다. 컴파일러도 알지 못하는 문제가 있을 때 당신은 왜 함수가 작동하지 않는지 규명하는데 많은 시간을 쏟는 것을 원치 않을 것이다.
만약 사용하는 언어의 공통적인 에러 정보를 찾을 수 있다면, 당신의 코드 안에서 에러를 찾는 데 강점을 갖게 될 것이다. "common syntax errors"에 당신의 사용 언어를 더한 구글의 빠른 검색은 훌륭한 조언들로 가득한 정보들을 제공해 줄 것이다.
묻는 것을 두려워하지 마라
디버깅의 가장 절망적인 부분은 디버깅 기술은 경험을 통해서 얻는다는 것을 깨닫는 것이다. 당신이 초보자라면 숙련된 개발자가 단시간에 찾아 고칠 수 있는 종류의 실수를 명백하게 할 가능성이 있다는 점을 분명히 받아들일 것이다. 그러나 아직 당신은 잘 모르기 때문에 숙련된 개발자와 같이 행동할 수 없다. 몇 시간 동안 코드 때문에 머리를 쥐어 싸매는 대신 당신을 도울 수 있는 더욱 숙련된 누군가를 찾아라. 만약 당신이 수업 환경에서 배우고 있다면 강사나 다른 학생이 그런 사람이 될 수 있을 것이다. 실제 전문 영역에서는 멘토를 찾을 수 있는지 살펴라. 만약 책이나 비디오를 통해서 학습 중이라면, 저자나 출판사가 당신의 질문을 받을 수 있는 포럼 사이트를 가졌는지 찾아라. 심지어 당신이 웹에서 단편적으로 얻은 정보로 완전히 혼자 학습한다고 해도 여전히 당신이 이름을 정할 수 있는 거의 모든 언어로 운영되는 커뮤니티 포럼을 찾을 수 있으며
Stack Overflow와 같은 사이트들이 언제나 존재한다. 도와줄 의지가 있는 많은 이들이 존재하지만, 무엇보다도 먼저 당신은 어리석은 질문을 던지는 것에 대한 두려움을 극복해야 한다. 다음의 세 가지 가능성이 있다.:
- 문제가 당신이 아직 학습하지 않은 부분과 관련이 있기 때문에 당신이 이를 찾을만한 방도가 없는 경우다.
- 문제가 완벽하게 새롭고 독창적인 경우로 심지어 강사나 멘토 역시도 문제를 해결하는데 어려움을 느낄 것이다. 축하한다! 당신은 문제를 함께 풀어가면서 무언가를 배우게 될 것이다.
- 문제가 위에서 언급한 "x == y"와 같은 이슈의 정말로 기본적일 경우로 어쩌면 당신은 충분한 시간이 주어지면 스스로 그 문제를 찾을 수도 있다. 당신은 여전히 무언가를 배운 것이다. 당신은 그 문제를 찾아내는 경험을 얻게 되었고 다음번에 더욱 잘 찾을 수 있을 것이다.
상황이 어떤 결과를 가져오든지, 당신은 새로운 무언가를 배운 것이다.