[부스트캠프 7기] 챌린지 수료 후기

Lybell·2022년 8월 21일
2
post-custom-banner

7월 18일부터 8월 12일까지 4주간 진행된 부스트캠프 웹・모바일 7기 챌린지가 드디어 막을 내렸다.

각 일차 회고록

16일차

이제부터는 배경지식이 없습니다. 미션을 해결하기 위해 얻어야 하는 지식도 스스로 알아가셔야 합니다.

4주차부터는 기본적으로 주어지는 배경지식이 없다. 그래서 문제를 읽고 배경지식을 유추해서 공부해야 한다. 진정한 야생은 최소한의 길잡이조차 주어지지 않고, 자기가 스스로 부스트캠프가 야생이라는 것이 느껴지는 순간이었다.
사실 16일차 문제와 비슷한 것을 13일차에 이미 시도한 적이 있었다. 그 때에는 거의 야매로 배워서 적용했었는데, 16일차에서 복습하면서 제대로 적용하니 내 지식이 강화된 느낌이었다. 더불어 이전 프로젝트를 하면서 썼던 기술을 적용하는 과정에서 해당 기술의 문제점을 파악할 수 있었다. 이 과정에서 부스트캠프 도중에 배웠던 테크닉이 또다시 빛을 발했다.

4주차에서 유일하게 7시간 내에 클리어한 문제였다. 나머지는 기본적으로 밤 10시에 끝냈고 마지막 날은 새벽에 끝을 보았다.

17일차

설계의 중요성

설계가 정말 중요한 문제가 나왔다. 바로 전일차에 나왔던 것은 물론 이전에 배웠던 설계방식과 학습 내용을 가져와야 풀 수 있는 문제였다. 추가적으로 학습해야 하는 배경지식이 있다기보다는 이전에 반복적으로 나온 것들을 어디까지 확실히 알고 있냐는 느낌이었다.

코드를 짜다가 특정 모듈에 로직이 너무 집중되어서 비대해지는 것 아니냐는 지적을 받았다. 해당 문제를 해결하기 위해 학습정리를 하다 특정한 디자인 패턴을 알게 되었고 그것을 적용하였다. 나중에 다시 알아보니 이미 코드를 짜면서 쓰고 있었는데 그 명칭과 효과를 몰랐던 패턴이었다더라.

18일차

이게 10시간이 걸릴 게 아닌데?!
-그 당시 나, 학습노트에 느낀 점을 쓰며

예전에 개인 프로젝트를 하면서 한 번 다뤄본 것이 주제로 나왔다. 그때는 원리를 모르고 썼었는데, 이번에 직접 구현하면서 원리를 알아가니 좋았다더라. 그런데 한 번 다뤄본 거고 설계가 어렵지 않은 것 같았지만 끝나고 나니 10시간이나 걸렸다더라.

끝없는 예외처리

4주차 문제들이 다 그렇지만, 예외처리가 정말 중요했었다. 개발자는 자신이 생각한 플로우대로 사용자들이 따라올 것이라고 생각하지만, 실제 환경에서 사용자는 개발자가 상상치도 못한 창발적인 방법으로 버그를 찾기도 한다. 그래서 가능한 한 사용자가 할 수 있는 모든 방법을 틀어막아서(?) 사용자가 개발자가 의도한 방법대로 프로그램을 사용하도록 유도하는 것이 예외처리다. 아마도 사용자 입장에서 어떻게 하면 프로그램에 버그가 날까 하고 생각하면서 가능한 모든 수를 생각하느라 늦어진 게 아닐까 싶다. 그만큼 예외처리도 잘 이루어졌던 것 같다.

19일차

(슬랙에 어떤 분이 올리신 사진의 원본. 정보유출 문제로 그 사진을 올릴 수 없지만 대충 이번 부스트캠프에서 악명 높은 문제 4천왕을 꼽은 내용이었다. 그리고 끝판왕이 19일차.)

마지막 일차라 그런지, 지금까지 나왔던 대부분의 CS지식과 테크닉을 총동원해서 풀어야 하는 문제가 나왔다. 그 중 화룡점정은 지금까지 나왔던 미션들이 나열되는 부분. 챌린지 4주간의 기억을 되돌아볼 수 있었던 가슴 뭉클한 시간이었다.

놀랍게도 19일차 문제는 내가 한 라이브러리를 써서 해 봤던 문제였다. 하지만 그 때는 라이브러리를 쓸 줄만 알았지 라이브러리가 어떻게 굴러가는지는 몰랐었다. 힘들게 직접 구현해보니 라이브러리의 소중함을 알게 되었다더라.

