본문 바로가기
Engineering WIKI/Book

리팩토링 2판 - Chapter2 요약

by wonos 2022. 10. 20.

리팩터링 2판

  • 자바스크립트로 예시가 되어 있음
  • 리팩터링 패러다임은 언어를 초월하여 의미가 있음
  • 그러나 실제 활용은 언어에 귀속됨

배워서 어디에 써먹을까?

  • 리팩터링이 필요한 이유를 설득할 수 있음
    • 책 한권 읽는다고 설득할 수 있는 것은 아님
    • 적어도 물꼬는 틔워줄 수 있음
  • 리팩터링 중 발생하는 고민을 일정량 줄일 수 있다.
    • 간결한 코드가 좋을까, 성능이 우월한 방법이 좋을까?
    • 어느정도의 성능 감소를 용인할 수 있을까?
    • 깔끔한 코드와 디버깅이 용이한 코드 중 무엇을 할까?
  • 언제 리팩터링 할까?
    • 냄새나는 코드
    • 냄새가 얼마나 나야 리팩터링 해야하나?
  • 훨씬 깔끔한 코드를 작성할 수 있음
    • 리팩터링을 수정하는 것이지만, 창조할때도 유용
  • 동료의 Code Review 할 때
    • 동료와 팀의 생산성에 기여할 수 있다!

스터디에서 다루는 범위

  • 챕터 1 생략
  • 매주 가이드 영상에서 책의 내용을 요약해줌
  • 이렇게 스터디 해본적은 없는데, 내용 요약에 대한 부담이 줄어서 오히려 의문이 드는 부분만 핵심적으로 파볼 수 있을 것 같다.

챕터 2: 리팩터링 원칙

리팩터링 정의

  • Why: 코드 이해와 수정이 쉽도록
  • What: 내부 구조 변경
  • How: 겉보기 동작은 유지

겉보기 동작 유지

  • 콜스택이나 인터페이스가 달라지는 것은 변화가 아님
    • 같은 함수인데 지역변수를 함수의 파라미터로 놓기
    • 어디까지나 겉보기 동작에는 변화가 없음
  • 그런 어디부터 변화? (추상적 기준)
  • 버그도 그대로 남아 있어야 한다
    • 만약 리팩터링 하는 과정에 사소한 버그가 발견되면 수정해도 상관없음
    • 하지만 이미 알고 있는 버그이고, 수정할 계획이 있었다면 리팩터링 중에는 수정하지 않기

이 책에서 정의한 리팩터링은 굉장히 좁다

  • 누군가 리팩터링 하다가 코드가 꺠져서 며칠이나 고생했다 라고 한다면, 십중팔구 리팩터링 한것이 아니다 (80페이지)
  • 이건 어떤 의도로 한 말일까?

두개의 모자

  • 기능추가 / 리팩터링
  • 하나의 모자를 쓸 때는 하나의 변화만
  • 리팩터링 할 때는 버그도 그대로 둬야함

리팩터링 하는 이유

  • 소프트웨어 설계가 좋아진다
  • 소프트웨어를 이해하기 좋아진다
  • 버그를 쉽게 찾을 수 있다
  • 프로그래밍 속도를 높일 수 있다: 이게 가장 핵심적인 이유

언제 리팩터링해야 할까?

  • 3의 법칙 (3진아웃 리팩터링)
    • 비슷한 일을 3번째 하게되면 리팩터링한다
  • 준비를 위한 리팩터링
    • 기능을 쉽게 추가하게 만들기
    • 리팩터링을 조금만 하면 기능 추가하기 쉬울것 같을 때
    • "잠깐, 지도를 찾아보고 가장 빠른 경로를 찾아보자"
  • 이해를 위한 리팩터링
    • 코드를 이해하기 쉽게 만들기
    • 이해한 바를 명시적으로 코드에 드러내도록 수정할 수 있음
    • 새로운 설계에 도움
    • 동료간 교류에 도움
      • 새로운 코드를 접했을 때 리팩토링을 하는 것이 코드 이해에 도움이 될 수 도 있겠다
  • 쓰레기 줍기 리팩토링
    • 코드가 일을 비효율적으로 처리하는것을 발견했을 때
      • 간단히 수정할 수 있으면 바로 고친다
      • 아니라면 기록 후, 하던일을 마치고 처리한다
        • 이슈 작성해서 큐에 넣어두기
  • 계획된 리팩터링과 수시로 하는 리팩터링
    • 프로그래밍 중 상시 지속되는 활동: 저자가 지향하는 것
    • 소홀했던 부분을 작성하고 리팩터링하는 것도 필요
      • 무조건 나쁜 것은 아님
  • 오래 걸리는 리팩터링
    • 리팩터링은 대부분 몇 분 안에 끝난다. 길이야 몇 시간 정도다
    • 조금씩 개선
  • 코드 리뷰에 리팩터링 활용하기
    • 팀원의 코드 리뷰를 할 때 리팩터링 기법을 이용
  • 관리자에겐 뭐라고 말해야 할까?
    • "어설픈 재구성"은 리팩터링이 아니다
    • "설계 지구력 가설": 추진력을 얻기위해 무릎을 꿇는 과정을 관리자에게 어필
    • 아니면 아예 리팩터링 한다고 말하지 말아라
      • 리팩터링은 어차피 프로그래밍의 일부
  • 리팩터링 하지 말아야 할 때
    • 굳이 수정할 필요가 없을 때
      • 코드가 지저분한데 한 함수안이 지저분하다... 블랙박스로 되어 있고 성능이 잘나오고 있다면 굳이 수정할 필요 없음
    • 처음부터 새로 작성하는게 쉬울 때

