카테고리 없음

우아한 테크코스 3기 프리코스 후기

bimppap 2020. 12. 13. 16:08

무럭무럭 자라나는 새싹

 

우아한 형제들에서 진행하는 우아한 테크코스 1차 전형을 통과하고 프리코스를 3주 동안 진행하였다. 프리코스가 마무리를 지어가고 코딩 테스틀 앞두며 여태껏 겪은 바와 공부한 것을 정리할 겸 후기를 써 본다.

 

[ 차례 ]
0. 1차 전형
1. 프리코스 준비
2. 프리코스 진행
3. 오프라인 코딩 테스트를 앞두고

 

0. 1차 전형

  이번 우아한 테크코스는 내게 있어 두 번째 도전이다. 우아한 테크코스 2기를 지원한 적이 있기 때문이다. 결과는 1차 심사에서 장렬하게 탈락. 프리코스의 'ㅍ'도 맛보지 못했다.

 

당시 불합 안내 메일. 울지 않았다.

  탈락 소식을 듣고 1년이 지났다. 그동안 바뀐 모습을 보여주겠다는 포부로 3기에 도전했다. (무엇이 바뀌었는지는 여백이 좁아 여기에 적지 않겠다. 어쨋든 공부를 많이 했다.) 제출 마감 2주 전에 자소서를 미리 쓰기 위해 노트북 앞에 앉았다. 13일 동안 빈 페이지만 노려보다가 남은 하루 동안 밤을 꼴딱 새 자소서를 완성했다. 결국 자소서를 제출하고, 코딩테스트를 준비하고, 시험을 치고, 결과가 나올 때까지 일말의 기대를 하지 않았다. 이유는 간단했다. 하루만에 쓴 자소서가 잘 써졌을 리가 없으니 당연히 탈락할 거라고 생각했기 때문이다. 제출하고 나니 뭐라고 썼는지 기억이 하나도 안 났던 것도 슬픈 예측에 힘을 얹어줬다. 1차 심사 결과가 오기 전까지는 그랬다.

 

  다섯 번 정독해도 탈락 이 아니라 합격 이었다. 자소서를 꺼내 보았다. 과거의 내가 대체 뭐라고 썼는지 궁금했다. 읽어보니 과거의 나와 지금의 나는 다른 사람이 아니었을까 하는 의심이 들었다. 하지만 분명 내가 쓴 게 맞았다. 마감의 힘이라는 걸 새삼 실감했다.

 

1. 프리코스 준비

1차 합격의 기쁨도 잠깐이었다. 최종 합격이 뜰 때까지 김칫국은 마시지 말자고 결심했기 때문에 묵묵하게 프리코스 준비를 시작했다. 프리코스는 우아한 테크코스(이하 우테코)만이 가지는 특이한 절차로, 본과정의 맛보기 코스다.

📎
이 과정을 통해 지원자는 우아한테크코스 과정을 미리 경험해 보면서 교육의 참여 여부를 결정할 수 있고, 저희는 우아한테크코스 과정을 소화하는데 어려움이 없는지 판단할 수 있는 기간이 될 수 있을 것 같아요. 서로가 같이할 수 있는지를 탐색할 수 있는 시간이라고 생각하면 됩니다.
(...중략...)
우아한테크코스가 목표가 아니라 좋은 개발자로 성장하는 것을 목표로 하면서 성장해 나가는 과정으로 생각하고 도전했으면 합니다.

- 프리코스 사전 준비 안내 메일에서 발췌

  우테코가 중요시 여기는 것은 자기주도 학습협업 정신이다. 해당 과정은 스스로 공부를 해나가며 개발할 수 있는 역량과 더불어 다른 개발자와 코드로 소통할 수 있는 역량을 파악하는 게 목표인 듯 했다. 솔직히 말하자면 자신 있었다. 코딩은 대부분 독학으로 배웠기 때문에 방향이 어느 정도 잡혀있었고, 팀프로젝트도 서너번 경험해본 전적이 있었다.

 

  이전 기수의 프리코스 후기를 읽어보면서 나름대로의 준비를 했다. 이런 미션이 나오면 이렇게 풀어야지... 저런 미션이 나오면 저렇게 접근해봐야지... 함수명이랑 변수명은 이렇게 써야지... 머릿속으로 상상의 코드를 짰다. 마음의 준비만 한 것이나 다름 없었다. 그래도 어쩔 수 없었다. 나는 철저하게 예습을 하며 준비하기 보단 직접 문제에 부닥쳐서 맨땅에 헤딩하는 공부 방식이 적성에 맞았다.

 

