오늘은 짧게 2주간의 우테코 프리코스를 되돌아보려 합니다. 이 글은 철저히 개인 회고와 리마인드를 목적으로 작성했음을 미리 말씀드립니다. 글의 제목이 반성글인 이유는 제가 실수한 부분을 리마인드 해보려는 목적으로 작성하는 글로 코드에 대한 내용은 없을 예정입니다. 코드에 관한 내용은 제가 3주 차 과제를 스스로 당당하고 만족스럽게 해낸다면 그때 작성해 보겠습니다.
첫 주차에서 만난 첫 프리 코스는 어렵진 않은 과제였습니다. 다만 코드 컨벤션, 테스트 코드 같이 평소엔 생각해보지 않던 것들, 처음 접해보는 것들이 많아서 굉장히 낯설고 신기했던 것 같습니다. 그렇게 나름 구현해 낸 과제 제출 기한이 다 끝나고 다른 분들 코드를 리뷰하며 보니 가장 중요한 기능 구현을 놓쳤더군요.. 에러 처리에 대한 부분도 정말 부족했습니다. 아니, 다른 분들에 비하면 안 했다고 해도 과언이 아니었습니다. 이미 끝난 일 후회해 봤자 소용없기에 2주 차 땐 요구 사항을 정확히 파악하기 위해 체크 리스트를 만들고 에러가 발생할 수 있는 케이스를 모두 표로 정리하여 READE.me에 정리습니다.
그리고 미션 자체도 MVI 패턴을 공부하며 정말 열심히 구현했습니다. State Reducer, 이벤트 상태를 관리하는 sealed class 등등 MVI에 필요한 요소들을 녹여내고 SAM Interface도 처음 사용해 보면서 다양한 방향으로의 시도를 했습니다. 그리고 MVI에 대한 정리를 해서 앱스쿨 시절 인연이 된 멘토님과 디스코드로 발표회도 진행하고 정말 정말 열심히 했습니다. 제출을 다 해놓고도 제출 마감 5분 전까지도 계속 리팩토링 하면서 더욱더 나은 코드를 위해 고민하고 싸웠습니다. 그런데 웬걸... 또 메인 요구사항을 놓쳤습니다.
무엇이 문제였을까요? 스스로 진지하게 고민했습니다.
이번 미션의 흑백 요리사에 비유하면 내 코드를 한 줄로 표현하면 "맛없는 코드"였습니다. 안성재 심사위원님이 아무 쓸데없는 꽃을 올려놓는 것을 싫어하시는 것처럼 제 코드도 마치 겉보기에 화려하고 예쁘지만 정작 맛이라는 요구사항을 만족하지 못했습니다. 제 코드도 겉보기엔 화려한 아키텍처와 깊은 기술을 적용한 것 처럼 보이지만 정작 문제의 요구사항을 정확히 풀어내지 못했습니다. 1주 차에 분명 같은 실수를 하고 이에 대한 대비책으로 체크 리스트까지 만들었는데 그럼에도 왜 자꾸 이런 실수를 하는 걸까요?
심지어 마감 후에 리팩터링 하다 생각 없이 Pull Request에 Push를 하는 바람에 마감 후 푸시를 허용하지 않는다는 조건을 어기게 되었습니다. 그래서 부랴 부랴 구글링으로 Pull Request에 push 한 commit을 지우다 기존 Pull Request를 날려버리는 대참사가 발생했습니다. 아마도 이번 주차 과제는 무효가 되겠죠... 머리가 새하얘졌습니다...
어쩌면 좋은 코드, 좋은 아키텍처를 만들기 위해 노력했다고 스스로 생각했지만 어쩌면 나는 겉으로 보기에 화려한 코드를 만들고 싶던 게 아닐까요? 남들에게 나 잘한다고 나 이거 할 줄 안다고 자랑하고 싶었던 건 아닐까요? 저는 문제를 제대로 이해도 못하는 겉멋만 부리는 애송이였던 것 같습니다.
문득 이전에 봤던 냉장고를 부탁해 에피소드 중 김풍 님의 애벌레 플레이팅을 한 음식 편이 생각났습니다. 삼겹살을 말아서 애벌레를 만들고 숙주로 플레이팅 한 누가 봐도 기괴한, 비주얼이 반 이상은 먹고 들어가는 요리라는 분야에서 바라볼 땐 굉장히 이상한 음식이었지만 결국 이연복 셰프님과의 대결에서 승리했습니다. 심지어 이연복 님은 세계 누구나 인정하는 중식의 대가이신데 김풍 님은 전문 쉐프가 아닌 웹툰 작가셨습니다. 이전에는 이 에피소드를 보고 깔깔 웃으며 즐기기만 했는데 상황이 이렇게 되고 나니 조금은 다른 관점에서 바라보게 되었습니다. 김풍님은 겉보기에 예쁘고 아름다운 음식 대신 자신만의 독특한 음식을 만드셨고 무엇보다 가장 중요한 "맛"이라는 요구 사항을 너무나 잘 완성하셨기 때문에 승리하실 수 있었다고 생각합니다.
이를 보면서 스스로 겸손해질 필요가 있다고 생각했습니다. 그래서 3주차 미션에선 처음엔 어떠한 아키텍처도 어떠한 기교도 부리지 않을 것입니다. 그리고 모든 요구사항을 완벽하게 구현했을 때 리팩토링을 하겠다고 다짐했습니다. 아무리 좋은 아키텍처, 예쁜 코드를 짜봐야 문제의 요구 사항을 정확히 풀어내지 못하면 아무 쓸모없는 코드이기 때문에 정확한 맛 정확한 요구 사항을 구현하는 것을 목표로 할 것입니다. 겉으로 보기에 화려한 코드보다 문제를 정확히 푼 쓰레기가 오백만 배는 더 훌륭하다고 생각합니다. 아키텍처를, 클린 한 코드를 못 짜면 정신이 나가버리는 저에겐 굉장히 가혹한 형벌이라고 생각합니다.
그리고 2주차 과제를 통째로 날려버렸다고 포기하지 않으려 합니다. 당연히 이 과제를 수행하는 목적엔 우아한 테크코스에 합류하는 게 가장 큰 목표겠죠. 하지만 2주 동안 프리코스를 해본 결과 이 프리코스 만으로도 제 스스로 정말 많은 성장을 이끌어낼 수 있다고 생각합니다. 그리고 코틀린을 처음 하신다고 하신 다른 참가자 분의 PR을 보면서 정말 저 스스로를 다시 돌아보게 되었습니다.
대학교 시절에도 바보 같은 실수로 중간고사를 통째로 날려먹었지만 기말고사 때 정말 이 악물고 미친 듯이 해서 A 학점을 받은 적이 있습니다. 제 스스로도 바보 같지만 값진 경험이었다고 생각합니다. 그때의 감정과 경험을 되살려 남은 두 번의 과제를 이 악물고 달려드려고 합니다. 이 도전의 끝이 합격일 수 도 불합격일 수 도 있겠죠. 하지만 결과가 불합격일지언정 실패했다고는 생각하지 않을 것입니다. 이미 4주간의 프리코스 덕에 또 다른 성장을 할 수 있었으니까요!
제가 열심히 만든 코드는 아래 링크에 있습니다
https://github.com/woowacourse-precourse/kotlin-racingcar-7/pull/116