부스트캠프 챌린지를 마무리했다.
사실 회고를 많이 쓰는 편은 아니었지만, 이제는 주간이나 프로젝트를 하면 내가 부족했던 부분이나 어떤 점이 좋고 어떤 점이 발전해야 하는지를 조금씩 써내려가려고 노력하는 중이다. 아무튼 챌린지를 마무리하는 기념에서 처음 부스트캠프를 시작하기 전부터 현재까지의 이야기를 써내려 가려고 한다.
챌린지 시작 전
반성부터 하자면 나는 사실 굉장히 오만한 개발자였다고 생각한다.
부스트캠프를 시작하기 전부터 ‘지금의 나 정도라도 그래도 웬만큼은 개발을 좀 안다고 할 수 있지 않을까?’ 라고 건방지게 생각했다. 마치 파이썬 교양을 듣고 Hello world!를 콘솔에 찍어놓았을 때 개발에 자신감이 붙은 새내기 1학년과 같은 느낌이었다.
하지만 챌린지에서 알면 알수록 정말 내가 알던 프로그래밍의 세계는 티끌만큼도 되지 않았음을 느껴버렸다.
마치 이런 느낌이었다.
아무튼 이렇게 챌린지를 하기 전에는 내가 할 수 있는 정보, 즉 동아리나 몇 명을 모아서 하는 자그마한 토이프로젝트를 가지고 코딩하기를 반복하면서 나도 모르게 내가 알던 부분이 전부라는 오만한 생각을 가지고 있었다고 생각한다. 사실 그 알던 부분도 제대로 알던게 아니라는 사실 또한 깨달았다.
아무튼 그렇게 오만해졌던 나는 프로젝트들을 하면서 한정적인 사람들과 하면서 항상 비슷한 류의 프로젝트만 했기 때문에 기술적인 역량 자체가 정체기에 머물러 있었다. 나름대로 공부한다고 이것저것 서적을 참고하면서 리액트나 자바스크립트에 대해서 공부했지만, 사실상 이러한 개념들은 내가 제대로 활용하는 상황이 없었기 때문에 다시금 잊혀지기를 반복하면서 나름대로 슬럼프와 같은 느낌을 받았다. 이 슬럼프는 나에게 정신적으로 고통스러운 시간이었던 것 같다. 나는 발전하고 싶지만, 이걸 하면서 발전한다는 느낌을 크게 받지 못해 스트레스를 많이 받았다. 매일매일 열심히 뜀박질을 했지만, 아직도 출발 지점에 있는 것과 같은 느낌이었다.
이에 다른 공부의 방향을 잡아야겠다고 생각했고, 이에 생각해낸 방법 중 하나가 부스트캠프였다. 그렇게 나는 부스트캠프 1차 테스트를 보았고, 베이직에 입과하여 과정을 수료하고 2차 테스트를 본 후에 챌린지에 입과하게 되었다.
챌린지 입과
챌린지는 입과 처음부터 매우 쉽지 않았다. 기존에는 그리 보지 못했던 낯선 문제들, 나는 제대로 문제를 해석도 못 하는 것 같은데 이미 열심히 토론중인 다른 캠퍼들, 새벽까지 문제를 잡고 있어도 풀리지 않는 문제들 챌린지의 모든 것들이 내 멘탈을 집중 공략한 것만 같았다. 자괴감도 많이 느꼈던 것 같다.
하지만 니체가 말했듯 나를 죽이지 못하는 것은 나를 더 강하게 만든다고, 다른 사람들도 하는데 내가 왜 못하겠어? 하는 마음으로 하다보니 정말 얻는게 많았다.
물론 그렇다고 일찍 문제를 푼건 아니다. 매일 4시간 이상 자지는 못했다^^,,,
아무튼 챌린지에서 내가 성장한 부분, 개선이 더 필요한 부분 등을 말해보려 한다.
코드 리뷰를 통한 독해력 증진과 코드 개선
과정 내내 항상 다른 사람의 코드를 보면서 코드 독해력이 크게 늘었다. 예전만 하더라도 프로젝트에서 남의 코드를 리뷰할 때 괜히 조금 읽다가 로직에 문제만 없겠다 싶으면 무지성 LGTM을 남발했었다.

