빨리 가는 유일한 방법은 제대로 가는 것이다

지난 달에 적은 “학습의 본질, 내 학습방법”에서 보면 알 수 있듯이 나는 계속해서 내 학습 방법을 찾아 헤매고 있다. 이 시점에서 나는 프로젝트 기반으로 학습을 하는 방법을 모색했었다. 그리고 실제로 한달 가까이 해당 방법으로 학습을 진행했고, 9월이 마무리 되어가는 이 시점에 스스로에 대한 피드백을 적어보려 한다.

img
학습 방법을 연구하는 모습

💥 앨리스의 토끼굴

현재 학기에 듣는 강의들은 별도로 집중해서 듣고, 나는 이전에 했던 “체스 게임” 프로젝트를 목표로 학습을 하려 했다.

해당 프로젝트를 진행하려는 이유는 객체지향을 더 연습하기 위해서였고, 객체지향을 알아보면서 자연스럽게 함수형 프로그래밍도 궁금해져서 함수형 프로그래밍에 관련된 강의를 보게 되었다.

함수형 프로그래밍 특성상 타입이 중요했기 때문에 Typescript를 중점적으로 강의가 진행되었다.

그에 따라 Typescript관련 강의도 수강하게 되었고, Typescript 초기 세팅 상황에서 babel과 같은 트랜스파일러에 대해서 궁금하게 되었다.

그렇게 나는 babel에 대해서 알려했고, 그것의 맥락을 알아보다가 모르는게 너무 많은 것 같아 fastcampus에서 프론트엔드 초격차 패키지라는 걸 순서대로 수강하며 요약하는 데 많은 시간을 보냈고, 그렇게 현재 프로젝트에서 개발은 제대로 시작조차 못한 상태이다.

img
끝도 없는 기술의 늪에 빠지는 중

나처럼 어떤 개념을 이해하기 위해 파고들수록 또 다른 개념을 이해할 필요가 생겨 처음 의도한 학습 방향과 멀어지는 이 현상을 앨리스의 토끼굴이라 부른다고 한다.

매일 책이나 강의를 요약하기 이전에 ‘내가 이걸 배우려고 하는 이유는 프로젝트에서 써먹기 위함이다’하고 상기시키며 진행을 했지만, 배우고자 하는 것과 멀어지게 되니 이게 뭘 위한건지 막연해지고 뇌가 ‘이 학습은 책 전부를 요약하기 위해서 학습하는 것’이라고 받아들여 버려서 결국에는 지루함을 느끼게 되는 것 같았다.


✅ 목표를 정확하게 하기, 작은 문제를 만들어서 해결하기

프로젝트를 시작할 당시에는 “객체지향적으로 코드를 작성하는 역량을 늘리기 위해서”라는 이유가 있었다.

객체지향적 사고 방식 역량을 늘린다는 목표를 명확하게 하고, 함수형 프로그래밍이나 타입스크립트, babel과 같은 것들은 간단한 개념만 인지한 상태에서 기술의 부채로 쌓아두고 진행했어야 했다.

그리고 겪어봤듯이 객체지향적으로 코드를 잘 작성하는 게 목표인데, 코드 한 줄 작성없이 책만 읽거나 강의만 듣는다고 해서 의미가 없다.

최소한의 작은 문제를 만들어서 그 문제를 해결해 나가는 방법으로 학습하게 된다면, 내가 목표로 하는 것에 더 가까워 질 수 있을 것이고, 뇌도 성취감을 느낄 수 있을 것이다.


💥 익숙하지 않은 프로젝트 기반 학습

프로젝트를 통해 학습하는 방식이 더 효과가 있고, 많은 개발자들이 추천하는 방법인 걸 알면서도 나는 그게 익숙하지 않아서 굉장히 많이 헤매는 것 같다. 그동안 내가 학습해온 방식을 되돌아보면 이렇다.

초, 중, 고) 이 시기에는 다들 각자만의 이유를 찾으며 공부를 한다. 내가 공부를 했던 이유는 시간이 지났을 때 이 순간에 열심히 하지 않았던 것에 대해 후회하지 않기 위해서였고, 그걸 확인할 수 있는 증거는 시험 성적이라고 생각을 했다. 그렇게 내 학습은 시험 문제를 더 잘 맞추기 위한 공부가 되었다.

대학교 1, 2학년) 대학교에 와서도 자연스럽게 교수님께서 내실 문제를 더 맞추기 위한 공부를 하게 되었다. 이 때 컴퓨터공학과로 전과했고, 컴퓨터 공학 기본 이론과 수학이나 물리같은 교양을 들어서 이렇게 공부하는게 당연하다고 생각했던 것 같다.

