Slide 1

Slide 1 text

해나 공혜연 super.init(version=6) Korea Android Hannah left a comment 무차별 LGTM ~ 👍 만 외치던 우리가 고봉밥 코드 리뷰 를?

Slide 2

Slide 2 text

super.init(version=6) 무차별 LGTM만 했던 우리들 2명 이상의 승인 없이 코드를 합병하지 못하도록 Branch Ruleset을 설정해뒀지만 의미가 없었다. * Branch를 보호하기 위해 설정할 수 있는 규칙 hxeyexn left a comment LGTM! hxeyexn approved these changes on Sep 09, 2024 s6m1n left a comment LGTM ~ ! s6m1n approved these changes on Sep 09, 2024 hodu left a comment LGTM ~ hodu approved these changes on Sep 09, 2024 Intro

Slide 3

Slide 3 text

Chapter 01 우당탕탕 코드 리뷰 도입기 feat. 스타카토 Chapter 02 코드 리뷰, 왜 필요할까? Korea Android super.init(version=6)

Slide 4

Slide 4 text

코드 리뷰란? 01 코드 리뷰를 하지 않았던 이유 02 코드 리뷰의 부재로 겪었던 문제 03 코드 리뷰로 해결한 문제 04 Contents 우당탕탕 코드 리뷰 도입기 feat. 스타카토 Korea Android super.init(version=6)

Slide 5

Slide 5 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰란? A 개발자가 작성한 코드를 B 개발자가 검토해 피드백을 전달하면, A 개발자가 피드백을 반영하며 피드백을 주고받는 과정

Slide 6

Slide 6 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 우리는 코드 리뷰를 하지 않았다 * 실제로 이러진 않았습니다…! 기능 개발 끝! 아직 푸시 안햇는데요 ㅇㅋ LGTM~👍

Slide 7

Slide 7 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰를 하지 않았던 이유 기능 구현이 우선 아닐까? 나중에 고치면 되지~ “ ” 우리끼리 코드 리뷰를 해서 얻는 게 있을까? “ ” 스프린트 일정을 기능 구현으로만 채우자! “ ”

Slide 8

Slide 8 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰를 하지 않았던 이유 기능 구현이 우선 아닐까? 나중에 고치면 되지~ “ ” 우리끼리 코드 리뷰를 해서 얻는 게 있을까? “ ” 스프린트 일정을 기능 구현으로만 채우자! “ ” 코드 리뷰를 하지 않았던 이유 super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰의 중요성을 깨닫지 못했고, 추후에 발생할 문제를 예상하지 못했다.

Slide 9

Slide 9 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰의 부재로 겪은 문제

Slide 10

Slide 10 text

작업 시간 증가 버그 발생 위험 Context 공유 부족 Context 공유가 원활히 이루어지지 않았다. 기능 구현보다 코드 이해에 더 많은 시간이 걸렸다. 예상치 못한 사소한 버그가 많이 발생했다. super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰의 부재로 겪은 문제

Slide 11

Slide 11 text

이제는 ؊ ੉࢚! 없다! 물러날 곳이 super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰 도입

Slide 12

Slide 12 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 Activity의 Data Layer 의존성 제거 코드 리뷰로 해결한 문제 문제 상황 -> Activity의 Data Layer 의존성 발생 SharedPreferences로 사용자의 정보를 관리하는 책임을 가진 매니저 객체를 A 작업자가 구현 코드 리뷰 X 이후 B 작업자가 사용자의 정보를 관리하는 매니저 객체를 이용해 Activity에서 사용자의 정보를 호출

Slide 13

Slide 13 text

