프로그래밍 입문자를 위한 몇 가지 조언

2014년 11월 4일부터 패스트캠퍼스에서 웹 서비스 개발을 주제로 강의하여 얼마 전에 네 번째 기수를 마쳤다. Python과 Django를 이용해 웹 서비스 개발 공정을 겪는 것이 커리큘럼 주제인데, 1기에 대한 이야기는 Python과 Django 강의라는 글로 작성했다. 이번 글에선 어떻게 Python과 Django를 공부하면 좋을 지 1년 간 강의하며 고민했고 몇 가지 원리에 대해서는 정리되어 공유해 본다. 내가 강의한 주제가 Python과 Django, 그리고 웹 프로그래밍이어서 그렇지, 프로그래밍에 대한 공부 방법이라고 해도 무방하다고 생각한다.

강의 개요

  • 이름 : 웹 서비스 개발 캠프
  • 주제
    • Python과 Django를 강사의 경험을 담아 심도있게 다룬다.
    • 웹 서비스를 개발하는 공정을 Back-end 중심으로 경험하며 웹 프로그램을 개발하여 배치(deployment)한다.
  • 수강 대상자
    • 다른 언어나 프레임워크를 써봤고, Django에 입문하려는 사람
    • Python이나 웹 프로그래밍 중급 과정에 진입하려는 사람
  • 강의 시간
    • 1기 : 90시간
    • 2기 : 64시간
    • 3기 : 48시간
    • 4기 : 40시간

손으로 반복, 반복, 그리고 또 반복

뭔가 만들려 하면 막막해서 시작을 떼지 못하겠다는 입문자가 무척 많다.

책을 보거나 강의를 듣는 중엔 다 안다. 물어보면 대답도 한다. 근데 막상 코드를 짜라고 하면 힘겨워한다. 질문하며 코드 흐름을 자연스레 유도하면 대답은 하는데, 그 대답을 코드로 옮기질 못하기도 한다. 커리큘럼 초반엔 잘 따라오는데, 중반에 접어들어 학습하는 주제와 범위가 늘면 눈에 띄게 힘들고 어려워 하는 경우도 있다.

그에 반해 빈 파일에 코드를 채워넣는 걸 주저하지 않는 사람도 있다. 원래 다른 분야에서 프로그래밍을 했거나 다른 언어로 웹 프로그래밍을 한 사람이야 그렇다 쳐도, 사실상 입문자여서 이 강의를 듣기엔 다소 무리하는 수강자인데도 곧잘 코드를 작성한다. 입문자여서 프로그래밍이나 Python, Django에 대한 지식과 경험이 부족하여 이론을 설명하면 이해는 못하는데 코드는 어쨌든 작성해 간다. 심지어 자신이 무슨 코드를 짰는지 이해하지 못하면서도 말이다.

이런 차이는 반복량에 있다. 눈으로는 코드와 이론을 알지만, 손은 모른다. 프로그래밍 언어도 언어의 한 종류이다. 아무리 영어 단어나 문법을 외워도 말을 하지 않고 글을 쓰지 않으면 표현하기 어렵다. 마찬가지로 눈으로 이론을 공부하고 코드를 읽어도 손으로 코드를 짜지 않으면 코딩은 되지 않는다.

시시하고 아는 코드라도 직접 손으로 쳐야 한다. 한 번 쳐보고 넘어가지 말고, 다양하게 응용하며 여러 번 쳐봐야 한다. 손에도 코드를 새겨야 한다. 코드를 손에 새기는 가장 쉽고 좋은 방법은 딱 세 개이다. 반복, 반복, 그리고 또 반복하는 것이다.

복습

학습한 건 가능한 빨리 복습해야 학습 효과가 크다.

  • 우선 배운 걸 그대로 따라하는 복습을,
  • 시간이 있다면 응용하는 복습을

하는 게 좋다. 나는 첫 번째 복습 방법을 교재에 반영하여 수강자가 수업 내용을 떠올리도록 유도한다. 큰 주제 별로 교재를 구성하되, 작은 주제는 강의 흐름에 맞추어 배치하여 스토리텔링을 하려 한다. 중요한 내용은 몇 번 반복 등장하고, 가끔 다른 주제가 먼저 등장하기도 하는데 교재를 한 장 한 장 읽어 나가도록 구성하여 교재를 그대로 따라 복습하면 강의를 떠올리도록 한 것이다.

