겸손하기 꾸준하기 건강하기

우테코 6기 최종 코딩 테스트 회고 (feat. 싸피) 본문

woowacourse/백엔드 6기 프리코스

우테코 6기 최종 코딩 테스트 회고 (feat. 싸피)

seminss 2024. 1. 6. 17:36

최종 코딩테스트를 본 뒤로 어느덧 2주가 지났다.
결론부터 이야기하자면, 나는 우테코 6기로 참여하지 못하게 됐다.

불합이란 뜻 😮‍💨⭐

 
많이 아쉽고, 후회도 크게 남는다.
최종 코테 이후로는 코드가 돌아가도록 완성하거나, 리펙토링 해야 했지만, 그럴 수 없었다.
 
엉망으로 코테를 치룬 내가 너무 싫었고, 코드를 다시 보는게 힘들었다.
실패한 코드를 보는 것이 부끄러운 내 밑바닥을 드러내는 것 같아서 큰 스트레스였다.
 
그래서 2주가 지난 지금에서야 프로젝트를 다시 열었고, 회고를 작성해보려고 한다.
어떤 것이 부족했고, 어떻게 고쳤고, 다시 돌아간다면 어떤 스탠스를 취했어야 했는지 살펴보자.
 


 

🧐프리코스가 끝난 뒤

11/15 : 4주간의 프리코스 종료
11/15~11/19 : 싸피 자소서 제출 & 코딩 테스트, 졸업 전시회
11/20~11/26 : 4주차 미션 코드리뷰 후 리펙토링, 회고 작성
11/27 : 싸피 1차 합격 발표 ▶ 면접 스터디 시작
11/28 ~ 12/11 : 대학 과제, 최종 코테 스터디 2회, 나머지 시간 모두 면접 스터디 및 개인 면접 준비
12/11 : 싸피 면접, 우테코 1차 합격자 발표
12/12~12/14 : 대학 기말고사 기간
12/14~12/15 : 최종 코테 준비

 
프리코스가 끝난 뒤에는 간략히 말해 공부를 하지 않았다. 싸피 준비를 했다. ㅎㅎ;
 
사실 처음에는 두 부트캠프 모두 될 생각으로 한 것은 아니었다. 그 과정이 가치 있다고 생각해서 도전한 것이었다. 내가 워낙 부족하다고 생각했기 때문에, 당연히! 떨어진다는 전제가 깔려있었고, 프리코스가 종료된 이후에는 그간 부족하다고 느낀 부분들을 순전히 자기 개발 목적으로 공부하려고 했었다. 포트폴리오로 쓸만한 프로젝트를 하나 만들고, 바로 취업시장에 뛰어들 생각이었다.
 
프리코스 기간동안 열심히 했다고 자부할 수 있기 때문에, 그간의 노력을 인정받으면 좋을 것 같아, 1차 합격자로 선정되었으면 좋겠다.. 고 생각한 정도였다.
 
그러다 운좋게 싸피 면접 기회가 주어졌고, 이게 웬걸! 면접 준비에 올인했다. 제대로 된 면접을 처음으로 보게 된 것이었고, 공통 질문부터 자소서 질문 준비, PT 면접 준비까지 정~말 할 게 많았기 때문이다. 적당히! 만 하려고 했는데 그 적당히가 어려웠다.. 
 
프리코스 시기에 스터디를 했던 분들과 중간중간 최종 코테 스터디 2회를 하기는 했지만, 정말 참석만 했다.
 
 

🫨1차 합격자 발표

우연히 싸피 면접일과 우테코 1차 합격 발표일이 겹쳤다. 면접 준비를 꽤 열심히 했기 때문에 준비한 기량만큼 못 뽐내고 나온 것이 아쉬웠지만, 후련했다. 그리고 바로 다음날부터 기말고사 시작이었기 때문에 벼락치기를 위해 도서관에 갔다. (면접 준비한다고 시험범위를 1도 못 봤었음..ㅎㅎ)
 

 
그런데 이런 미친.
 