20일차

훈련소 수료 기다리는 훈련병같지 않아요?
-누군가

고통스러웠던 19일차 미션이 끝나고, 피어세션 시간이 되었다. 가장 어려운 미션이라 모두 힘들어했지만 그래도 어떻게든 끝낸 모습을 볼 수 있었다. 19일차에는 시간이 빨리 지나가서 어느덧 새벽이 되었는데, 막상 모든 미션이 끝난 20일차가 되고 수료식만을 남겨둔 상황에서는 시간이 정말 가지 않았다. 누군가는 훈련소 수료 기다리는 훈련병이라느니, 전역 기다리는 장병 같다느니 하는데 딱 그 느낌인 것 같다.

팀 회고 시간에는 3주차처럼 갈틱폰을 진행했다. 이번 주차 갈틱폰도 재미있는 주제들이 나왔다. 참고로 위의 짤을 슬랙 갤러리 채널에 올렸는데, 놀랍게도 챌린지 갤러리 명예의 전당 2위에 빛나는 영광을 얻을 수 있었다!

챌린지 수료식은 zep이라는 가상공간 플랫폼에서 진행되었다. 방명록이나 zep 미니게임, 슬랙에 올라왔던 사진들을 모아놓은 갤러리 등 예쁘게 꾸며져 있었다. 특히 가장 압권이었던 건 내준내상이었는데, 온갖 웃긴 상드립을 볼 수 있어서 재미있었다. 마지막으로 zoom에서 소감을 발표하고 7시에 헤어졌는데, 챌린지가 완전히 끝났다는 느낌이 드니 뿌듯하면서도 아쉬운 느낌이 들었다.

(3주차 캠퍼들과 같이 찍은 그 당시 사진.)

챌린지 수료 후기

(미션은 이제 없다!)

당연한 거지만, 챌린지가 끝나니 매우 후련했다. 6개월치 공부를 한 달만에 끝낸 듯한 느낌이었고, 거기에 놀라운 건 그 중 절반이나 소화했다는 것이다. 절반이라고 말하면 별거 아닌 것 같지만, 무려 3개월이다! 챌린지의 1/6밖에 소화하지 못했어도 1달치 공부다. 챌린지를 하지 않고 개인 공부만 했다면 3개월치도 아니고 3일치 공부밖에 소화하지 못했을 것이다.

챌린지 과정은 힘들었지만, 그만큼 얻어간 것들도 많았다. 많은 사람들이 챌린지 힘들다 해서 얼마나 힘들겠냐고 챌린지 시작 전에는 생각했지만, 진짜 자바스크립트 난생 처음 해 본 사람부터 수년간 자바스크립트로만 코드를 짠 사람들, 전공자 졸업생에 회사를 퇴사하고 온 사람들까지 전부 다 가리지 않고 힘들어했다.

대충 어떻게 어려웠냐면, 설계과정이 어려웠다. 우리가 아는 코딩테스트 같은 알고리즘적인 어려움이 아니라, 설계를 제대로 하기 위해서 해당하는 CS지식이 정확이 어떻게 돌아가는지를 알고 있어야 했고, 나는 그 기초 CS지식에 대한 내용이 거의 없는 상태로 들어왔기 때문에, 전공자보다 배는 공부해야 했다. 그나마 코드를 많이 짜 봤기 때문에 코드 짜는 데에 어려운 점은 없었다.

미션 자체의 분량도 엄청났고, 구현해야 할 것들도 상당히 많았다. 한 미션의 경우 무려 800줄이 넘는 코드를 작성해야 했다. 분명 2시쯤에 밥을 먹고 설계를 완료하면 그래도 7시 이전에는 끝낼 수 있을 것 같았는데, 코드를 짜다 보면 이렇게 오래 걸릴 게 아닌데...?라고 말하는 자기 자신을 볼 수 있었다. 이 미션이 만약 학교 전공수업 중에 나온 미션이라면 일주일을 줬을 것이다.

무엇보다도 끝없는 밤샘으로 인한 체력적 소모가 심했다. 나는 2~3주차 기준으로 평균적으로 오후 9~10시에 미션을 완료한 편이었지만, 아직 학습정리가 남아 있었기 때문에, 미션 도중 배웠던 점을 정리하고 학습정리를 다 끝내고 나면 새벽에 자는 경우가 부지기수였다. 한번은 고된 피로로 인해 늦잠을 자는 경우도 있었고, 특히 마지막 날에는 미션이 새벽에 끝났기 때문에 학습정리까지 마무리하느라 밤을 새고 말았다.

