지난 3월 26일, 콜로소에서 주최한 무료 디버깅 특강에 참여하게 되었습니다. 이 특강을 통해, 오랫동안 궁금해왔던 '잘하는 사람들은 어떤 방식으로 생각하는가?'에 대한 답을 찾는 중요한 계기가 되었습니다. 바로 인지작업 분석이라는 방법을 통해서였죠. 이 경험은 저에게 많은 영감을 주었고, 이를 많은 사람들과 공유하고자 포스팅을 작성하게 되었습니다.
해당 특강에서는 아래와 같은 목차로 구성 되어 있었습니다.
- 인지작업 분석: 암묵지를 끌어내는 인터뷰
- 디버깅 전문가의 그림, 관찰, 행동, 습관
- 디버깅 전문가의 패턴을 내것으로 만드는 훈련법
- 마무리: 소프트웨어 디버깅을 넘어 삶의 디버깅으로
인지 작업 분석이란 무엇인가?
인지작업 분석은 미국의 인지심리학계 거장 개리 클라인이 주축이 되어, 미 해군 및 여러 연구자들과 함께 협력하여 개발하고 발전시킨 기법이라고 합니다. 인터뷰에서 잘 활용하면 전문가의 전문성, 즉 몸에 익은 습관과 뇌에 익은 암묵지를 효과적으로 뽑아낼 수 있는 것으로 잘 알려져 있죠. 해당 방법을 이용하여 표준 편차 50%의 아이도 15%까지 오르는 기적을 만들수 있다고 강의에서 소개해 주었습니다.
디버깅 전문가들의 사소하지만 훌륭한 습관
강의에서는 실리콘밸리의 회사에서 근무 중인 배휘동님께서 직접 5명의 전문가들을 만나보고, 같은 질문들로 공통된 패턴들을 추출하여 그것을 자신의 것으로 만드는 방법을 소개했습니다. 공통된 질문들은 아래와 같았습니다.
- 당신이 디버깅할때 하는 행동들을 3개~5개 정도 그려주세요.
- 이 행동들 중 디버깅을 잘 하는 사람과 못하는 사람의 차이가 큰게 무엇인지 골라주세요.
먼저 1번에 대한 답변을 나열한후, 2번에 대한 답변중 중요한 내용은 굵은 글씨로 정리해 보았습니다.
토스 박서진님
- 에러 메시지를 자세히 읽는다
- 올바르게 동작한다면 어떤 순서로 연산이 일어나야 하는지 생각한다
- 이것 자체를 생각하고 적는 습관
- 올바른 동작 순서를 생각해낼 수 없다면, 왜 그럴까?
- 컨텍스트 파악&로그 심기 ⇒ 정보 수집 +가설 검증
- 디버거를 걸어서 문제 상황을 더 자세히 확인한다.
- 관련 라이브러리의 github issue를 검색한다.
- 스택오버플로우/구글 검색또는 gpt를 쓴다.
- 문제를 제대로 재현할 수 있게 정보를 수집한다
원지랩스 ceo 곽근봉님
- 에러 상황을 재현해본다
- 에러메시지 혹은 오류사항을 꼼꼼하게 읽고 확인한다
- 구글링,gpt,로그심기 중 선택한다
- 3번중 하나를 실행하고 얻은 새로운 정보를 꼼꼼하게 읽는다.
- 원인 파악 및 해결이 될때까지 2~4를 반복한다.
근봉님의 경우에는 습관부분에서도 좋은점이 많아서 부가적으로 설명해 주셨습니다.
- 일정 시간마다 무조건 리프레시하게 해주는 습관
- 혼자 일할 때 물을 굉장히 많이 마셔서
- 20분에 한 번씩 화장실에 간다.
- 이때 리프레시가 되면서 자연스럽게 지난 20분에 대한 회고를 한다.
- 결과적으로, 좋은 돌파구를 만들어준다.
- 인지 부하를 줄이는 물리적 환경을 만드는 습관
- 눈에 보이는 불필요한 걸 다 치운다.
- 새 탐색 시작은 새데스탑에서 충분히 탐색되면 데스크탑을 통째로 날린다.
- 한 줄마다 제대로 짰음을 검증하는 습관
- 무엇이 정상 동작하는 상태다라는 감을 잡고 하나하나 쌓아나간다. 한줄마다 테스트하면 어디가 틀렸는지 바로 확인가능
- 배포 가능한 상태까지 최대한 빨리가고, 그 다음 함수 하나 짤 때마다 새로 배포해서 테스트한다.
릴레잇 cto 양웅철님
- 문제를 제대로 이해한다.
- 디버깅을 위한 추가 정보를 수집한다. (git 변경 이력 확인) (git blame, git log)
- 제대로 된 동작과 문제를 비교해서 확인할 가설을 세운다
- 제대로 동작한다면 이래야 하지 않나? 근데 그게 아닌 상황이네?
- 그럼 우리가 잘못 생각한것은 뭐지?
- 가설을 확인한다.
- 디버거를 능숙하게 활용하기
- 무엇은 의심할 필요 없고, 무엇은 의심할 만한지 알기
- 확인한 가설 기반으로 우리 코드 또는 의존성 문제를 해결한다
- 증상만 고치는게 아니라 근본 원인을 박멸한다.
- 사람이 실수하기 어렵도록 환경 개선
- 다음에 비슷한 문제 생기면 알 수 있도록 모니터링 추가
- 필요 없는 건 고치는 대신 제거
- 굳이 안 고쳐도 되는건 의도적 방치
두물머리 cto 박지수님
- 차분히 증상을 관찰한다
- 에러메시지를 자세히 읽기
- 에러 메시지에서 고정된 부분과 내 코드에 따라 달라지는 부분을 구분
- 다양한 가설을 떠올린다
- 좁히기: 도메인 지식과 과거 유사 문제 해결 경험을 총동원해서 의심 할 의심하지 않아도 되는 부분 구분하기
- 넗히기: 실제로는 사실이 아닌데 내가 사실이라고 믿고 있는 게 뭘까?
- ex)스타트업에서 마감을 앞둔 개발자가 실수하는게 뭘까?
- 소스코드 및 이슈 트래커를 탐색하며 가설을 확인한다
- 최소 재현 환경을 만든다
- 웹상에 자료가 불충분한 기술 사용 ⇒ 직접 이슈 올려야 함 ⇒ 최소 재현 환경 만드는 습관 형성
- 같은 효과를 얻을 수 있는 다른 방법 써보기
- 버그 해결의 우선순위를 판단하고 의사결정한다
- 당장 재현/파악/해결이 어렵다면 가시성을 높인다
- 타인에게 도움을 구한다.
- 최소 재현 코드와 함께 이슈 등록 ⇒ 회사 코드에서는 우회해서 개발 속행
- zio 프레임워크 커뮤니티에서 메인테이너와 좋은 관계를 쌓아두니 피드백 요청이 먼저 들어오기도 함
chatGpt님
- 문제를 온전히 이해한다
- 정보를 수집한다.
- 이슈를 격리하고 재현한다
- 해결책을 설계한다.
- 해결책을 구현하고 테스트한다
- 꾸준히 학습하고, 회고하고 ,적응하고 나만의 도구를 계발한다.
각 전문가들의 답변을 토대로 볼 때, 모두 유사한 패턴을 가지고 있었습니다. 그렇다면, 이러한 패턴을 어떻게 자신의 것으로 만들 수 있을까요?
디버깅 전문가의 패턴을 내 걸로 만드는 훈련모델
- 시니어: 사례에 더해 멘탈 모델까지 공유하기
- 주니어: 페어 디버깅에서 고수의 인지작업을 적극 분석하기, 고수의 패턴들을 내 실전 문제에 적용하며, 내가 디버깅하는 시간의양과 질에 어떤 변화가 있는지 인지하기
요약
- 마법 같은 디버깅은 타고난 재능이 아니라 배우고 연습할 수 있는 기술입니다. 무엇을 배우고 연습해야 하는지만 알면 됩니다.
효과적 디버깅을 위한 전문가들의 멘탈 모델
- 문제를 온전히 이해하여
- 무엇이 올바른 상태인지 감을 잡고
- 가설을 설정하고
- 정보를 수집해서
- 효과적으로 검증하는 싸이클을
- 아주 일찍부터 빈번히 돌려
- 실력을 올린다.
이번 특강을 통해 인지 작업 분석 방법을 알게 되었고, 위와 같은 방법으로 저도 디버깅을 적용해 봐야겠다고 생각했습니다. 주변의 잘하는 개발자들을 직접 찾아가 제가 부족한 점을 인터뷰로 질문하고, 그들의 방법을 자신의 것으로 만드는 방법을 알게 되어 짧지만 유익한 시간이었습니다.