개발자는 공부해야 한다.

“개발자는 공부해야한다.”라는 말을 부정하는 개발자는 그리 많지 않으리라 생각합니다. 하지만 “무엇을” 공부해야 하는지, “어떻게” 공부해야 하는지에 대해서는 별로 이야기가 없는 것 같습니다. 그렇기에 사람들은 “어려운 걸 배워야 유용하지”라고 쉽게 착각하는 것 같습니다.

이 글의 결론은 간단합니다. 어려움 중독에서 벗어나세요.

프로그래머의 공부.

사례를 하나 상상해보겠습니다. 컴공과 1학년생이 프로그래밍을 배우고 싶다고, 어떤 것부터 해야 하는지 질문합니다. 그럼 여러 답변이 나옵니다. 그리고 그 중엔 “C언어를 배워서 기초를 쌓으세요” 같은 말이 반드시 섞입니다. C를 배우면 메모리, 배열, 포인터 등의 개념을 low level에서 익힐 수 있어서 좋다는 이야기죠.

또 다른 사례입니다. 취직을 준비 중인 프로그래머입니다. 자신이 할 줄 아는 건 너무 경쟁력이 없다고 생각하여 다른 기술을 익혀보고 싶다고 합니다. 그래서 “취직준비 중인데 뭐 공부하는 게 좋을까요?” 같은 막연하고 설명도 모호한 질문을 올립니다. 이것에도 여러 답변이 나옵니다. 그리고 그 중엔 “알고리즘 공부를 해보세요” 라던가 “머신러닝이 요즘 핫해요” 같은 답변이 달립니다. 물론 저 답변들에도 이유는 있습니다. 알고리즘 공부의 경우 기본기를 늘려주고, 입사 면접에 도움이 된다고들 하죠. 실제로 머신러닝의 경우 할 줄 아는 경우 개발자로서의 몸값이 확 오릅니다.

하지만 저는 저런 추천, 그리고 저런 추천에 대해서 별다른 고민 없이 호응하는 분들에게 이렇게 말하고 싶습니다. 그러지 마세요.

공부.

제가 말리는 이유에는 이유가 있습니다. 이야기에 앞서 우선 공부라는 작업의 속성을 살펴봅시다.

  1. 공부는 시간을 투자하여 성취도와 만족도를 얻는 작업이다.
  2. 시간과 성취도, 시간과 만족도, 성취도와 만족도는 서로 비례하지 않는다.
  3. 만족도가 낮으면 공부를 지속할 욕구가 사라진다.
  4. 성취도가 낮으면 실제 학습 효과는 낮고 시간만 버린 셈이다.
  5. 같은 분량을 습득할 수 있다면 더 적은 시간을 쓰는 편이 좋다. (남는 시간에 복습이나 심화학습이 가능하므로)
  6. 공부한 지식은 자신의 양분이 되어야 한다.

이 세상에 의미 없는 공부는 없습니다. 아는 것에 곧 힘, 지식은 어떤 형태로건 자신에게 유익함을 주곤 합니다. 하지만 공부는 시간을 들여서 하는 작업입니다. 돈으로 시간을 살 수 있을 만큼 부유한 일부의 사람들을 제외하고는 모두가 늘 시간에 쫓깁니다. 그리고 공부의 성취도나 만족도, 효율성은 공부법에 따라 극명하게 갈립니다. 그래서 저는 같은 시간을 쓰더라도 보다 유익한 공부시간을 가지고 싶다고 생각합니다.

성취도 높게 공부하기.

시간을 들여 높은 만족감을 느낄 정도로 공부를 했는데 막상 성취도가 낮다면 너무나 큰 손해입니다. 공부한다는 행위는 곧 자신을 능력을 향상하기 위함인데 실질적으로 공부를 한 것이 도움이 안 되었다면 그냥 머리만 아픈 시간을 보낸 것이죠. 그러므로 우리는 성취도 높은 공부를 해야 합니다.