두 번째 복습 방법은 과제를 내서 유도한다. 아무리 의지가 가득해도 입문자에게 독학이 어려운 이유 중 하나는 학습한 내용을 응용하여 복습하기 어렵기 때문이다. 과제 풀이를 열심히 한 수강자는 커리큘럼 후반으로 가며 다루는 주제가 다양해 질수록 과제를 푼 효과를 보는데, 새 주제가 등장하더라도 이전 주제와 연계되거나 응용하기 때문이다. 책이나 교육 웹사이트로 학습하는데 실습 문제나 과제가 나오면 꼭 풀기를 권한다.

강의 시간은 기수를 거듭할수록 줄어 들었는데, 수강자가 복습하지 않으면 강의 시간이 아무리 길어도 별 효과가 없었기 때문이다. 실제로 4기는 강의 시간이 1기의 반도 안 됐지만 진도와 강의 주제의 깊이는 별 차이가 없었다.

질문

공부하고 있는 걸 머리에 선명하게 새기는 또 다른 방법은 학습자가 질문하는 것인데, 복습한 사람이 질문을 하는 편이었다. 내 경우는 과제에 함정(?)을 심어 놓는데, 과제를 제출한 사람 중 함정에 대해 질문한 사람 없이 문제를 잘 해결했다면 수강자들이 진도를 잘 따라오고 있다고 판단하여 수업에서 좀 더 깊은 내용을 다루거나 더 많은 양을 다룬다. 함정에 빠진 피해자는 질문을 하게 되는데, 함정에 빠진데다 질문을 하여 답변을 받기 때문에 기억에 남을 가능성이 높다고 본다.

독학할 때엔 이러한 피드백 과정을 겪기 어렵다. 혼자서 웹에서 검색하여 문제를 해결해도 문제의 앞뒤 맥락을 이해하기 보다는 답에 초점을 맞추어 넘어가기 십상이기 때문이다. 나는 문제에 부딪혀서 스스로 해결하지 못하여 웹에서 해결 방법을 찾으면 반드시 따로 갈무리 하여 쌓아놓고, 일정 시간 뒤에 갈무리 한 자료들의 범주를 나누고 복기한다. 갈무리 당시엔 개별 문제이지만, 시간이 흘러 쌓인 문제들을 분류해놓고 보면 각 문제가 서로 연결되어 문제 상황과 맥락을 이해하게 된다.

질문과 답변을 주고 받는 소통은 피드백 과정이기도 하다. 피드백을 받지 못하면 실력은 늘지 않는다.

질문하고 답을 찾자. 질문 하려면 질문할 준비가 돼야 한다. 그 준비란 바로 실습과 복습이다.

함께 공부하기

팀은 1기 때부터 계속 조성하려 애썼다. 1기 때는 강사 입장에선 운좋게도 수강자들이 스스로 팀을 짜서 팀 프로젝트를 수행했었다. 2기 때는 권유를 해봤고, 3기 때는 오리엔테이션 때 아예 팀 조성 시간을 갖고 팀 프로젝트를 정해주었으며 팀장에겐 작은 사례(?)를 하기도 했다. 4기 때는 3기 때와 거의 같으나 수시로 팀 프로젝트를 상기시키며 좀 더 독려했다. 하지만 팀 운영은 잘 안 됐다. 복습과 과제 수행도 버거운데 팀 활동은 더 시간 내기 어려웠다는 수강자가 많았다.

하지만 여전히 팀 조성과 활동을 하도록 관심을 투자할 가치가 있다. 팀은 아니지만 지인과 나란히 앉아 공부하거나 서로 도우며 공부한 수강자는 혼자서 수업에 참여한 수강자에 비해 실패나 난관에 흔들리는 정도가 덜했다. 질문도 왕성하게 하고 붙임성 있게 다른 수강자와 교류하며 수업에 왕성하게 참여하는 수강자는 그 자신이 수업에서 거둬가는 게 많기도 하지만, 다른 수강자에게도 영향을 많이 끼친다. 그런 참여 활동이 당사자 뿐만 아니라 동료 수강자에게 피드백을 주고 받는 과정이기 때문이다.