힘든 것들만 있는 것 같았지만, 얻어간 것들도 상당히 많았다. 챌린지 기간 동안 얻어간 것들은 후술한다.

챌린지에서 얻어간 것들

다양한 CS지식들

개구리를 해부하지 말고, 직접 만들어라.

부스트캠프에서 제일 많이 얻어갔던 것이었다. 본래 나는 프로그래밍을 많이 하는 과 출신이었고, 그만큼 코드도 많이 짜 봤지만, 전공자는 아니라서 CS지식에 취약했었다. 부스트캠프에서 제공하는 잘 짜여진 미션을 받고, 코드를 설계하면서, 학교에서는 공부하지 못했던 CS지식을 넓고 깊게 알 수 있었다.

특히 가장 좋았던 것은 CS지식에 대한 흐름을 확실히 알 수 있었다는 것이다. 책이나 아티클을 보고 공부하는 것만으로는 좋아, 그런 지식이 있어. 그래서 어쩌라는 거지? 라는 느낌이 들었으며, 정확히 알아도 알지 못하는, 외우기만 하는 느낌이었다면, 부스트캠프를 하면서 해당 CS지식을 모사하며 직접 만들어 보니, CS지식에 대한 개괄적인 지식이 아니라 알고리즘을 위한 흐름 위주로 공부하게 되고, 이러한 원리로 해당 CS지식이 굴러간다는 것을 알게 되었다.

커밋 컨벤션

(부스트캠프 직전 프로젝트인 Stardew Dressup 커밋. 부스트캠프 도중 프로젝트는 커밋 내용만으로 주제가 스포되기 때문에 올릴 수 없다.)

본래 나는 커밋 컨벤션을 그렇게 지키는 편이 아니었다. 2일차까지 커밋을 대충 작성했는데, 3일차 피어세션 때 다른 동료들이 커밋 컨벤션을 잘 지키면서 공부한 흔적을 잘 보여준 것을 보고, 그 동안 나의 커밋 스타일이 개판이었다는 것을 자각하게 되었다. 이후 커밋 컨벤션을 스스로 만들어서, 챌린지 20일차까지 커밋 컨벤션을 지키려고 노력하고 있다. 전 세계에 내 서비스를 퍼블리싱할 가능성도 있기 때문에 웬만해서는 영어로 커밋 메시지를 쓰려고 노력하고 있다.

동료학습

누구도 완벽할 수는 없다. 완벽하지 않기 때문에 서로를 지탱하는 동료가 있는 것이다.

부스트캠프 이전, 나는 혼자서 모든 것을 해결하려는 사람이었다. 혼자서 공부하고, 개인 프로젝트를 진행하면서 누군가와 같이 공부한다는 생각 자체를 하지 않았다. 하지만 부스트캠프라는 좋은 기회에서 동료들과 같이 코드를 리뷰하면서(내 코드를 남이 볼 것이라는 걸 생각하지도 못했다.) 지식을 공유하고, 때로는 지식을 전수받기도 하면서 같이 성장한다는 기쁨을 누릴 수 있었다.

부스트캠프는 학교 수업 등과 다르게 줄세우기가 없다. 정말로 다른 사람의 객관적인 실력을 아무도 모른다. 그렇기 때문에 저 사람들을 멤버십에 가기 위한 경쟁자로 보는 게 아니라 멤버십은 하늘에 맡기고 서로 성장하는 동료로 쉽게 볼 수 있었던 것 같다.

동시에, 완벽한 사람은 없다는 것을 알게 되었다. 슬랙에서 날아다니는 사람조차도 부족한 면모는 있으며, 반면 아무리 코드 실력이 부족한 사람이라도 강점이 있기 마련이다.

학습 방법

부스트캠프가 지향하는 학습 방법은 만들면서 배우기다. 특정한 지식을 직접 만들어 보고, 만드는 과정에서 설계적 완성도를 끌어올리거나 실제와 더 흡사하게 만들기 위해 깊게 공부하고, 이 과정에서 새로 배운 것들을 기록하여 훗날의 자신이나 다른 사람들이 쉽게 볼 수 있게 공유하는 것이 부스트캠프의 학습 방식이다.

