운이 너무 좋게 우테코 2기에 1차 합격해버렸다.

우테코를 진행하면서 느낀점을 주차별로 정리해보고 마지막에는 후기와 회고를 작성해보고자 한다.

1주차

1주차는 비교적 쉬웠다. 코딩 자체는 쉬웠다. 분명히 쉬웠다. 그러나 결과물은 만족스럽지 못했다.
무엇이 어려웠는지 생각해보면 첫째로 Github와 MarkDown 둘째로는 기능구현목록이 어려웠다.

내가 어려움을 겪었다는 것을 보여주는 산 증인. 1주차 Commit Log이다. 미리 작성한 기능 구현 목록은 10가지가 넘었는데 commit은 단 7번뿐이었다. 또한 Commit Message도 영어였다가 한글이였다가 중구난방이고 어떤 작업을 한 후 Commit을 한건지 알아보기도 쉽지가 않다. 그 외 제약조건은 비교적 지키기 쉬웠다. 물론 자바 컨벤션이나 우테코에서 제시한 제약조건을 지키면서 코딩을 해본적은 없기 때문에 평소보다 많은 시간을 들여서 코딩을 했고 완전히 지켜지지도 못했다. 예를들어 for (int i =0; i < 5; i++) 에서 5와 같이 상수를 직접 하드코딩하는 것이 습관적이였기 때문에 무의식중에 하드코딩하고 그냥 제출해버린 부분도 있었다.

2주차

2주차도 쉬웠다. 코딩 자체는 쉬웠다. 분명히 쉬웠다. 그러나 결과물은 또 만족스럽지 못했다.

2주차에 제출한 Commit Log의 일부분이다. 한눈에 보기에도 1주차에 비해 훨씬 더 깔끔하고 명확하게 작성한 것 같다. Github를 다루는 것은 익숙해졌지만 여전히 기능구현목록에 맞게 코딩을하고 목록 단위로 Commit을 하는게 쉽지가 않았다. 내가 생각하기엔 기능구현목록을 잘못 설계 했거나 코딩 설계를 잘못한 것 같다. 둘 다 잘못했거나.. 기능구현목록에 따라 구현을 하다보니 코드들이 서로 독립적이지 못하고 유기적으로 연관이 되어 있어 기능별로 명확하게 Commit을 하는 것이 쉽지가 않았다. 제약조건인 최대 depth 2를 지키는 것은 너무 어려울 줄 알았는데 생각보다 어렵지 않았고 오히려 메소드를 분리하는 연습을 재밌게 할 수 있게 된 것 같다. 개인적으로 예외처리를 제대로 못한것이 참 아쉬웠다. 후회하고 있을 때는 이미 Pull Request를 날린 후여서 다음 주차 때는 더 열심히 해야지라는 생각을 가지고 3주차를 기다렸다.

3주차

평화로웠던 우테코에 하나의 운석이 떨어졌다. 그야말로 불지옥 난이도였다. 설마 최대 depth가 1로 제한될 줄은 상상도 못했다. depth는 그렇다고 쳐도 그것보다 나의 3주차를 아비규환으로 만든 것은 이 피드백이였다.

이 4가지 피드백에 나의 밑천은 곧바로 드러나버렸다. 내 생각에 3주차 미션은 1주차, 2주차 미션과 굉장히 비슷한 로직을 가지고 있었다. 이름을 입력받고 쉼표 기준으로 입력을 받는 것, 원본 리스트에서 값을 하나씩 떼서 다른 리스트에 할당해주는 것 등 3주차 미션을 마주했을 때 바로 1주차 2주차 미션이 생각날만큼 비슷하다고 생각했다. 반면에 코딩은 진도가 전혀 나가지 않았다. 피드백과 제약조건을 지키며 코딩을 하다보니 이름을 입력받는 것만 해도 2일을 사용했다.