항상 주변에서 같이 프로젝트 했던 사람들은 코드리뷰에서 코드 자체를 읽지 않았던지라, 어찌보면 나도 거기에 무의식적으로 그 사람들도 안하니까~하면서 미뤄놨었는데 이번 챌린지 과정에서 코드를 보는 눈을 좀 더 길러 이제는 다른 사람이 쓴 코드 또한 어떻게든 읽어내는 습관을 잡았다.
이와 동시에 계속해서 ‘이 코드에서 더 발전할 부분이 있는가?‘에 대해서도 계속해서 자문하면서 코드를 리뷰하려고 노력했던 것 같다. 예를 들어보자면,
- 불필요하게 반복되는 로직을 줄이기 위해 함수를 분리했는가?
- 함수가 여러 기능을 담당하는 것이 아닌, 하나의 기능만을 담당하여 처리하는가?
- 예외 처리에서 생각할 수 있는 것을 다 찾았는가?
- 에러에 대한 핸들링을 모든 경우에서 원할히 동작하도록 로직이 되어있는가?
- 함수의 길이가 지나치게 길지 않은가?
- 누군가에게 이 코드를 보여줬을 때, 이해하기 쉽도록 작성되었는가?
- 테스트코드를 작성하고, 코드의 정상 작동을 다양한 상황에서 검증했는가? 등등…을 많이 신경쓰면서 코드를 보다보니 나도 모르게 해당 코드를 비판적인 시선으로 바라보며 리뷰를 했던 것 같다.
하지만 이 비판적인 시선이 부정적인 것만은 아니라고 생각한다. 이 비판점을 통해서 나 또한 다른 캠퍼들에게 내가 개선이 필요한 부분에 대해 이야기를 들었었고, 나도 다른 캠퍼들의 코드를 보면서 조금 더 발전할 수 있도록 조언을 아끼지 않았다. 결과적으로는 모두가 발전한 긍정적인 피드백이라고 생각한다.
처음에는 이렇게 개선이 필요한 부분을 직설적으로 말하는 것이 그 사람에게 상처를 주지 않을까 생각했었는데, 내가 직접 피드백을 듣고난 뒤에는 내가 정말 무의식적으로 코드를 썼을 때 보이는 안 좋은 습관들을 제삼자의 입을 통해 들어 처음으로 알게 됐다. 이를 통해 내가 코드를 쓰는 방식이나 이런저런 조언들을 통해 크게 발전할 수 있었고, 아 이게 정말 동료와 함께 하는 프로그래밍이구나 깨달았다.
boy scout rule이라는 코드 리뷰에 추천하는 룰이 있다고 한다.
항상 당신이 발견한 코드보다 더 나은 코드를 작성할 것
이러한 룰처럼, 코드 리뷰는 이전보다 더 나은 코드가 되기 위한 과정으로, 서로가 서로의 발전을 위해서 보다 객관적으로 봐주고 내가 아는 지식 선에서 보다 나은 개선방안을 찾아 공유하는 것이 얼마나 중요한 과정임을 몸소 깨달을 수 있었다. 이렇게 하다보니 왜 그렇게 개발자 커뮤니티가 커졌는지 알 것만 같다. 마치 서로의 코드를 자신의 코드 보듯이 해주어 마음도 따숩고 나의 발전을 진심으로 원하는 마음으로 해준 리뷰가 하나하나 소중해서 이렇게 받은 리뷰들을 계속 기억하고 활용하기 위해 다시금 로직을 생각하다보니 자연스럽게 발전했던 것 같다.
효과적인 학습방법을 통한 학습
Don’t Dissect the Frog, Build it - Nicholas Negroponte
이번 챌린지를 하면서 가장 크게 깨달았던 효과적인 학습방법이었다. 무언가를 이해할 때는, 그 대상에 대해 하나하나 학습해가는 것 또한 중요하지만, 이를 직접 만들어나가는 것이 제일 중요하다고 생각한다.
비단 똑같이 만들어내는 것이 아니더라도 학습하고자 하는 대상에 대한 학습은 필수요건이며, 이렇게 쌓아올린 지식을 기반으로 내가 직접 로직을 생각해서 구현해나가는 학습 방식이 정말 효과가 좋았다고 생각한다.
내가 이제까지 했던 프로그래밍 학습 방식은 보다 효과적인 학습방식이 아니었다고 생각한다. 앞에서도 말했듯 책을 보면서 학습하거나 강의의 코드를 따라 치는 학습 또한 좋지만, 이는 기본적인 베이스이다. 정말 직접 어떤 개념에 대해 이해하고 내 머리의 장기저장소로 이전시키기 위해서는 이러한 쌓아올린 베이스를 가지고 직접 활용해보면서 계속해서 머릿속에서 이해하는 것이 중요함을 느꼈다. 이제까지 학습 방식에 대해 계속해서 의문을 가지고 있던 나에게 있어서는 정말 중요한 부분을 익힌 것 같다. 한 단계 발전된 학습 방식은 보다 앞으로의 내 학습에 있어서 긍정적인 영향을 끼칠 것이라 생각한다.
문제를 읽고, 설계하기
이 또한 프로젝트나 알고리즘 등 어떠한 문제를 해결함에 있어서 내가 사용했던 방식이 너무나도 구렸다(?)는 점을 깨닫고 개선하게 된 점 중 하나였다.
나는 문제를 원래부터 잘 읽지 않았다. 이 문제가 나에게 무엇을 원하는지 분석하는 것이 문제가 아닌, 내가 이 문제를 푸는 것이 내 문제해결의 중점이 되었다. 그러다보니 다른 문제에서도 빼먹은 조건 또한 많으며, 문제를 잘못 읽어 학교 시험에서는 수두룩 점수가 깎여나갔던 적도 부지기수였지만 이를 제대로 고치지 못했다. 아니, 고치지 않았다고 표현하는 것이 맞다. 애초에 고칠 생각을 크게 하지 않았다.
마치 이렇게 문제 파악도 안하고 문제를 푸는 사람 같달까..
아무튼 이런 고질적인 문제도 이번 기회에 제대로 인식하고 고쳐나가려고 했던 것 같다. 챌린지를 시작하고 나서 다른 알고리즘 문제를 풀더라도 이제는 설계부터 어떻게 해야 하는지 생각하고 이를 코드로 옮기면 어떻게 해야할 지를 생각하면서 기초를 잡아나가고, 이를 계속해서 애자일하게 고쳐 나가는 방식으로 문제에 접근했다.
예상보다 기초가 있는 문제와 없는 문제를 해결해나가는 과정은 정말 차이가 많았다. 기초가 없을 때는 문제를 하나씩 읽어가면서 계속해서 설계를 변경해나가야 했으며, 이에 따른 시간 지연이 정말 컸다. 그러다보니 이제까지 내가 알고리즘 문제를 풀 때 걸리는 시간도 오래 걸렸다고 생각했다. 이런 내 나쁜 습관들을 인지하고, 반성하며 개선하려 노력해나갔다. 이는 챌린지 과정이 끝나더라도 계속해서 인지하고 고쳐나가야 할 습관이라고 생각한다.
테스트의 중요성
테스트는 프론트엔드, 백엔드 모두에게 중요하다. 테스트를 세부적으로 진행하면 할수록 코드의 완성도는 높아지고, 프로젝트와 같은 경우에도 어디에서, 프론트와 백 어디에서 문제가 있는지를 보다 잘 파악할 수 있는 필수적인 요소이다. 회사에도 QA가 따로 있는 이유가 있다.
하지만 그럼에도 불구하고 이제까지 내 테스트는 허접하기 그지 없었다. 잘 작동되기만 하면 된다 라는 일념 하에 작성한 내 코드는 아직까지 어떤 에러가 터질지 모르는 위험성을 가지고 현재 프로젝트가 돌아가고 있다. 지금보면 참 무모한 짓이었다. 약간 주변에 떠도는 개발자 밈을 가지고 나도 그렇게 해도 괜찮을 것 같다는 안일하고 단편적인 생각이었다.

