ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 우아한 테크코스(우테코) 3기 프리코스와 최종 테스트 후기 + 불합격ㅠㅠ
    기타 2020. 12. 21. 20:04

    우아한 테크코스 3기 모집

     

    안녕하세요.

    저번 게시물에서는 우아한 테크코스 지원서 작성부터 1차 코딩 테스트까지의 후기를 작성했습니다.

    이번 게시물에서는 3주 간의 프리코스와 최종 코딩테스트에 대한 후기를 남겨보도록 할게요!!

     

     

    프리코스란?

    우아한테크코스가 목표가 아니라 좋은 개발자로 성장하는 것을 목표로 하면서 성장해 나가는 과정으로 생각하고 도전
    했으면 합니다.

    1차 선발에 합격한 후, 우아한 테크코스에서 보내온 프리코스 사전 안내 메일에 있던 글이에요.

     

    너무나도 당연하게 우아한 테크코스 합격만을 목표로 생각했는데, 이 글을 보고 다시 생각해보게 되었어요.

    3주 간 다른 사람과 비교하지 말고 온전히 나 자신만의 발전을 초점으로 성장하자라는 다짐을 하게 된 거 같아요.

     

    일단 프리코스라는 것은 3주 간의 모의 수업과도 같아요. 하지만 강의를 하지는 않는답니다.

    3주 간, 1주일에 하나씩 과제를 내주면 1주일 동안 열심히 과제를 완수해서 Github에 Pull Request를 보내는 건데요.

    매주 이메일로 과제가 담긴 Github 저장소의 주소가 옵니다. 이를 Fork해서 과제를 가져올 수 있어요.

     

    그리고 제출을 하게 되면 다음날 저희가 했던 과제에 대한 피드백이 옵니다.

    100명이 넘는 인원이다보니까 개별 코드 리뷰는 못해주지만, 공통 리뷰는 해주는데요.

    이 공통 리뷰에서도 굉장히 배울게 많습니다. 

     

     

     

    프리코스  0주차 : 사전 준비

    11월 20일에 1차 합격 통보를 받고, 프리코스까지 남은 시간은 단 5일이었습니다.

    5일을 어떻게하면 알차게 보낼 수 있을까 생각해봤습니다. 일단 프리코스 후기를 뒤지기 시작했어요.

    1기와 2기 지원자 분들의 프리코스 후기를 거의 다 본 것 같네요;; 근데 정말 도움 많이 됐습니다.

    그래서 혹시라도 프리코스를 준비하시는 분이 계시다면, 꼭 다른 후기들을 먼저 많이 보시길 추천합니다.

    그리고 이 링크로 가보시면 박재성님께서 쓰신 글을 볼 수가 있는데요.

    아마 우아한 테크코스 1기 때인 것 같은데, 프리코스 피드백을 pdf 파일로 올려놓으셨습니다.

    그리고 당시 1기 최종 테스트 때 잘했던 두 분의 Pull Request도 볼 수 있어요.

    그래서 어떤 피드백들을 받았는지, 또 이전 기수 분들은 어떤 식으로 과제를 진행했는지 살펴볼 수 있어서

    좋았습니다.

     

    다음으로는 책을 샀습니다. 우아한 테크코스의 피드백에 나오는 내용이 대부분 책에도 나오는 내용이더군요.

    바로 로버트 C. 마틴의 "클린코드"라는 책인데요. 너무너무 유명한 책이더라고요.

    이 책 같은 경우, 제 블로그의 다른 글에서 따로 리뷰를 하고 있으니까 참고 부탁드릴게요~

     

    로버트 C.마틴의 클린코드(Clean Code) - 1) 깨끗한 코드란?

    운이 좋게 우아한 테크코스의 프리코스 과정을 진행하게 되었는데, 로버트 C.마틴 (Uncle Bob으로 더 유명하죠)의 클린 코드라는 책이 워낙 유명하고 박재성 님의 추천 도서이기도 해서 읽어보게

    kyleyj.tistory.com

    책을 한 권 더 구입했는데, 정호영 님께서 쓰신 "팀 개발을 위한 Git, GitHub 시작하기"라는 책입니다.

     

    팀 개발을 위한 Git, GitHub 시작하기

    개발자, 디자이너, 기획자 다함께 깃·깃허브 입문이 책은 시나리오를 곁들인 실습으로 시작해서 깃과 깃허브를 처음 접하는 사람 또는 좀 더 깊은 난이도에서 깃과 깃허브를 다루고 싶은 개발

    www.yes24.com

    전까지는 SourceTree라는 GUI 프로그램을 이용해서 Git을 다루었었는데, 이 책을 통해서 CLI 환경에서도 깃을 다룰 수 있게 되어서 많은 도움이 되었던 것 같아요. 아무래도 프리코스를 하면서 Git을 사용하는 일이 많다 보니까, Git과 Github에 대한 사전 지식도 많이 준비하면 좋은 것 같아요.

     

     

     

    프리코스 1주 차 : 숫자 야구 게임

    11월 25일에 프리코스 1주차 메일이 도착했습니다. 과제는 숫자 야구 게임을 구현하는 것이었는데요.

    프리코스 1주차 메일

    숫자 야구 게임 미션 링크 : github.com/woowacourse/java-baseball-precourse

     

    프리코스가 특별한 점은 과제를 완성하는 그 자체보다, 기능 구현 사항을 상세히 작성하고 Git commit을 상세히 남기고 예외처리를 꼼꼼히 하는 등의 활동을 중요시했다는 점입니다.

     

    그래서 처음에 기능 구현 사항을 작성하는 데에만 3, 4시간 걸린 것 같아요 ;; ㅎㅎ

    이제는 30분도 안돼서 작성 가능하지만, 처음이라 그런지 정말 생각도 많이 하고 오래 걸린 것 같네요. ㅠㅠ

     

    1주차 숫자 야구 게임의 기능 구현 사항

     

    기능을 입력, 동작, 출력 이렇게 세 가지 분야로 나누었어요.

    그리고 각 기능이 담당하는 일들을 나열하고, 발생할 수 있는 예외에 대해서도 작성했습니다.

    각 기능이 담당하는 일에 부가적인 설명이 필요하다면 추가 설명도 같이 넣었습니다.

     

    처음에는 왜 기능 구현 사항을 굳이 작성하는 거지?라고 생각했고, 이전에 개발을 할 때도 한 번도 작성해본 적이 없어서 많이 어색하고 어려웠는데요.

     

    작성을 하고 개발을 하니까 확실히 내가 어디까지 완성했는지 알아볼 수 있고, 또 예외 처리 같은 부분도 놓치지 않고

    작성할 수 있어서 좋았던 것 같아요. 전체적으로 봤을 때는 시간을 단축시키는 효과를 가져다준 것 같습니다.

     

    정리해보자면 1주 차에는

    • 기능 구현 사항 작성의 중요성에 대해 배웠다.
    • Git commit은 기능 단위로 하는 것을 배웠다.
    • Computer, View, Validator 등 기능에 맞게 클래스를 분리하는 것을 해보았다.
    • 하드코딩의 위험성을 배웠고, 상수 처리하는 법을 배웠다.
    • 일급 컬렉션의 개념에 대해서 배웠고 적용해보려고 했다.
    • 변수, 메서드, 클래스명을 짓는데 시간을 오래 썼고, 주석이 필요 없도록 노력했다.
    • 프로젝트 관리 도구인 Gradle을 처음으로 접했다.

    정도로 정리해볼 수 있겠네요.

     

     

     

    프리코스 2주 차 : 자동차 경주 게임

    1주 차가 끝나고 다음날 오후 3시에 1주차 피드백과 함께 2주 차 미션 공지가 메일로 왔습니다.

    1주차 피드백을 비롯한 모든 피드백은 제가 이 게시글 아래쪽에 정리해서 남기도록 할게요.

     

    대망의 2주차 프리코스는 자동차 경주 게임을 구현하는 것이었는데요.

    자동차 경주 게임 미션 링크 : github.com/woowacourse/java-racingcar-precourse

     

    2주차 자동차 경주 게임의 기능 구현 사항

     

    이번에는 기능 구현 사항을 작성하는데 1시간 정도밖에 걸리지 않았습니다.

    1주 차에 비하면 정말 많이 줄어들었죠;; ^^

     

    이번 미션은 다른 건 크게 어렵지 않았는데, 입력 값 예외 처리하는 것이 조금 까다로웠습니다.

    자동차 이름을 하나 씩 개별로 입력받는 것이 아니라, 쉼표를 기준으로 한 줄로 입력받기 때문에

    일일이 분리해줘야 하고 각각에 대한 예외 처리를 해줘야 했기 때문입니다.

     

    그리고 2주 차부터는 Junit을 이용해서 테스트 코드도 같이 작성을 했는데요.

    사실 프리코스 전에는 Junit은 물론이고 테스트 코드라는 것을 아예 몰랐었는데, 이번에 접하게 되었어요.

    박재성님의 Junit4 라이브러리 기본 사용법 영상

    이 영상은 우아한 테크코스의 리더이신 박재성 님께서 예전에 찍으신 영상이에요.

    현재는 Junit5 버전까지 있지만, 그 이전 버전인 Junit4에 대한 기초 강의 영상인데요.

    저처럼 Junit이라는 것을 처음 사용해보시는 분들이 보면 너무나도 좋은 영상입니다.

     

    정리해보자면 2주 차에는

    • Junit을 이용한 테스트 코드 작성을 배웠다.
    • 함수를 최대한 잘게 쪼개서 작성해보았다. 함수의 길이가 아니라 개수를 늘렸다.
    • 함수의 파라미터가 2개 이상이 되지 않기 위해 노력하였다.
    • Car, Player, Winner 등 여러 클래스로 업무를 분담하여 클래스를 쪼개는 연습을 하였다.
    • "클린 코드" 책에 나오는 "내려가기 규칙"을 이용해서 함수를 작성하고자 노력하였다.

    정도로 정리해볼 수 있겠네요.

     

     

     

    프리코스 3주 차 : 지하철 노선도

    프리코스의 마지막 3주 차는 지하철 노선도 미션이었습니다.

    처음에는 미션을 받고 정말 많이 당황했습니다. 일단 요구사항부터 엄청 많았어요.

    1주 차, 2주 차와는 비교도 안될 만큼 구현해야 하는 기능이 많았고 복잡했습니다.

    아래 기능 구현 사항을 보시면 아시겠지만, 예외 처리도 엄청 많았네요;; ㄷㄷ

     

    지하철 노선도 미션 링크 : github.com/woowacourse/java-subway-map-precourse

     

    3주차 지하철 노선도의 기능 구현 사항

     

    확실히 이제 3주 차라서 그런지 기능 구현 사항은 30분도 안되어서 작성할 수 있었네요^^

    물론 이게 가능한 이유는, README.md 파일을 중간중간에도 수정할 수 있기 때문입니다.

    죽은 문서가 아니라 살아있는 문서를 만들도록 노력해야 한다.

    우아한 테크코스의 피드백 중에 있던 말입니다.

     

    기능 구현 사항을 처음부터 완벽하게 만들려고 하는 것이 아니라, 중간중간에 예외 처리가 발견되면 추가하고 수정할 부분이 생기면 수정하면서 README.md를 좀 더 역동적인 문서로 만드는 것이죠.

     

    지하철 노선도 미션의 기능은 크게 네 가지로 나눠볼 수 있습니다.

    1. 역 관리

    2. 노선 관리

    3. 구간 관리

    4. 지하철 노선도 출력

     

    그런데 각 관리 메뉴에 따라 등록, 삭제, 조회 소메뉴가 따로 있었습니다. 그래서 클래스 파일도 이전보다 훨씬 많아지고 프로젝트 자체의 규모가 커졌어요. 늘어난 클래스들과 규모를 어떻게 관리할 수 있을까 고민했습니다.

     

    그러던 중 MVC 디자인 패턴에 대해서 알게 되었는데요.

     

    세상에서 제일 쉬운 MVC 패턴 - 호돌록

    MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고

    hodol.dev

    우아한 테크코스 전 기수이신 호돌님의 블로그 글입니다. MVC 패턴을 엄청 잘 설명해주셨더라고요. ㅎㅎ

    호돌님에게 다시 한번 감사의 말씀을 드립니다.

     

    어쨌든 이에 힘입어 지하철 노선도 미션에 MVC 패턴을 적용해 보았는데요. 예전부터 패키지 구조를 나눠보고 싶다는 욕심은 있었는데 어떻게 해야 할지 몰랐었거든요. 이번에 처음 적용해보면서 확실히 정리가 더 잘 되는 듯한 느낌을 받았습니다.

     

    그리고 이번에는 indent를 자체적으로 1로 제약사항을 두고 코딩을 했습니다.

    우아한 테크코스 측에서 제시한 요구사항은 2까지는 허용한다는 것이었는데, 제가 일부러 더 강하게 제약을 했죠.

    그 과정에서 습득할 수밖에 없었던 것이 Java의 "람다와 스트림"이라는 개념이었습니다.

     

    컬렉션(List, Map, Set 등)을 사용할 때는 보통 for문이나 if문을 이용해서 컬렉션을 조회, 삭제, 수정, 추가 등을 하잖아요?

    근데 Stream을 이용하면 for문이나 if문을 쓰지 않고도 가능합니다. 따라서 indent가 추가적으로 늘어날 일이 없다는 거죠.

     

    람다와 스트림에 대해서는 저의 Java 공부 카테고리에 조만간 올리도록 하겠습니다.

     

    정리해보자면 3주 차에는

    • MVC 디자인 패턴을 적용해보았습니다.
    • 람다와 스트림을 통해 indent를 1로 지킬 수 있었습니다.
    • Custom Exception을 직접 만들어서 다양한 예외처리를 할 수 있었습니다.
    • 비즈니스 로직과 UI 로직을 확실히 구분하도록 노력했습니다.
    • 함수가 최대한 한 가지 일만을 하도록 잘게 쪼개는 연습을 했습니다.

    정도로 정리해볼 수 있겠네요.

     

     

     

    최종 코딩 테스트 : 지하철 노선도 경로 조회

    마지막 주차인 3주 차 미션을 제출하고 그 주 토요일에 최종 코딩 테스트를 봤습니다.

    올해는 코로나의 여파로 인해서 루터회관에서 오프라인으로 보지 않고, 각자 개인적인 장소에서 온라인으로 시험을 치렀습니다. ㅠㅠ (너무 아쉬웠습니다. 루터회관 한 번쯤은 가보고 싶었는데...)

     

    시간은 오후 1시 ~ 오후 6시, 총 5시간에 걸쳐서 시험을 보았습니다.

    아무래도 온라인으로 시험을 진행하다 보니까, ZOOM을 이용해서 감독을 하시더라고요.

    저는 책상 옆에 휴대폰으로 ZOOM을 켜서 제 옆모습을 비추는 형식으로 했었습니다.

     

    지하철 노선도 경로 조회 미션 링크 : github.com/woowacourse/java-subway-path-precourse

     

    최종 코딩 테스트의 미션은 지하철 노선도에서 경로를 조회하는 미션이었는데요.

    jgrapht 라이브러리를 이용해서 Dijkstra 알고리즘을 통해 최단 거리, 최소 시간의 경로를 찾는 것이었습니다.

     

    최종 테스트 지하철 노선도 경로 조회의 기능 구현 사항

     

    일단 결과부터 말씀드리면 저는 100% 구현을 다 못했답니다...ㅠㅠㅠㅠㅠㅠ

    정말 아쉬웠던 점이, jgrapht 라이브러리를 따로 설치해야 하는 줄 알고 documentation도 찾아보면서 했는데 자꾸 에러가 나는 겁니다.... 그 에러 고쳐보겠다고 1시간을 날린 것 같아요 후....

     

    근데 알고 보니까 그냥 테스트 코드에 이미 작성되어있던 코드를 복붙 하기만 하면 되는 거더군요.... 절망

    나중에 오픈 카톡에서 얘기해보니까 다익스트라 알고리즘을 구현한 라이브러리가 있는 줄 모르고, 직접 다익스트라 알고리즘을 구현해서 하신 분이 있다고 하더라고요..ㄷㄷ 진짜 능력자이신 것 같네요. 존경합니다.

     

    저는 나머지는 다 구현했는데, 최소 시간을 기준으로 경로를 조회하는 기능을 완성하지 못했어요.

    아무래도 기능도 완성하지 못했다 보니까, 리팩터링을 못한 부분도 많아서 너무너무 아쉽습니다...

     

    처음에는 5시간이 되게 많은 시간인 줄 알았는데, 아니었습니다... 저에게는 6시간은 필요했던 것 같아요 ㅠㅠ

    하지만 어쩔 수 없죠 ㅎㅎㅎㅎ 이미 테스트는 끝났고 아쉽지만 후회는 없네요!

     

    결과는 12월 30일 오후 3시에 메일로 전송된다고 하네요. 저는 사실 거의 떨어진다고 보고 있는데요.

    설령 떨어지더라도 3주간 정말 정말 많은 것을 배우고 느꼈기 때문에 너무나도 좋은 경험을 했다고 생각합니다.

    그래도 붙여주신다면 8개월 동안 누구보다 열심히 할 생각은 있습니다...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

     

    어쨌든 12월 30일에 결과가 나온다면 합격 / 불합격을 떠나서 꼭 결과를 올리도록 하겠습니다.

    여태까지 긴 글 읽어주셔서 너무나도 감사드리고요. 저는 이만 떠나볼게요!!

     

     

     

    아차차... 제가 위에서 약속드린 게 있었죠? 3주 동안의 피드백을 정리해서 올려볼게요. 참고하시면 됩니다~~

    1) 변수, 함수, 클래스 이름에서 충분히 의도가 드러나는가?
    2) 변수, 함수, 클래스 이름을 축약하진 않았는가?
    3) Eclipse에서 "ctrl + shift + F" 로 정리 했는가?
    4) 불필요한 space 혹은 enter line은 없는가?
    5) 비슷한 코드가 반복되지는 않는가?
    6) space와 tab을 혼용하진 않았는가?
    7) 의미없이 주석을 달진 않았는가? (정말 의도가 드러나기 힘든 경우에만 작성)
    8) 하드코딩을 하진 않았는가? (상수, Enum으로 대체)
    9) git commit 메세지를 의미있게 작성했는가? (기능 단위로 이해 되도록)
    10) 기능 목록을 너무 상세하게 메소드와 클래스 단위로 작성하진 않았는가?
    11) 인스턴스 멤버를 선언할 때 순서에 맞게 하였는가? (상수 -> 필드 -> 생성자 -> 메소드)
    12) 배열 대신 Collection을 사용하고, API를 많이 활용하였는가?
    13) getter/setter를 사용하진 않았는가?
    14) 인스턴스 필드의 수가 3개 이상이 되진 않았는가?
    15) 인코딩을 UTF-8로 하였는가?
    16) main 메소드를 포함한 모든 메소드가 각각 15라인 보다 많진 않은가? (10라인 이하가 베스트)
    17) 예외 처리는 모두 고려하였는가? (정말 꼼꼼하게 예외 상황의 모든 경우를 생각해보아야 한다.)
    18) Pull Request 보내기 전에 혹시 master 브랜치로 되어있는거 아닌지 확인했는가?
    19) 상황에 맞는 설계와 구현 방법을 택했는가? (정답 보다는 요구사항에 적합한 설계와 구현인가?)
    20) 반복문을 너무 남용하지는 않았는가? (재귀 함수로도 충분히 가능하다)
    21) 원시 타입과 문자열을 포장하였는가?
    22) 자료구조의 쓰임을 정확히 이해하였는가? (Set을 쓰는 것이 낫다면 List가 아니라 정확히 Set을 써야한다.)
    23) 함수가 한 가지 일만 하고 있는가?
    24) 함수를 최대한 작게 만들었는가?
    25) indent를 최대 2까지 허용하였는가? (최대 1이 베스트)
    26) 삼항 연산자를 사용하진 않았는가?
    27) else 예약어를 사용하진 않았는가?
    28) 한줄에 점 하나만 찍었는가?
    29) 일급 컬렉션의 형태로 작성하였는가?
    30) 비지니스 로직과 UI 로직을 한 클래스가 담당하지 않도록 한다.

     

     

     

    + 2021.01.02 추가 작성

    최종 결과 발표...그리고

    2020년 12월 30일 오후 3시 드디어 최종 결과 발표가 났습니다!

    결국 불합격

    저는 최종 불합격을 했어요! ㅎㅎㅎㅎ 3주 동안 고생도 많았지만 정말 즐거운 시간이었습니다.

    사실 떨어진 게 아쉽지 않다면 거짓말이겠죠? 

     

    그래도 SSAFY를 최종 합격한 상태이기 때문에, 우아한 테크코스 불합격에 크게 실망하지는 않았어요.

    2021년 새해는 SSAFY에서 개발자의 꿈을 키워나갈 것 같습니다. 

     

    아무튼 3주 동안 정말 감사했고 즐거웠습니다. 그리고 최종 탈락 메일에 앞으로 어떻게 공부하면 좋을지에 대한 PDF 파일도 보내주셔서 정말 우아한 형제들은 좋은 회사라는 것을 다시 한번 깨달았습니다. ㅎㅎ

     

    앞으로는 SSAFY에서 배우는 것들과 경험한 것들을 많이 올릴게요! 감사합니다!!!

    댓글

Designed by Tistory.