백명석님의 지속가능한 SW 개발을 위한 코드리뷰
ds_chanin
·2023. 1. 8. 01:01
소프트 웨어 장인정신이란?
- 지식과 경험의 공유로 전문성을 갖춘 개발자를 육성
- 후배들에게 지식과 경험을 공유
코드리뷰
- 개발자가 지금부터 당장 행할 수 있는 공유 활동
- 배움을 주고 받으며 지속가능한 SW개발자가 될 수 있는 실천법
목적?
- 주목적은 품질문제 검수
- 학습 및 지식 전달
- 코드, 해결책 등 관련 지식 공유에 기여
- 대게 리뷰어들도 하드 스킬과 소프트 스킬도 얻게 된다.
- 다른 사람이 잘 하는 모습을 보고 동기부여가 잘 된다.
- 코드, 해결책 등 관련 지식 공유에 기여
- 상호 책임감 증대
- 오너십 및 결속 증대
- 팀에서 일어나는 일 공유
- 설계 개선 제안
- 개발 문화 개선
코드리뷰가 어려운 이유
- 좋은 PR을 만들기 위해서 PR의 저자가 고생해서 설명을 적어주어야 한다.
- 만드는 사람이 고생해야 쓰는 사람이 편하다와 같은 논리
- 코드에 대한 비판을 자신에 대한 비판으로 이해
- 코드의 대한 토의는 공유를 통한 상호 학습의 수단이다.
- 개인적 공격으로 받아들이면 물거품
- 코드의 대한 토의는 공유를 통한 상호 학습의 수단이다.
- 생각을 그로 전달하는 것에 대한 어려움
- 피드백을 조심스럽게 표현하는 것이 더 중요하다.
- “파일을 닫는걸 잊어버렸네요?”
- “바보도 아니고 이걸 어떻게 잊어버렸지?”
- “파일을 닫는걸 잊어버렸네요?”
효율적인 PR 방법
- 코드를 읽는 것은 인지적 부담이 되는 고수준의 집중이 요구된다.
- 리뷰에 불필요한 부분은 가능한 덜어내자
- 코드 포맷팅, 스타일 등
- 리뷰에 불필요한 부분은 가능한 덜어내자
- PR을 올릴 때 주석달기
- 리뷰어들을 위한 설명을 코멘트로 남겨서 리뷰어의 시간을 절약할 수 있게하면 좋다
- 모두를 포함하라
- 많은 사람들이 볼 수록 버그를 더 잘 찾아낼수 있다.
- 많은 사람이 보면 더 잘하려는 경향이 있다.
- 많은 사람들이 볼 수록 버그를 더 잘 찾아낼수 있다.
- 의미있는 커밋으로 나누어라
- 혼자 개발하는 경우 2주 뒤의 나에게는 나도 타인이 될 수 있다.
효율적인 리뷰 방법
- 리뷰는 즉시 시작
- 코드리뷰는 높은 우선순위를 가져야한다.
- 저자는 리뷰가 종료될 때 까지 대기해야하는 경우가 있을 수 있다.
- 리뷰를 바로 시작하면 선순환이 된다.
- 언제 어떻게 올려야 더 빠르게 리뷰가 되는지 파악이 된다.
- 리뷰 라운드는 최대한 하루로 잡도록 하라
- 하루내에 리뷰를 못할것 같으면 다른 리뷰어를 지정하도록 하라
- 재지정 빈도수가 늘어난다면 속도를 줄여서 건강한 개발관습을 유지할 수 있어야 한다.
- 하루내에 리뷰를 못할것 같으면 다른 리뷰어를 지정하도록 하라
- 매일 일정 시간(오전, 오후)을 리뷰를 위해 확보 하도록 하라
- PR에 변경이 적도록 노력
- 반나절정도 작업한 양
- 모든 팀원이 하루에 두번(오전, 오후) 작은 양의 PR을 리뷰할수 있도록
- 최대 4시간 안에 리뷰가 완료될 수 있도록
- 반나절정도 작업한 양
- 그런데 사람들이 리뷰할 시간이 없다고 느낀다.
- 코드리뷰 행위가 개인기여로 평가받는 다면 팀을 돕기 위해 수행하는 모든 일이 시간낭비처럼 보일수 있다.
- 리뷰를 행하는 것이 문제가 아니라 가치를 인정해주지 않고 있는 조직적인 문제이다.
- PR vs 페어코딩
- 트레이드 오프
- 코드리뷰는 높은 우선순위를 가져야한다.
- 고수준으로 시작, 저수준으로 내려가라
- 너무 많은 리뷰가 남겨지면 저자가 당황할 수 있다.
- 20~50개가 온다면 위험한다
- 초기 라운드에는 고수준 피드백으로 제한하라
- 버그, 장애, 성능, 보안 등
- 메서드 추출, 메서드 조합, 복잡도 개선
- 버그, 장애, 성능, 보안 등
- 고수준의 피드백이 처리된 후 저수준 이슈를 처리
- 변수명 변경, 주석 달기 등
- 너무 많은 리뷰가 남겨지면 저자가 당황할 수 있다.
- 예제 코드 제공에 관대하라
- 저자를 기분 좋게 하기 위한 방법
- 리뷰 중에 선물 주기(코드 예제)
- 다만 너무 긴 예제는 억압적으로 보일수 있다.
- 라운드 당 2~3개의 코드 예제로 제한
- 너무 많은 예제를 제공하면 저자가 코드를 작성 할 수 없다고 생각하게 할 수 있다.
- 저자를 기분 좋게 하기 위한 방법
- 리뷰의 범위를 존중하라
- PR 근처의 코드를 저자에게 수정을 요청하는 것은 안티패턴이다.
- PR에 포함되지 않은 라인은 리뷰 범위가 아니다.
- 단 PR이 둘러싼 코드에 영향을 미친다면 리뷰의 대상이 될 수 있다.
- 태그를 활용
- Nit
- ‘고치면 좋지만 아니어도 그만’
- 리뷰어는 항상 더 개선할 수 있는 의견을 자유롭게 남길 수 있어야 한다.
- 중요치 않으면 Nit 태그로 저자가 무시할 수 있도록 할 수 있다.
- 교육적 목적, 지속적으로 기술을 연마하는 것을 돕는 목적
- null 대신 Optional을 쓰는게 어떨까요?
- OCP 준수를 위해 strategy 도입은 어떨까요?
- Nit
- 한 두 등급만 코드 레벨을 올리는 것을 목표로
- D등급 PR을 받으면 저자가 C, B 등급을 받도록 도와라
- Letter Grade
- 모든걸 알려준다고 모든걸 습득하고 따라가지 못한다.
- Letter Grade
- F등급 PR이면?
- 기능적으로 틀린경우
- 너무 복잡해서 정합성에 확신이 없다면?
- 이때는 승인을 보류하라
- D등급 PR을 받으면 저자가 C, B 등급을 받도록 도와라
피드백 방법
- 너, 왜, 맨날 같은 단어 사용금지
- 리뷰의 핵심
- 누가 잘못 했는지가 아니다
- 무엇이 코드를 나아지게 하는가
- 저자의 방어 유발을 최소하 하는 방법으로 피드백하라
- 비판의 대상은 코드이다.
- ~하는게 어떨까요?
- 오픈 커뮤니케이션
- 리뷰의 핵심
- 건설적인 피드백을 하라
- 동료간 코드리뷰
- 경쟁이 아니다
- 생산성을 높익는것
- 비판이 아니라 학습의 과정으로 인지하여 전체적인 프로젝트의 성공에 기여
- 건설적인 피드백으로 실수에서 배우고 역량을 증대하도록 동기부여
- 동료간 코드리뷰
- 진정한 칭찬을 하라
- 리뷰어는 잘못된 부분에만 집중하기 때문이다.
- 저자가 자괴감에 빠지지 않도록
- PR에서 좋은 변경이 있을 때 마다 칭찬하도록 하자
- “오 이런 API가 있나요? 유용하네요”
- “함수를 분리한 것은 좋은 생각이네요. 훨씬 단순해졌어요”
- 저자가 주니어, 신규입사자라면 리뷰에 매우 민감하고 방어적일 수 있다.
- 진심어린 칭찬은 리뷰어가 잔인한 감시자가 아니라 도와주려는 팀 동료라는 것을 보여서 긴장감을 낮추게 한다.
- 리뷰어는 잘못된 부분에만 집중하기 때문이다.
- 피드백은 명령이 아니라 요청으로 표현하라
- 일상에서 동료에게 명령하지 않는다. 코드리뷰도 동일하다
- 의견이 아니라 원칙에 기반하여 피드백하라
- 제안하는 변경과 변경의 이류를 모두 설명하라
- SW는 과학인 동시에 예술
- 단지 보기 싫거나 직관적이지 않은 코드를 보게된 경우
- 무엇을 할 수 있을지 객관적으로 설명하라
- 이 코드는 혼란스럽네요. → 나는 이 코드를 이해하기 어렵네요.
- 무엇을 할 수 있을지 객관적으로 설명하라
- 단지 보기 싫거나 직관적이지 않은 코드를 보게된 경우
- 반복적인 패턴에 대해서 피드백을 제한하라
- 저자의 실수가 동일한 패턴임을 식별했다면 모든 경우를 언급하지는 말라
- 동일 패턴에 대해 2~3개 정도 언급하라
- 개별사례가 아닌 패턴을 언급하라
- 저자의 실수가 동일한 패턴임을 식별했다면 모든 경우를 언급하지는 말라
교착상태 시
- 교착상태를 적극적으로 처리해라
- 토론의 톤이 점차 팽팽해지고 공격적으로 됨
- 라운드당 커멘트가 줄어들지 않는 경향을 보임
- 너무 많은 커멘트에 저항이 보임
- 코드 리뷰 최악의 결과는 교착상태
- 저자는 커멘트 반영을 거부
- 커멘트를 반영하지 않으니 승인 거부
- 만나서 이야기 하라
- 화상 혹은 만나서
- 텍스트 기반 의사소통은 상대가 인간이라는 것을 잊게 한다.
- 인정하거나 Escalate하라
- 교착상태가 길어지면 관계가 나빠진다.
- 그냥 승인하는 비용
- Agree to disagree
- 아주 심각하지 않다면 인정하고 협업하라
- 저수준 코드를 무심코 승인하면 SW품질이 낮아질 수 있다.
- 동료와 너무 다퉈서 함께 일하지 않게 된다면 고수준의 품질을 얻을 기회가 사라짐
- 인정이 불가한 경우
- 팀장, 테크리더에게 Escalation
- 다른 리뷰어 할당
- 교착상태의 회복
- 상황을 관리자와 논의
- 휴식을 갖고 안정될 때 까지 PR을 서로 보내지 마라
- 갈등 해결책을 학습
- 회피하지말고 해결을 할 수 있도록 하라
- 설계 리뷰를 고려
- 코드 리뷰 때 설계 리뷰 때 논의되었어야 할 사항을 논쟁하는가?
- 설계 리뷰는 있었나?
추가적인 사례
- PR을 작성한 사람과 짝 프로그래밍을 한다.
- Revert를 한다.
- PR을 작성한 사람이 스스로 개선할 수 있도록 기회를 주자
- 시간이 오래 걸릴지언정 스스로 하는법을 배우게 된다
- PR을 작성한 사람이 스스로 개선할 수 있도록 기회를 주자
- Revert를 한다.
- 결정은 저자가
- 완벽한 설계가 아닌 당신이 할 수 있는 최고의 설계를 추구하라
- Letter Grade
- 팀 정신을 유지하기 위해 불완전한 해결책을 받아들여라
- 모든 설계 결함이 항상 실제로 문제가 되지 않는다.
- 완벽한 설계가 아닌 당신이 할 수 있는 최고의 설계를 추구하라
- 코드리뷰의 목적은 비난이 아닌 배움
- 리뷰하려는 코드가 그냥 나쁠 때가 있음
- 저자에게 무슨일이 있었을지도
- 좀 더 안내하는 가르침으로 전환
Appendix
- 저자의 노력 (생산자의 노력)
- 리뷰어 n명의 시간을 절약 (소비자를 위해)
- 효과적인 리뷰 가능
- 리더의 관심과 의지
- 가끔, 그러나 매우 자세히
- 코드 비난에 대한 두려움
- 따라하고 싶도록 코드 리뷰를 하자
- 코드 리뷰같은 것을 어떻게 팀에 도입시킬 수 있는가?
- 못할수도 있으니 좌절한 준비가 필요
- 타인에게 내가받은 영감을 줄 수 없다.
- 영감은 부산물이다.
- 내가 어떻게 하면 모범이 될 수 있을까?
- 특정 행동, 특정 기술을 채택하도록 하려면 모범이 되어야한다.
- 해당 기술을 마스터 해야한다.
- 내가 어떻게 하면 모범이 될 수 있을까?
- 영감은 부산물이다.
- 그러니 모범이 되어야 한다.
- 지각하지 말라. 업무에 기여하라. 긍정적으로 임해라. 사람들을 잘 대하라.
- 기술적 훈련에 대해 언급하려면 고도로 숙달되어야 한다.
- 키보드로 코딩 할 때 사람들이 경악하도록 해라
- 이러한 엄청난 모습을 보여주면 몇몇 사람에게 영감을 줄 수 있을지 모른다.
FAQ
- 코드리뷰 자체가 중요한가?
- 공유와 코드에 대한 논의를 할 수 있는 문화가 중요
- 개발 생산성 vs 개발 품질의 트레이드 오프
- 품질이 높으면 라이프싸이클의 후반으로 갈 수록 시간이 절약된다.
Q&A
- 코드리뷰의 성과 측정 방법?
- 엑셀러레이터 책을 통해 성과 보고가 하나의 방법
- PR을 짧게 자주 하라고 하는데 기능단위로 작업 후 PR을 하면 코드량이 어쩔 수 없이 많아진다. 어떻게 하는 것이 좋은가?
- 커밋단위로 볼 수 있도록 커밋을 의미있게 작성하도록 노력하라.