1학기 초등학생 대상으로 진행한 수업에 이어 같은 컨셉의 수업을 중, 고등학생 대상으로 개설해 운영해보았다. 첫 학교에서 사직하고 수학 강사하던 2018년 이후로 중, 고등학생 대상 수업이 처음이라 약간 긴장했으나, 그럴 필요가 없었다. 어차피 정규 교육과정에 존재하지도 않는 내용. 내 마음대로 해보면 되는 수업이었던 것...
1. 수업 준비
초등학생을 대상으로 한 같은 수업을 이미 1학기 때 36차시 동안 진행했다. 초기 목표는 수업 후반부에는 최단경로, 최소스패닝트리 등의 다소 복잡한 알고리즘까지 다루어 보는 것이었다. 예상되는 문제들은 영타는 고사하고 키보드 입력 방식 자체가 익숙하지 않은 학생들을 대상으로 한다는 점과 초등학생의 수준을 한참 뛰어넘는 추상화 능력이 요구된다는 점이었다. 예상대로 이 두 가지가 수업 목표의 발목을 잡았다. 아니 애초에 이런 문제가 예상이 되었다면 수업 목표를 그렇게 설정하면 안되었다. 초등학생 대상으로 텍스트 코딩을 다루지 않는 것은 다 이유가 있었다. 수업에 참여하던 10여명의 학생 중 단 두 명이 수업 내용에 조금이나마 따라올 수 있었다.
이전 수업에서 가장 큰 난관은 입력 처리부터였다. 어떤 학생들은 온라인저지 시스템이 프로그램을 어떤 식으로 채점하는지를 수업이 끝나는 시점까지 이해하지 못했다. 이후 조건문, 반복문 부분도 꽤 어려워했지만 온라인저지 시스템의 작동 방식을 제대로 이해하고 그에 따라 입력과 출력 처리가 어떻게 이루어져야 하는지 확실하게 이해하는 것이 매우 중요하다고 생각되었다.


수업 내용의 배치 역시 단순히 난이도 순으로 나열할 것이 아니라 연관된 개념을 순차적으로 배우며 깊이를 더해갈 수 있도록 하는 것이 중요하다고 생각되었다. 예를 들어 그래프 이론을 배운 직후에 DFS를, 그 후에 BFS를, 그 후에 최단 경로 탐색을 바로 배우는 식이다.

수업 자료도 간단하게 제작했다. 수업 내용을 직접 정리할 수 있도록 구성했는데 이 부분은 실수였다. 학생들은 학습 내용을 메모하면서 처음 듣는 내용을 머리에 기억해야 하고 코딩까지 해야 한다. 할 일이 너무 많았지 않았을까 싶어 수업 중반부터는 모든 자료에 빈칸을 두지 않았다. 하지만 학생들은 학습지를 챙겨가지 않았다. 이 부분은 수업 자체에 열의가 없었던 것도 있겠지만 배부 방식에 문제가 있던 것도 있다. 이렇게 매일 한 장 한 장을 나눠줄 것이 아니라 모든 차시의 자료가 하나의 교재로 엮어진 채로 나갔어야 했다. 그러나 수업을 준비할 시간이 충분하지 않았기에 어쩔 수 없이 매 회차 그 날의 학습 내용을 나눠줄 수밖에 없었다.
2. 수업 시작

수업은 시작되었고 준비한대로 잘 진행됐다. 한 번 인원 미달이었다가 추가 신청을 받았는데 20명 가까이 신청해버리는 바람에 제대로 진행이 될까 걱정됐다. 아무래도 디버깅과 피드백을 매우 많이 해줘야 하는 수업이기 때문에 인원이 많으면 진행이 느려진다. 다행인 건지 실제로 출석하는 학생은 10명이 되지 않았다. 고등학생 2명, 중학생 4명, 초등학생 3명. 수업이 시작되기 직전까지도 '어떤 학생이 무슨 이유로 이 제목의 수업을 신청했을까'가 의문이었다. 과연 어떤 수준의 학생들이 올 것인가. 첫 수업이 시작되는 날 9시, 가장 먼저 이 궁금증을 해결하기 위해 질문을 몇 가지 던졌다.
코딩 경험이 있는가? 반은 있고 반은 없었다.
파이썬을 다뤄본 적이 있는가? 2~3명 정도였다.
엔트리는 해봤나? 당연하지만 이건 다 해당되었다.
코딩에 관심이 있는가? 여기도 반은 있고 반은 없었다.
결국 이 수업을 듣고 싶어서 온 학생은 3명 정도였고, 나머지는 '그냥' 왔다. 그냥이라 함은 방학 중에 집에서 노는 건 안되겠다는 부모님이 신청해서 보내진 그런... 느낌인 것 같다. 실제로 그런 학생들은 수업 참여 역시 그런 식으로 했다. 가장 걱정했던대로 이번 수업 역시 소수 정예 형식으로 굴러가는 형태가 됐다.
수업의 루틴은 다음과 같았다.
- 기본 이론 설명
- 문제 풀이
- 디버깅과 피드백
- 과제 제시
2와 4를 위해 백준에서 좋은 문제들을 많이 확보해야 할 필요가 있었다. 이 작업도 쉽지만은 않았다. 후반으로 갈수록 또 시간이 부족해 시간 초과를 피하는 테크닉이 필요한 문제나 EOFError를 다루는 문제를 끼워넣는 실수도 있었다.