그럼, 어떻게 공부해야 성취도가 높을까요? 저는 교육학자도, 인지과학자도 아니므로 과학적인 설명은 할 수 없지만, 모두가 경험적으로 알고 있을법한 두 가지 방법을 소개해드리려 합니다.

  • 가장 좋은 것은 재밌게 배우는 것이다
  • 만약 즐겁게 할 수 없다면 자신에게 우선적으로 필요한 것을, 가능한 한 쉽게 배워라

초심자가 C언어로 프로그래밍 입문하기를 예로 이야기해 보겠습니다. 프로그래밍 입문자에게 가장 중요한 학습 요소는 프로그래밍적 사고력 기르기라고 생각합니다. 하지만 프로그래밍의 개념을 처음 접하는 사람에게 메모리나 포인터 같은 개념은 고난도의 학습 내용입니다. 당연히 재미도 없고, 입문자가 필요성에 공감하기도 힘듭니다. 난이도가 올라가 버리면 공부를 하려던 사람이 질려서 포기하는 경우가 매우 많아지고, 설령 공부해도 고난도의 학습 내용을 온전히 자신의 것으로 만들어 이용할 수 있는지는 별개의 문제입니다.

공부가 필요한 부분에 대해 구체적으로 고민해보지 않고 알고리즘이나 머신러닝을 배우는 것 또한 그러합니다. 알고리즘이나 머신러닝 등의 “멋있는” 주제들은 대체로 첫술에 배부를 수 없는 분야입니다. 많은 시간과 열정을 쏟아야 하며, 깊은 이해도가 있어야 비로소 값어치가 나오는 주제들입니다. 어려운 주제들이므로 공부를 시작해서 초반의 내용을 이해하는 데 성공하면 그로 인한 자신감 상승으로 인한 만족도가 상당히 높습니다. 하지만 난도가 올라가는 속도가 가파르게 변하면 만족도만으로는 공부를 지속할 수 없게 되어 포기하는 사람 또한 많습니다. 첫 단원만 너덜너덜한 수학 문제지 같은 상황이 되는 것입니다.

초심자가 C언어 배우기, 필요성 인식 없이 어려운 개념 익히기 같은 학습으로 어려운 주제를 공부한 뒤로 자신감을 얻는 사람들도 있습니다. 이런 현상은 주로 “어려운 책 한 권 떼기” 같은 공부법에서 흔히 나타납니다. 물론 공부를 통해 자신감을 얻는 것은 매우 좋은 현상입니다. 하지만 잘못하면 자신감의 영역을 지나쳐 오만함에 빠져 공부를 멈추기 쉽습니다. 자신은 이 영역에 대한 공부를 “마스터” 했으므로 더 이상의 학습이 필요 없다고 생각해버리는 것이죠. 이런걸 더닝 크루거 효과라고 합니다. 자신을 성장시키기 위해서 한 공부의 결과로 착각의 늪에 빠져 자신은 이미 해당 분야를 완전히 습득했다고 착각하면 추가적인 성장은 기대하기 힘들 것입니다. 공부로 자신을 이롭게 하는 것이 목적이라면 이런 전략은 위험하겠죠.

물론 위에 언급한 두 사례에도 예외는 존재합니다. 공부를 하다 보면 즐거움이나 필요성을 새롭게 느끼는 경우도 있습니다. 하지만 그런 행운이 언제나 일어난다는 보장이 없으므로 나 자신을 위해서 가급적 재밌게, 가급적 필요한 것을, 가급적 쉽게 배워야 합니다.

재밌게 배우기.

매사를 행함에 있어서 가장 좋은 연료는 즐거움이라고 생각합니다. 남들은 모두 손사래를 치는 수학 공부도, 수학의 재미를 아는 사람에겐 즐거운 여행입니다. 그렇기에 재밌는 공부를 하는 것이 가장 중요하다고 생각합니다. 하지만 어느 공부를 하는 것이 자신에게 즐거움을 주는 요소 인지는 사람마다 다릅니다. 결국 여러 가지 분야를 직접 경험해보는 수밖에 없습니다.

가급적 쉽게 배우기.