입문자일 수록 함께 공부할 동료를 구하라고 권하고 싶다.

마치며

재작년에 근거기반훈련 워크샵에 참석해 효과적 훈련의 원리를 배웠다. 막상 내게 제대로 활용하지 않았는데, 1년 여 강의하며 몇 가지 원리는 뚜렷하게 효과를 체험했다. 웹 프로그래밍 입문웹 서비스 개발을 주제로 강의하긴 하지만, 꼭 내 강의가 아니더라도 혼자 공부하거나 지인과 공부하며 활용하면 충분히 효과를 볼 것이라 생각한다.


2016년을 맞이하며 20년 전 판을 생각하다

게임 개발

20년 전에 첫 게임을 만들었다. 내 필명인 한날은 이 게임 이름에서 비롯된 것이다. 어설프고 재미없고 허섭했지만, 내 게임을 만들어 친구들과 내 게임 얘기를 나누었다. 내 고교 시절 생활기록부를 보니 장래 희망이 컴퓨터 프로그래머라 적혀 있었다. 당시엔 게임 개발이라는 직업이 사회에 인식되기 전이라서 편의상 게임 개발자 대신 컴퓨터 프로그래머라 적은 것인데, 20년이 지난 지금은 정말 게임 개발자가 아니라 컴퓨터 프로그래머가 되어 있다.

가끔 언제 다시 게임 업계에 돌아오냐는 안부성 질문을 받곤 한다. 게임 업계에 돌아갈 지 안 갈 지 아직은 모르겠다. 하지만 난 게임을 만들어 왔고, 앞으로도 게임을 만들 것이다.

홈페이지

20년 전에 내 홈페이지를 처음 열었다. 1997년부터는 게임 개발, 프로그래밍 등을 주제로 운영하다 1998년에 도메인을 사서 나 나름대로 브랜드를 만들고 유지하려 했다. 꾸준하진 않지만 완전히 놓지 않고 계속 운영해 온 지난 20년을 스스로 대견하게 여긴다.

나를 표현하는 익숙한 방법이 내 홈페이지 또는 블로그이다. 앞으로도 내 공간에 글을 쓸 것이다.

작더라도 내 판을 만들어야 한다는 생각을 해왔다. 아무리 잘하고 위협스러워도 남의 판에서는 승산이 없다. 판의 주인이 판을 엎고 새 규칙을 짜면 그만이다. 주인이 판 엎지 않게 아양 떨고 비위 맞추고, 규칙을 바꾸면 바꿀 규칙을 예측하며 그 판에 길들여지면 더이상 희망이 없다. 차라리 판의 주인이 한 짓에 삐쳐서 그 판을 떠나는 게 낫다. 내 판을 만들어 사람들이 내 판에 들어오고, 그 판을 키워야 한다. 그래야 내가 바라는 진정한 독립이 이뤄진다.

하지만 난 그동안 준비되지 않았으며 진심으로 독립을 갈망한 것이 아니었을지도 모른다는 생각을 했다. 내 판을 만들어야 한다고 주창했지만 정작 말로만 고민했을 뿐, 실행할만큼 고민하지 않았다. 여전히 남의 판에 기대어 마이너 버전 수준에서 내 몸뚱아리를 업그레이드 하려 아둥바둥거렸다.

앞으로 3~4년 뒤부터는 갈수록 내 판을 만드는 데 들이는 노력이 비싸질 것이라 예상한다. 내 판을 만드는 비용이 비싸질수록 포기할 가능성이 커지고, 포기하는 그때부터 남의 판에서 움직이는 장기말이자 노예가 될 것이다.

20년 전에 막연히 내 판을 만들어야 한다는 생각을 한 것 같다. 능력도 없으면서 게임 만들자며 사람들 꼬셔 게임개발팀을 만들었고, 하루 방문자가 몇 명이더라도 내 홈페이지에 내 글을 남기려 했다. 내 스토리를 갖고 싶었고 만들려 애썼다. 길들여지지 말자. 내 판의 20년 전 원시형을 잊지 말고 포기하지 말자.

그렇게 다짐하며 각오를 세운다.