코드의 복잡성이 높아질 수록 내 자신 또한 테스트 자체가 필요함을 많이 느꼈다. 직접 필요성을 느끼고 시작하는 것이야말로 효과적인 습관들이기가 아닌가 싶다. 처음으로 콘솔로 하나하나 찍어가는 것이 아닌 Jest를 사용하여 테스트를 체계적으로 실시하기 시작하면서 앞으로도 테스트 코드를 활용하여 코드를 작성하는 버릇을 들일 예정이다.
수료, 그 후..
챌린지를 수료하더라도 할 것이 줄어든게 아니라 더 늘어났다. CS도 그렇고 자바스크립트도 그렇고 새롭게 배우고 싶은 것들도 너무 많아졌고 이러한 학습법이나 내가 익힌 것들을 보다 나에게 반복숙달시켜 나의 일부로 받아들일 수 있도록 많은 계획을 생각중이다.
아무튼 챌린지를 하면서 삐그덕거렸던 순간도 정말 많았지만, 결과적으로는 나름 열심히 내가 할 수 있는 최선을 다해 문제를 해결해나갔고, 항상 이름대로 챌린지한 문제들을 결국은 해내는 나를 보면서 나름의 내 가능성(?)을 보았다. 앞으로도 이런 불가능해보이는 문제에 대해서 끊임없이 도전하고 해낼 것이라 나를 믿는다.
마치 프로그래밍계의 신형만이 된 기분이랄까.
내 나름대로 잘 해냈고 앞으로도 노력하면 무엇이든 될 것 같다.
수료생 중 한 분이 해주신 말이 기억에 남는다.
중요한 것은 꺾여도 그냥 하는 마음
나 또한 이를 마음에 새기고 앞으로도 열심히 개발해나갈 것이다!