문제를 하나하나 검증하며 솔루션까지 다 만들어서 제시하는 게 최선이고 그게 수업 방향에도 당연히 맞다. 그런데 그럴 시간이 도저히 나질 않았다. 매주 9차시가 진행되는 수업을 두고 매 수업마다 2시간 이상 준비하는 건 지금 상황에서 불가능했기 때문에 문제를 슥 훑어보고 난이도를 보고 내가 제출했던 코드와 다른 사람들의 코드, 내가 푼 적이 없는 문제라면 코드 길이를 살펴보는 식으로 '이게 수업에서 쓸 수 있는 문제인가'를 가늠했다. 그리고 실제 수업에서는 기억도 잘 나질 않는 풀이를 말로 설명해가며 라이브 코딩 콘서트 같은 걸 했다. 이거 맞나..? 뭐 교수학습방법 중에 교사가 자신의 사고 과정을 설명하는 것도 있으니 아마... 아주 잘못된 방식은 아니라고 생각해본다.
3. 수업의 문제점
수업은 잘 진행되기도 했지만 문제도 많았다. 이전에 했던 수업은 사실 기초 문법 이후의 단계로 발전된 적이 없으니 이론을 다루는 시점부터는 도움이 되지 않았다.
1) 월화수 수업
주 3일, 각 3차시 씩, 총 36차시를 운영하는 수업이었다. 그런데 이 수업의 일정을 정할 때 별 고민 없이 '빨리빨리 끝내면 좋지'라는 생각으로 "월화수" for i in range(4)를 때리는 실수를 했다. 월요일 첫 수업에 기본 입출력과 변수 선언을 배운 학생들은 21시간 후에 곧바로 조건문과 반복문을 배웠다. 그리고는 21시간 후에 또 문자열과 리스트 등 iterable 자료형을 배웠다. 이미 컴퓨터 지식이 어느 정도 깔린 학생들 대상이라면 모르겠으나 무슨 부트 캠프도 아니고 이런 식의 초고속 차시 운영이 학생들에게 연습할 시간을 주지 않았다. 과제로 제시할 문제들을 왕창 골라놓고도 과제를 할 시간을 안 줬다. 점점 어려운 이론을 다룰 수록 이 문제는 더 심해졌다. 결국 초기에 정했던 차시 운영 계획을 수정해 많은 부분을 날리고 매일 딱 1개의 알고리즘만 다루도록 했다.
2) 타자연습
이 문제는 이전에 해봤던 수업에서도 똑같은 문제였다. 결국 "문제해결 프로그래밍"이란 스스로 주어진 문제 상황을 두고 고민해야 하는 활동인데 처음 배우는 학생들을 두고 3차시를 '고민해봐라'고 던져줄 수는 없었다. 이분탐색을 오늘 배운 사람에게 매개변수탐색 문제 던져주고 풀어보라고 하면 적어도 3시간은 줘야 제대로 된 코드가 나올까 말까 할 거다. 그걸 나도 알고 있기 때문에 결국 수업은 정답 코드를 짜는 과정을 '시청'하며 코드를 따라 쓰는 받아쓰기, 타자연습이 되어버렸다. 이 문제는 앞으로도 이 수업을 계속하려면 꼭 해결해야 할 문제다. BIKO 처럼 정답 코드의 일부를 제공해서 빈칸 채우기 식으로 학습 자료를 만들 필요가 있다. 결국 백준 하나만으로 때우는 수업은 불가능하다는 것. 더 많은 자료 준비가 필요하다.
3) 404 교육과정
이 모든 수업 내용이 교육과정 상에 존재하지를 않는다. 참고할 만한 다른 커리큘럼도 거의 없다시피 하다. 교육 내용의 순서를 정하는 것이 매우 어려웠다. 이 작업에서 참고한 것은 시중 교재 목차와 Solved.ac의 새싹 문제, 클래스 문항 배치들이었다. 실제로 수업을 하다 보니 내가 정한 순서로는 제대로 설명할 수 없는 개념도 있어서 "이건 나중에 좀 더 자세히 설명하겠다."는 말을 몇 번이나 했는지 모르겠다. 결국에는 진짜 다 설명하기는 하는데 순서가 엉망진창이라 듣는 사람 입장에서도 이게 체계가 잘 잡힐지 걱정되는 수준이었다.
이 문제는 연구회 커리큘럼을 작성하며 좀 더 체계화하려고 한다. 수 차례의 시행착오를 더 겪어봐야 해결할 수 있는 문제이기도 하다.
4) 설명 방식
이론을 설명하는 방식이 좀 더 하화 될 필요가 있다. 내용 자체가 학생 수준을 한참 뛰어넘는 것도 있지만 그렇다고 아주 설명 못할 내용은 또 아니다. 그럼에도 이 내용은 학부생을 상대로 교육되고 있기 때문에 모든 교육자료가 그 수준에 맞춰져있다. 내가 다루고 싶어하는 모든 내용에 대해 이론을 시각화해서 이해하기 쉽게 다루는 교육 자료 개발이 선행될 필요가 있다. 너무 아무 것도 없이 판서로만 설명하다보니 막바지 그래프 이론에서 최단경로 문제를 설명할 때는 좀 '이게 맞나' 싶은 판서까지 나와버렸다.