내가 지향하는 학습 방식도 이와 비슷하다. 실제로 만들면서 배우기를 부스트캠프 이전에도 수행했기도 했다. xnb.js를 제작할 때에는 npm과 번들러, xnb 파일의 구조와 버퍼를 다루는 방법, 워커 스레드에 대해 배웠고, stardew dressup을 제작할 때에는 react, pixi.js에 대해 배웠다. 만약 내가 stardew dressup을 react로 제작하지 않았다면 react를 왜 써야 하는지도 몰랐을 것이다. 부스트캠프에서 새로 알게 된 것은 만들면서 배우기를 CS지식을 공부하는 데에도 적용할 수 있다는 것과, 프로젝트를 만들기 위한 수단으로써의 학습이 아닌 학습의 수단으로써의 프로젝트라는 패러다임을 전환할 수 있었다는 것이다.

부스트캠프가 끝났는데도 아직도 모르는 것들이 산더미다. 그래도 부스트캠프에서 만든 분야는 흐름은 말할 수 있는 수준으로 끌어올려졌다. 그래서 부스트캠프에서 얕게 넘어갔던, 또는 몰랐던 것들은 부스트캠프 스타일로 스스로에게 미션을 주어서 학습해볼 계획이다.

챌린지에서 기여했던 것들

코드 스타일

참 챌린지 기간인 '야생' 에 어울리네요.
짧은 시간인데 뭐든지 필요하면 뚝딱뚝딱 만들어 잘 쓰시는군요....ㅋㅋㅋㅋ
구현력이 대단하십니다. 저는 하루만에 저렇게 절대 못 할 것 같아요..
일주일동안 교과서같은 모범 코드 잘 봤습니다
-피어세션 한 캠퍼분

피어 세션을 하면서 코드 스타일에 대한 칭찬을 많이 받았었다. 사실 코드 스타일에 대해 자신은 없는 편이었고, 본래 목적이 코드 스타일 개선이었던지라, 의외로 코드 스타일에 칭찬을 받아서 코드에 대해 자신감이 조금씩 생기는 것 같았다.

부스트캠프에서 나는 다른 사람을 이끌어주는 포지션이 되었다. 대학에서 하던 게 자바스크립트로 코드 짜는 거라서 그런지, CS지식이나 공대생처럼 사고하기 같은 건 하지 못하지만 내 장기인 자바스크립트 테크닉이나 코드를 예쁘게 보이게 하는 법 같은 부분을 중점적으로 피드백했었다.

나와 함께 했던 18명의 캠퍼분들에게 미숙한 코드를 좋게 봐주셔서 감사할 따름이다.

자바스크립트 테크닉

let [first, second, ...rest] = [1,2,3,4,5]; // 구조 분해 할당
let {x, y} = position; // 객체 구조 분해 할당
let copied = [...origin]; // 스프레드 연산자.

// 함수 구조분해 할당
function moveForward({x,y})
{
  return {x:x+1, y};
}

// 배열 고차함수
Array.from({length:100}, (_,i)=>i)
  .map(elem=>elem*2)
  .filter(elem=>elem>10)
  .reduce((sum, cur)=>sum+cur, 0);

// promise 감싸기
function sleep(millis)
{
  return new Promise(resolve=>setTimeout(resolve, millis));
}

// promise 체이닝
sleep(1000)
  .then( ()=>console.log("1s 경과") )
  .then( ()=>sleep(2000) )
  .then( ()=>console.log("2s 추가경과") )

// 파이프 함수
pipe(
  mult(2),
  filter(elem=>elem>10),
  average
)([1,2,3,4,5,6,7,8,9,10]) 

// 정규표현식 체이닝
regexpChain(
  [/^create\s+(.*)/i, ([,n])=>pipe(parseCreate, createPlayer)(n)],
  [/^move\s+(.*)/i,   ([,n])=>pipe(parseMove, 	movePlayer	)(n)],
  [/^delete\s+(.*)/i, ([,n])=>pipe(parseDelete, deletePlayer)(n)]
  [/.*/, ()=>console.log("다시 입력하세요!")]
)(command);

function moveForward({x,y}){}
이런식으로 선언하고 파라미터를 따로 파싱할 필요가 없어서 되게 좋은 것 같아요! 이런식으로 편한 문법들이 많은데 저는 아직 활용을 잘 못하고 있었네요. 배워갑니다!
전체적으로 문법 활용을 잘 하셔서 깔끔하고 간결하게 짜신 것 같아요 bb
-피어세션 한 캠퍼분