이름을 입력받고 객체에 할당하는 것만 2일을 사용했다. 2일간 프로그램 구조를 계속해서 갈아엎었고 심지어는 이전에 했던 commit로그를 수정해야하는 상황도 있었다. 그 과정에서 mend 같은 로그가 찍히는 실수도 발생했다. 설상가상으로 개인적인 상황도 좋지 못해서 우테코 과제에 많은 시간을 할애할 수 없었다. 자연스럽게 작성하던 코드를 긴 텀을 두며 다시 작업을 하게 되었고 그로인해 작성하던 코드의 구조나 원래 생각했던 설계들이 머리속에서 계속 희미해졌다. 결국 3주차의 목표는 "완성"에 의미를 두게 되었고 앞으로 나의 코드를 피드백해줄 심사위원분들에게 너무나 송구스러울 정도로 최악의 코드를 작성하고 말았다. 작성하면서도 머리속에서는 계속 2가지로 싸웠다. 완성하지 못해도 다시 처음부터 제대로 작성하기 vs 일단은 완성하기. 일단은 완성하기를 선택했고 말 그대로 완성만 했다. 그마저도 미완성으로이다. 아쉬운마음에 나름대로 실패의 원인을 분석해봤다.  

  

  1. Player와 Dealer를 따로 생각한 것
  2. 기능구현목록과 Class 설계를 치밀하게 하지 못한 것
  3. 프로그램이 처음 설계한 것 보다 커질 것을 예상하지 못한 것

Player와 Dealer를 따로 생각한 것

3주차 미션을 작성할 때 User Class를 Player와 Dealer의 부모 클래스로 생성했다. 그것까진 좋았다. 좋았는데 상속한 이점을 제대로 살리지 못했다.

위에 코드와 같이 User 배열에 Dealer와 player를 모두 넣으면 해결되는 코드들이 대다수 있었다. 이것을 깨달았을 때는 이미 프로그램의 구조를 바꿀 수 없을 만큼 너무 많이 진행되어 있었다. 이 문제만 해결한 상태로 코딩을 시작했다면 심사위원분들께 덜 송구했을 것 같다.

기능구현목록과 Class 설계를 치밀하게 하지 못한 것

말 그대로이다. 코딩을 시작하기 전에 충분히 고민해보지 못했다. 핑계는 시간이 너무 부족했다. 일정에 쫓겨 과제가 발표된지 2일 후에나 과제를 시작할 수 있었고 3주차 미션을 수행할 때는 항상 시간에 쫓기며 코딩을 했다.

자연스럽게 마감 시간을 지켜야한다는 압박에 못이겨 위와 같이 필드들을 중복해서 여기저기 많이 생성했다. 마감 시간 4시간 전에 안 사실인데 객체.필드객체.필드객체메소드 같이 어떤 객체의 필드로 생성되어있는 객체에도 접근할 수 있었다. 이걸 조금 더 빨리 알았다면 필드 복잡도를 조금 줄일 수 있지 않았을까? 아쉽다.

프로그램이 처음 설계한 것 보다 커질 것을 예상하지 못한 것

맨 처음 시작할 때는 10개의 클래스였다. 완성했다고 판단 했을 때는 19개의 클래스가 되었다. 다른 클래스의 필요를 느낄 때마다 프로그램의 구조를 뜯어 고치거나 필드 복잡도가 증가했다. 완전히 프로그램 설계의 실패라고 생각한다. 심지어 새로운 클래스를 추가하면서 기존에 잘 동작하던 코드들에서 버그가 생성되고 디버깅에 실패하여 이전 commit을 불러와서 다시 코딩을 한 적도 있다. 이 경험을 통해 commit을 기능구현단위로 잘 해야겠구나라는 것을 뼈저리게 느꼈다. 너무 아찔하고 등골이 서늘한 경험이었다.

회고

나는 내가 앞으로 몸 담을 분야의 전문가가 되고 싶다. 이 생각 하나로 열심히 달려왔다. 이것저것 공부하다보니 자바지기님의 자바플레이그라운드 강의도 들은 적이 있다. 거기서 가장 기억에 남는 것은 자바에 관한 내용이 아니라 맨 처음에 해주신 이야기다.

이 그림을 보여주시면서 한 이야기가 있는데 강의를 들을 당시에는 와닿지 않았는데 우테코를 진행하다보니 너무 와닿았다. 내 생각엔 나는 지금 아래 동그라미 친 cliff of confusion 구간에 있다고 생각한다.

