블로그를 꽤 오랜만에 작성하는 것 같다.
그동안 이런저런 일이 있었고, 조금 여유가 없기도 했는데 졸업을 앞두고 생각이 많아졌던 것 같다.
그러던 중 프리코스를 진행하게 되면서 다른 생각 없이 한 달 동안 온전히 몰입할 수 있었다.
이미 한 번 겪어봤던 프리코스였지만 작년과는 배우고 느낀 점이 또 달라서 이를 편하게 작성해보려 한다.
어떤 점이 달랐을까?
작년 프리코스를 시작하면서 처음 자바 공부를 시작했고, 이전에는 파이썬으로 알고리즘 문제 풀이 정도만 해본 상태여서 클래스나 객체, 생성자와 접근자 등에 대한 부분들이 생소하게 다가왔었다. 그러다 보니 자바에 대한 학습이 주를 이뤘고, 좋은 코드에 대해 고민하기보단 어떻게 구현해야 동작할 지에 대해서만 고민했었다.(정작 최종 코딩테스트에서는 구현해내지 못했지만 말이다.) 자바에 익숙해진 계기가 되긴 했지만, 프리코스에서 제시한 것들을 모두 해내진 못한 거 같아서 아쉬움이 남았었다.
하지만 이번 프리코스는 시작하기 앞서 자바에 익숙하기도 했고, 객체 지향과 클린 코드에 대한 학습도 진행 중이었어서 최대한 배운 것을 적용해 볼 수 있었다. 프리코스에서 제시하는 요구 사항과 피드백을 수용하는 데 집중했고, 객체지향적이고 클린 한 코드를 짜기 위한 고민을 많이 하게 되었다.
한마디로 어떻게 구현할지 보다, 어떻게 좋은 코드를 짤 수 있을 지에 대해 고민하며 학습했다고 할 수 있겠다.
무엇을 배웠을까?
적절한 책임 부여하기
프로그램을 구현하기 위한 시작점은 요구 사항 분석에서 시작된다.
요구 사항을 정확히 분석했을 때 객체를 더 잘 분리시킬 수 있었고, 또 객체를 잘 분리시켰을 때 적절한 책임을 부여하기도 수월했다. 처음부터 객체를 잘 나누긴 어렵지만, 어떤 객체가 많은 책임을 지고 있다는 생각이 들면 객체를 잘 분리시키지 못했던 경우가 많았고 그때마다 수정하면서 객체를 더 적절하게 분리시킬 수 있었다.
요구 사항을 잘 숙지하여 처음 객체를 잘 분리시키는 것도 중요하지만, 적절한 책임을 부여하고 있는지 끊임없이 생각하면서 코드를 짜고, 수정해 나가는 것이 중요하다고 느꼈다.
어차피 한 번에 잘 짜기는 힘들다. 그렇다면 처음부터 잘 짜려고 노력하다 포기하는 것보단 코드를 짜보면서 고쳐나가는 습관을 들여보는 것은 어떨까?
테스트 코드의 장점
처음 테스트 코드를 접했을 때 왜 당연한 걸 테스트하는 거지?라는 생각을 했었다. 내가 짠 코드고 대충 실행도 해봐서 돌아가는 걸 확인했는데 굳이 시간을 들여서 왜 테스트 코드를 짜는지 잘 이해가 안 됐었다.
하지만 프리코스를 하면서 몸소 느끼게 된 테스트 코드의 장점이 있었다.
1. 작은 실수들이나 바로 알아차리기 힘든 논리 에러들을 쉽게 찾을 수 있다
예를 들면, 3주 차 로또 미션에서 총수익률을 구하기 위한 메서드에서 100을 곱해주지 않아 값이 작게 나오는 실수가 있었는데, 만약 테스트 코드를 아예 작성하지 않았거나 혹은 큰 단위로 테스트했다면 1. 구입 금액에 오류가 있는지 2. 상금의 값이 잘못되었는지 3. 총수익률을 구하는 메서드가 잘못되었는지 등 생각할 요인이 많았을 것이다.
하지만 테스트 코드, 그중에서도 단위 테스트를 작성함으로써 총수익률을 구하는 메서드로 좁혀질 수 있었고 이런 작은 실수들을 쉽게 찾을 수 있었다. 또한 흔히 저지르는 논리 에러들을 그때그때 찾을 수 있어서 에러를 고치기 위한 시간을 확연히 줄일 수 있었다.
2. 자연스럽게 객체의 책임을 분리
객체마다 단위 테스트를 작성하면서 이 테스트를 왜 여기서 하지? 와 같은 생각이 들 땐 책임 분리가 잘 안 되었다는 것을 알아차릴 수 있었다. 이를 즉각적으로 수정해 나가면서 자연스럽게 객체의 책임을 적절하게 분리시키는 효과도 얻을 수 있었다. 총 구현 시간은 조금 늘어나긴 했지만 이는 테스트 코드도 코드이기 때문에 구현하는 데 소요되는 시간이 있고, 아직 테스트 코드 작성에 익숙지 않기 때문에 더 그런 것 같다.
더 좋은 설계와 책임 분리를 위해선 테스트 코드 작성을 물론, 테스트 코드를 잘 작성해야겠다는 생각이 들었다. 또 현업에서 테스트 코드에 시간을 더 많이 들이는지 그 이유를 아주 조금은 이해할 수 있게 된 것 같다.
코드 리뷰를 통해 시야 넓히기
이번 프리코스와 작년 프리코스의 가장 다른 점을 꼽으라면 커뮤니티의 활성화인 것 같다.
매주 주어지는 미션을 해결해 가는 과정에서도 확실히 성장했다고 생각한다. 하지만 같은 관심사에 대해 여러 지원자들과 자유롭게 의견을 주고받을 수 있는 환경이 정말 좋았고, 이런 환경 속에서 더 빠르게 성장할 수 있었다고 생각한다.
특히 코드 리뷰는 해볼 기회가 거의 없었는데 정말 좋은 경험을 한 것 같다. (프리코스만의 장점이라고 생각)
코드 리뷰를 받으면서 내가 작성했던 코드 중 꽤 괜찮은 코드라고 생각했던 코드도, 객관적인 시선으로 봤을 때 개선 사항이 있다는 걸 배울 수 있었다. 아마 혼자서 미션을 계속 진행했다면 이런 개선 사항들을 끝까지 생각해내지 못했을 것이라고 생각한다. 사소한 실수부터 좋은 개선 사항까지 리뷰를 해줬던 리뷰어들에게 정말 고마울 따름이다.
리뷰를 할 때는 다른 사람의 코드를 보고 배우고 이해하는 경험을 할 수 있었다.
내가 생각하는 개선 사항들은 다시 한번 찾아보고 개념들을 정리하며 나 또한 복습할 수 있었고, 다른 사람의 코드를 보고 배우면서는 왜 이렇게 코드를 짰는지 이해하려고 노력하면서 학습할 수 있었던 것 같다. (리뷰를 해주는 입장인데도 계속 질문만 한 적도 있어서 조금 죄송스럽기도 했음) 이 과정에서 이런저런 키워드를 접하고 찾아보면서 스스로 학습하게 되기도 했다.
리뷰를 받던, 하던 상관없이 배울 점과 느낀 점이 많았던 경험이었고, 또 내 코드에 대한 리뷰가 달리는 게 은근히 설레고 재밌었어서 코드 리뷰 경험을 할 수 있다면 꼭 해보라고 권해주고 싶다.
마무리
프리코스는 항상 끝나고 나면 성장했음을 느끼게 해주는 것 같다.
작년엔 Github 기본 사용법부터, 자바 및 여러 컨벤션 등을 학습하게 했고, 올해는 객체지향 및 클린 코드, 코드 리뷰 방법, 테스트 코드 등 또 새로운 것들을 학습하게 했다. 하지만 특이한 점은 이런 방법들을 직접 알려주는 게 아니라 스스로 학습하도록 유도한다는 것이다. 이렇게 스스로 학습했을 때 시간은 좀 걸리더라도 더 기억에 잘 남았던 것 같다.
프리코스가 끝났을 때 자연스럽게 학습한 것이 흡수되어 있었는데,
새로운 프로젝트를 할 때 커밋 컨벤션을 지켜 커밋하거나, 객체지향적이고 클린 한 코드를 작성하기 위해 고민하고 있거나, 테스트 코드를 작성하고 있는 내 모습을 봤을 때 확 와닿았던 것 같다. 그래서 생각보다 프리코스가 주는 영향이 크구나, 그래도 한 달 동안 열심히 했구나 하는 생각이 들었다. 특히 나는 졸업을 앞두고 있는 상황이라 시간이 잘 사용해야 했는데, 프리코스를 하는 동안만큼은 별다른 생각 없이 온전히 몰입할 수 있었다. 그만큼 가치 있는 시간이었다고 생각했던 것 같다.
이번 우아한 테크코스에 떨어지게 된다면 앞으로는 도전해 볼 기회가 없을 것 같아서 아쉬움이 남겠지만, 두 번의 프리코스를 겪으면서 배웠던 것만 해도 충분한 가치가 있었다고 생각한다. (물론 붙는다면 더 바랄 게 없겠지만)
기수의 지원자가 점점 더 늘어나면서 경쟁률은 높아지고 있지만 우아한 테크코스에 선한 영향력을 받아가는 사람이 더 많아지게 되는 거라고 생각하니, 크게 보면 잘된 일이 아닐까 생각이 든다. 모든 지원자들에게 좋은 결과가 있길 바라고, 떨어지더라도 한 달 동안 미션을 진행하느라 고생 많았고 파이팅 하라고 말해주고 싶다.
또 이제 취업 준비를 하게 될 나를 포함하여 취업을 준비하는 모든 사람에게 취업 파이팅 하라는 메시지를 전하며 회고를 마무리한다.