우아한테크캠프(우테캠) 합격 및 2주차까지의 후기
우테캠 지원
작년 네이버 면접에서 쓴 맛을 보고 방향성을 새로 잡으며 공부하던 중, 우아한 형제들에 전환이 가능한 우아한 테크 캠프에 지원했다.
작년 면탈 이후 CS 지식이 부족하다 생각하여 CS에만 집중하고 있었는데 마침 자체 서비스를 가진 우아한 형제들에서 우테캠 모집을 하였다. 당시 코테에서 많이 탈락하여 자신감이 많이 떨어졌고, 이전에 이미 부트 캠프를 했었기에 큰 기대는 하지 않고 지원을 했다.
코딩 테스트
코딩 테스트는 1차와 2차 두 번 진행했다.
1차 코딩 테스트(알고리즘)
1차 코딩 테스트는 java로만 응시가 가능했고, 개인적으로 문제는 쉽게 느껴졌다. 알고리즘 문제를 잘 풀어낼 수 있는 것을 확인하는 것이 아닌, java 언어를 어느정도 잘 사용할 수 있는지 확인하는 듯한 시험이었다. 물론 그렇다고 알고리즘을 전혀 공부하지 않으면 어려울 수 있으니 공부는 해야 한다.
2차 코딩 테스트(API 개발)
2차 코딩 테스트는 API 서버를 개발하는 과제였다. 사실 API 자체는 CRUD만 할 줄 알아도 완성할 수 있었지만, 그 외의 추가 로직은 스프링에 대한 지식이 많아야 빠르게 풀 수 있었던 것 같다. 본인은 추가 로직이 어떻게 동작하는지 자세하게 몰라서 많은 시간을 사용했고, API를 전부 구현하지 못했다.
팁을 주자면 프로그래머스에서 API 개발을 연습해 볼 수 있는 모의 테스트가 있다. 환경도 동일하니 연습을 하고 시험을 치면 충분히 모든 기능을 완성할 수 있을 것이다.
최종 면접 및 결과
서류는 자유 양식으로 썼는데 길이 제한이 없어 각 항목마다 1000자를 넘기지 않고 작성했다. 사실 서류 자체에 대한 합/불합은 없는 것 같고, 해당 서류를 바탕으로 면접을 진행하는 것 같았다.
사실 작년 네이버 면접 이후로 면접을 한 번도 보지 못했고, 서류 합격도 거의 없었기에 자신감이 떨어져 있었다. 하지만 그동안 CS 공부는 열심히 했고, 인성 면접은 준비하면 오히려 진실된 모습이 보이지 않을 것 같아 CS만 다시 훑어보았다.
면접은 30분 정도로 짧게 진행했고, 총 세 분의 면접관으로부터 질문을 받았다. 질문에 대한 답이 끝나면 바로 다음 질문이 들어왔다. 하지만 체감상 30분은 굉장히 빨리 지나갔고, 작년 면탈 이후 CS 공부를 한 덕에 기술적인 질문은 굉장히 쉽게 답했던 것 같다.
사실 우테캠 커리큘럼만 보아도 TDD를 중요시하는 것 같은데, 나는 아직 TDD가 정말 좋은가? 에 대한 의문이 있었고, 이런 나의 의견을 면접에서도 굳이 말했었다. 하지만 합격했던 것을 보면, 단순히 의견을 주장하기보다는, 그에 대한 명확한 근거만 있다면 괜찮았던 것 같다. 프로젝트나 서류에 쓴 기술적인 요소도 왜 썼는지, 어떻게 동작하는지 등을 잘 설명하면 되는 것 같다. “TDD가 별로인 것 같다!”라고 말한 나도 합격했으니까..
1주 차 회고
체스 프로젝트
첫 주에는 굉장히 여유로웠다. 4명씩 팀 단위로 주차별 과제를 수행하고, 첫 주 과제는 페어 프로그래밍을 진행하기를 권장하여 페어 프로그래밍을 진행했다.
작년 네이버 면접 이후로 CS의 중요성과, 이 개념들을 복합적으로 사고하는 방식이 중요하다고 생각하여 여기에 집중을 했었다. 하지만 여기 와서 느낀 특이한 점은 동료들이 객체지향과 클린 코드를 굉장히 중요시한다는 점이었다. 페어 프로그래밍을 할 때도 이런 점이 느껴졌고, 사실 나는 토론을 즐기는 타입이라 서로 다른 의견을 주고받는 과정이 재밌었다. 나의 페어가 굉장히 착한 분이었고, 마찬가지로 토론하는 것을 좋아하셨기에 큰 트러블 없이 다양한 관점에서 프로그래밍을 진행할 수 있었다.
사실 페어 프로그래밍을 진행하니 진행 속도는 굉장히 더뎠고, 하나의 컴퓨터로 개발을 하고 서로의 의견이 섞이며 코드를 작성하다 보니 각자의 의견이 수용된 코드는 이해를 잘했지만, 반대로 상대방의 의견이 수용된 코드는 빠르게 이해하지 못하여 코드를 다시 살펴보는 시간이 많았다. 즉, 효율이 굉장히 좋지 않았다. 그래도 1주 차는 평가에서 제외되고 서로 다양한 의견을 주고받는 것을 원하셨던 것 같아 의도에 맞게 잘했던 것 같고, 나와 다른 의견을 가진 사람과 많은 이야기를 할 수 있었던 점이 재밌었다.
강의
여기선 마스터님이라고 부르는데, 우테캠에서 우리들을 관리하고, 강의도 해주신다. 강의 시간은 길지 않고, 자주 없지만 굉장히 인상 깊었다. 왜냐하면 마스터님이 리눅스, 데이터베이스 등을 전공하셨기에 CS에 대해 굉장히 깊게 알고 계셨다. 나름 CS 공부를 많이 했다고 생각했는데, 강의 중에 모르는 내용이 꽤 많았다. 그리고 중간에 서버는 안정적으로 잘 돌아가는 게 가장 중요하다고 말씀해 주신 부분이 좋았다.
2주 차 회고
WAS 프로젝트
2주 차부터는 본격적인 개발을 시작했다. java로 WAS를 만드는 과제였고, 시작하기에 앞서 멀티 스레드, 소켓 등에 대한 학습을 먼저 진행했다. 개인적으로 저런 개념들이 어떻게 여러 기술들과 맞물려서 동작하는지가 중요하다고 생각하여 학습 시간에 꽤 많은 시간을 쏟았다. 그래서 결론부터 말하자면 정해진 시간 안에 과제를 완성하지는 못했다.
사실 누군가는 그래도 과제인데 이상하게 동작하더라도 요구사항에만 맞춰서 기능 구현을 하는 것이 먼저가 아니냐?라고 할 수 있지만, 이미 SSAFY를 진행하며 1년 동안 그 과정을 겪었고, 해당 과정은 내가 추구하는 방향성과는 달랐기에 나는 나의 길을 가려고 노력했다.(사실 나만 이렇게 해서 이 방식을 버려야 하나 많은 고민이 있었던 것 같다)
중간에 여러 사람들과 섞여서 코드 리뷰를 하는 시간이 많았다. 인상 깊었던 점은 모두들 구현 능력이 매우 뛰어나다는 것이다. 순식간에 기능 구현을 하고, 리팩토링까지 진행한 사람들이 많았다. 또한 다들 어떻게 각 클래스의 책임을 분리하고, 확장성 있는 코드를 작성할지 고민하는 모습이 나와는 달라서 재밌었던 것 같다.
사실 난 java와 spring으로 프로젝트를 많이 해보진 않아서 구현 속도도 느리고, 저런 구조적인 고민은 깊게 하지는 않는 것 같다. 아마 28명 중에 나 혼자 TCP 버퍼를 보다 빠르게 비우는 방법에 대해 고민하고 내부적으로 데이터가 어떻게 전송되는지 학습하며 과제를 주어진 기간 안에 못했기에 다른 사람들이 보기엔 내가 신기했을 것 같다...(아마 많이 신기했을 듯?)
물론 완성하지 못한 기능은 주말에 이어서 완성하고, 구현하면서 이해하기 어려운 구조를 나름 개선했지만 다른 동료들만큼 깔끔한 구조로는 만들지 못한 점은 조금 아쉬웠다.
강의
2주 차에도 강의가 있었다! java 스레드와 linux의 스레드가 어떻게 매핑되는지에 대해 말해 주셨는데, 다대다로 LWP에 의해 매핑되는 줄 알았지만, jvm의 스레드와 커널 스레드가 1대 1로 매핑된다고 말씀해주셔서 놀라웠다. 내가 학습한 내용은 굉장히 옛날 방식인 것 같고, 최근에는 1:1로 java 프로세스에서 스레드를 생성하면 커널 스레드를 생성한다고 한다. 나는 내 눈으로 보기 전까진 이 사실을 잘 믿지 않기에 jvm 코드가 어떻게 돌아가는지 쫓아가보니 pthread_create()라는 함수를 실행하여 스레드를 만드는 사실을 볼 수 있었다.
추가적으로 찾아보니 항상 1대1로 매핑되는 것은 아니고, 상황에 따라서 커널 스레드가 놀고 있으면 굳이 자바에서 new Thread()를 해도 생성하는 것이 아닌, 놀고 있는 커널 스레드와 매핑할 수 있다는 점도 흥미로웠다.
이외에도 리눅스 설치를 진행했는데 여전히 이런 것은 어려웠다.. 아직도 왜 마운팅이 제대로 안 됐는지 의문이다.
강의는 계속 CS 관련 내용을 진행하는 것이 정말 마음에 들었다. 처음 우테캠에 들어왔을 땐, 내심 객체 지향 강의만 계속하면 어떻게 하나?라는 걱정이 있었지만, 내 CS 지식은 아직 멀었다는 듯한 강의가 진행되어 강의 시간은 항상 기다려지는 것 같다.
마무리
전체적으로 빨리 객체와 확장성 고민을 하며 기능 구현에 집중해야 하는가? 내가 하던 대로 느리더라도 왜?라는 의문과 함께 어떻게 동작하는지를 공부하는가? 에 대한 고민을 많이 했던 것 같다. 아무래도 코드 리뷰를 진행하면 다들 객체와 확장성에 대해 고민을 많이 하기 때문에 스스로도 정말 이렇게 계속해도 될까?라는 생각을 많이 하게 됐다.
고민한 결과는 뭐라도 얻어가려면 내가 평소 공부하던 방식을 고집하는 것이 낫다는 것이다. 이전 부트 캠프에서 기술적으로 깊이 고민하지 않았던 점이 많이 후회가 되었기에, 이번에도 기능 구현에만 집중하다가 후회하는 시간이 되지 않도록, 느리더라도 확실하게 배우고 얻어가는 시간으로 만들어야겠다.