우리는 누구나 어릴 적 1+1 == 2 를 배웁니다. 하지만 처음부터 숫자를 바로 쓰진 않습니다. 사과 같은 그림을 통해 더 쉽게 접근하면서 배웠을 것입니다. 어렵게 배우면 좋다는 분들이 어릴 적 덧셈을 배우면서 정수론 서적을 보진 않으셨을 것 아닙니까.

뭘 배우건 일단 가급적 쉽게 배워야 합니다. 점점 더 어려운 요소를 배우게 될지라도, 기초가 배신하진 않는다고 생각합니다.

필요한 것을 배우기.

하지만 이 세상 공부는 아무리 쉽게 해도 어려운 요소가 있습니다. 그리고 보통 어려운 공부를 하려고 하면 의욕이 바닥으로 추락합니다. 이런 상황에서 자신을 끌고 가줄 수 있는 것은 두 가지인데, 하나는 재미고 또 하나는 간절함으로부터 오는 필요입니다. 이미 재미를 느끼고 있는 시점이라면 어려운 공부라고 해도 거부감을 느끼지 않습니다. 하지만 아직 재미를 느끼지 못한 사항이라면 하다못해 필요한 것을 배워야 합니다.

예를 들어보겠습니다. 고등학교 수학에는 미적분이 있습니다. 그리고 상당히 많은 사람이 “미적분을 배워서 어디다 씁니까? 장 보러 갈 때 미적분 안 하잖아요?”라고 하죠. 미적분은 재미도 못 느끼고, 실용성도 못 느끼기에 하는 말이죠. 그런 상태로 미적분을 하려고 해봐야 수포자가 될 뿐입니다.

재미를 느끼지 못한다면 하다못해 자신에게 간절한 걸 배워야 합니다. 그러려면 자신에게 무엇이 가장 필요한지 꾸준히 생각해야겠죠.

글쓴이의 경험담.

제 개인 프로젝트인 Yui는 Python 3의 신기능인 asyncio와 coroutine으로 개발된 Slack용 채팅봇입니다.

필요 인식.

일단 Yui는 제게 있어서 상당히 간절한 요소였습니다. IRC로 채팅하던 시절에 사용하던 편의기능을 Slack으로 사용하지 못하는 상황이 되자 불편함이 속출했거든요.

쉽게 만들기.

하지만 채팅과 연계되는 봇코드는 동시에 여러 명령을 보내도 마비되지 않게 하려면 비동기적 연산을 할 수 있어야 했습니다. 사람들은 asyncio를 추천했지만 저는 asyncio를 하나도 몰랐습니다. 그래서 처음엔 비동기적 연산을 포기하고 쉽게 requests 기반으로 기반 코드를 작성했습니다. 이 작업을 위해 여러가지 코드를 찾아보았고, Slack의 Real-Time-Message API의 사용법을 간략히 익히고 나니 다른 분들이 asyncio로 작성한 샘플코드도 비교해가며 읽을 수 있게 되었습니다.

재미 느끼기.

이렇게 필요한 것을 쉬운 부분부터 차근차근 익혀나가면서 Yui의 기반이 잡혔습니다. 처음에는 제가 쓰려고 한 기능들을 자기 스스로 만족할 정도로 사용하기 위해 만든 봇이었지만 점차 다른 분들도 사용해주시기 시작했습니다. 다른 사용자분들의 요구를 듣고, 그것을 어떻게 하면 만들 수 있을지 고민하고, 그것을 실제로 만드는 사이클을 돌다 보니 자연스레 즐거움을 느끼게 되었습니다. 그 결과 현재 Yui는 4곳의 슬랙 커뮤니티에서 활약하고 있습니다.

마치며.

어려움 중독, 어려움 강박으로 고통받는 것은 괴롭습니다. 공부하고 싶다면 필요한 것에 대해 공부를 하는 것이 유리하고, 그것이 어렵다면 아는 것을 이용해서 조금이라도 더 쉽게 배워야 합니다. 기왕 해야 한다면 보다 유익하고 지속 가능한 공부가 좋지 않겠는가 하고 저는 생각합니다. 그러다 보면 언젠가 즐거운 공부를 만날 수 있지 않을까 하는 바람도 있고요.

같이 보기.