최종 코테 대상자로 선정이 되었다.
진짜 x 100000000 + 완전 x 1000000000 믿기지 않았다. 완전히 들떴다. 거의 뭐 최종 합격한 기분이었다. 프리코스 기간 동안 열심히 했다고, 인정받은 기분이었다. 너무 행복했다.
 
한 편으로는 의문도 들었다. 같이 준비했던 동기들, 스터디원들 모두 열심히 했기 때문이다. 실력만 놓고 본다고 해도, 난 중간정도였다. 잘하는 사람들이 정말 많았음에도 내가 선정된 데는.. 지원서! 영향이 크지 않았을까? 추측해 본다.
 
너무 기뻤으면서도, 동시에 든 생각은.. 아 ㅈ됏ㅇ.. 큰일 났다. 면접 준비를 한다고 알고리즘 문제를 푸는 것, 이전 미션들을 풀어보는 것, 자바 공부를 하는 것.. 그 모든 것들을 전부 2주 정도 놓아버렸기 때문이다. IDE를 키는 것 자체가 어색한! 상황이었다 :(
 
게다가 다음날부터 3일간 기말고사 기간이었기 때문에 학과 공부를 우선적으로 해야 했다.
일단은 3일 내내 학과 공부에 올인했고, 기말고사가 완료된 시점인 12/14, 12/15 코딩테스트를 준비했다.
 
 

🤮최종 코테 준비

우선 1차 합격자 발표 전, 스터디원들과 함께 했던 미션은 블랙잭 미션, 서브웨이 미션이다.
 
1. 블랙잭 미션
이 미션은 문제가 이해가 안 돼서 기능명세서만 1시간을 썼고, 입출력만 받다가 5시간이 지났다. 이때 '아 이건 내가 1차를 붙어도, 어차피 코테에서 떨어지겠구나.. 싸피 준비를 정말 열심히 해야겠다!'라고 생각했다 ㅋㅋㅋㅋㅋ (어휴)
 
2. 서브웨이 미션
이 친구는 그래도 블랙잭보다는 난이도가 많이 낮았다. 도메인 중심으로 우선 구현하려고 했고, 기능 구현을 마치고, 어느 정도 리펙토링도 했지만, 예외처리 및 에러 핸들링이 미흡했다. 그래도 '어..? 하면 하겠는데?'라는 생각을 했다.
 
3. 베이스 코드 생성 + 노션 정리
기말고사가 끝나고는, 코테에서 사용할 베이스 코드부터 만들었다. 입력, 출력 DTO를 만들고 파싱 로직, 예외 처리 로직, 포맷팅, 정규표현식 등을 정리해 뒀다. 미션별로 어떤 식으로 패키지를 나눌 건지도 대충 생각을 해서 정리를 해뒀다.
 
그 뒤로는 페어매칭 미션을 풀어봤고, 로또 미션을 재구현 해봤다.
 
4. 페어매칭 미션
진짜.................. 댕어려운 미션이다. 분기를 나누는 게 너무너무너무 어려웠다. 보니 5시간 안에 푸신 분들도 있다던데, 나는 전혀 불가능했고, 10시간 정도 붙잡고 있었지만, 구현에 실패했다. 코테 이틀 전이었는데 정말 다 포기하고 싶었다. 
 
5. 로또 미션 재구현
페어매칭을 마저 구현할까 싶었는데, 솔직히 하루를 더 투자한다고 해서 완성할 수 있을지에 대한 확신이 들지 않아, 프리코스 기간에 했던 미션 중 가장 못했다고 생각했던 로또를 재구현 해봤다. 로또는 3시간 반 정도 해서 구현했고, 리펙토링까지 했다. 확실히 이전보다 는 건 맞다. 갑자기 또 자신감이 뿜뿜 해졌다.
 
로또 미션까지 해보면서, 내 구현 속도로는 5시간 내로 구현을 완료하기에는 무리가 있어 보였고, 깃허브 코파일럿을 설치해서 최종 코테에 가게 되었다. (원래 공부할 때는 코파일럿 사용을 선호하지는 않는다)
 
 

🤯최종 코테 당일

코테를 위해 선릉 캠퍼스로 가던 중 메일을 받았다.
 
안 돌아가는 프로그램보다 돌아가는 쓰레기를 만들어도 괜찮아요
이상과 현실의 경계에 놓인 이번 최종 코딩 테스트를 시험이 아닌 또 다른 교육으로 생각하며 즐겨 보시길 바랍니다.

최종 코딩테스트 레포지토리는 java-oncall이었다. 
https://github.com/seminss/java-oncall-6-seminss

 

GitHub - seminss/java-oncall-6-seminss: 우테코 6기 최종 코딩 테스트

우테코 6기 최종 코딩 테스트. Contribute to seminss/java-oncall-6-seminss development by creating an account on GitHub.

github.com

 
보자마자.. 헐..? 왜 이렇게 리드미가 길어?
 
그래도 내용을 이해하는 것이 어렵지는 않았다. 블랙잭 미션 같은 경우에는 게임 룰도 모르고, 기능 요구사항이 이해가 안 되어서 애를 먹었었는데, 문제가 이해가 되는 것만으로 다행이다 생각했다. 어떻게 하면 최적의 자료구조일까, 어떻게 하면 효율적인 구현일까 생각하지 않고, 기능 명세서 작성 후 무지성 구현을 시작했다.
 
Application을 실행했을 때, 리드미에 있는 출력 예시처럼 출력하는 데는 총 3시간 30분 정도 걸렸다.
그러나 예외 처리는 필수적인 것을 제외하고는 못했고, 라인이 15줄이 넘어가는 메서드가 허다했으며, 코파일럿이 짠 쓰레기 같은 코드가 난무했다. 테스트를 성공하고 얼른 리펙토링 할 생각이었다.
 
그러나 문제는 그때부터였다. 예상하지 못한 예외가 터졌다.

해당 에러 때문에 테스트는 계속 실패했고, 한 시간 이상을 붙잡고 있었고, 결국 해결하지 못했다. 테스트코드가 돌아가지 않으면 코테는 0점이기 때문에, 소감문도 . 찍어서 냈다 ㅎㅎ
 
결과는 예상했듯 불합격이다.

 
아쉽지 않다.
역량을 몰라보신 게 아니라 내가 부족한 것 맞다. 그러니 이제 역량을 채워야 한다.
 
 

🤯뭐가 문제였을까

도대체!! 그럼 저 에러는 왜 발생하는 에러였을까..

에러를 잡지 않고 그대로 터뜨려보면 이렇다.

최종 코테를 볼 당시에는, 입력을 받는 데 문제가 있다고 생각했다. (Scanner에서)
 
그런데 지금 보니, 보자마자 아래와 같은 생각이 바로 들었다.

No line found ➡️ 입력이 없는데, 계속 입력을 받으려고 하고 있다.➡️ 테스트로 들어오는 Input는 정상 입력이기 때문에 재입력을 받을 필요 없이, 결과 출력 후 즉시 종료되어야 한다.➡️ 내 프로그램은 정상 입력을 문제가 있다고 판단해서 계속 입력을 받고 있다.➡️예외 처리하는 부분에서 정상 입력을 예외로 잘못인식하고 있구나

 
Application을 실행해 봤을 때, [휴일 비상근무 순번대로 사원 닉네임을 입력하세요>] 까지 입력을 받고 재입력을 받고 있었고, 이곳에서 예외를 잘못 처리하고 있다 예상되어 로그를 찍어봤다.

근무자 관련 예외 처리는 다음과 같았다.

 
문제는 3,4번에서 발생했다. 휴일근무자와 평일 근무자의 합이 5명 이상, 35명 이하가 되어야 한다는 로직을 처리하는 부분에서 실수가 있었다.

 
근무자 총합 인원이 35를 넘기면 안 되는 것이고, 평일 근무자+주말 근무자가 겹치는 사람들이 있을 수도 있기 때문에, Set을 사용했어야 했다.

기존 코드는 위와 같았고,

수정한 코드는 위와 같다.

테스트 통과까지 10분 걸렸다....ㅋㅋㅋㅋㅋ

바로 성공했다. 
 

별 거 아닐 것 같다고 예상은 했지만,, 생각보다 더 별 게 아니었다.

사실 코테 보고 엄청 자책하고 있었는데... 원인을 알고 나니, 생각보다 별 게 아니라서, 나를 엄청 탓할 필요까지는 없었겠다 싶다. 그냥 내가 긴장을 많이 했었나 보다 싶고, 바로 원인을 생각하지 못한 건 연습 부족이라 생각한다.

+++ 역시나 테스트 코드가 중요하다.

 
 

😮‍💨아쉬운 점

1. 커뮤니티의 적극 활용 x
최종 코테를 보기 전, 내가 정말 간절하다고 생각했지만, 그리고 정말 열심히 했다고 생각했지만, 최종 코테를 끝내고 커뮤니티에 오랜만에 접속했을 때, 정말 잘하시는 분들이 많았고, 잘하면서 겸손함+성실함+열심히 하시는 분들이 많았고, 그럼에도 간절한 분들이 많았다. 난 아무것도 아니었다. 커뮤니티를 조금 더 자주 들락날락했다면, 내 간절함이 배가 되고, 더 객관적으로 나를 보고, 더 열심히 준비할 수 있지 않았을까 싶다. 
디스코드에 정말 많은 분들이 정보 공유를 해주셨다. 초반에는 좋은 코드, 나쁜 코드를 판별하는 능력이 부족했고, 필요한 정보를 쏙쏙 골라 읽기에는 지식이 부족했다. 다른 분들의 코드를 보고 공부를 하려고 해도, 잘하시는 분들의 코드를 선별하는 게 어려웠다. 그래서 그냥 '내가 알아서 잘하자'라는 마인드로 디코를 매번 꺼두게 되었다.
후반으로 갈수록 활동 인원이 필터링되어서 양질의 정보만 올라왔다. 그때 활용했으면 나도 많은 것을 얻어갈 수 있었을 것 같다고 생각한다. 나는 코드 리뷰 외에 커뮤니티 활용이 적극적이지 못했다.
 
2. 어떻게든 되겠지~ 이 정도면 됐지~
나는 에러가 발생했을 때 해결하는 능력이 부족하다. 그런데 지금껏 에러가 어찌어찌 해결이 되면, 이 정도면 됐지! 하고 넘어갔다. 페어매칭, 서브웨이 때는 해결하지도 못했다. 그냥 최종 코테 때는 어떻게든 되겠지~ 생각했다. 그런데 팩트는, 어떻게든 되는 건 없다. 하나를 하더라도 제대로 이해하고 넘어가야 한다. 앞으로는 에러가 발생하면 대애충 이해하고 넘어가지 말고, 왜 발생했는지부터 꼼꼼하게 따져보는 습관을 들여야겠다. 비슷한 에러가 나면 바로 원인을 생각할 수 있는 능력을 키우고 싶다.
 
3. 나에 대한 믿음 부족, 간절함 부족
나는 그냥 프리코스 기간이 너무 재밌었다. 그래서 열심히 했다. 우테코 6기가 되기 위해 몰입을 했다기보다는, 그 기간이 너무 즐거워서! 완전한 몰입을 했다.
꽤나 열심히 했고, 꽤나 발전을 했다. 사실 그렇게 프리코스에 열심히 참여했다면, '우테코 합격은 불가능하다. 참여에 의의를 둔다!'라는 마인드보다는, 1차 합격자 발표가 나기 전까지 '나는 된다.'라는 확신을 가졌으면 어땠을까 싶다. 당연히 안될 거라 생각하고 코테 준비+자바 공부에 시간을 투자하지 않은 것이 아쉽다. (하다못해 매일 코테 1문제라도)
 
4. 선택과 집중 실패
최종 코테를 보면서 ~~ 하면 ~~, 이런 조건들이 있었다. 이런 조건들도 초반에 다 패스했으면 분기 처리를 할 때나 예외가 터졌을 때 시간 쓰는 것 없이 일단 테스트는 통과할 수 있었을 것 같기도 하다. 클린 코드는 바라지도 않았지만, 모든 요구사항을 처음부터 완벽하게 지키려고 했던 것 도 약간은 아쉽다. 
지금도 '클린하지는 않아도, 요구사항에서 시킨 건 다 해야 한다.'라는 생각은 변함없지만, 테스트가 돌아가지 않으면 무슨 소용인가.. 🫠🫠
 
 

🙄이제 무얼 할까?

 
그래도 싸피에 합격했다. 한시름 덜었지만, 솔직히 걱정도 많다..
 
이번 프리코스 기간 동안 스프링을 제대로 공부할만한 기본기를 쌓았다고 생각한다. 이제는 스프링에 대해서 본격적으로 공부해서 프로젝트가 필요한 시점이라고 느낀다. 그러나 싸피에서 과연 그럴 수 있을까 라는 생각이 든다. 싸피는 하나에 몰입해서 공부를 한다기보다는, 얕고 넓게 배우는 느낌이 강하고, 언어의 기초부터 배우며 풀스택 인재를 양성하는 과정이기 때문이다.
 
하나에 온전하게 몰입하는 데서 오는 행복함+성취감이 좋아서 우테코를 더 원한 건 맞지만,
뭐 그런데 내 성향상, 싸피에서도 잘 적응해서 그럭저럭 재밌게 할 것 같기는 하다. 개발자는 언어와 프레임워크에 구애받지 않아야 한다는 것도 팩트고 ㅎㅎ
 
싸피에서는 백엔드 개발로 밀고 가기보다는 이것저것 잘 챙겨서 대기업 SI나 은행권을 준비하는 게 더 효율적일 것 같아서 내가 어떤 스탠스를 취할지가 고민이다.🫠
결국 싸피든 우테코든 취업하려고 하는 것이다. 뭐든 내가 선택하고, 하기 나름이다 :)
 
