Python으로 만든 스타크래프트 놀이는 참가자들이 무척이나 좋아했다. 또 그 직전에 Python Interactive Shell에서 간단하게 남자, 여자, 인간 클래스를 직접 만들어 보게 한 것도 좋아했다. 아주 짧은 시간 동안에 OOP의 "감"을 느끼게 해주는 데 일조를 했다고 본다.
또한,
JuNe과
1002의
CrcCard 세션을 (마치 주변에 사람이 없는 듯 가정하고) 보여줬던 것도 좋은 반응을 얻었다(원래는
1002가 혼자 문제를 푸는 과정을 보여주려고 했다가
JuNe이 보기에 두 사람의 협력 과정을 보여주는 것도 좋을 듯 했고, 분위기가 약간 지루해 지거나 쳐질 수 있는 상황이어서 중간에 계획을 바꿨다.) 선배들이 자신이 풀어놓은 "모범답안"으로서의 코드 자체를 보여주는 것은 했어도 분석하고 디자인하고, 프로그래밍 해나가는 과정을 거의 보여준 적이 없어서, 그들에게 신선하게 다가간 것 같다.
또, 동일 문제를 여러번 하는 것의 교육적 효과를 다시금 확신하게 되었다. 내용이 이어지고 연계가 되니, "현재의 주제를 벗어난 것들에 에너지를 덜 소모하면서" 많은 학습이 가능했다. 최소한 문제를 매번 새로 설명하고, 그걸 이해시키게 하는 시간은 주제가 바뀔 때마다 아낄 수 있었다.
참가자들 중 대표로 몇 명의 코드를 프로젝터를 통해 직접 보면서 하나 하나 짚어 나갔다. 그 사람이 어떤 순서로 프로그램을 만들었고, 어떤 의도에서 이걸 이렇게 했는지. 한 줄 한 줄 정말 "많은 것을 가르쳐주고, 배울 수 있겠다" 하는 생각이 들었다. 우리는 "교사/정답에게서만 배운다"는 사고에서 자유로워질 필요가 있다.
- 어떤 만화에서 보면 한 스승이 춤을 지도할때 재현성에 대해 이야기한다. '극장에 가득찬 관중들 앞에서, 당신은 "오늘은 신이 내리지 않았습니다" 라고 사과할 셈인가요?" 세계의 정상엔 최고의 춤에 '재현성'을 가지고 있습니다. 의식하십시오. 발가락, 발바닥, 모든 근육들을.'
과정을 의식하고 행한다는 것은 그런것 같다. 문제 SPEC을 받았을때부터 코드의 끝까지. 잘못된 부분을 의식하지 않으면 끝까지 고칠수 없다. 문제 자체가 드러나지 않으면 문제를 풀 수 없으니까. 문제가 나를 지배하기 전에 내가 문제들을 지배하려면. 하나하나 나의 제어영역으로 들어오도록 해야겠다. 이름상으로는 세미나의 진행자로 올랐지만, 이 시간만큼 나는 세미나 진행자인 동시에 배우는 사람일 수 있었다.
- Pair Teaching 세미나를 혼자서 진행하는게 아닌 둘이서 진행한다면? CRC 디자인 세션이라던지, Structured Programming 시 한명은 프로그래밍을, 한명은 설명을 해주는 방법을 해보면서 '만일 이 일을 혼자서 진행했다면?' 하는 생각을 해본다. 비록 신입회원들에게 하고싶었던 말들 (중간중간 팻감거리들;) 에 대해 언급하진 못했지만, 오히려 세미나 내용 자체에 더 집중할 수 있었다. (팻감거리들이 너무 길어지면 이야기가 산으로 가기 쉽기에.) 그리고 내용설명을 하고 있는 사람이 놓치고 있는 내용이나 사람들과의 Feedback 을 다른 진행자가 읽고, 다음 단계시 생각해볼 수 있었다.
--
1002
RandomWalk2를 풀 때 어떤 사람들은 요구사항에 설명된 글의 순서대로(예컨대, 입력부분을 만들고, 그 다음 종료조건을 생각하고, ...) 생각하고, 또 거의 그 순서로 프로그래밍을 해 나갔다. 이 순서가 반드시 최선은 아닐텐데, 그렇게 한 이유는 무엇일까. 두가지 정도를 생각해 볼 수 있겠다.
하나는 사람들이 별다른 외현화를 하지 않고 바로 프로그래밍에 들어갔기 때문이다. 외현화라는 것은 자기 생각을 머리 바깥에 표현하는 것을 말한다. 다이어그램을 그리거나, 글을 쓰거나 해서 표식을 남기는 것이다. 외현화가 필요한 이유는, 사람의 단기기억 장치는 상당히 작은 수의 것들만 기억할 수 있기 때문에 일종의 "보조기억장치"를 통해 기억부담을 줄여야 하기 때문이다. 그런데, 미리 문제이해/분석/기획시에 특별히 자신이 이해하고 계획한 문제풀이를 외현화하지 않았기 때문에, 프로그래밍을 하는 중엔 유일한 보조물인 "요구사항"을 그대로 보고 따라하게 된 것이 아닐까 생각한다. 만약 문제를 보고 분석을 하면서 간단한 다이어그램을 그려뒀고, 그것을 참조하면서 프로그래밍했다면, "좀 더 바람직한 순서"를 택할 수 있지 않았을까.
다른 하나는, 요구사항이 어떻게 제시되느냐가 산출물로서의 프로그램에 큰 영향을 끼친다는 점이다. 요구사항이 어떤 순서로 제시되느냐, 심지어는 어떤 시제로 제시되느냐가 프로그램에 큰 영향을 끼친다. 심리학에서 흥미로운 결과를 찾아냈다. "내일은 한국과 브라질의 경기날입니다. 결과가 어떻게 될까요?"라는 질문과, "어제는 한국과 브라질의 경기가 있었습니다. 결과가 어땠나요?"라는 질문에 대해 사람들의 대답은 큰 차이가 있었다. 후자 경우가 훨씬 더 풍부하고, 자세하며, 구체적인 정보를 끌어냈다. 이 사실은 요구사항에도 적용이 되어서, 요구사항의 내용을 "미래 완료형"이나 "과거형"으로 표현하는 방법(
FuturePerfectThinking )도 생겼다. "This system will provide a friendly user interface"보다, "This system will have provided a friendly user interface"가 낫다는 이야기다. 어찌되었건, 우리는 요구사항이 표현된 "글" 자체에 종속되고, 많은 영향을 받는다.
따라서, 프로그래머는 "요구사항"이라는 말과 글의 울타리에서 가능한 한 벗어나서 "고객의 의도"를 먼저 파악하려는 시도가 필요하고, 동시에 자신의 이해와, 디자인 계획 등을 별도로 외현화 해두는 것이 중요하다.
처음
1002가 계획한 세미나 스케쥴은 조금 달랐다. "어떻게 하면
ObjectOrientedProgramming의 기본 지식을 많이 전달할까"하는 질문에서 나온 스케쥴 같았다. 나름대로 꽤 짜임새 있고, 훌륭한(특히 OOP를 조금은 아는 사람에게) 프로그램이었지만, 전혀 모르는 사람에게 몇 시간 동안의 세미나에서 그 많은 것을 전달하기는 무리가 아닐까 하고
JuNe은 생각했다. 그것은 몇 번의 세미나 경험을 통해 직접 느낀 것이었다. 그가 그간의 경험을 통해 얻은 화두는 다음의 것들이었다. 어떻게 하면 적게 전달하면서 충분히 깊이 그리고 많이 전달할까. 어떻게 하면 작은 크기의 씨앗을 주되, 그것이 그들 속에서 앞으로 튼튼한 나무로, 나아가 거대한 숲으로 잘 자라나게 할 것인가.
그래서
1002와
JuNe은 세미나 스케쥴을 전면적으로 재구성했다. 가르치려던 개념의 수를 2/3 이하로 확 잘랐고, 대신 깊이 있는 학습이 되도록 노력했다. 가능하면 "하면서 배우는 학습"(Learn By Doing)이 되도록 노력했다.
그렇지만 초반에 시간관리가 부족해서 전체적으로 약간 시간이 부족했다. 하지만, 처음 계획했던 것의 80% 이상을 실행했다는 점에서 꽤 성공적이었다고 생각한다.
아쉬운 점이 있었다면,
- 마지막의 ScheduledWalk Prototype 부분을 사람들이 제대로 활용하지 못했다. 세미나때 '가장 빨리 써먹는 방법은 기존의 코드를 읽고 흉내내는 겁니다' 라고 창준이형이 이야기했지만, 사람들에겐 아직 익숙하지 않아서 였을까.
- 세미나 전 미리 공부해온 사람이 적었다는 점(그래도 두명은 있었던 것 같다) '미리 어디 공부해오라고 알려준바 없어요' 라고 이야기하겠지만. 하긴, 이건 내 영향력 밖의 일이니 일단은. --1002