Child pages
  • 어려운 개념, 복잡한 시스템을 학습하는 방법
Skip to end of metadata
Go to start of metadata

지난 주말 코딩을 지탱하는 기술이라는 책을 읽었다. 이 책을 읽으면서 새로운 지식을 알게 된 것도 정말 즐거운 경험이었지만 가끔씩 등장하는 칼럼이 더 마음에 들었다. 특히 내가 학교에서 학생들을 가르치는 입장이다 보니 새로운 지식을 학습하는 방법에 대해 정리한 칼럼이 좋았다. 내가 학생들에게 이야기하고 싶은 내용도 포함되어 있어 이 글을 통해 공유해 보려 한다.

이빨로 씹다.

큰 고기를 한 입에 먹을 수는 없다. 우선은 입에 넣을 수 있는 크기로 잘라서, 이빨로 씹은 후 삼켜야 한다. '이해'란 것도 같다. 어려운 개념이나 복잡한 시스템, 익숙하지 않은 분야를 한 번에 모두 이해하는 것은 어렵다. 우선은 작은 정보 단위로 잘라서, 하나씩 씹어 자신의 것이 되도록 흡입해야 한다.

그러나 방대한 정보 중에서 무엇을 선택하면 좋을까? 어떤 정보가 중요하고 어떤 정보가 중요하지 않을까? 어떤 정보가 중요한지 판단하기 위해서는 대상을 깊이 이해할 필요가 있다.

지인 중에 전문가가 있다면 그 사람에게 배우는 것도 한 가지 방법이다. 하지만 주위에 그런 사람이 없다면 인터넷을 검색해서 설며을 발견했다고 해도 해당 저자가 정말 전문가인지, 아니면 전문가인 척하는 것인지 어떻게 알 수 있을까?

예를 들어, 저자가 직접 쓴 자료나 소스가 가장 상세하다고 치자. 그러나 '어렵다', '양이 많다', '영어라서 읽을 수 없다'등의 변명으로 다른 사람이 쓴 쉬운 설명을 찾으려고 한다. 그것은 '원래 고기는 너무 크고 먹기가 어려워'라고 하며, 안전한지 확인도 안하고 다른 사람이 만든 다진 고기를 먹는 것과 동일하다.

이해는 간다. 저자도 방대한 정보를 앞에 두고 좌절한 것이 한두 번이 아니다. 그럴 때 사용할 수 있는 3가지 전략이 있다. 그것은 '필요한 부분부터 흡수한다', '대략적인 부분을 잡아서 조금씩 상세화한다', '끝에서부터 차례대로 베껴간다'이다.

저자는 방대한 정보에 접근하기 위해 3가지 전략을 제시하고 있다. 각각의 전략에 대해 구체적으로 살펴보자.

필요한 부분부터 흡수한다

책이나 자료 전체가 동일한 정도로 중요하다고 말할 수 없다. 목적이 명확하고, 목적 달성을 위해서 어디를 읽어야 할지 알고 있다면 다른 페이지는 신경 쓰지 말고 바로 그곳을 읽도록 한다.

전체 모두 읽지 않은 것이 께름칙한가? 하지만 좌절하고 전혀 읽지 않는 것보다는 낫다. '전부 읽지 않으면'이라는 완벽 주의가 배우고자 하는 동기를 짓누르고 있다면, 버려버리는 것이 낫다. 동기는 매우 중요하다.

이 전략을 사용하기 위해서는 읽고 싶은 부분이 어디인지 대략적으로 전체적인 구조를 파악하고 있어야 한다. 만약 그게 어려우면 다음 전략이 '대략적인 부분을 잡아서 조금씩 상세화한다.'를 시험해보도록 하자.

이 전략은 특히 소프트웨어를 개발하는 프로그래머의 입장에서 유용한 전략이다. 소프트웨어를 개발하면서 오픈 소스를 활용하는 경우가 많다. 이 때 사용하고자하는 라이브러리의 모든 기능이 필요한 것은 아니다. 따라서 정말 현 시점에 필요한 부분의 기능만을 익힌 후 적용하고 잊어버리는 경우가 종종 있다. 물론 관심이 있다면 더 깊이 있게 몰입할 수 있겠지만 시간적인 제약 때문에 구체적인 학습은 뒤로 미루고, 필요한 부분만 찾아 바로 적용하게 된다. 하지만 이 같은 접근 방식에 죄책감을 느낄 필요는 없다고 생각한다. 현 시점에 최선의 선택을 한 것이라 생각하고, 이후 시간적인 여력이 있는 시점에 추가적인 학습을 하면 된다. 물론 이 같은 추가적인 학습을 하지 않는 경우가 많아서 아쉬움이 남을 따름이다.

대략적인 부분을 잡아서 조금씩 상세화한다.