사실 다익스트라 같은 알고리즘은 언플러그드로 활동을 재밌게 구성할 수 있는 여지가 있었다. 오히려 언플러그드로 넘어가면 더 어려운 MST나 Bipartite matching 같은 것도 어느 정도 쉽게 설명할 수 있을 것 같다. 그래프 이론은 확실히 시각화를 해야 이해가 더 쉬우니까. 모든 문제가 다 결국 여기로 귀결되는데 '그럴 시간이 없었다.' 초등에서는 거의 개척자 신세이니 이건 내가 앞으로 해야 할 과제 아닐까 싶다.
4. 대회 운영
수업의 마지막은 항상 대회로 구성하고 있다. 이번에는 풍선을 준비할 여력이 없어 스티커로 문항 해결을 표시해주기로 했다. 저 난이도 4문제, 단순 구현 2문제에 수업으로 배운 알고리즘 이론을 적용해 풀 수 있는 3문제를 제시했다. 이렇게만 문제를 던져주면 절대 모두 해결할 수 없기 때문에 총 160분의 시간에서 120분은 AI를 사용하지 않고 풀다가 순위표를 저장하고 남은 40분 동안 AI를 사용하도록 해주었다. 다만 AI로 문제를 해결하면 시간이 오히려 남기 때문에 추가로 3문제를 더 준비했다.


기본 문법 문제까지는 해결 가능한 수준으로 끌어올렸다는 결론이 나왔다. 알고리즘 이론을 적용해 풀 수 있는 문제들은 앞서 이야기한 문제점으로 인한 연습시간 부족으로 학생들이 접근 조차 어려웠다. 이 문제는 솔루션과 정답 코드를 제공하는 것으로 해결했다. 전날 밤을 새가며 가능한 다양한 풀이 방법을 정리하느라 잠을 제대로 못잤다.

문제 검수가 좀 부족했던 탓에 마지막 추가 문제의 테스트 케이스에 문제가 있었다. 다행히 대회 종료 전에 테스트 케이스를 다시 만들어 올솔브를 띄우기는 했다.
5. 결론
- 수업자료가 아직 너무 부족하다. 꾸준히 수업자료를 개발해 컨텐츠를 확보할 필요가 있다.
- 수업 일정을 좀 더 학생 수준을 고려해 정할 필요가 있다.
- 학습 내용의 체계화가 필요하다. 내용 체계를 직접 만들어보면 좋을 것 같다.
- 또 다른 평가 방안을 마련해야 한다. 단순히 코드 따라쓰기, 디버깅으로 반복하기에는 시간 효율이 너무 떨어진다.
고칠 점이 너무 많다... 그래도 이런 수업 재밌어서 기회 닿는대로 계속 해보고 싶다. 좋은 수업 경험 할 수 있게 해주신 우리 교장선생님과 장학사님, 우리 부장님 너무너무 감사합니다..ㅠㅠ