의견 제시 super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰로 해결한 문제 Activity의 Data Layer 의존성 제거 Opinion2 left a comment 위의 문제점을 해결하기 위해서는, MVVM 아키텍처를 따르고, 추상화와 의존성 주입을 활용하여 의존 관계를 최대한 끊어내는 것이 방법이 될 것 같아요. 그래서 아래 구현을 제안해봅니다! 1. SharedPreferencesManager를 interface로 추상화 : 고수준 모듈이 저수준 모듈에 의존적인 관계를 제거 2. SharedPreferencesManager의 Hilt 적용 : 싱글턴 모듈을 만들어서 싱글턴 인스턴스로 관리 가능, 의존성 주입 가능 3. MemberProfile의 접근, 수정에 대한 책임을 MyPageRepository에게 위임 : SharedPreferences의 의존성 주입, MemberProfile 조회 및 수정을 같은 data 레이어에서 처리 가능 Opinion1 left a comment 이러한 문제점을 해결하기 위해 UserInfoPreferencesManager의 이름을 ~ Manager가 아닌 ~ Repository 또는 ~ DataSource 추상화에 따라 결정 로 변경하고, MainActivity에서 UserInfoPreferencesManager의 함수를 호출하는 부분을 ViewModel에서 처리하도록 변경하는 건 어떨까요? 🧐 cacheػ MemberPro fi le਷ ViewModel੉ ҙܻ
 ViewModel ղীࢲ cachedMemberPro fi le੄ ਬബࢿਸ ѨૐೞҊ Ӓ Ѿҗী ٮۄ MemberPro fi le set ژח fetch

Slide 14

Slide 14 text

의견 제시 super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰로 해결한 문제 Activity의 Data Layer 의존성 제거 Opinion2 left a comment 위의 문제점을 해결하기 위해서는, MVVM 아키텍처를 따르고, 추상화와 의존성 주입을 활용하여 의존 관계를 최대한 끊어내는 것이 방법이 될 것 같아요. 그래서 아래 구현을 제안해봅니다! 1. SharedPreferencesManager를 interface로 추상화 : 고수준 모듈이 저수준 모듈에 의존적인 관계를 제거 2. SharedPreferencesManager의 Hilt 적용 : 싱글턴 모듈을 만들어서 싱글턴 인스턴스로 관리 가능, 의존성 주입 가능 3. MemberProfile의 접근, 수정에 대한 책임을 MyPageRepository에게 위임 : SharedPreferences의 의존성 주입, MemberProfile 조회 및 수정을 같은 data 레이어에서 처리 가능 Opinion1 left a comment 이러한 문제점을 해결하기 위해 UserInfoPreferencesManager의 이름을 ~ Manager가 아닌 ~ Repository 또는 ~ DataSource 추상화에 따라 결정 로 변경하고, MainActivity에서 UserInfoPreferencesManager의 함수를 호출하는 부분을 ViewModel에서 처리하도록 변경하는 건 어떨까요? 🧐 cacheػ MemberPro fi le਷ ViewModel੉ ҙܻ
 ViewModel ղীࢲ cachedMemberPro fi le੄ ਬബࢿਸ ѨૐೞҊ Ӓ Ѿҗী ٮۄ MemberPro fi le set ژח fetch 공식 문서의 Data Layer 네이밍 컨벤션을 근거로 네이밍 변경 ViewModel을 통해 Activity가 사용자 정보를 전달받도록 변경 사용자 정보를 관리하는 매니저 객체 추상화 의견 제시 super.init(version=6) 코드 리뷰로 해결한 문제 Activity의 Data Layer 의존성 제거 우당탕탕 코드 리뷰 도입기 feat. 스타카토

Slide 15

Slide 15 text

결과 객체가 명확한 이름을 가지게 되었고, 그에 따른 적절한 책임 분리 Activity에서 Data Layer에 직접 접근하지 않고 ViewModel을 통해 데이터에 접근 가능 super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰로 해결한 문제 Activity의 Data Layer 의존성 제거

Slide 16

Slide 16 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰 경험을 돌아보며 코드 리뷰에 대한 나의 생각 Q1. 코드 리뷰는 좋은 개발 문화인가? Yes No Yes Q1. 코드 리뷰는 좋은 개발 문화인가? A1. 그렇다. Yes

Slide 17

