
@Override
public void start() {
System.out.println("8기 최종 코딩테스트");
}
일단 저를 성장시키게 한 모든 과정을 만들어 주신 코치님들 및 포비님에게 감사 인사를 전하며 시작하겠습니다.
12월 29일 월요일 저는 고생했던 반년 동안 제가 좋아하는 선배들과 후배, 동기들과 함께 온천 여행을 떠나는 날 프리코스 1차 심사 결과가 나오는 날이었습니다.
온천의 따뜻한 물에 몸을 담그며 힘들었던 순간들을 떠올렸습니다. 프리코스 동안 매주 새로운 미션과 씨름했던 시간들, 테스트 코드를 작성하며 고민했던 날들, 커뮤니티에서 다른 참가자들과 나눴던 얘기들, 그 모든 순간이 온천물처럼 따뜻하게 느껴졌습니다.
점심을 먹고 나오는 길에 오후 2시 59분에 이메일 알림이 왔습니다. 정시각인 3시보다 1분 빠르게 받은 메일이었습니다. 동기들이 먼저 제 반응을 보려고 핸드폰을 건네주기 전에 이미 결과를 확인하고 있었습니다.
"고생했다", "열심히 했으면 됐지 뭐.."
동기들의 말만으로는 합격인지 불합격인지 알 수 없었습니다. 떨리는 손으로 화면을 켰을 때, 제일 먼저 눈에 들어온 문구가 있었습니다.
"1차 심사에 합격"
순간 환호성이 터져 나왔습니다. "나 그래도 열심히 했구나"라는 생각이 밀려왔습니다. 단순히 합격했다는 기쁨과, 프리코스 동안 나의 노력과 고민들이 헛되지 않았다는 안도감이 동시에 들었습니다.
그렇게 1차 심사를 통과하고, 최종 코딩테스트만 남게 되었습니다.
1차 심사 합격 후, 최종 코딩테스트까지는 약 12일의 시간이 주어졌습니다. 하지만 1월 5일부터 10일까지 대학교 지원으로 일본을 다녀오게 되면서, 실질적으로 준비할 수 있는 시간은 6일밖에 남지 않았습니다.
일차적으로 지속적으로 포비님이 언급해주신 로또와 비슷한 수준으로 문제를 낸다고 하여 1주차와 2주차 문제를 풀고 3주차 로또 문제를 3번정도 복습을 했습니다.
(오히려 행운이였습니다..후후..)
그리고 이전 기수 문제들을 풀었습니다.
단순 횟수로만 본다면 하루에 2문제를 풀며 내가 부족했던 문제가 있었으면 브랜치를 초기화 시키고 다시 풀며 반복했습니다.
문제는 이정도로 풀고 최종 코딩테스트에서는 구글링과 정리한 자료를 보는 것이 허용되었기 때문에 내가 애매하게 알고있는 부분은 모두 템플릿으로 정리해놓고 필요할 때마다 쓸 수 있도록 미리 작성해놨습니다.
그리고는 시험을 칠 때 루틴을 만드는 것이 좋을 것 같아 이렇게 체크리스트로 어떻게 시험을 치기 직전에는 셋팅을 해놓고 시험을 치는 동안 해야할 것을 미리 작성 해놨습니다.
(최종 코테때는 문제 푼다고 중간에는 크게 체킹을 못한거 같아요 ㅠㅠ)
마음이 조급한 5시간 브금을 들으면서 계속 문제를 풀면서 하니 뇌 셋팅도 "아 문제 풀고 있구나"라고 생각을 하게 만드면서 순간 몰입을 끝까지 올려 풀 수 있어서 좋았습니다.
(5시간짜리가 많이 없기도 하고 다른 블로그에서 참고했던 노래였는데 정말 좋았습니다 ㅠㅠ)
일본에 가서 저녁과 이른 아침에 짬짬히 간단히 기능 구현을 하고 부족한 문법을 공부하며 보냈습니다.
(소바가 진짜 맛있었습니다... 진짜 재방문 의향 가득...)
그렇게 귀국을 한 뒤에는 9일에 잠실 시험장 근처에 숙박을 잡아 저녁을 먹고 간단하게 문제를 하나 풀고 잠에 들었습니다.
저는 10시 30분 정도에 퇴실을 하고 난 후 캐리어를 가지고 있었기 때문에 지하철 라커에 캐리어와 패딩을 맡겨 놓고 너무 아점을 헤비하게 먹으면 시험 칠 때 잠이 올 것 같아서 근처 서브웨이에서 간단하게 먹고 11시 45분 즈음에 삼성생명 빌딩에 들어갔습니다.
딱 도착 했을 때 저 포함 3명이 제일 먼저 와서 간단하게 스몰 토킹을 하며 서로에게 기운을 불어 넣었습니다... ㅎㅎ
(꼭 붙으면 좋겠습니다 ㅠㅠ)
(기다리는 동안 재밌는게 있어서 찍었습니다.. ㅎㅎ)
그러고 난 후 12시에 신분 확인을 포비님에게 받고 시험장에 들어갔습니다. 꽤나 많은 사람들이 일찍 오셨고 시험치기 15분 전에는 거의 4~5명정도 빼고는 가득 찼었던 것 같습니다.
미리 와서 저는 와이파이 셋팅과 인텔리제이 AI 설정을 다시 체킹하며 꺼져있는지 확인했습니다.
확실히 시험 장소에 오기 전까지는 열심히 준비를 했기 때문에 긴장을 하지 않았는데 막상 자리에 앉으니 크게 실감이 나면서 살짝 긴장을 했었던거 같습니다.
그렇게 시간이 13시가 되어 간단한 안내 후에 시작되었습니다.
안내 내용은 개발은 총 5시간 중에 4시간만 진행되고, 남은 1시간 동안은 소감문을 작성한다고 안내를 받았고 개발을 하면서 리팩토링 or 추가 기능 구현을 생각해보라는 도전도 해야한다는 안내를 같이 받았습니다.
문제를 확인하기 전 상태여서 "후... 내가 4시간안에 풀 수 있겠지?"라는 생각이 들었습니다.
그렇게 지원 페이지에서 문제를 확인해보니 3주차 문제인 로또와 거의 유사하게 나왔습니다.
확실히 딱 문제를 받아보며 느꼈을 땐 위에서 말한 안내 내용에서 "도전"이라는 키워드를 확실히 녹아내리기 위해서는 기존에 했었던 것에서 새로운 부분을 도전하는 것이 "도전"을 하기에는 새로운 문제보다는 확실히 좋을 것 같다라는 생각이 들었습니다.
그래서 도전 목표에 대해서는 기능만 우선으로 개발하는 것이 아닌 TDD를 하기로 했고 로또라는 것은 실제 세계에서도 많이 하기 때문에 어떤 프로그램을 만들더라도 항상 규범과 법률을 지켜서 만들어야하기 때문에 "로또"라는 도메인으로 제한된 현실의 규칙을 적용을 시키려 했습니다.
예를 들어서 로또는 1회당 10만원을 초과하여 구매할 수 없다는 규율과 당첨 금액이 200만원 초과 ~ 3억 이하에서는 22%의 세금을 책정한다는 규율이 있기 때문에 이를 고민하여 추가적으로 기능을 개발했습니다.
그래서 일단 기능을 구현할 것을 먼저 연습을 할때 좋았던 행동 중심으로 기능을 먼저 1차적으로 작성하고 개발을 시작했습니다.
그러고 난 후 TDD를 진행하기 위해서 작은 단위 테스트를 작성하고 기능을 개발하며 진행하였습니다.
쭈욱 다 진행하고 나니 3시간 30분 정도 소요가 된 것 같았습니다.
저는 현실에 있는 "로또"와 유사하게 만들기 위해서 기존에 당첨된 로또 통계만 반환을 요구사항으로 작성되어 있었지만 저는 수익률과 10만원을 제한하며 개발을 진행했습니다.
그러다보니 일단 기능을 개발한 후 진행하다보니 시간이 많이 남지 않았습니다. 그래서 제가 작성한 TDD를 지키지 못하고 일단 그래도 다른 블로그들의 후기를 많이 참고했을 땐 "일단 돌아가는 코드"를 만들라고 했던 포스팅들이 떠올라 개발하기 시작했습니다.
public class CalculateStatics {
private static final double TAX = 0.22;
public double statics(Map<Integer, Integer> ranks, Money money) {
double totalPrize = 0;
for (Map.Entry<Integer, Integer> entry : ranks.entrySet()) {
totalPrize += setAfterTax(Rank.findByRankingNumber(entry.getKey())) * entry.getValue();
}
return totalPrize / money.getMoney();
}
private double setAfterTax(Rank rank) {
if (Rank.FIRST == rank) {
return rank.getPrize() - (rank.getPrize() * TAX);
}
if (Rank.SECOND == rank) {
return rank.getPrize() - (rank.getPrize() * TAX);
}
return rank.getPrize();
}
}
이렇게 22%의 제세공과금이 붙기 때문에 세금을 제외한 수익률을 반환하였습니다.
private void maxAmount(int money) {
if (money > MAX_AMOUNT) {
throw new IllegalArgumentException("구입 가능 금액은 10만원 미만입니다.");
}
}
그리고는 Money라는 도메인에 입력 금액을 입력 받으면 구입 가능 금액인 10만원을 제한하면서 실제 세계에서도 적용되는 법률을 현재 로또 프로그램에 구현하면서 만약 본 프로그램이 실제 사용된다해도 문제가 없는 프로그램을 만들려고 노력을 했습니다.
이번 기수에서 제일 중요하다고 생각이 들었던 소감문입니다.
5시간 중에 4시간은 개발 1시간은 소감문을 작성할 시간을 따로 줄 정도로 중요하다고 생각이 들었습니다.
원래 시간이 빡빡할 줄 알아서 이전에 써놓았던 소감문을 바탕으로 얘기를 녹아내려 했지만 이번 기수는 최종 코딩테스트 문제도 그렇고 내가 작성했던 소감문이랑 취지가 맞지 않을 것 같다고 생각이 들었습니다.
그래서 이번 기수는 "도전"이라는 키워드가 중요했기 때문에 나의 소감문에선 "도전"이라는 단어를 내가 어떻게 생각하고 어떻게 풀어갈지를 작성했습니다. 저뿐만 아니라 모든 사람에게 도전은 빼놓을 수 없는 단어라고 생각합니다.
세상에는 내가 해본 것보다는 내가 경험해보지 못한 것이 더 많다고 생각합니다. 그러다보니 어떤 행동을 하더라도 자신은 알아차리지 못해도 모든 것이 도전이고 단순히 생각에 그치는 것이 아니라 행동을 한다는 순간부터 이것을 "도전"한다는 개념이 내포 되어있다고 생각합니다.
그런 작은 도전들이 나에게는 하나하나 모두 성장이고 그런 작은 도전들이 모여 큰 도전을 할때 큰 빛을 비추게 된다고 생각합니다.
그래서 이번 최종 코딩테스트를 진행하면서 도전한 것에서 배운 점을 최대한 작성하려고 노력했었던 것 같습니다.
(모든 내용은 붙여 넣지 못했네요 ㅠㅠ)
3시가 되니 코치님이 앞에서 "모두 너무 몰입을 해서 시험장 열기가 과열되고 있는 것 같네요"라고 말씀하시며 노트북을 모두 덮고 10분정도 환기를 하며 휴식시간이 있었습니다.
그리고 포비님이 좋은 말씀을 해주셨던걸로 기억했는데 개발에 정신을 모두 몰입하고 있어서 내용이 잘 기억이 나지 않네요 ㅠㅠ
최종 코딩 테스트가 끝나고 저는 3분정도 일찍 나와 함께 했었던 스터디원들과 인사를 나누고 저녁을 먹고 난 후 캐리어를 챙겨 지방러이기 때문에 기차를 타고 집으로 돌아갔습니다.
그러고 집에 돌아와서는 내 코드를 보며 어떤 부분이 부족했는지 확인하고 실수한 것이 뭐가 있었는지 간단하게 복기만하고 편히 잤습니다...ㅎㅎ
4개월간의 프리코스 과정 및 최종 코딩테스트까지 모두 끝이 났습니다.
저의 인생에서 성장을 제일 의미깊게 했었던 과정이었고, 합격하고 싶다는 간절함과 이 과정만 충실히해도 큰 성장을 하겠다라는 감정과, 어찌보면 혼자서 힘듬을 이겨내는 과정 중에서 다른 주위 사람들에게 소홀히 대했었던 부분도 있었습니다.
솔직히 이번 과정을 하며 저의 인생 중 중요한 분기점이라고 생각했던 부분에서 의미깊게 몰입하고 성장하고 도전했기 때문에 현재 끝난 이후에는 소홀했던 동기, 선배, 후배들 그리고 응원해준 친구들에게 다시 연락하고 고맙다는 인사를 전하고 싶습니다.
합격 발표는 이제 2주도 남지 않았습니다.
기다림 과정에서 기대도 있지만 불안함도 있지만, 결과가 어떻게 나오든 나는 열심히 했기 때문에 큰 미련이 없습니다.
프리코스 시작 전 TDD, MVC패턴, SOLID, OOP 등등 들어만 보고나 처음 접해봤던 단어들과 새로운 개발방식이었기 때문에 이런 도전들을 하며 크게 성장했었던 것 같습니다.
다시 한번 이런 성장과정을 이끌어준 우아한테크코스 코치진분들에게 정말 감사인사를 드리며 끝마치도록 하겠습니다.