2. 프리코스 진행

  프리코스는 깃허브에서 주어진 미션을 fork하여 새 branch를 생성해 구현을 하고 pull request를 하는 방식으로 진행되었다. 미션은 일주일에 하나씩 총 3개의 미션을 구현해야 했다. 주어진 미션들은 다음과 같다. 차후에 우테코에 지원할 의향이 있는 사람들이 참고할 수 있도록 각 미션에 내가 제출한 미션 링크를 걸어두겠다.

 

  주차를 거듭하면서 더 큰 그림을 그리게 하는 식이었다. 난이도도 자연스레 올라갔다. 숨이 막힐 정도로 어렵진 않았지만 간혹 코드가 막힐 정도로 어렵긴 했다. 막힐 때면 침대에 누워 이걸 어떻게 하냐고 넋두리를 하며 훌쩍거렸다. 충분히 훌쩍거리고 나선 다시 일어나 컴퓨터 앞에 앉았다. 원래 공부는 울면서 해야 늘어난다고 어디서 주워들은 게 있어서 그랬다.

 

  훌쩍거린 효과가 있었는지 공부는 잘 되었다. 프리코스에서 어떤 공부를 해야할지 방향을 잘 잡아준 덕택도 있었다. 미션은 크게 기능 요구사항, 프로그래밍 요구사항, 진행 요구사항으로 나누어졌는데, 각 요구사항에서 무엇을 해야할지 세분화해서 정해주니 무엇을 해야할지 명료했다. 이 중 프로그램 요구사항을 지키면서 특히 많은 공부를 하게 되었다.

 

모든 미션에 공통적으로 달려있던 프로그래밍 요구사항

  위 요구사항을 처음 봤을 때 적잖이 충격을 받았다. 자바 코드 컨벤션은 뭐지? 3항 연산자를 쓰는 편이 좋지 않나? 불가피하게 인덴트가 3이 넘으면 어쩌지? 함수가 저렇게 짧아도 되나? else를 쓰지 말라고? switch문도? 이러한 의문들은 구글링을 하고 코드를 짜면서 자연스레 해결되었다. 그 중 크게 도움이 된 것들을 소개한다.

 

자바 코드 컨벤션

  자바 코드 컨벤션은 코드를 짤 때 권장하는 규칙이다. 위에 적혀있다시피 미션을 진행할 때에는 Google Java Style Guide 를 기본 원칙으로 한다. 당연하게도(?) 나는 한글로 해석된 걸 찾아 읽었고, 다음 세 가지 게시물이 크게 도움이 되었다.

 

  나는 InteliJ를 쓰기에 네이버 캠퍼스 핵데이 Java 코딩 컨벤션의 Appendix.D.2 를 참고하여 포맷터를 설정했다. 매번 컨벤션을 들여다보면서 코드를 뜯어고칠 수는 없으니까. 코드 포맷팅 단축키는 윈도우 기준 Ctrl + Alt + L 맥OS 기준 ⌘ + ⌥ + L 라는 것도 알아놓자. (단축키 만세!)

이렇게 설정해두면 마음껏 코드를 치고 마무리로 코드 포맷팅을 하면 된다. 마법 같다.

 

indent depth 줄이기 - stream API

  1주차 미션은 인덴트 깊이를 3까지 허용했지만 2주차부턴 2까지 제한을 걸었다. 나는 연습을 위해 일부러 깊이를 1까지만 허용하도록 스스로에게 제약을 걸었다. 굉장히 힘들었다. 간혹 for 조건절 안에 if 조건절을 써야할 경우가 있었는데, 이걸 어떻게 해결해야할 지 답이 보이지 않았다. 결국 다른 사람들이 pull request 한 코드들을 컨닝(?)했다.

 

  많은 사람들이 stream 이라는 생소한 메소드를 쓰길래 알아보니 컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 반복자라고 한다. 자바 8부터 지원하는 기능이다.

 

  잠깐 환기를 해보자면 우테코에서는 미션이 마감된 이후 공통 피드백을 올려준다. 받은 피드백 중에서는 이런 항목도 있었다.  

 

배열 대신 java collection 을 사용해라. (List, Set, Map 등) 다양한 API가 있어 데이터 조작에 용이하다.
또한 자바 API를 적극적으로 활용해라.

 

  이전에 배열을 쓰는 것이 컬렉션을 쓰는 것보다 안전하다고 배웠기 때문에 정말 그래도 되나? 하는 의문이 들었지만 뜻이 다 있겠거니 하고 컬렉션을 써봤다. 말 그대로 신세계 였다. 너무 편했다!  stream도 마찬가지였다. 진작에 써볼 걸 하는 후회가 들었다. 해당 API 는 구글링하면 자료가 많기에 자세한 설명은 하지 않겠다. 대신 가장 많이 찾아본 게시물 링크를 여기에 달아둔다.

 

  결론적으로 stream을 사용하면 코드를 간결하게 만들 수 있다. 아래 예시를 보자.

 