Slide 17 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰 경험을 돌아보며 코드 리뷰에 대한 나의 생각 Yes No Q2. 그럼 코드 리뷰는 장점만 있는가? No Q1. 코드 리뷰는 좋은 개발 문화인가? A1. 그렇다. Q2. 그럼 코드 리뷰는 장점만 있는가? A2. 아니다. 우리는 열정이 너무 과해 한 PR에 100개의 코멘트를 남기며 리뷰이에게 부담을 줬고, 병합까지 많은 시간을 소요했던 적이 있다. Q1. 코드 리뷰는 좋은 개발 문화인가? A1. 그렇다.

Slide 18

Slide 18 text

super.init(version=6) 우당탕탕 코드 리뷰 도입기 feat. 스타카토 코드 리뷰 경험을 돌아보며 코드 리뷰에 대한 나의 생각 Yes No Yes Q1. 코드 리뷰는 좋은 개발 문화인가? A1. 그렇다. Q3. 단점을 겪고도 코드 리뷰가 꼭 필요하다고 생각하는가? Yes Q3. 단점을 겪고도 코드 리뷰가 꼭 필요하다고 생각하는가? A3. 그렇다. Q2. 그럼 코드 리뷰는 장점만 있는가? A2. 아니다. 우리는 열정이 너무 과해 한 PR에 100개의 코멘트를 남기며 리뷰이에게 부담을 줬고, 병합까지 많은 시간을 소요했던 적이 있다. Q1. 코드 리뷰는 좋은 개발 문화인가? A1. 그렇다. Q2. 그럼 코드 리뷰는 장점만 있는가? A2. 아니다. 우리는 열정이 너무 과해 한 PR에 100개의 코멘트를 남기며 리뷰이에게 부담을 줬고, 병합까지 많은 시간을 소요했던 적이 있다.

Slide 19

Slide 19 text

Chapter 02 코드 리뷰, 왜 필요할까? 부록 내향적인 발표자로서 전하고 싶은 한마디 Korea Android super.init(version=6)

Slide 20

Slide 20 text

코드 리뷰의 장점과 단점 feat. 팀원 회고 01 나쁜 코드 리뷰 vs 좋은 코드 리뷰 02 효과적인 코드 리뷰를 위한 제안 03 코드 리뷰의 필요성 04 Contents 코드 리뷰, 왜 필요할까? Korea Android super.init(version=6)

Slide 21

Slide 21 text

super.init(version=6) 코드 리뷰, 왜 필요할까? 코드 리뷰의 장점과 단점 feat. 팀원 회고 지식 공유 및 학습 다양한 의견을 주고받는 과정에서 서로의 부족한 부분을 보완해 팀원 모두가 성장할 수 있다. 01. 가독성 좋은 코드 다양한 코드 스타일 간의 합의점을 찾아 모두가 읽기 쉽고 유지 보수하기 좋은 코드를 만들어 갈 수 있다. 02. 논리적인 코드 작성 리뷰어가 리뷰하기 좋은 환경을 만들기 위해, 팀원이 쉽게 이해하고 납득할 수 있는 코드를 작성하려고 노력한다. 04. 프로젝트 기여도 상승 코드를 개선하기 위해 팀원 모두가 함께 고민하면서 자신이 개발한 기능이 아니어도 기여할 수 있다. 05. 프로젝트 이해도 향상 팀원이 구현한 기능의 동작 방식에 대한 이해도가 자연스럽게 향상된 다. 03. 우리가 직접 느낀 코드 리뷰의 장점은?

Slide 22

Slide 22 text

super.init(version=6) 코드 리뷰의 장점과 단점 feat. 팀원 회고 코드 리뷰, 왜 필요할까? 우리가 직접 느낀 코드 리뷰의 단점은? 긴박한 상황이라면? 마감일이 얼마 남지 않은 상황이거나 hotfix가 필요한 긴박한 상황에는 장애물처럼 느껴질 수 있다. 02. 코드 리뷰로 인한 상처 때로는 상처를 받기도 한다. 팀원의 차가운 리뷰에 상처를 받거나, 스스로에게 실망하는 경우도 있다. 03. 많은 시간이 소요 리뷰에 너무 많은 시간을 투입하면 리뷰 반영과 기능 병합까지 많은 시간이 소요되고, 리뷰이의 부담도 커진다. 01.