리팩터링 시 고려할 문제

  • 새 기능 개발 속도 저하된다는 오해
    • 이후에 개발 속도를 빠르게 하기 위함
    • 팀원들을 설득하고 훈련시키는 것이 중요함
    • 리팩터링은 '클린코드', '바람직한 엔지니어링 습관' 같은 도덕적인 것이 아님
    • 오로지 경제적인 이유로 하는 것
  • 코드 소유권
    • 구현코드와 호출코드의 소유자가 다른 팀일 때, 공개 API를 사용할 때 등
    • 여전히 리팩터링 가능하다. 제약이 따를 뿐
    • 코드 소유권을 세부적으로 나눠서 관리하는 것을 바람직하지 않다고 함. 아마존에서도 소스코드를 팀별로 관리하고 있다고 함
    • 오픈소스 개발 모델 차용
  • 브랜치
    • 메인 브랜치 → A / B / C 브랜치 나눠서 작업 → 나중에 머지
    • 이 처럼 독립브랜치로 일할 때 통합되는 기간이 길어질 수록 통합이 어려워짐
    • 브랜치 통합주기를 2~3일, 그 보다 더 짧게, 최소 하루에 한번 통합
    • 단, 완료되지 않은 기능이 시스템 전체를 망치지 않도록 주의
    • 리팩터링이 일어나면 코드 전반에 소규모 수정이 일어남 → 머지 중에 충돌이 발생할 가능성이 높음
  • 테스팅
    • 리팩터링은 동작 변화가 없어야 한다
    • 테스트 자체가 하나의 기준이 될 수 있음
    • 의도치 않은 버그를 빠르게 잡을 수 있음
    • 버그 생길 위험이 크다는 불안감 해소 가능
  • 레거시 코드
    • 한계를 언급함
    • 대부분의 코드베이스는 다른사람이 작성한 것
    • 테스트 없이 리팩터링은 어렵다 → 테스트를 보강하라!
    • 쉽게 해결할 방법은 없다
  • 데이터베이스
    • 안 되는 줄 알았는데 가능하더라

리팩터링, 아키텍처, 애그니(YAGNI)

  • 기존 패러다임
    • 요구사항 사전에 완벽 파악 → 코딩전에 아키텍처 확정
    • 사실상 불가능
    • 요구사항이 계속 변함
  • 유연성 메커니즘을 심어두는 방안
    • 미래를 대비해서 기능을 미리 만들어두는 것
    • 코드를 너무 유연하게 하면 오히려 대응 능력을 떨어트림...
  • YAGNI(You aren't going to need it: 아마 필요 없을 거다)
    • 현재까지 파악한 요구사항만 해결
    • 해당 요구사항을 멋지게 해결
    • 진행중 요구사항을 파악하면 그때그떄 리팩터링하여 수정
    • 요구사항을 이해했을 때 처리하는게 훨씬 더 낫다

리팩터링과 소프트웨어 개발 프로세스

  • XP
  • TDD
  • 애자일 소프트웨어
  • 테스트 코드, 지속적 통합

리팩터링과 성능

  • 하드웨어가 발전하기 때문에 성능은 상관없음이 아님
  • 리팩터링을 하고나면 성능을 튜닝하기 쉬워진다
  • 결과적으로는 성능에도 도움이 됨

성능 중심 개발방법

  • 시간예산분배: 제한된 조건에서만 사용됨
  • 끊임없이 관심 기울이기: 모든 코드를 쓸 때 성능향상에 초점
    • 실제 효과가 변변치는 않음

90%시간은 낭비

  • 대부분의 프로그램은 극히 일부분에서 대부분의 시간을 소모한다
    • 아무것도 안 만드는데도 시간이 걸린다
    • ex) 알고보니 하나의 함수를 쓸데없이 여러번 호출
  • 성능상 문제가 되는 부분은 10%밖에 안된다
  • 그 부분을 찾기 쉽게하려면 리팩터링
  • 프로파일러로 분석하여 해당 부분만 성능 개선
  • 크게 느려지지 않은 나머지 90%의 성능개선에 투자하는것은 낭비

기타