행동 강령
초기 설정 관련 내용들이랑 어떤 순서로 풀지(기능 구현 목록 작성 - 디렉토리 분리.. 등)을 정리했다.
기능 구현 목록 템플릿
최종 소감문(일부만 미리 작성)
당황한 나를 위해
코드 스니펫
크게 파일 디렉토리 구조, 입출력 포맷 등을 분리해서 준비했다
포수타에서 최종 코테는 3주차 수준으로 나온다고 해서 3주차랑 난이도가 비슷했던 6기 4주차, 6기 최종, 5기 최종을 추가적으로 풀어봤던 것 같다. 7기 최종도 맛만 봤는데 많이 어렵긴 하더라..;;
결전의 날, 최종 코테! (1월 10일)
전날까지는 고양에서 아인슈타인클래스 사전 교육을 받아서 코드 한 번 더 보고 그럴 여유는 없었다. 소감문 한 번 다듬고.. 마음의 준비를 하고 일찍 잠에 들었다. 그리고 12시 맞춰서 도착할 수 있게 잠실 캠퍼스로 출발했다. 바로 옆 스벅에 아아 사러 갔는데, 다 코테 준비하는 사람들인 것 같았다ㅋㅋㅋ 노트북에 인텔리제이, 노션 킨 사람들이 한 가득이였다.
맞다 프론트랑 백 줄이 따로 나뉘어있었는데 못 보고 선 사람들이 많아보였다. 나는 운 좋게 제대로 서서 앞에 사람들이 옆으로 훅 빠지는 바람에 3~4번째로 입장했다. 입장하고 나서는 노트북 셋업하고, 와이파이도 연결하고, 노션도 키고 준비했다.
자리마다 놓인 선물들
달라진 최종 코딩테스트 문제 유형
10분 전부터 코치 한 분께서 시험 진행에 대해 설명해주셨고, 지원 페이지로 들어가니 최종 코테 문제가 올라왔다!
이번 문제는 행성 로또로 이번 기수 3주차 미션과 거의 동일하고 몇몇 조건만 다른 문제였다. 그래서인지 문제 푸는 시간을 4시간으로 줄이고, 1시간은 소감문 작성 시간으로 한다고 했다. 이번 미션에서 우테코가 보고자하는 포인트가 크게 2가지 달라졌다.
1. '본 프로그램의 목적은 기능 구현에 그치는 것이 아니라 프리코스에서 학습한 개발 방식(문제 분해, 설계, TDD)이 코드에 드러나는 것에 있다.'
라고 명시를 해둔 것이다. 나머지 말들은 별로 마음에 안 걸렸는데 TDD라고 명시를 해놓은 게 좀 걱정이 되긴했다. 나는 예외처리를 위해 테스트 코드를 작성하다보면 생각나는 예외가 너무 많아서 어디까지 해야할 지 단시간에 판단하는 게 너무 어려웠다. 그러다보니 자연스레 테스트코드 작성과정에서 불필요하게 낭비하는 시간이 많았져서 최종을 준비하면서는 TDD를 사용하지 않기로 선택했기 때문이다. 대신 처음에 기본 제공되는 테스트코드를 잘 읽고, 테스트코드에서 검증되는 예외만 우선적으로 처리하기로 했다.
이때까지 연습해온 루틴을 바꾸기 보다는 소감문에 이런 나의 생각을 잘 녹여내기로 하고 TDD는 하지 않기로 했다.
2. 도전 과제
이번 기수는 자유롭게 미션을 설계하고 수행하도록 하는 오픈 미션이 처음 도입되었는데, 이 부분이 최종에도 반영이 된 것 같다. 나는 사실 3주차 하면서 마음에 안 들던 미션 기준이 있어서 그 부분을 생각하며 기능 확장 미션을 선택하기로 했다.
최종 코딩테스트 과정
기본 기능 구현
git clone하고 나서 보니까 이번에는 InputView와 OutputView가 정해져 있다는 조건이 있었다. 최종 코테 준비를 하면서 제공된 코드와 테스트 코드를 꼼꼼히 읽고 푸는 연습을 많이 해둬서 다행이라는 생각이 들었다.
처음에 askWinningLotto 메서드에서 출력되는 메시지가 문제에 제공된 메시지와 달라서 당황해서 내가 새로운 메서드를 만들어서 저 부분만 입력을 받았는데, 테스트 코드에서는 해당 메시지로 검증을 하고 있어서 계속 exception이 터지는 문제가 발생했다. 당황했지만 에러 메시지를 잘 읽고, 다시 저 메서드를 사용하도록 변경했더니 해결되었다.
OutputView를 확인하면서 반환형이 좀 복잡하다고 생각했다. 위에 있는 메서드는 List가 List<Integer>형태로 값을 저장하고 있고, 밑에는 Map<Integer, Integer>형태로 Key = 등수, Value = 해당 로또 개수로 받고 있다. 이런 부분을 먼저 파악하고 들어가니까 서비스 로직 짤 때도 할 만했던 것 같다.
기본 기능 구현을 다 하고 나니 3시가 되어 있었다. 코치님이 다같이 노트북을 덮고 쉬는 시간 10분을 가지자고 하셨다. 스트레칭도 하고, 화장실도 다녀오고~ 머 이것저것 재정비의 시간을 가졌다. 이때 같은 줄에 앉아있던 분이 귤을 나눠주셔서.. 맛있게 먹었다. 그 분도 꼭 붙으셔서 다시 만날 수 있으면 좋겠다.
도전 기능 구현 : 사용자 편의성을 고려한 거스름돈 반환 기능
나는 화려한 코드나 고도의 기술력이 들어간 기능보다, 구현에 드는 리소스 대비 사용자 편의성이 크게 증가하는 기능이 더 중요하다고 생각한다. 프리코스 3주차 로또 미션을 수행하는 과정에서 아래의 조건을 보면서 ‘이게 왜 필요할까?’라는 의문을 가졌다.
‘왜 사용자가 구매할 수량을 계산해서 금액을 입력해야할까?’, ‘사용자가 가용 가능한 금액을 입력하고, 시스템이 금액에 맞게 구매 수량을 계산해주면 안 되는걸까?’
아쉬웠던 점을 떠올리면서 추가 기능을 설계했다. 내가 설계한 추가 기능은 '거스름돈 반환 기능' 이다. 거스름돈을 반환하게 되면 사용자가 가용 가능한 금액을 전부 넣고 시스템이 구매 수량을 계산해줄 수 있기에 사용자 편의성을 향상시킬 수 있다. 또한, 실제 환경을 고려하면 더 합리적이다.
자판기에서 커피를 뽑을 때 500원짜리 음료수를 뽑아야할 때 1000원권밖에 없는 경우를 떠올려 보자! 이때 500원이 아니므로 구매할 수 없다고 하면 어떨까? 돈이 있음에도 불구하고 구매하지 못하는 아이러니한 상황이 일어날 것 같다. 이런 상황을 떠올리며 700원을 입력하면 500원으로 로또 한 장을 구매하고, 거스름돈 200원을 돌려주는 형태로 기능을 구현했다.
소감문 작성
기능 구현을 막 끝내고 push하고 테스트 돌리니까 2/2가 떴다~ 야호!
올솔 야르
이제부터 1시간은 소감문 작성 시간이였다. 이번에는 소감문 작성 가이드가 나와있어서 참고해서 적었다.
크게 이런 흐름으로 썼다.
최종 코테 준비과정
도전 기능 설명
끝까지 지킨 원칙과 내려놓은 것
마무리하며 내가 하고 싶은 말
3분을 남기고 다 작성했다. 짐을 싸고 나오며 같은 줄에 앉았던 분들께 '수고하셨습니다~' 가벼운 인사도 건네고 나왔다.