class StreamExample {
	String[] fruits = { "apple", "banana", "watermelon" };

	public boolean useForAndIfStatement() {
		for (int i = 0; i < fruits.length; i++) {
			if (fruits[i].length() == 5) {
				return false;
			}
		}
		return true;
	}

	public boolean useStreamAPI() {
		return Arrays.stream(fruits)
			.noneMatch(fruit -> fruit.length() == 5);
	}
}

 

  두 함수는 같은 기능을 가졌지만 함수 길이와 인덴트 깊이가 확연하게 다른 것을 알 수 있다. 이걸 알고 흥분해서 다른 쓸 만한 API도 있는지 열심히 찾아본 기억이 있다. 함수형 인터페이스도 이 때 알게 되었다. 자바와 좀 더 친해진 기분이었다.

 

else 예약어 쓰지 않기

  else를 쓰지 않고 if 조건절을 쓰는 방법은 간단한다. 말 그대로 안 쓰면 된다. 생각해보면 당연한 일이다. if 조건절을 빠져나오는 건 else를 진행하는 것이나 마찬가지다. 아래 예시는 같은 기능의 함수를 3가지 방법으로 만든 것이다.

 

class ElseExample {
	public boolean doSomethingWithElse() {
		if (check) {
			return true;
		} else {
			return false;
		}
	}

	public boolean doSomethingWihoutElseButSwitch() {
		switch (check) {
			case true:
				return true;
			default:
				return false;
		}
	}
    
	public boolean doSomethingWithoutElse() {
		if (check) {
			return true;
		}
		return false;
	}
}

 

  보다시피 else를 쓰지 않아도 충분히 코드를 짤 수 있다.

 

그 외

위 3가지 말고도 프리코스에서 배운 것은 많았다.

  대부분 프리코스에서 가르쳐서 배운 게 아닌, 미션을 구현하며 혼자 공부해 배운 것들이다. 신기했다. 나 혼자 이만큼이나 공부하다니... 확실히 프리코스를 시작하기 전과 후가 크게 달라진 게 느껴졌다. 성장한 정도를 알아보고 싶어 먼 옛날에 쓴 코드를 꺼내봤다. 아주 가관이었다.

 

과거의 나를 요약하자면 이렇다.

  앞서 말했듯이 우테코는 자기주도 학습을 중요시 여긴다고 했지만, 정말로 혼자 공부하도록 내버려두지 않는다. 대신 혼자 공부할 수 있는 밭과 비료를 조성해두고 씨앗들이 어떻게 자라나 지켜본다. 농부는 모든 씨앗이 훌륭한 작물이 되길 바라겠지만, 밭에 심어진 씨앗이 어떻게 뿌리를 뻗고 싹을 움틀 것인지는 농부도 밭도 아닌 씨앗에게 달려있다. 씨앗이 노란 싹을 틔우면 밭에서 치워질 테고, 푸르고 싱싱한 싹을 틔우면 잘 자라라고 물을 뿌려줄 것이다. 그러니 남은 기간동안 쑥쑥 자라기 위해 최선을 다 해야 할 것이다.

 

  만일 나는 구글링하거나 책을 읽어가면서 스스로 공부하는 걸 좋아한다! 판만 깔아주면 뭐든지 할 수 있다! 1을 알려주면 10을 해내고픈 의지가 있다! 뭔가 보여주겠다!  하는 사람이 있다면 우테코에 지원하길 적극 권장한다. 프리코스만 거쳐도 코드의 질이, 개발자로서의 시선이 확연하게 바뀐다.

 

3. 오프라인(?) 코딩 테스트를 앞두고

  다가오는 19일에 코딩 테스트를 본다. 본디 오프라인으로 진행될 예정이었으나 코로나로 인해 온라인으로 전환되었다. 아쉽지만 시험을 못 보는 것보단 나았다. 시험은 5시간 동안 진행될 예정이라 한다. 지난 기수 후기를 찾아보니 프리코스 때 진행한 미션과 비슷한 유형의 문제를 출제한다고 한다. 남은 기간 동안 시험 대비를 위해 제한 시간을 걸어놓고 미션들을 다시 구현해 볼 예정이다. 나 뿐만 아니라 모든 지원자들이 각자 최선을 다해 유종의 미를 거뒀으면 좋겠다.

 

모든 씨앗들이 멋지게 자라길 응원한다!!