얼마 전 카카오 개발자 블로그에 카카오스토리팀의 코드 리뷰 도입 사례라는 글이 올라왔습니다. 현재 일하고 있는 곳에서 2년이 넘는 시간 동안 진행한 코드 리뷰의 경험을 잘 설명한 글입니다. 제가 쓴 글은 아니지만 코드 리뷰에 참여하고 있는 한 명으로서 이 글을 잘 읽었다는 피드백을 받을 때마다 솔직히 기분은 좋더군요.
여기서는 코드 리뷰 경험에 대한 글을 공개하기 전, 후에 코드 리뷰에 대해 질문받은 내용과 답변에 대해 기억나는대로 정리해보려 합니다.
Q. 코드 리뷰가 성공할 수 있었던 이유는 무엇일까요?
1. 리뷰도 개발의 한 과정이라고 생각하는 개발문화입니다. 많은 경우 리뷰를 개발 과정의 일부가 아닌 개발 외적의 일로 여기는 경우가 있는데, 리뷰 자체도 개발의 일부라고 생각하고 일정과 같이 개발에 필요한 자원을 챙길 때 항상 리뷰를 고려했습니다.
2. 리뷰를 실행하는 구성원의 의지입니다. 중간에 여러 난관에 맞닥뜨렸을 때, 리뷰를 중단함으로써 문제를 해결할 수도 있었지만 리뷰는 반드시 지켜야 할 좋은 가치라는데 이견이 없었기에 리뷰가 아닌 부분에서 해결 방법을 찾으려고 계속 시도했습니다.
3. 리뷰의 전, 후에 진행했던 작업을 리뷰와 관계 없는 업무 흐름으로 분리했습니다. 원문에서 볼 수 있는 '병목이 새로운 병목을 만들었다.'부터 '브랜치 미리보기 서버' 절까지가 대표적인 예입니다. 이를 통해 리뷰는 '개발 - 리뷰 - 머지 - 테스트 - 배포'의 업무 흐름에만 속해 있으며 다른 업무에는 영향을 주지 않습니다.
4. 좋은 도구를 사용하고, 반복적인 업무는 자동화하여 개발자는 코드 자체의 품질을 개선하는데 집중할 수 있게 했습니다. 깃헙, 미리보기 서버, 깃훅을 이용한 린트와 테스트의 실행 등이 큰 도움이 됐습니다.
Q. 코드 리뷰에 어느 정도의 시간을 사용하나요?
리뷰해야 할 코드에 따라 많이 달라지는 요소라 정확하게 시간을 측정해보지는 않았습니다. 리뷰 중반까지는 대략 전체 개발 시간의 30% 수준으로 느꼈고 구성원들도 이에 동의한 적이 있습니다. 이 시간은 업무 방식에도 영향을 많이 받는데, 2~3주에 한 번 리뷰를 하는 경우 읽어야 할 코드도 많고, 리뷰 받은 코드의 양도 많아 리뷰의 의견에 답변하고 수정해야 하는 시간이 많이 필요했습니다. 시간이 흐르면서 리뷰 참여자의 역량이 향상되고, 리뷰에 능숙해지면서 리뷰에 필요한 시간은 점점 짧아졌고, 리뷰할 대상의 코드의 양을 적절히 관리하여 지금은 코드 리뷰를 특별히 시간을 많이 소모하는 작업으로 느끼지 않습니다.
Q. 코드 리뷰가 잘 될 수 있었던 것은 코드 리뷰에 참여하는 사람의 숫자가 적기 때문이 아닐까요? 사람이 많은 경우에는 적용하기 어려울 것 같은데 어떻게 생각하시는지 궁금합니다.
저희가 시작할 때 코드 리뷰에 참여하는 사람의 숫자가 적어서 의견의 일치를 이루기 쉬웠기 때문에 쉽게 진행할 수 있었다는 점은 부인하기 어렵습니다. 하지만 개발자가 소수인 곳에서의 '의견의 일치'는 개발자가 다수인 조직에서의 '개발자 문화'로 치환해 볼 수 있다고 생각합니다. 개발자의 공감을 받고 있는 개발자 문화가 있고 이 문화를 지키고 실천한다면 대규모 조직에서의 코드 리뷰도 충분히 가능하리라 생각합니다. 종종 발견하는 페이스북이나 구글에서의 코드 리뷰에 대한 글을 보면 - 실제로 그 곳에서 코드 리뷰가 잘 되고 있는지는 모르겠습니다만 - 사람의 숫자는 실행을 어렵게 할 뿐, 실행을 불가능하게 만드는 요소는 아니라고 생각합니다.
Q. 대규모 조직에서 코드리뷰를 시작한다면 어떻게 시작하실 생각인가요?
저도 대규모 조직에서 코드 리뷰를 도입해본 경험이 없으므로 아래에서 설명할 내용이 성공으로 이어질 지는 확신할 수 없습니다. 다만 팀 내에서 3명에서 시작한 리뷰가 8명까지 늘어나면서 겪었던 경험을 바탕으로 간단하게 방법을 정리해봤습니다.
1. 코드 리뷰를 실행할 개발자들이 코드 리뷰를 개발 과정의 일부로써 당연히 수행해야 하는 작업으로 생각하는 문화를 만듭니다.
2. 코딩 컨벤션 등 개발 조직에서 필요한 규칙들을 만듭니다. 그리고 이런 규칙을 쉽게 적용할 수 있는 도구를 사용합니다.
3. 개발 과정에서 리뷰의 과정이 크리티컬 패스가 되지 않도록 업무의 흐름을 재조정합니다. 특히 개발자가 아닌 다른 직군과의 협업이 필요한 부분은 리뷰의 앞단계로 빼놓거나 다른 흐름으로 분리합니다. 리뷰의 뒷 단계에는 테스트와 배포 작업만 남겨둡니다.
4. 개발 환경 설정부터 배포에 이르는 전 과정에 걸쳐 있는 작업을 자동화합니다.
5. 리뷰를 시작할 팀 2~3개를 설정합니다. 리뷰팀은 최대한 같은 코드 혹은 동일한 서비스를 만드는 사람으로만 구성합니다. 각 팀은 3~5명으로 구성합니다.
6. 리뷰팀 내에서 리뷰를 시작하며 각 리뷰팀간의 정기적인 교류를 시도합니다. 리뷰팀 사이에서 교류하는 목적은 각 리뷰팀 사이에서 발생하는 차이를 줄이고자 함입니다.
7. 각 리뷰팀 내의 멤버를 서로 교환하여 리뷰를 진행합니다. 목적은 6번과 같습니다.
8. 6~7의 과정을 거친 후 해당 멤버들을 중심으로 5~8의 과정을 반복하며 리뷰를 진행하는 개발자를 늘려갑니다.
Q. 저희 조직에는 개발자가 저 밖에 없습니다. 이럴 때 코드 리뷰의 효과를 볼 수 있는 방법은 없을까요?
리뷰는 혼자서는 할 수 없는 활동이므로 조직 내에서 리뷰를 진행하기는 어려울 것으로 생각합니다. 오픈소스 중에서 기여할 수 있는 것을 찾아 보면 어떨까요?
Q. 지금 조직에서 코드 리뷰를 시작하고 싶습니다. 그런데 조직적으로 코드 리뷰에 대한 도움을 얻기 어려울 것 같습니다. 어떻게 시작하면 좋을까요?
무엇보다도 조직 내에서 마음이 맞는 사람을 찾으면 좋겠습니다. 두 분 정도 찾은 후, '대규모 조직에서 코드를 시작한다면 어떤 방법으로?' 질문에 있는 답에서 1, 2번을 실행하신 후 코드 리뷰를 시작하세요. 3, 4번은 리뷰를 진행하면서 개선이 가능한 부분부터 하나씩 고쳐나가면 됩니다. 조직의 도움이 없다면 개인적인 노력이 많이 필요할 수 있어 쉬운 길은 아니지만 시간을 투자하는 만큼 얻는 것은 있으리라 생각합니다.
Q. 초보 개발자끼리 코드 리뷰를 해도 도움이 될까요?
큰 도움이 됩니다. 타인의 코드를 읽고 생각하는 능력을 기를 수 있습니다. 또한 코드를 짤 때, 수정하기 쉬운 코드를 만드는 방법을 고민하게 됩니다. 이와 함께 오픈 소스 중에 맘에 드는 프로젝트를 찾아 코드를 읽어보기 바랍니다.
Q. 스타트업에 근무하는 개발자입니다. 개발할 내용이 많아 리뷰할 시간을 내기 어려운데 이 경우에 해결 가능한 방법이 있을까요?
기본적으로 코드 리뷰는 적지 않은 시간을 소비하는 활동으로 시간을 확보하는 것이 중요합니다. 시간을 만드는 방법은 여러 가지가 있겠지만 개발자인만큼 프로그램을 개발하여 업무의 효율성을 높이는 방법을 추천합니다. 반복해서 진행하는 수작업을 자동화할 수도 있겠고, 적당한 도구를 만들어 개발자가 아닌 다른 이들에게 업무를 이전할 수도 있을 것입니다. 시간을 내기 어렵다면 짧은 시간 안에 리뷰를 완료할 수 있도록 리뷰할 대상이 되는 코드를 한정지을 수도 있을 것입니다.
Q. 리뷰를 진행하면서 힘든 적은 없었나요?
첫 번째는 코딩 컨벤션에 익숙해질 때까지 입니다. 코딩 컨벤션은 자동화으로 컨벤션을 맞춰주는 도구를 사용하면 편리합니다. 어느 정도 시간이 지나고 익숙해지게 되면 특별히 도구를 사용하지 않아도 자연스럽게 컨벤션을 맞추는 자신을 발견할 수 있습니다.
두 번째는 컨벤션에 없는 암묵적인 스타일을 맞춰나가는 과정입니다. 이 부분은 실제 프로그램을 구조적으로 작성하는 방식을 맞추는 과정을 의미합니다. 로직을 작성하는 방법이나, 클래스를 설계하는 방법, 함수가 갖게 되는 기능의 범위를 결정하는 방식 등 프로그램을 실제로 만들 때 구성하는 방법을 맞춰가는 과정이 매우 힘든 경험이었습니다. 이 시기를 성공적으로 넘긴다면 코드 리뷰가 정말 큰 도움이 될 것입니다.
세 번째는 일정과 리뷰 사이에서 고민했던 시기입니다. 저희는 다행이 리뷰의 가치를 해치지 않는 방향으로 해답을 찾았고 그 결과 지금처럼 좋은 경험으로 이어질 수 있었습니다.
Q. 코드 리뷰를 통해 개발 과정에서 얻은 장점은 뭔가요?
담당하는 업무가 바뀔 때 업무의 인수 인계에 걸리는 시간이 필요 없거나 매우 짧아집니다. 이를 통해 누구나 대부분의 기능을 개발할 수 있게 되어 유연하게 업무를 진행할 수 있습니다. 물론 이 장점은 코드 리뷰와 함께 프레임워크의 도움도 매우 큽니다.
내가 작성한 코드와 타인이 작성한 코드를 구별할 수 없어 코드를 재작성하려는 하는 욕구를 최소화할 수 있습니다. 코드 리뷰의 과정을 거치고 나면 더 좋은 로직이 떠오를 때 외에는 코드를 재작성하고 싶은 생각이 들지 않습니다. 이것은 위에서 이야기한 암묵적인 스타일을 맞춰나가는 과정을 거친 후에 얻는 장점이라고 생각합니다.
타인이 작성한 좋은 패턴과 나쁜 패턴을 쉽게 익힐 수 있고 내 코드에 반영하게 됩니다. 코드를 많이 읽어 얻게 되는 장점입니다.
위의 질문 외에 더 궁금하신 내용은 댓글로 남겨주시면 계속 추가하도록 하겠습니다.
3월 20일 최초 작성
4월 3일 질문, 답변 추가