대학교 3학년) 군대에 다녀오고 이 때가 가장 많이 헤매던 시기였다. 개발 동아리에 들어가 실제로 웹 사이트를 제작해보며 ‘아 이렇게 공부했어야 했구나’ 생각하게 됐다. 이때 한창 무언가 만드는 것에 빠져서 클론코딩 강의를 통해 레시피 식으로 빠르게 기술을 늘려나가려 했다.

지금) 프로젝트 기반 학습은 내가 발전하고 싶은 무언가를 찾아 의도적인 연습을 통해 해당 역량을 키워야한다는 걸 알았지만, 무의식 중에 순서대로 책을 읽거나 강의를 듣는 것을 목표로 하고 있고, 자꾸 그게 필요하게만 느껴진다. 가장 큰 이유는 자료구조, 알고리즘, OS, 네트워크.. 이런 중요한 과목들은 각 개념들에 있는 체계적인 흐름을 인지 정도는 할 수 있게끔 하는 게 분명히 중요하다고 생각을 하기 때문이다.

뭔가 감을 잡은 것 같다가도 매번 이렇게 헤매는 이유는 실무의 중요성을 경험하고, 이론의 중요성 또한 느꼈기 때문인 것 같다. ‘실무 중점’으로 학습을 진행을 하다가 이론을 놓쳐버리게 돼서 ‘이론 중점’으로 진행하면 실무를 놓쳐버리게 되는 굴레를 벗어나기가 힘들다.


✅ 이론 vs 실제, 유연하게 학습하기

내 고민에 대해 검색해보니 실제가 먼저 생겨나 처음에는 급속히 발전하고, 이론은 실제가 어느 정도 체계를 갖춘 후에 나오게 되며, 이 역시 급속히 발전하다가 어느 시점에서 이론이 실제를 앞지른다는 것을 알게 되었다. 마치 내가 대학교 3학년 때 실무를 경험하고 빠르게 늘었다가 이론의 필요성을 알게된 것처럼 말이다.

img
이론 vs 실무

이 그래프는 두가지를 나타낸다고 한다.

  1. 분야의 초기 단계에서는 실제를 관찰하여 이론을 정립하는 방법이 가장 효율적이다. (이론이 실제로부터 배우지 못함)
  2. 이론이 실제를 추월하는 시점, 즉 실제가 이론에 귀를 기울여야 하는 시점이 있다. (실제가 이론으로부터 배우지 못함)

위의 그래프에서 이론과 실제가 여러 차례에 걸쳐 앞서거니 뒤서거니 꼬인 모습으로 발전하는 그림이어야 더 정확할 것이다.

그래서 내가 내린 결론은 각 분야마다 내 판단에 맡겨 진행해야 한다는 것이다. 현재 내가 판단하기에 OS, 네트워크, 리액트, JS처럼 목표가 “기술에 대한 이해”를 위한 것이라면 이론을 우선적으로 하여 알게된 것들로 실습을 진행하고, 객체지향 프로그래밍, 리팩터링, TDD처럼 목표가 “사고방식 및 패턴에 대한 이해”를 위한 것이라면 먼저 문제를 만들어서 이를 해결해가는 방식으로 이론을 배워나가는 방식을 적용해야 한다는 생각이다.


🤔 결론

오늘 피드백을 통해 내가 내린 결론은 다음과 같다.

  • 프로젝트 진행 방식 1. 프로젝트의 목표를 명확하게 하고 나머지 것들은 기술의 부채로 쌓아두고 진행하기 2. 작은 문제를 만들어서 그 문제를 해결해나가기
  • 프로젝트 진행 중 학습 순서 1. 목표가 “기술에 대한 이해”를 위한 것이라면 이론 우선 2. 목표가 “사고방식 및 패턴에 대한 이해”를 위한 것이라면 실습 우선
img
모던 자바스크립트 Deep Dive: 기본 개념 & 동작 원리 기반 학습
문득 책에서 봤던 이 그림이 떠올랐다. 더 좋은 소프트웨어를 만들기 위해 프로젝트가 진행이 되고, 그 프로젝트를 위해 코딩 구현 능력(코딩 스킬)을 향상시켜 나가야 하며 이를 위해 기본 개념과 동작 원리를 잘 이해해야 한다. "개념과 원리를 이해하는 것" 자체가 목표가 아니라는 걸 계속 상기시키자.

학습을 하는 데 있어 빨리가는 지름길은 없지만 제대로 가는 방법은 분명히 존재한다.