프리코스 1주차 미션을 수행하며 느낀 점들을 글로 남기고자 합니다. 48개의 커밋과 110개의 코드 리뷰를 주고 받으며 스스로 성장한 내용을 담고 있습니다.
목표를 설정하고, 이를 달성했을 때의 성취감을 좋아합니다. 성취감 중독으로 굴러가는 개발 일상 저에게는 성취감이 항상 다음 성장을 위한 동력이 되어 줍니다.
그러기 위해서는 목표를 설정하고, 이를 달성하기 위한 작은 계획들을 세우고 있습니다. 또 짧게라도 회고를 매일 작성하고 있는데요! 노션에서 아래와 같이 일정을 관리하고 있습니다.
지원서에 기재한 프리코스 목표는 아래와 같습니다.
이를 위해 세운 세부적인 계획은 아래와 같습니다.
✅ SOLID 원칙 준수하기
✅ 다양한 디자인 패턴 코드에 녹여보기
✅ TDD 첫 도전
✅ 채널에 일주일에 적어도 2개씩 글 올리기
✅ 코드 리뷰 열심히 참여하기
목표를 세웠다면, 이를 의식적으로 챙기면서 열심히 하루하루 굴러갑니다. ( •_•) ○ ) ○ )
1주차를 어떻게 보냈는지 간단하게 되돌아보겠습니다.
기능 구현 목록을 정리하고, 문제 요구사항을 구체화했습니다. 간단한 요구사항이라고 생각했지만, 생각할 부분과 추가해야 하는 검증이 매우 많았습니다. 최대한 여러 가지 경우의 수를 생각해보며 어떻게 설계할지 고민했습니다.
TDD를 도전하기로 목표를 잡았습니다. Red - Green Cycle을 경험하며 작은 단위로 개발을 시작했습니다. 테스트 코드를 먼저 작성하고 개발을 하다 보니 자연스럽게 한 가지 일만 하는 메서드를 만들 수 있게 되었습니다. 벌써 첫 번째 계획 일부 달성!?
또 작은 커밋 단위를 지킬 수 있게 되었습니다. 기존에 프로젝트를 진행할 때 몇 백줄의 코드를 한 번에 커밋을 하던 행동을 깊게 반성하게 되었습니다.. 이때까지만 해도 TDD 최고!! 를 외쳤던 것 같습니다.
어랏 !? 생각보다 할 일이 너무 많다는 것을 느꼈습니다. 벌써 3일차인데 20개 남짓의 체크 박스 중에 3개밖에 완료하지 못했습니다.
이때부터 TDD의 스텝을 놓치기 시작했습니다. 큰 기능 단위로 구현을 했고 변경의 범위가 넓어지게 되었습니다.
프로젝트 일정이 바빠 프리코스를 수행하지 못했습니다.
객체를 다시 정의했습니다. 요구사항을 다시 분석하며 Parser, Number, Separator, Calculator 등의 객체를 만들었고, 각각의 객체가 가질 상태와 행위, 의존성을 고민했습니다.
Parser는 Separator를 기준으로 문자열을 자르고, Calculator는 Number들을 계산합니다.
객체는 반드시 처음에 정의해야지
기능 구현을 완료했고, 세부적인 리팩토링을 진행했습니다. 변수명과 메서드명이 적절한지, 객체가 올바른 책임을 갖고 있는지 등을 고민했습니다.
총 13분의 코드를 리뷰하며 좋은 리뷰를 할 수 있도록 노력했고, 결과적으로 제 성장에도 많은 도움을 얻었습니다.
코드 리뷰를 할 때, 아래의 내용을 생각하며 좋은 리뷰를 하기 위해 노력하고 있습니다.
✅ 추상적으로 말하지 않기.
의견이 갈리는 것 같지만 개인적으로는, 구체적인 해결책까지 제시하는 걸 선호합니다. 서로의 의도를 이해하지 못해 두 번 질문이 오가는 것이 불편할 때가 있습니다.
✅ 상황에 적합한 리뷰를 하기.
너무 현실성이 떨어지는 리뷰는 지양하고 있습니다. 리뷰를 하시는 분의 코드 스타일과 상황을 존중하는 리뷰를 해야 한다고 생각합니다.
✅ 이렇게 해주세요 ❌ 이렇게 하는 거에 대해 어떻게 생각하세요? ⭕
물론 상황마다 더 적합한 선택이 존재하지만, 기존에 내가 익숙한 방식이 틀릴 수도 있다는 것을 항상 전제에 두고 있습니다. 그렇기에 내가 작성한 코멘트가 무조건 정답이라고 강요하는 듯한 말투는 지양하고 있습니다.
이 외에도 세세하게 신경 쓰는 포인트가 많고, 앞으로도 좋은 리뷰를 하기 위해 많이 노력하려고 합니다!
https://github.com/woowacourse-precourse/java-calculator-7/pull/1037
감사하게도 총 11분께서 좋은 리뷰들을 남겨주셨습니다. 생각지도 못했던 부분을 짚어주시기도 했고, 더 좋은 방향성을 제시하거나 사소한 실수들을 바로잡아 주신 분도 계셨습니다.
시간을 들여 코드를 읽어주시고, 또 리뷰를 작성해주신 분들에 대한 기본적인 예의로 꼼꼼하게 읽어본 뒤, 댓글과 이모지를 열심히 달았습니다. 👀 🎉
많은 리뷰에서 공통된 몇 가지 사항에 있어 아래에 정리해보았습니다.
네이밍이 굉장히 중요하다는 것을 이번 코드 리뷰를 통해 알게 되었습니다.
처음 제 코드를 보시는 분들은 클래스 이름을 통해 "아, 여기 이러한 기능들이 있겠구나" 생각하시고, 메서드 이름을 통해 "이 메서드는 이러한 역할을 수행하겠지?" 추측하시게 됩니다.
그런데 Calculator 라는 클래스에 들어가봤더니 정작 하는 기능은 문자열을 자르는 기능이라면 코드를 파악하는데 더 오랜 시간이 걸리겠죠.
이처럼 네이밍은 제 코드에 대한 첫인상이며, 가독성을 위한 중요한 역할을 수행하기에 더 신경을 써야 겠다는 다짐을 하게 되었습니다.
이번 과제에서 전반적으로 상수 처리가 미흡했던 것 같습니다. 특히 단일 문자로 구성된 Character 타입은 상수 처리를 할 생각을 하지 않고 하드코딩을 하게 되었습니다.
public Separators() {
separators = new HashSet<>(Arrays.asList(':', ','));
기본 구분자는 언제든지 콜론(:
)에서 쌍따옴표("
) 등으로 변경이 될 가능성이 있기 때문에, 이를 상수 처리하는 것은 변경에 대비하는데 큰 도움이 됩니다.
작다고 무시하지 말고, 꼼꼼하게 상수 처리를 해야겠습니다!
코드 리뷰를 받을 것에 대비해 메서드마다 주석을 달게 되었습니다. 보시는 분들의 편의성을 생각하고, 가독성을 높이기 위함이었는데요.
/*
* 리스트의 각 요소를 검증하고, Number 타입으로 변환하여 반환한다.
*/
다만, 코드 가독성은 주석이 아니라 네이밍, 클린 코드 등을 통해 보장되어야 합니다. 가독성이 충분히 지켜지지 않을 것 같다는 걱정에 주석을 달게 되었는데, 코드만 읽어도 술술 읽혀야 하겠네요 ..! 정말 많은 노력이 필요한 부분 같습니다.
✅ SOLID 원칙 준수하기
✅ 다양한 디자인 패턴 코드에 녹여보기
✅ TDD 첫 도전
✅ 채널에 일주일에 적어도 2개씩 글 올리기
✅ 코드 리뷰 열심히 참여하기
1주차 목표를 모두 달성했습니다!
함께 나누기 채널에 Commit Message 를 편하게 작성할 수 있는 plugin 관련 글, Intellij Ultimate 학생 계정으로 무료 이용하는 방법을 공유했습니다!
1주차에 세운 목표를 모두 달성했습니다! 코드 리뷰도 기존에 생각했던 것보다 훨씬 많은 양을 주고 받으며 많은 깨달음과 배움을 얻었습니다. 커뮤니티의 글들을 열심히 읽어보고, 또 배움을 직접 공유하기도 하며, 함께 성장하는 기분을 느끼고 있습니다! 진정한 몰입의 길을 걷는 것 같아 뿌듯했습니다.
비록 중간에 큰 단위의 리팩토링을 하며 TDD의 스텝을 꽈당 놓치게 되었지만, 처음으로 TDD에 도전해본 결과 많은 장점을 느꼈습니다.
리팩토링을 하더라도, 안전 장치가 존재해서 기존에 구현한 기능이 정상적으로 작동하는지 테스트할 수 있습니다. 또, 꼼꼼한 설계를 위한 지름길이 되어주기도 했습니다.
다만, 완전한 TDD를 하기에는 시간도, 실력도 부족함이 많다는 것을 느꼈습니다. TDD를 왜 실패했는지, 그 원인을 아래와 같이 정리했습니다.
🌨️ 원인 1
public 으로 선언한 메서드의 접근 제어자를 private으로 바꾸며 기존에 작성한 테스트를 사용할 수 없게 되었습니다.
🌨️ 원인 2
TDD를 실천하려고 하니 평소 개발하던 속도의 3배 정도가 걸렸습니다. 처음이라 익숙하지 않아 시간이 오래 걸렸고, 답답한 마음에 테스트 코드 작성을 후순위로 미루게 되었습니다.
🌨️ 원인 3
객체 지향 설계를 연습하자는 목표와 맞지 않게 초반에 객체에 대한 고민 없이 기능만 작성하여 개발을 시작했습니다. 중간에 추가적인 객체의 필요성을 느끼며 설계가 한 번 크게 변경되었습니다. 이때 큰 범위의 변경이 발생하며 TDD의 스텝을 놓쳤습니다.
정말 정말 부끄럽지만, 프로젝트를 할 때 스트림 사용에 익숙하지 않아 Gpt 에 많이 의존했던 것 같습니다. 스트림 사용에 더 자유로워질 수 있도록 많은 연습이 필요할 것 같습니다. 프리코스 미션을 수행하는 동안 Gpt를 사용하지 않고 있기 때문에, 스트림 사용에 더 자유로워질 수 있도록 많은 연습을 할 수 있을 것 같습니다!
객체가 어떠한 책임을 갖고 어떠한 역할을 수행하는지에 대한 고민이 부족했던 것 같습니다. 또 객체를 정의하고, 어떤 식으로 협력하며 기능을 동작시킬지 고민해보는 시간이 부족했습니다.
다음 주차 미션부터는, 이러한 부분을 많이 고민하며 객체 설계부터 더 꼼꼼히 해보려고 합니다!
정말 많은 고민과 연습, 그리고 깨달음이 있었던 1주차였습니다. 특히 코드 리뷰를 통해 많은 도움을 얻었습니다. 함께 성장하는 경험을 하게 해준 모든 분들께 감사합니다! 이제 시작이기 때문에, 앞으로의 성장이 무척이나 기대됩니다!
읽어주셔서 감사합니다 :)
성장하는 모습을 기록으로 남기시는 모습이 정말 멋있습니다.