본문 바로가기

기타/기타

[강의] The RED : 백발의 개발자를 꿈꾸며 : 코드리뷰, 레거시와 TDD by 백명석, 최범균

최범균님이 쓰신 책들은 찾아서 보는 편이었는데, 그러던 중 발견한 최범균님의 강의
사실 이때가지는 '백명석'님은 잘 몰랐지만 해당 강의를 수강하고 멋진 개발자임을 느꼈고 팬이 되었다!!

어떤 내용을 다루는 강의였는지 기억하기 위해, 가벼운 내용만 정리


성장

왜 성장해야 할까?

  • 내가 제어할 수 있는 거에 집중이 필요
    • 열심히는 누구나 한다. 잘 성장하는 것이 필요
  • 받은 만큼 일한다 vs 받고 싶은 만큼 일한다.
    • 7할의 불합리가 세상을 지배하지만 3할의 이치도 틀림없이 행해지고 있다!

성장하는 방법

롤모델

+ 주변에 내가 되고 싶은 개발자를 찾아라
    + 그가 왜 잘하는지를 탐구하고 어떻게 하면 그와 같이 될 수 있을지를 파악하고 노력하라
      + 무조건 실력자의 바지를 붙자고 늘어져서 하나라도 더 배워라!! 본인이 노력해야하는 건 당연
    + 왜 그러는지 이해가 되지 않더라도 기술을 모방하라.
        + 모방하고 혼나고 모방하고 혼나고 (암기/ 1만시간의 법칙)

공유

+ 개인적인 학습만으로는 성장에 한계
    + 업무 수행을 통해 얻은 지식과 경험의 공유를 통한 상호 성장이 중요
        + 공유받는 사람이 아니라 알려주는 사람이 잘됨

의도적 수련

+ 일, 놀이, 수련의 구분
    + 같은 코드를 정해진 시간 동안 할 수 있는 데까지 리팩토링 해보기
    + 같은 장난감을 여러 번 풀어보기
+ 업무만 열심히 해서는 고수가 될 수 없음
    + 전문성 연구에 따르면, 한 분야의 세계적 고수가 되려면 10년의 수련 혹은 도합 일만 시간 이상의 수련 필요

코드리뷰

코드리뷰는 왜 해야 할까?

목적

+ 주목적
    + 품질 문제 검수(버그, 장애)
+ Better code quality
    + 아키텍처 속성 개선을 위한 코드 개선
+ Learning / Knowledge transfer
    + 코드, 해결책 등과 관련된 지식 공유에 기여
        + 공유(주고 받는 학습)을 통한 역량 증대 및 성장
        + 참여한 모든 사람들의 배움의 기회
        + 대개의 경우 리뷰어들은 리뷰 과정에서 지식을 얻게 됨

코드리뷰 기법들

  • 효율적인 PR 방법
    • 지루한 작업은 컴퓨터로 처리
      • 예) 공백, 들여쓰기 같은 단순한 오류는 IDE 기능 활용
    • PR을 올릴 때 주석 달기
      • PR을 저자가 먼저 보고, 리뷰어들을 위한 설명을 코멘트로 남겨서 리뷰어들의 시간을 절약할 수 있게 하라
    • 많은 사람들이 보게 하라
      • 많은 사람들이 본다는 것을 알면 사람들은 대개 더 잘하려는 경향이 있다
  • 효율적 리뷰 방법
    • 리뷰는 즉시 시작
    • 고수준으로 시작, 저수준으로 내려가라
      • 초기 라운드에서는 고수준 피드백으로 제한
        • 버그, 장애, 성능, 보안 등
        • Extract Method, Composed Method 등
      • 고수준의 피드백이 처리된 후 저수준의 피드백 시작
        • (선택적인) 설계 개선
        • 변수명 변경, 주석을 명확하게 하는 것, 복잡도 등
    • 예제 코드에 관대하라
    • 리뷰의 범위를 존중하라
    • 태그를 활용
    • 한두 등급만 코드 레벨을 올리는 것을 목표로

코드리뷰 체크 리스트

  • 버그 장애
  • 기능성
    • 코드가 실제 기대되는 일을 하나?
  • 가독성 / 유지보수 용이성
  • 테스트
  • 자료구조
  • 성능
  • 보안
  • 설계

버그 장애

+ NPE
+ Thread safety
+ OOME
    + Memroy가 지속적으로 증가하는 가능성
    + connection, stream, session의   close
    + 적절한 resource pool
+ 단위 테스트 없는 중요 로직
+ 경계값 테스트
+ 외부 URL이나 DB를 n번 호출하는 경우

자료구조

+ 너무 많은 탐색
    + list에서 뭔가를 찾기 위해 너무 자주 iterate한다면 map?
+ 잦은 정렬
    + 결과를 반환하기 전에 항상 정렬한다면 TreeSet?
 + Map을 전역 상수로 제공하지 말자

설계

  • SRP를 준수하며 결합도 / 응집도를 준수하나
  • 고수준 컴포넌트가 저수준 컴포넌트에 의존하고 있는지(DIP)
  • 기능확장을 코드 수정없이 할 수 있는지(OCP)