디버깅을 성공적으로 마치기 위해서는 코드를 잘 읽어야 합니다.
그래야만 엉뚱한 곳에 시간을 허비하지 않을 수 있습니다.
코드를 빠르게 이해하고 허점을 찾아내는 일은 종종 생각보다 쉽지 않습니다.
내가 쓴 오래된 코드를 보고 고칠 때 마치 남이 쓴 것처럼 낯설게 느껴집니다.
운이 나쁘다면 다른 사람이 일으킨 버그를 당신이 잡아야 할 수도 있습니다.
세 명의 실력있는 개발자들이 공유한 '코드를 이해하는 방법'―특히 디버깅에 있어서―을 소개합니다.
최종 결과를 내는 몇 줄의 코드를 찾아내어 역추적합니다.
원저자 : Alex Coleman 페이스북 엔지니어, 국제 대학생 프로그래밍 대회 결선진출 2회, 2018년도 북미 챔피언
예를 들어, 여러분이 봐야 하는 코드가 '영화 제목 목록'을 생성한다고 알고 있다고 가정해 보겠습니다.
이제 영화 포스터 파일을 띄우는 특정 몇 줄 의 코드가 어디 있는지 파악해야 합니다.
그러고 나서 한 단계 뒤로 이동하여 파일에 정보를 배치하는 방식을 파악합니다.
...완료했다면 또 한 단계 뒤로 물러나서 정보가 어디에서 왔는지 알아내세요.
이 방식을 사용하면 결과적으로 코드의 다양한 영역을 살펴보게 됩니다.
시간이 지남에 따라 전체 코드가 파악되고 당신은 점점 더 유용한 정보를 얻게 됩니다.
- 코드가 구성되는 방식 : 변수 정의 위치, 메소드의 위치 등
- 코드를 작성한 사람이 어떻게 생각하고 문제를 해결하는가
- 어느 코드가 버그와 관련이 깊으며 어느 코드가 관련이 덜한가
문제 해결과 기능 추가 : 적게 읽고 많이 이해하기
원저자 : John L. Miller 박사. 마이크로소프트 25년차, 아마존, 구글, 등
코드에 발생한 문제를 해결해야 할 때
A. 당신이 들여다봐야 하는 루틴에 중단점을 설정합니다.
* 가능한 경우라면 문제를 재현할 수 있는 조건에서 시작하세요.
- 중단점에 도달하면 콜스택, 매개변수 값들을 기록하세요.
- 어디에 문제가 있는지 알아낼 때까지 값을 쫓아가세요.
- 문제가 있는 지점을 발견했다면 바로 그 직전에 중단점을 하나 더 지정하세요.
- 잠재적인 문제를 발견할 수 있도록 다양한 방법으로 코드를 호출하세요.
B. 디버거로 해결하기 어렵다면 그때부터 print나 log파일로 해결하세요.
문제 구간으로 다가가면서 print문을 심으세요.
C. 문제가 되는 변수나 함수를 찾았다면?
문제가 된 클래스의 선언부를 읽으면서 기능을 대략적으로 파악해보세요.
D. 문제가 되는 코드로부터 멀리 떨어진 부분까지 너무 많이 읽지 마세요.
그 문제가 여러 곳에서 동일하게 반복되지 않는다면요.
새로운 기능을 추가해야 할 때
- 먼저 추가하려는 기능과 관련된 클래스를 찾습니다.
- 명확하지 않으면 30분 동안 훑어본 다음 기능 변경을 요청한 사람 / 이전에 코드를 소유한 사람에게 질문하세요.
- 버그 수정에 사용하는 것과 동일한 디버깅/로깅 기술을 사용하여 해당 코드에 익숙해지세요.
- 문서화가 잘 되어 있고 문서가 최신 상태라면 클래스 주석과 가장 관련성이 높은 멤버 변수/함수를 읽으십시오.
- 추가하려는 새로운 기능을 테스트하는 단위 테스트를 작성하세요.
- 적절한 경우 변경 사항과 함께 새 단위 테스트를 코드에 추가합니다.
이런 일은 누구에게나 고통스럽습니다.
당신의 코드에 아직 익숙하지 않은 사람들은 이런 말들로 당신을 엿먹일 겁니다.
"이걸 네가 할 줄 알아야지" 혹은 "마안한데, 알아서 해"라면서요.
그 사람들이 당신보다 더 잘 해결할 줄 모르니까 그러는 겁니다.
이건 정상입니다. 자연스러운 일이고, 당신은 바보가 아닙니다. 힘 내세요.
우리가 하는 이런 일들은 정말 가치 있고, 자주 보상받기까지 합니다.
다른 사람이 작성한 코드를 가장 효율적으로 읽는 방법
원저자 : Sara A. Metwalli, 양자 컴퓨팅 박사과정, 컴퓨터 과학 강사
개발자는 분야에 관계없이 다른 사람이 작성한 코드를 읽는 데 시간의 75% 이상을 보냅니다.
문제는 모든 사람이 자신의 코딩 스타일을 가지고 있다는 것입니다.
다른 사람의 코드를 읽고 이해하는 4단계 프로세스를 안내하겠습니다.
1단계: 코드를 실행하고 수행하는 작업 확인
가장 먼저 해야 할 일은 코드가 수행하는 작업을 확인하는 것입니다.
입력으로 무엇을 취합니까?
출력은 무엇입니까?
이를 통해 코드의 목적, 사용하는 라이브러리와 프레임워크를 확인하세요.
2단계: 주요 기능 또는 시작점 찾기
main 함수와 같은 시작점을 찾으세요.
모든 코드에 main 기능이 있는 것은 아니지만
시작점을 살펴보다 보면 코드의 일반적인 흐름을 알 수 있습니다.
우리가 알고 싶은 "수행하는 작업이 무엇인지"를 알게 됩니다.
"어떤 식으로 동작하는지"에 대한 정보가 아니라요.
3단계: 디버깅 모드에서 코드 실행
코드의 주요 부분을 주의 깊게 읽은 다음
디버깅 모드에서 코드를 실행해보세요.
코드가 메모리를 어떻게 쓰는지 볼 수 있습니다.
코드의 모든 단계에서 각 변수가 어떻게 변경되는지 보여줍니다.
이후, 코드에 자신의 주석을 추가하여 각 줄마다 수행하는 작업을 스스로 설명할 수도 있습니다.
4단계: 코드의 서로 다른 부분 간의 연결에 대한 마인드맵 작성
디버거 모드에서 실행하는 동안 코드 연결에 대한 마인드맵을 구축하세요.
디버거 모드는 서로 다른 코드 항목 간의 명확한 연결을 보여줍니다.
마인드맵 중간에 있는 코드 파일 이름으로 시작한 다음 다른 기능과 연결 방법으로 분기합니다.