올해 초, 코딩테스트를 공부하면서 자바스크립트에 대한 고급 테크닉들을 많이 배웠고, 함수형 프로그래밍에도 어느 정도 관심 있어서 고차함수의 사용이나 배열 메소드 체이닝 등 기초적인 함수형 사고방식을 배웠다. 본격적으로 부스트캠프를 하면서 여러 자바스크립트 테크닉들을 미션에서 많이 사용했고, 피어세션에서 다른 분들에게 피드백을 하면서 지금까지 사용했던 자바스크립트 테크닉들을 알려주기도 했다.

커맨드의 파싱, 이후 로직을 단계별로 구분해서 함수형 프로그래밍적으로 구현하신 부분도 인상깊습니다.. 많이 배워갑니다.
-피어세션 한 캠퍼분

올해 초에 배운 것뿐만 아니라, 미션 도중 함수형 프로그래밍을 적용해서 이를 사용하기도 했는데, 대표적으로 위에 적었던 파이프 함수와 정규표현식 체이닝이다. 정규표현식 체이닝은 과도한 정규표현식 파싱 반복에 화가 나서 만든 기법이었는데, 결과적으로 가독성이 향상되는 효과를 얻을 수 있었고, 해당 부분을 배우려고 하는 캠퍼들도 있었다.

1주차와 3주차에 만난 한 캠퍼분이 있다. 지식을 빨아들이는 스펀지같은 분이었는데, 1주차에 내가 알려주었던 자바스크립트 테크닉들을 3주차에 적용해서 사용한 것을 보고 뿌듯함과 존경심을 느꼈다. 나의 지식으로 누군가가 성장하는 것을 통해 동료학습을 통해 모두를 끌어올리는 느낌을 알 수 있었다.

챌린지에서 아쉬웠던 것들

자신의 코드 스타일 개선

피어세션하셨던 많은 분들이 내 코드를 칭찬해 주셨긴 하지만, 사실 나는 코드 스타일을 개선하려고 부스트캠프에 온 거였다. 물론 챌린지 전에 비해 각 함수 코드가 짧아지고, 가급적이면 순수함수로 짜려고 노력하는 습관이 길들여지긴 했지만, 근본적으로 내 코드가 좋은 코드인가? 라는 질문에 답하려면 그러지는 못할 것 같다.

좋은 코드는 바보가 봐도 이해할 수 있는 코드, 그러니까 별다른 주석 없이도, 코드를 처음 본 사람이나 미래의 내가 흐름을 이해할 수 있는 코드 라고 생각한다. 나는 부스트캠프 이후 각 함수가 무슨 역할을 하는지까지는 어느 정도 정리할 수 있는 수준까지는 왔지만, 전체적인 코드의 흐름은 아직까지도 부족한 것 같다.

7시간 제한 업적에 매몰

챌린지 7시간 제한은 일종의 체크포인트이자 코드를 빨리 완성해야 된다는 일종의 자극제 역할을 하지만, 피어세션 때 마지막으로 gist를 수정한 시간이 전일 19시인가 라는 항목 때문에, 정작 7시간 이내에 마무리한 미션은 코드를 개선하면 7시간 안에 코드를 다 짰다는 업적이 손실되는 것처럼 느껴졌기 때문에, 코드를 19시 이후에 개선하는 것에 대해 소극적이었다. 오히려 7시간 내에 끝낸 미션보다 7시간을 넘겨서 끝낸 미션에 대해 리팩토링을 더 부담없이 할 수 있었던 것 같다.

아마 다시 챌린지 1일차로 돌아가게 된다면 7시간 제한은 장식으로 생각하고, 7시간 제한 안에 코드를 짰어도 코드 리팩토링을 더 신경쓸 것 같다.

멤버십?

사실 챌린지 끝나고 1주일이 된 시점에서 멤버십에 대한 욕심이 없다고는 말할 수 없다. 챌린지 도중에는 챌린지 미션과 학습에만 집중하다 보니 멤버십에 관한 생각은 까맣게 잊어버렸지만, 막상 챌린지가 끝나니 이왕이면 멤버십까지 가서 더 성장하고 싶다는 생각이 들었다. 물론 멤버십에 아쉽게 들어가지 못하더라도, 챌린지에서 공부하는 법이나 여러 코드 스타일들, CS지식들을 배웠기 때문에, 이를 기반으로 더 성장할 수 있다고 생각한다.

profile
홍익인간이 되고 싶은 꿈꾸는 방랑자
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 8월 22일

저도 부캠 7기 캠퍼인데 구글 돌아다니다가 글을 발견했습니다! 중간에 JS 테크닉 코드 올려주신거 인상깊게 보고 갑니다. 같은조가 한번 되었으면 좋았을거 같은데 아쉽네요~~

답글 달기