코드 없는 개발 이야기 #5
학습 방법의 역전
사람이 이타적인 행동을 할 때, 생각이 더 활발해지고, 좋은 아이디어가 자주 떠오른다고 한다. 유명한 학습법 중 "가르치는 듯이 학습한다"는 이것과 비슷한 맥락이다.
우리가 학습을 하는 목표를 생각해보면 보통 다음과 같은 이유들로 학습을한다; 글을 잘 쓰기 위해, 코딩 능력을 향상시키기 위해, 문제 해결 능력을 높이기 위해. 이것들의 공통점은 다 내 안의 여러 지식들이 정제되어 내 몸 밖으로 나오는 행위라는 것이다. 내가 받은 인풋을 토대로 아웃풋을 하는 행위다.
생각해봐야할 것이 있다. 내가 잘 하고 싶은것이 인풋인가? 아웃풋인가? 학습을 한다는 것은 기본적으로 인풋을 계속 쌓는 것이다.
인풋이 재료고 아웃풋은 요리라고 생각해보자. 재료를 먼저 생각하고 요리를 생각하는경우와, 요리를 생각하고 재료를 구하는 행위. 무엇이 더 목표지향적인가?
"가르치듯 학습한다." 라는 것은 이런 원리에서 출발한다. 남을 가르치기 위해서, 남에게 이해 시키기 위해서 필요한 부분을 학습하고, 어떻게하면 더 쉽게 이해할까 고민한다. 그럼 내가 먼저 어떻게 하면 이걸 쉽게 이해하려고할지 노력하게 된다.
결국 남을 가르치기 위해서, 본인이 더 잘 학습하게 된다는 것이다.
코드리뷰는 근본적으로 이타적인 행위이다.
전 직장 동료와 오랜만에 만나 여러 이야기를 나누던 중, 흥미로운 주제가 떠올랐다. 코드리뷰. 이야기 내용은, a와 b가 서로 코드 리뷰를 주고받다가 사이가 틀어졌다 라는 이야기였다. 일화를 들으며 코드 리뷰는 무엇이고, 왜 해야하는걸까? 라는 고민이 시작 되었다.
코드 리뷰의 본질을 한마디로 정의한다면, 그것은 서로의 코드를 검토하며 발전의 기회를 찾는 것이다.
그렇다면 코드 리뷰는 왜 중요한 것일까? 코드 리뷰는 단순히 코드의 품질을 높이는 것 이상의 의미를 담고 있기때문이다.
코드 리뷰는 개인의 지식을 뽐내기 위한 시간이 아니다. 또한, 다른 사람을 지도하거나 가르치려는 시간도 아니다. 코드 리뷰는 개별의 코드가 아닌 '우리의 코드'의 품질을 높이고, 팀 전체의 성장을 위한 활동이다.
더 확장된 이야기를 해보자면 "가르치듯 학습한다." 학습법 처럼, 타인을 돕는 행위는 결국 자신을 돕는 것과 같다. 남을 위한 행동, 그것이 자신을 성장시키는 방법 중 하나이다. 이것은 코드 리뷰의 본질과도 맞닿아 있다.
결국, 코드 리뷰는 서로를 돕고, 성장하며, 상호 존중하는 문화를 만드는 데 중요한 역할을 한다. 그 기반이 되는 것이 이타적인 마음가짐과 함께하는 협력의 자세라는 것이다.
역설적으로, 남을 위한 코드리뷰를 하는 것이야말로 진정으로 나를 위한 행위가 된다.
그럼, 어떻게 코드리뷰를 해야할까?
코드 리뷰에는 여러 기술과 기법들이 있지만, 우리가 가져야하는 마음가짐 위주로 이야기해보고자한다.
1. 리뷰라는 것이 무엇인지 정의 해야한다.
리뷰란 단순히 평가나 검토를 넘어서 상대방의 작업에 대한 피드백과 개선점을 제시하는 활동이다.
여기서 생각해볼 점은, 리뷰는 결국 '상호 대화'와 같다. 말하고 듣고의 과정처럼, 코드리뷰도 제시하고, 피드백 받고, 개선하는 순환 구조를 갖는다.
2. 유저를 생각하자.
이 일을 했을 때, 실제 사용자들이 도움되는가? 우리는 유저들에게 어떤 가치를 주려고 하는가? 라는 공통의 목표를 정해두는 것이 코드리뷰이다. 이렇게하면 상대방 개인에 대한 피드백이아니라, 우리가 가진 공통의 목표에 의한 피드백 이라는 인식을 심어줄 수 있다.
3. 도움을 주기 위한 리뷰와 개인적 욕심 사이에서의 균형을 찾아야 한다.
리뷰는 나를 뽐내려는 것이 아니다. 상대방을 지도하려는 것도 아니다. 우리 팀의 코드 품질과 개선을 위한 행위이고, 이를 사용할 유저들을 위한 행위이다.
나의 개인적인 코딩 스타일이 들어간 리뷰는 진짜 고민 해봐야한다. 이게 진정으로 해당 코드나 프로젝트에 그리고 실제 사용하는 유저에게 도움이 될까?
리뷰의 핵심은 '내가 이렇게 했을 것 같다'가 아니라 '이 코드가 어떻게 더 효율적이고 명확해질 수 있을까?'에 있다.
때로는 자신의 생각을 일단락하고, 다른 사람의 관점에서 바라보는 것이 중요하다. 이를 통해 리뷰는 더욱 건설적이고 생산적으로 진행될 수 있다.
4. 텍스트는 감정이 없다. 가이드라인을 정하자.
텍스트는 감정의 농도를 전달하기 어렵기 때문에, 언제나 긍정적이고 건설적인 톤을 유지해야 한다. 팀에서 몇 가지 규칙을 정해두면 좋다. 필자의 팀은 이런 가이드를 쓰기도한다. 꼭 고쳐야하는지 중요도를 점수로 나타내고, 왜 개선해야하는지 이유를 적고, 어떻게 개선하면 좋을지 방법을 적는다.
강조하지만, 커뮤니케이션의 중요성은 여러 번 반복해도 지나치지 않다. 올바른 의사소통은 성공적인 코드 리뷰의 핵심이다.
텍스트 리뷰는 단순한 피드백 전달 수단이 아니라, 팀원 간의 대화와 연결의 수단이다. 그 연결을 유지하기 위해서는 서로의 감정을 존중하고 이해해야 한다.
감정이 상하지 않도록 하는 방법 중 하나는 명확하고 구체적인 피드백을 제공하는 것이다. "이 부분이 이해되지 않아"보다는 "이 부분에서 변수명이 더 구체적이면 좋겠습니다."와 같이 명확하게 표현하자.
필자의 팀에서는, 서로 규칙을 정해두었다. "우리는 5Why 기법을 사용합니다. 그러니 그 누구든 왜?에 대해서 질문할 수 있고, 그 누구도 기분나빠할 필요가 없습니다. 근본적인 문제를 해결하고자 함 입니다." 이처럼 팀 차원에서 몇 가지 가이드라인을 잡아주는 것도 좋은 방법이 될 수 있다.
5. 코드 리뷰 요청을 하는 사람도, 남을 위해야한다.
리뷰를 받기 전, 요청자는 리뷰어의 입장에서 코드를 읽어보아야 한다. 리뷰어가 쉽게 이해할 수 있도록 문맥을 제공하자.
코드 리뷰는 리뷰어에게도 학습의 기회가 되도록 설명을 첨부하자. 주석이나 문서화에 간략하게 구현 의도나 복잡한 로직의 설명을 추가하면 도움이 된다. (살짝 벗어난 이야기지만, 테스트 코드로 내 코드를 설명하는 것이 가장 좋다. 주석과 문서는 낡기 때문이다. 그래서 필자의 팀에서는 코드 리뷰도 테스트 코드 위주로 진행한다.)
리뷰 요청 시, 주관적인 표현보다는 구체적이고 객관적인 데이터나 수치를 기반으로 한 내용을 제시하자. 예: "이 방법이 더 나은 것 같아요" 보다는 "이 방법으로 하면 처리 속도가 20% 향상됩니다"와 같이.
받은 리뷰 코멘트에는 반드시 답변을 하자. 대화는 양방향으로 이루어질 때, 대화라는 것이 성립된다.
6. 그리고, 코드리뷰에 칭찬도 적절히 하자. 우리는 지금 칭찬에 인색한 시대에 살고있다.
결국 중요하게 말하고자 하는 건 앞서말했듯 내가 아니라 남을 위한 행동을 할 때 비로소 진정한 학습의 장치가 되고, 진정한 성장이 생긴다는 것이다.