책이나 문서에는 목차가 있다. 목차를 보면 전체 구조를 대략적으로 알 수 있다. 그리고 나서 본문을 속독으로 읽어나간다. 자세히 보지 않고 우선은 소제목이나 강조 부분, 그림과 그림 제목 등을 본다.

소스 코드를 읽을 때는 우선 디렉토리 구조와 파일명을 본다. 그리고 파일을 속독으로 읽고 거기서 정의하고 있는 함수나 클래스 이름, 자주 호출되는 함수명 등을 본다.

이 방법들에는 '우선 대략적인 구조를 잡고, 조금씩 상세한 정보로 접근한다'는 공통점이 있다. 이것이 기본 원칙이다.

소스 코드에는 다른 방식의 독해 방법이 있다. 디버거의 과정을 사용해서, 실행되는 순서나 호출 계층으로 읽는 방법이다. 이 경우도 동일하게 우선은 대략적인 처리 흐름을 따라가고, 조금씩 깊이를 더해서 함수 안의 처리를 따라가는 것이 중요하다.

이 방법으로 읽어도 정보가 한쪽 귀로 들어와서 한쪽 귀로 나가버리는 느낌을 받는 경우가 있다면, 마지막 방법인 '끝에서부터 차례대로 베껴간다'를 시도해보자.

나도 자주 사용하는 방법이다. 책 읽다가 너무 어려워 이해되지 않거나 힘들면 일단 대략적인 줄기만 파악하기 위해 가볍게 읽는다. 모르는 부분을 일단 뛰어 넘기도 하면서 말이다. 그리고 다시 읽는다. 다시 읽을 때는 좀 더 자세하게 읽는다. 이런 방식으로 접근할 때 중간에 포기하지 않고 끝까지 읽어 나갈 수 있었던 경험이 많다.

끝에서부터 차례대로 베껴간다.

명확히 '하고 싶은 것', '조사하고 싶은 것'이 없이 '대충 읽으면' 읽은 내용이 뇌를 그냥 스쳐 지나갈 뿐이다. 이런 상태에서 어떻게 배울까를 고민하다고 해도, 판단을 위한 지식 자체가 없기 때문에 무의미하다.

그래서 지식의 밑바탕을 만들기 위해서 교과서를 그대로 베껴 쓴다. 이것이 '베끼기'라 불리는 기술이다. 지식이 없는 상태에서 고민하는 것은 무익하기 때문에 우선 아무것도 생각하지 않고 지식을 복사하는 것이다.

이 이상의 방법은 없다. 저자는 시간을 정해서 '25분간 어디까지 베낄 수 있는지' 도전하는 것을 좋아한다. 분량으로 나누는 것도 좋은 방법이다. 중요한 것은 간격을 적절히 해서 목표를 이루었다는 만족감을 얻을 수 있도록 하는 것이다.

어려운 개념이나 복잡한 시스템, 익숙하지 않은 분야를 학습할 때 가장 경계해야할 점은 처음부터 완벽하게 이해해야겠다는 욕심을 가지는 것이라 생각한다. 이러한 완벽주의가 자신감을 떨어트리고, 학습을 중도에 포기하게 만든다. 처음부터 너무 완벽을 추구하기 보다는 새로운 것을 배우는 것을 즐긴다는 마음으로 접근해 보자. 그런 관점에서 앞에서 제시한 3가지 접근 방식이 정말 유용하다고 본다. 특히 '필요한 부분부터 흡수한다.'와 '대략적인 부분을 잡아서 조금씩 상세화한다'는 반드시 실천해 봤으면 좋겠다.

마지막으로 코딩을 지탱하는 기술 책을 소개하지 않을 수 없다. 앞의 칼럼에서도 느낄 수 있겠지만 이 책은 프로그래밍과 관련한 기본적인 원리를 다루고 있다. 다양한 프로그래밍 언어의 특징을 통해 원리를 파악해 가는 과정이 너무 마음에 든다. 정말 구체적인 내용은 빼고, 우리가 반드시 알아야될 내용들만 다루고 있다. 프로그래밍을 시작하는 프로그래머라면 이 책으로부터 시작하는 것도 괜찮다고 생각한다. 일단 모든 내용이 이해되지 않더라도 프로그래밍 언어가 어떻게, 왜 지금과 같은 모습으로 발전해 왔는지에 대한 전체적인 그림을 그릴 수 있을 것이다.

책을 처음 받았을 때는 책이 왜 이리 얇아라고 느낄 것이다. 하지만 책을 읽고 난 후에는 이 얇은 책에 이리 많은 내용을 담을 수 있다니 정말 대단하다라고 느낄 수 것이다. 앞으로 이와 같은 종류의 책이 더 많아졌으면 좋겠다.