싸피에 가면 1학기 때는 알고리즘+언어+프레임워크 수업이고 2학기 때는 프로젝트를 진행한다.
 
1학기 목표를 먼저 세워보자면, ①자바로 코테를 정말 많이 풀 거다. 나는 티어가 골드 2 임에도 아직까지 시간 복잡도, 공간 복잡도를 연산하는 데 익숙하지 않고, 이 부분을 보완하고 싶다. 
초반에는 ②어학점수 빨리 따두고, 차차 커리큘럼 따라가면서 ③필요한 네트워크+운영체제+백엔드 관련 지식을 꾸준히 포스팅해보려고 한다! 개인 공부로 ④모던 자바 읽고, ⑤인프런 JPA 1,2 + MVC 1 듣는 것까지 해보고 싶다.
그리고 상반기 원서 틈틈이 넣어봐야지..
 
하고 싶은 걸 전부 할 수 있을지는 모르겠지만, 최대한 할 거다.

할 수 있을까 고민하지 말고, 어떻게 할지 고민하자!

 
우테코 최종 코테 회고록으로 시작한 글이었지만, 어쩌다 보니 싸피에서의 목표로 글을 마무리하게 되었다.
후회 없는 2023년을 보낸 만큼, 2024년도 최선을 다해보려고 한다:) _______2023.12.31
 
++ 라고 했지만 이 글을 싸피 입과 1주일 후에 포스팅하게 되었네..😲 _______2024.01.06
이사하느라 너무너무너무 정신없었다 ㅠㅠ ㅋㅋ
싸피 1주일 차지만 ㅎㅎㅎ 그래도 여기서도 열심히, 제대로, 깊게 공부할 수 있을 것 같은 예감이 든다!! 화이팅🩷