그래프와 같이 실력은 없으면서 자신감만 가득 차 있다. 컴퓨터공학과를 다니면서 특히 이름 없는 지방대학을 다니면서 주변 학생들과 사람들이 잘한다고 치켜세워주니 아주 깊은 우물안의 개구리가 되어 있었다. 이 근거없는 자신감은 우테코를 진행하면서 완전히 박살이 나버렸다. 그리고 강의에서는 아래에 화살표 구간인 desert of despair ~ upswiming of awesome 구간을 마의 구간이라고 말하고 있고 정말 많은 사람들이 포기한다고 말하고 있다.

이유는 공부할 자료가 가장 적고 공부할 범위는 가장 많기 때문이다. 즉, 혼자서 해결해야하는 부분이 상당히 많다는 말이다. 우테코를 진행하면서 계속 이 강의가 생각이 났다. 비록 프리코스 미션들을 시원하게 말아먹었지만 앞으로 있을 21일 오프라인 테스트에 열심히 임해서 cliff of confusion 구간을 벗어나 desert of despair 구간을 넘고 upswiming of awesome 구간을 또 넘어서 Job Ready를 향해 열심히 달려보고 싶다. 일단은 시험부터 좀 끝나고 ㅠㅠ

후기

우테코를 직접 참여한 적은 없지만 우테코는 나를 항상 성장 시키고 있다. 우테코 1기에 지원했을 때 1차 코딩 테스트에서 2개를 맞췄다. 정확하게 맞췄는지는 심사위원들만 알겠지만 4시간 동안 2문제와 씨름하다가 겨우 마지막에 2번째 문제의 테스트 케이스를 통과시키고 제출한 기억이 있다. 그 경험이 동기부여가 되어 2기 코딩테스트는 꼭 합격하리라 마음을 먹고 열심히 공부했다. 그 결과 이번 2기 코딩 테스트에서는 7문제의 모든 테스트 케이스를 1시간 남기고 통과시켰다. 그 희열을 아직도 잊을 수가 없다. 그리고 우테코 프리코스를 진행하면서 겪었던 괴로움이 가득한 시간들과 패배감은 나를 또 다시 자극했다. 프리코스를 진행하면서 가장 어려웠던 점은 내가 짠 코드들이 제대로 된 코드인지 아닌지 모르는 채로 코딩을 해야하는 것이었다. 예를들어 내가 지은 변수 이름 어때? 구현할 클래스를 먼저 작성해놓고 코딩할래? 아니면 코드를 작성하면서 클래스를 나눌래? 객체의 depth 증가와 메소드 증가 중 뭐가 더 좋은 것 같아? 학교에서는 재귀함수의 cost가 높다던데? 등등 여러가지 함께 이야기할 상대가 없는 것이 너무 힘들었다. 마치 눈을 감고 걷는 느낌이었다. 코딩을 하는 시간이 길어질수록 나의 코드에 대한 의구심이 들었다. 기능구현설계의 미스인가? 더 좋은 설계가 있을까? 주변에서 추천하는 유명한 자바 서적들에는 이런 어려움에서 해방시켜줄 방법들을 소개하고 있을까? 아 책 읽을 시간이 있었으면 좋겠다.. 만약 떨어져서 혼자 공부하거나 우테코로 합류하면 일주일 후에 봐도 흐름 파악이 쉬운 코드를 작성할 수 있을까? 등등 너무 많은 생각이 들었고 너무 괴로웠다. 정말 괴로운 시간의 연속이었다. 괴로운 시간 끝에 내가 앞으로 공부할 방향을 찾았다. 우테코에 최종합격 여부와 상관없이 시험이 끝난다면 그동안 시간이 없다는 핑계로 읽어볼 엄두도 못 낸 Effective Java, 토비의 스프링, 리팩토링 등 유명한 서적들을 읽으며 나홀로 프리코스를 다시 한번 진행해볼 생각이다. 이런 결심을 통해 나는 한 단계 더 성장할 수 있다고 확신한다. 숫자야구, 블랙잭 같이 간단한 프로그램도 어떻게 코딩하느냐에 따라서 훌륭한 교보재가 될 수 있다는 것을 깨달았으니 말이다. 프리코스 끝~~

'잡담' 카테고리의 다른 글

2019년 회고와 2020년 다짐  (0) 2020.01.01
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기