※ 이 글은 이상한모임에서 lemonade(현지환)님과 수다를 떨다가 "이런 내용의 책, 재밌지 않을까?" 라는 이야기가 나와서 쓰기 시작한 글입니다. 시리즈물로 제가 생각한 앞 부분만 살짝 연재해볼 생각입니다. 책으로 내보자는 이야기도 있었는데 제가 실력이 없으므로 안될겁니다. 근데 이 글이 계속 연재될진 알 수 없...



이봐요, 타임머신이라면서 너무 불친절한 것 아닌가요?

네. 불친절 합니다. 고의적으로 불친절을 흘리고 있습니다.

앞서 말했듯 여러분의 선결 과제는 컴퓨터와 친해지는 것입니다. 왜냐하면 프로그램은 컴퓨터 위에서 여러 프로그램과 상호작용을 하면서 돌아갈텐데, 프로그램 하나만 만들 줄 아는 것으로는 문제 상황에 대응할 수 없기 때문입니다.

가령 제가 Python 3.5에 대해 설치법을 처음부터 설명했다고 칩시다. 그런데 어느날 3.5에 문제가 있어서 3.5.1, 혹은 3.6이 나왔다고 하면 어떻게 될까요? 여러분이 쓸 가능성이 있는 모든 운영체제, 모든 버전에 대해 설명하는 글을 쓴다 할지라도 언젠가 그 내용은 쓸모 없는 내용이 됩니다. 운 제 글에서 다루는 방법으로 Python을 설치하고, Python에 대해 익혔다고 치더라도, 다음에 다른 언어를 배울 때는 또 다시 그 책의 설치법을 보고 할 것인가요? 그것은 명백하게 나쁩니다. 못해도 한 번 정도는 혼자서 삽질해볼 가치가 있습니다. 그래야 여러분이 타임머신을 탄 보람이 있게 됩니다.

공부하는 방법을 공부하기

왜 그러한가 하자면, 이 글은 통상적인 프로그래밍 교재와 목표가 다릅니다. 통상적인 프로그래밍 교재는 해당 언어를 익히는 것에 포커스를 맞춥니다. C 교재라고 하면 C를 익히면 될 뿐인 책입니다. 하지만 이 글은 다릅니다. 여러분들에게 가볍게 프로그래밍에 대한 공부 경험을 심어주고, 앞으로 더 많은 것들을 배울 수 있게 워밍업을 시키는 것이 목적입니다. 애초에 프로그래밍이라는 것을 공부하는 방법도 모르는 상태에서 끌어 올리는 것이 본 목적이라고 할 수 있습니다. 즉, 공부하는 방법을 공부하는 것이죠.

제 말이 상당히 허황된 이야기처럼 들릴 수도 있습니다. 많은 사람들이 자세히 설명하기 싫을 때 "고기를 주지 말고 고기 잡는 법을 알려 줘라" 같은 이야기를 하니까요. 보통 그런 이야기는 기분 나쁜 잔소리와 함께 하기 때문에 저 말에 나쁜 인상이 있는 사람도 있을거라 생각합니다. 하지만 실제로 고기를 잡을 줄 아는 사람은 실존하고, 그 사람은 태어나서부터 고기를 잡을 줄 알았던 것이 아닙니다. 고기 잡는 방법은 배울 수 있습니다.

그럼, 프로그래밍을 공부하는 방법은 어떻게 배울까요?

성취감이라는 이름의 마약

공부를 공부한다니, 공부는 재미가 없는데 공부가 될까요? 공부에 대한 경험은 대부분 학교 공부인데, 학교 공부는 왜 재미가 없을까요? 보통 공부는 성취감을 주지 않기 때문입니다. 시험을 보기 위해 하는 공부에서 성취감을 느끼기는 어렵습니다. 하지만 정말 진지하게 프로그래밍과 마주한다면 당신에겐 성취감이라는 마약같은 보상이 기다리고 있습니다.

무언가 프로그램을 만들기 시작해서 막히고 어려운 부분들을 뚫고 완성을 해낸다면 그 시점에서 엄청난 성취감을 느낄 수 있습니다. 우리가 프로그래밍을 공부하기 위해선 무엇보다 성취감이 필요합니다.

하지만 우리는 프로그래밍을 해야하게 되면 불안합니다.1 왜 그럴까요? 익숙하지 않기 때문이기도 하지만, 대부분은 실제로 자신에게 어렵기 때문입니다. 과도하게 어려운 문제는 재미마저 잃게 만듭니다. 우리에겐 적당한 난이도의 문제가 필요합니다.

무엇을 프로그래밍 할 것인가