Slide 23

Slide 23 text

super.init(version=6) 코드 리뷰, 왜 필요할까? 코드 리뷰를 한다고 좋은 개발 문화인가?

Slide 24

Slide 24 text

super.init(version=6) 나쁜 코드 리뷰 vs 좋은 코드 리뷰 코드 리뷰, 왜 필요할까? 작업자의 의견과 생각을 고려하지 않고 변경을 지시하는 리뷰 리뷰어 비난이 섞인 리뷰 의도가 모호한 리뷰 리뷰어의 제안을 무조건 수용하거나 지시를 따름 리뷰이 성의 없는 리뷰 반영 목적 없이 다양한 작업을 한 PR

Slide 25

Slide 25 text

super.init(version=6) 코드 리뷰, 왜 필요할까? 나쁜 코드 리뷰 vs 좋은 코드 리뷰 코드 뒤에 있는 리뷰이를 배려하는 리뷰 리뷰어 리뷰이가 스스로 고민하고 개선할 수 있도록 유도하는 리뷰 충분한 이유와 자료, 예시를 활용해 의견 제시하는 리뷰 기능 구현 시 고민한 과정을 PR에 공유 코멘트의 의도와 배경을 이해한 후 반영 자신의 결정에 대한 충분한 설명 피드백을 남겨 준 이에게 감사 표현 리뷰이

Slide 26

Slide 26 text

super.init(version=6) 효과적인 코드 리뷰를 위한 제안 코드 리뷰, 왜 필요할까? 규칙 만들기 팀 상황에 적합한 코드 리뷰 규칙을 만들어야 한다. ✦ 아무리 좋은 코드 리뷰 방식이라도 팀 상황에 맞지 않으면 역효과가 난다. 우선순위 정하기 hotfix, 마감기한 임박 등 긴박한 상황이라고 리뷰를 소홀치 말자. ✦ 우선순위를 정해 피드백이 필수적인 부분만 간단히 리뷰를 주고받자. 마감 기한 설정 리뷰 및 반영 기간이 길어질수록 PR의 크기는 커진다. ✦ 리뷰에 대한 부담을 줄이기 위해 피드백 마감기한을 짧게 설정하자. 작업 목표 설정 이슈 티켓 발행 시 이슈의 목표를 명확히 설정해야 한다. ✦ 해당 이슈에서 다루지 않을 작업을 티켓에 명시해 PR 크기를 줄이자. 규칙

Slide 27

Slide 27 text

super.init(version=6) 효과적인 코드 리뷰를 위한 제안 코드 리뷰, 왜 필요할까? 자세 리뷰어의 자세 ✦ 이유와 근거 있는 의견 제시 리뷰는 토론과 같다. 토론을 하듯, 리뷰를 남길 때도 의견과 함께 리뷰이가 납득할 수 있는 이유와 근거 자료 등 를 충분히 제시해야 한다. 적절한 시간 분배 리뷰이가 감당할 수 있는 양의 리뷰를 남기고, 피드백 마감기한을 지키자. 지나치게 많은 시간을 코드 리뷰에 할애하면 오히려 생산 효율이 떨어진다. 리뷰를 위한 리뷰 자제 리뷰를 위한 리뷰는 자제하자. 리뷰를 위한 리뷰는 지적을 초래한다. 피드백 할 부분이 없다면 칭찬을 남기는 것이 좋다.

Slide 28

Slide 28 text