- 코드의 변수도 마인드맵에 포함시키십시오.
- 결과에 가장 큰 영향을 미치는 변수를 사용하도록 하십시오.
- 또한 코드의 입력 및 출력과 해당 유형 또는 예상 유형을 포함시키십시오.
마무리
다른 개발자가 작성한 코드를 읽는 것은 어려운 작업일 수 있습니다.
그들의 논리, 스타일 및 특정 선택을 이해해야 합니다.
다양한 수준과 연령대의 프로그래머가 작성한 코드를 많이 읽었습니다.
앞서 제가 소개드린 4단계 프로세스로 많은 시간과 노력을 절약할 수 있습니다.
- 코드를 실행하고 결과를 탐색합니다.
- 주요 기능 또는 코드의 시작점을 찾습니다.
- 디버거에서 코드를 실행하고 코드의 메커니즘을 완전히 이해하세요.
- 서로 다른 코드 요소 간의 연결에 대한 마인드맵을 작성해두고 매번 활용하세요.
'Tips' 카테고리의 다른 글
[Tips] Live Server 비주얼 스튜디오 코드 라이브 서버 설정 (0) | 2022.09.01 |
---|---|
[Tips] 맥 터미널에서 .NET 설치 확인이 안 될 때 (ARM 포함) (1) | 2022.08.30 |
[Tips] 한국 게임 공모전 및 사업 목록 (0) | 2022.08.29 |
[Git] Please make sure you have the correct access rightsand the repository exists. (0) | 2022.08.24 |
[Tips] 디버깅 탐구 1 - Interactive Debugging (0) | 2022.08.14 |
댓글