개발자에게 가장 어려운 과정 중 하나인 디버깅에 대해 이야기하려고 합니다.
과거에 제가 일했던 회사에는 뛰어난 개발자 한 분이 계셨습니다. 그분은 디버깅 능력을 특히 중요하게 여겼습니다. 항상 이렇게 말씀하시곤 했습니다.
"개발자가 자신의 실력을 증명하는 가장 좋은 방법은 두 가지다. 첫째는 자신의 코드에서 버그를 내지 않는 것이고, 둘째는 남의 코드에서 버그를 찾아내는 것이다."
처음에는 그 말이 그저 당연한 이야기로 들렸지만, 개발을 계속할수록 그 말이 맞다는 것을 깨닫게 됩니다.
버그가 개발자의 실력을 평가하는 기준이 되는 이유는, 어느 정도 경력이 쌓이면 '잘한다'는 것의 기준이 애매해지기 때문입니다. 어떤 방식으로 코드를 작성하든, 객체지향이든 절차지향이든, 결국 개발론의 목표는 버그를 방지하는 것입니다. 따라서 버그가 발생하지 않는 코드는 좋은 코드라고 할 수 있습니다.
어떤 분야에서든 조용히 자기 일만 하는 사람은 주목받기도, 인정받기도 어렵습니다. 그러나 큰 문제를 자신의 능력으로 해결하면 단번에 인정받을 수 있습니다. 서비스에 문제가 발생했을 때 남의 코드에서 버그를 찾아내면 빠르게 개발자로서의 능력을 인정받을 수 있습니다. 이처럼 자신의 코드에 버그를 내지 않고 남의 코드에서 버그를 찾는 것은 개발자에게 매우 중요합니다.
그렇다면 버그를 방지하는 법과 버그를 찾는 법은 무엇일까요?
버그를 방지하는 방법은 단순합니다. 바로 코드를 잘 짜는 것입니다. 이를 위해 가독성 있는 코드 작성, 꼼꼼한 테스트, 동작 흐름을 확인할 수 있는 로그 작성 등이 필요합니다. 코드를 작성할 때부터 예외 케이스를 염두에 두고 방어적인 프로그래밍을 하는 습관을 들이면 버그 발생 가능성을 크게 줄일 수 있습니다. 또한 코드 리뷰를 통해 동료 개발자들의 피드백을 받는 것도 좋은 방법입니다. 여러 사람이 코드를 꼼꼼히 살펴보면 혼자서는 놓치기 쉬운 버그를 미리 찾아낼 수 있습니다.
버그를 찾는 방법은 좀 더 복잡합니다.
문제 상황 파악: 버그 제보를 받으면 문제 상황을 상세하게 듣고 구체적으로 파악할 수 있도록 질문해야 합니다. 대부분의 버그 제보는 단순히 "안 된다"고만 이야기할 뿐, 구체적인 상황을 설명하지 않는 경우가 많기 때문입니다. 개발자 입장에서의 동작 흐름과 일반 사용자 관점에서의 동작 흐름은 다를 수 있으므로 이를 고려해야 합니다. 에러 메시지가 출력되었다면 어떤 상황에서 어떤 메시지가 나타났는지 자세히 물어봐야 합니다. 명확한 상황 파악이 어렵다면 문제 상황을 반복해서 재현해 달라고 요청하는 것도 좋습니다. 문제가 발생한 정확한 상황을 알아내는 것이 디버깅의 시작입니다.
코드와 로그 분석: 문제 상황을 파악했다면 실제 코드와 로그를 살펴봐야 합니다. 제보자의 말을 곧이곧대로 믿고 짐작으로 판단해서는 안 됩니다. 사람의 기억은 부정확할 수 있기에 실제 상황과는 다를 수 있습니다. 로그를 통해 제보된 상황대로 프로그램 로직이 진행되었는지 확인하고, 문제의 원인을 추적해 나가야 합니다. 만약 상황 파악에 필요한 로그가 부족하다면 로그를 추가하고 문제 상황을 재현해 보는 것도 좋은 방법입니다.
문제 해결: 문제 상황을 정확히 파악하고 관련 코드와 로그를 꼼꼼히 살펴보면 대부분의 버그는 해결할 수 있습니다. 하지만 여기까지 진행했는데도 원인을 찾지 못하는 경우가 있습니다. 그럴 때는 일단 마음의 평정을 찾고 문제 해결에 집중해야 합니다. 디버깅의 깊은 늪에 빠졌더라도 포기하지 말고 반드시 해결한다는 자세로 임해야 합니다.
로그 추가하고 살펴보기: 도저히 원인을 알 수 없는 경우 문제가 발생한 지점에 로그를 추가하여 재배포하는 것도 좋은 방법입니다. 더 많은 정보가 있으면 문제 해결의 단서가 될 수 있기 때문입니다. 필요한 부분에 상세한 로그를 추가하여, 어떤 상황에서 문제가 발생하는지 명확히 파악하도록 합니다.
롤백 준비하기: 배포하기 전에 롤백을 준비해두는 것이 중요합니다. 롤백 준비는 매우 번거로울 수 있지만 중요한 배포라면 필수적으로 준비해야합니다. 관리자가 롤백 준비를 직접 시키는 경우는 드물기 때문에, 개발자가 직접 롤백 계획을 세우고 준비해야 합니다.
버그와 타협은 없습니다. 반드시 해결할 수 있고 해결해야만 합니다. 내가 만든 문제는 내가 반드시 고칠 수 있다는 믿음을 가지고 임해야 합니다.