[리팩터링 2판] 스터디 모집 및 시작. Chapter 1. 리팩터링: 첫 번째 예시
Background
6개월 차 개발자 정도 되었을 땐가 연구팀에서 작성이 된 Machine learning 코드들을 production level로 만들고 serving 하기 위해 refactoring 하는 업무를 맡게 되었다.
그때 동료분께서 읽어보는 것을 추천해 주신 책이 'Clean code'였다.
그 당시 clean code 책을 읽을 때는 '좋은 말인 거 같다..' 정도이지 솔직히 크게 와닿거나 '아 앞으로 내 업무에 이런 것들 적용해봐야겠다. 이런 것을 명심해야겠다' 정도의 깨달음은 없었다.
그렇게 1년이 흐르고 올해 2022년 1월, 새해 버프를 받아 그 유명하다는 Clean code (일단 다시 읽어보자)를 했다.
그래도 처음 읽고 나서 6개월 사이 나도 모르게 보고 배운 건 있었는지 첫 번째 읽었을 때 보다 이해도 잘 가고, 현업에 적용할 수 있는 포인트들이 많이 보였다.
당시 정리한 글들..
[Clean Code] Chapter 01. 깨끗한 코드
[Clean Code] Chapter 02. 의미 있는 이름
[Clean Code] Chapter 03. 함수
[Clean Code] Chapter 04. 주석, Chapter 05. 포맷팅
[Clean code] Chapter 08. 경계
[Clean code] Chapter 09. Unit test
[Clean code] Chapter 11. System
[Clean code] Chapter 12. Emergence (창발적 설계로 깔끔한 코드 구현하기)
그리고 그 후부터 지금까지에는
- 유지보수 단계에 접어든 프로젝트들이 복잡하여 예상치 못한 에러가 터지거나
- 그럼에도 프로그램의 요구사항은 꾸준히 변경되어나 추가되고
- 더이상 이럴 순 없다! 해서 더 좋은 구조와 확장성을 고려한 디자인에 대한 필요성을 고려해나가는
일들이 있었다.
이런 일들을 겪으면서 마음 한편에서 그 유명하다는 리팩터링 2판 (제발 우리를 좀 구해주세요)를 시작해야겠다는 생각이 들었다.
정리하자면,
리팩터링 2판을 공부해야겠다는 마음을 먹게 된 배경은
- Clean code를 어찌 됐건 읽고, 정리하는 목표를 달성했다는 것에 대한 자신감이 있었음.
- 더럽고 복잡한 코드, 이해하기 어려운 코드로 인해 유지보수가 오래 걸리는데, 여기에 기능 추가까지 되어야 하는 상황이라 리팩터링의 필요성이 절실함
- 부채 청산에 대한 팀 차원의 공감이 형성되어 있음.
이었다.
스터디 모집 및 킥오프
이전에 혼자 클린 코드를 읽고 정리하면서 아쉬웠던 점은
1. 혼자 하다 보니 완독과 정리 의지를 다잡기 위한 노력이 많이 들어갔고,
2. 예시로 나와있는 코드는 그냥 넘어가기도 하면서 꼼꼼함이 부족했다는 것이다.
그래서 이번 리팩터링 2판은 현업에서 적용시켜봐야 하는 것인 만큼
1. 회사 동료분들과 함께 공부하고 싶었고,
2. 리팩터링 2판은 Javascript로 되어있었기에 Typescript를 사용하는 우리 상황에 맞게 예시 코드를 바꿔보기도 하고, 예제를 따라 해 보며 리팩터링 과정을 커밋 단위로 남겨보고자 했다. 또한 테스트까지 작성해보고 싶었다.
그래서 잠깐의 홍보로 동료 2분과 함께 리팩터링 2판 스터디를 함께 하게 되었다. 😀 작고 귀여운 스터디 규모 3명♥️ ㅎㅎㅎ
스터디 방식은 '돌아가면서 한 명이 한 챕터씩 전담해서 발표하는 방식'은 절대 하지 말자고 얘기가 되었다.
그 이유는 이런 방식으로 진행되는 스터디에 참여해보면
- 자신이 발표할 주에 부담감이 굉장히 큰 반면
- 발표가 아닌 주에는 책임감이 떨어져 스터디 준비가 잘 되지 않는 경우가 많고
- 책을 읽어오지 않고 준비를 해오지 않아도 묻어갈 수 있기 때문에
이것이 반복되면 끝날 때쯤 자신이 발표한 주제 외엔 남는 것이 하나도 없기 때문이다.
그래서 우리의 스터디 방식은
- 독서 모임처럼 정해진 부분을 '반드시' 읽어오고 스터디 시간에는 그에 대해서 토의하고 싶은 부분을 자유롭게 얘기한다.
- 토론, 얘기 주제는
- 이거는 다 같이 인지해줬으면 좋겠다 싶은 것들
- 이거는 동의하지 않는 내용인데 다른 분들은 어떻게 생각하느냐
- 책에서는 리팩터링 전/후 예제 코드만 있는데, 이 리팩터링 후 예제 코드를 검증하는 테스트 코드를 짜서 소개한다던지
- JS로 된 예제니까 TS로 전환해서 소개한다던지
이다.
자바스크립트 스터디 좋은 책 추천, 그리고 NestJS에서 향로님께서 진행하는 방식을 따랐다.
아래부터는 리팩터링 2판 책을 읽고 사내 스터디를 통해 나눈 내용을 기록합니다.
개인적인 경험과 생각이 들어가 있으며 아직 배워야 할 것이 많은 사람으로서 잘못 이해한 내용이 있을 수 있습니다.
책의 모든 내용과 순서를 그대로 담지 않을 수 있습니다.
블록 안의 내용은 책의 내용 중 스터디에서 많은 얘기가 주고받아지거나 의미 있다고 판단한 내용을 옮겨 적은 것입니다.
Chapter 1~5는 본격적인 리팩터링 기법을 배우기 전
- 리팩터링에 있어서 필요한 사고 과정을 예시 코드를 통해 훑어보기
- 리팩터링에 대한 소개
- 나쁜 코드와 그에 적용할 수 있는 기법들에 대한 리스트업,
- 테스트 코드 작성에 대한 간단한 소개
- 책 전개에 대한 소개
이므로 간단한 bullet point 형식으로 정리하였습니다.
Chapter 6. 기본적인 리팩터링부터 각 기법들을 예제 코드와 함께 자세히 정리해나갈 계획입니다.
Chapter 1. 리팩터링: 첫 번째 예시
27p
수백 줄짜리 코드를 수정할 때면 먼저 프로그램의 작동 방식을 더 쉽게 파악할 수 있도록 코드를 여러 함수와 프로그램 요소로 재구성한. 프로그램의 구조가 빈약하다면 대체로 구조부터 바로 잡은 뒤에 기능을 수정하는 편이 작업하기가 훨씬 수월하다.
프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형태로 리팩터링 하고 나서 원하는 기능을 추가한다.
- express는 구조 자유도가 높아서 구조가 빈약해질 가능성이 큰 것 같다. nestjs가 좋더라
- 저번에 팀원 A분께서 리팩터링을 하신 PR을 코드 리뷰했는데 구조부터 잡고 들어가시더라
- 하지만,, 이미 덕지덕지 붙어서 복잡해질 대로 복잡해진 코드라면 쉽진 않을 것 같다.
- 리팩터링이 필요한 이유는 새로운 요구 사항이 한 부대씩 몰려오기 때문이라는 것이 정말 공감이 많이 되었다.
28p
리팩터링 할 코드 영역을 꼼꼼하게 검사해줄 테스트 코드들부터 마련해야 한다.
리팩터링 하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자기 진단하도록 만든다.
- 테스트 코드가 없으면 불안해서 리팩터링 할 수 없다.
- 저번에 다른 팀의 코드를 리팩터링 해야 할 일이 있었는데, 그때 가장 먼저 한 일이 전의 결과를 보증할 수 있도록 테스트 코드를 작성하고 테스트 자동화를 한 것인데, 가장 잘한 일이라고 생각한다.
33p
하나의 리팩터링을 문제없이 끝낼 때마다 커밋한다. 그래야 중간에 문제가 생기더라도 이전의 정상 상태로 쉽게 돌아갈 수 있다.
- 리팩터링 하는 작업을 작게 나누고, 이 작은 변경사항에 대한 테스트를 수행하고, 통과되었다면 커밋하자. 이것이 저자가 말하고 싶은 리팩터링에 있어서 필요한 (사고) 과정이라고 생각한다.
Chapter 1 스터디 소감
개발에 대한 노하우가 굉장히 많고 개발 일정과 개발 부채에 대한 회사 내에서의 이해관계를 잘 아시는 선배 개발자가 하나하나씩 천천히 알려주는 느낌이었다. 스타트업에서 이런 분의 존재는 정말 귀한데, 책을 통해 한 분 만난 기분이랄까 ㅋ-ㅋ
그만큼 현업과의 괴리가 크지 않고, 한 소제목에 대한 내용마다 관련된 회사 일이나 프로젝트 코드가 생각났다.
그리고 스터디에서 사내 동료분들과 그 떠오른 프로젝트나 회사 상황에 대해서 더 구체적으로 토의할 수 있었고, 앞으로 배워나갈 리팩터링 기법들을 통해 개선시켜나갈 생각으로 기대감이 가득했다.
Reference
자바스크립트 스터디 좋은 책 추천, 그리고 NestJS
깨끗한 코딩 하는법 (리팩터링 최종 정리판 강의, 드루와🥳)
[리팩터링 2판] CHAPTER 01. 리팩터링: 첫 번째 예시 (1) - Mijeong (Rachel)