하지만 문제의 난이도가 적당하다 할지라도 흥미가 생기지 않을 수 있습니다. 자신이 이것을 왜 하는지에 대해 스스로 납득하지 못하면 재미도 없고, 금방 그만두게 됩니다.

아쉽게도 학교나 대부분의 교재에서 다루는 프로그래밍 예제 문제는 보통 재미가 없습니다. 원인은 두 가지 입니다. 첫째로 문제가 해당 문법에 대해 이해했는지를 확인하기 위한 일종의 장치일 뿐이여서 프로그래밍 할 가치 자체가 떨어지고, 둘째로 그 문제를 해결해야하는 당위성을 스스로 느끼지 못하기 때문입니다. 간단히 예를 들어보자면, 이제까지 접해온 문제들은 대부분 "건설에 대해 배워보자"라는 주제에 대해 "삽을 제대로 쓰기 위해 북극에 가서 제설작업을 해보자"을 하는 식이라는 것입니다.

이 문제에서 탈피하기 위해서는 우리는 우리가 진정으로 필요로 하는 프로그래밍을 할 필요가 있습니다. 따라서, 우리는 "무엇을 배워야겠다"라기 보다는 "무엇을 해결해야겠다"라는 의식이 더 필요합니다. 그리고 그런 의식은 대체적으로 누가 준다기 보다는 자기 자신이 알고 있습니다.

예를 들면 이런 겁니다. 자신이 즐겨 듣는 노래 수백곡이 모두 저장되어 있는 폴더가 있습니다. 모두 곡 정보란에 곡에 대한 정보도 적혀 있지만 파일명이 일률적이지 않습니다. 예를 들어 어떤 곡은 윤하 - 비밀번호 486.mp3처럼 되어 있고, 어떤 곡은 좋은날_아이유.mp3 혹은 01. 오늘 헤어졌어요.mp3처럼 되있다던가 하는 식으로 말이죠. 이 상태의 파일명을 통일된 규칙으로 정리하려면 어떻게 해야할까요? 프로그래밍을 모르는 사람이라면 이런 상황에서 수작업으로 정리를 한다거나, 아예 정리하지 않을겁니다. 하지만 프로그래밍을 조금만 하면 모두 일률적으로 정리가 가능할 것입니다.

공부를 하기 위해서는 이런 목표 의식이 중요합니다. 내가 이 언어를 배워서 이것을 처리하겠다는 의식을 가져야 하는 것이죠.2 그리고 그런 의식은 위기지학(爲己之學), 즉 자기 자신을 위해 배울 때 보다 강력해집니다.3 그렇기에 우리는 우리가 필요한 것을 만들기 위해 배울 필요가 있습니다.

의식의 4단계

하지만 문제가 있습니다. 우리는 어떤 문제 상황이 프로그래밍으로 해결 가능한지조차 알지 못합니다. 해결이 가능하다고 해도 어디부터 손을 대야할지 모릅니다. 왜 그럴까요?

저는 이 해답을 앤서니 웰링턴의 의식의 4단계로 설명해보고자 합니다.

대부분의 독자분들은 무의식적무지(Unconscious Not Knowing)과 의식적무지(Conscious Not Knowing)의 경계, 혹은 그 중 한 곳에 있을 것이라고 생각합니다. 간단히 말해서 무엇을 모르는지조차 모르거나, 모르는게 너무 많은 상태죠. 우리가 무의식적지식(Unconscious Knowing)의 경지에 이르기 위해서는 좀 더 많은 지식이 필요합니다.

그래서 저는 먼저는 고기를 잡아드릴 생각입니다. 이 고기도 먹어보고, 저 고기도 먹어보면서 자신이 어떤 것을 좋아하는지 알아야 합니다. 하지만 그냥 고기를 드리기만 하진 않을거고 잡는 과정을 같이 서술할겁니다. 고기들을 맛보고 나서 잡는 과정을 보면 좀 더 많은 깨달음을 얻을 수 있을 겁니다. 그러다보면 정말 자기가 만들고 싶은 것이 무엇인지 알고서는 위기지학 할 수 있게 되겠죠.


4장 이어서 보기


  1. 이에 대해서 더 자세한 이야기가 알고 싶은 분은 김창준씨의 애자일 블로그에 있는 당신이 제자리 걸음인 이유 : 지루하거나 불안하거나를 읽어볼 것을 추천합니다.

  2. 이에 대해서 더 자세한 이야기가 알고 싶은 분은 김창준씨의 애자일 블로그에 있는 프로그래밍 언어 배우기의 달인을 읽어볼 것을 추천합니다.

  3. 이에 대해서 더 자세한 이야기가 알고 싶은 분은 김창준씨의 애자일 블로그에 있는 프로그래머의 위기지학을 읽어볼 것을 추천합니다.