super.init(version=6) 효과적인 코드 리뷰를 위한 제안 코드 리뷰, 왜 필요할까? 자세 리뷰이의 자세 ✦ 의견이 제시된 배경을 생각 리뷰어도 실수할 수 있다는 것을 명심하자. 리뷰어의 제안을 무조건 수용하거나 따르기보다는, 그 의견이 제시된 배경과 질문이 나온 원인을 생각해야 한다. 코드와 나는 독립적인 존재 피드백이 자신에 관한 공격이나 비판이라고 생각하지 말자. 코드 리뷰는 내가 아닌 내가 작성한 코드를 개선하고자 의견을 주고받는 것이다. 리뷰하기 쉬운 PR 만들기 리뷰하기 쉬운 PR을 만들자. 목적을 명확히 해 PR의 규모를 작게 유지하고, 작업 내용을 PR 본문에 설명해 리뷰어가 리뷰하기 좋은 환경을 만들어야 한다.

Slide 29

Slide 29 text

super.init(version=6) 효과적인 코드 리뷰를 위한 제안 코드 리뷰, 왜 필요할까? 마인드셋 ✦ 리뷰는 모두를 위한 것이다. 나 자신과 팀, 서비스를 위한 것, 서로 감정이 상하지 않도록 노력이 필요 ✦ 사람은 누구나 실수한다. 리뷰이, 리뷰어 모두 실수를 빠르게 인정하고 열린 마음으로 토론하는 것이 중요 ✦ 칭찬도 좋은 코드 리뷰이다. 코드 리뷰가 어렵게 느껴진다면 칭찬을 남기며 코드 리뷰와 친해지기 효과적인 코드 리뷰를 위해서는 리뷰이와 리뷰어가 토론할 수 있는 환경을 만들어 가는 것이 중요

Slide 30

Slide 30 text

super.init(version=6) “아무리 가독성 높은 코드를 작성하려고 애를 써도 노력의 결과가 항상 성공적이지는 않습니다. 스스로는 가독성이 높다고 판단했지만 배경 지식의 차이, 생각의 차이 등으로 인해 누군가에는 이해하기 어려운 코드가 될 수도 있습니다.” - 이시가와 무네토시 코드 리뷰의 필요성 코드 리뷰, 왜 필요할까?

Slide 31

Slide 31 text

super.init(version=6) “아무리 가독성 높은 코드를 작성하려고 애를 써도 노력의 결과가 항상 성공적이지는 않습니다. 스스로는 가독성이 높다고 판단했지만 배경 지식의 차이, 생각의 차이 등으로 인해 누군가에는 이해하기 어려운 코드가 될 수도 있습니다.” - 이시가와 무네토시 코드 리뷰의 필요성 코드 리뷰, 왜 필요할까? super.init(version=6) 코드 리뷰의 필요성 코드 리뷰, 왜 필요할까? 자신이 작성한 코드도 시간이 지나면 이해하기 어려워진다. 하물며, 동료가 작성한 코드는 더욱 그렇다. 문제를 빠르게 해결하지 않으면 문제의 크기는 점점 커지고, 프로젝트 규모가 커질수록 문제를 찾기도 어려워진다. 그래서 코드 리뷰가 필요하다. 코드 리뷰를 숙제라고 생각하지 말고, 리뷰어와 리뷰이가 함께 성장할 수 있는 도구로 활용하자.

Slide 32

Slide 32 text

super.init(version=6) 부록. 내향적인 발표자로서 전하고 싶은 한마디 저는 파워 I 입니다

Slide 33

Slide 33 text

super.init(version=6) 참고 자료 우리는 코드 리뷰를 잘하고 있을까요? develog 이시가와 무네토시, ~읽기 쉽고 코드 리뷰하기 좋은 코드 작성 가이드, 정기욱, 길벗 코드 리뷰 in 뱅크샐러드 개발 문화 banksalad blog 효과적인 코드리뷰를 위한 리뷰어의 자세 kakao tech ✦ ✦ ✦ ✦

Slide 34

Slide 34 text

Thank You Thanks to my teammates BingT and Hodu! super.init(version=6) Korea Android val hannah: Developer = introduce { name(“ҕഌো”) email(“kck85075@naver.com”) github(“hxeyexn”) } 발표의 주재료였던 스타카토가 궁금하시다면 QR에 접속해 보세요!