아이에게 프로그래밍 가르치기

예전부터 아이들에게 프로그래밍을 가르치는 일에 흥미가 있었다. 특히 올해는 우리집 멍멍이가 초등학교에 입학할 나이가 되었기 때문에 개발자 아빠로서 뭐라도 알려주어야겠다는 생각이 든다. 이참에 아이에게 프로그래밍을 가르칠 때 무엇을 염두에 두어야 하는지 글로 정리해 보려고 한다.

 

코딩 교육 의무화

2019년도부터 초등학생에게 코딩교육을 의무화하였다 한다. 사실 코딩 교육 의무화는 2015년부터 계획되어 있던 것이라 놀랄 일은 아니다. 다만 코딩이 공교육과 입시의 영역으로 들어오게 되었을 때 생길지 모를 부작용 때문에 각계에서 우려가 많은 것으로 안다.

본인은 현업 교사도 아니고 입시 전문가도 아니기 때문에 현 코딩 교육 실태에 대한 평가가 맞지 않을 수도 있음을 감안하고 들어달라. 코딩 교육은 2019년부터 의무화가 되었지만 현장 교육은 학교마다 차이가 있다. 어떤 곳은 저학년부터, 어떤 곳은 5/6학년부터 코딩 교육을 실시한다. 왜 이렇게 차이가 나는가 하면 아직 공교육의 영역에 들어올 만큼 커리큘럼이 자리를 잡지 못한 상태에서 의무화를 서둘렀기 때문이라고 생각한다. 이런 경우 예상할 수 있는건 코딩 교육의 난이도가 많이 낮을 것이라는거다. 실제로 교재들을 찾아보면 부교재의 품질(로봇을 움직인다던지, 악기를 연주한다던지)에 차이가 있을 뿐 코딩의 난이도가 높은 과정은 찾아볼 수 없었다. 허면, 앞으로도 그럴 것인가 하면 그건 알 수 없다. 향후 코딩 교육 난이도의 향방은 입시 포함 여부가 결정할 듯 하다. 입시에 코딩이 포함되려면 변별력을 두어야 할텐데, 사실 코딩문제를 어렵게 내려면 그 난이도는 끝도 없이 높일 수도 있다.

개인적인 의견을 말하자면, 본인은 그다지 주입식 교육을 좋아하지는 않는다. 코딩 교육도 주입식 교육과 그다지 어울리지는 않는 영역으로 보인다. 허나 만약 코딩을 현 입시제도 하에서 주입식으로 가르친다 가정한다면 다른 어떤 과목보다도 실용적이기는 할 것이라 본다. 12년 입시 공교육 체제에서 배운 지식 중 실용적인 학문이 얼마나 될까? 기껏해야 영어 / 제2외국어 / 한문 정도? 본인은 수학도 좋아했고 과학도 좋아했고 철학 / 문학 / 역사도 즐겁게 배웠다. 공교육 체제 아래 배운 이러한 지식들이 본인의 관점과 지평을 넓혀주었다는 점을 부인할 수는 없으나, 그 지식들은 실용성과는 정말 거리가 멀었다. 심지어 변별력을 위해 무의미하게 난이도를 엄청나게 올린 입시 스킬은 정말 쓰잘데기 없는 죽은 지식들이다.  80평생 동안 ‘반데르발스 힘’ 같은걸 써먹을 일이 단 한 번이라도 생길까?

반면 코딩은 조금 상황이 다르다. 예를 들어 대입 시험에 임의의 숫자 배열을 merge sort하는 방법과 그때의 시간복잡도를 증명하는 문제가 출제된다면 이것도 죽은 지식일까? 물론 실용성 측면이라면 좀 전에 예로 들은 ‘반데르발스 힘’과 큰 차이가 없을 지도 모른다. 허나 merge sort는 컴퓨터나 핸드폰을 사용하는 사람이라면 알던 모르던 매 순간 마주하는 알고리즘일만큼 우리 일상에 가까운 것이다. 심지어 입시 공부로 merge sort를 배운 학생이 어느 날 갑자기 영감이 떠올라 개선된 탐색 알고리즘을 제안할 수 있을지도 모른다. 왜냐하면 생각은 누구나 할 수 있고, 그 생각의 결과물을 제안하는 방법도 누구에게나 열려 있기 때문이다.

기존의 입시과목의 실용성이 0이라면 단언컨대 코딩은 살면서 반드시 쓰일 일이 생긴다. 이 글을 읽는 독자가 설령 비개발자여도 엑셀 함수나 받은 편지함 분류 따위의 간단한 자동화는 직장에서 필수적이다. 현재에도 이런데 미래에 12년간 코딩 의무교육을 이수한 사람이라면 얼마나 많은 일들을 자동화 해낼 수 있을까.

코딩 교육 의무화는 본인이 다루고자 하는 주제의 본질과는 살짝 거리가 있으므로 ‘코딩 교육은 본질적으로 주입식과는 맞지 않으나, 만약 주입식으로 가르친다면 그나마 다른 학문에 비해 실용적일 것이다.’ 정도로 정리해본다.

 

Computational thinking

입시 코딩은 일단 제껴두자. 입시를 제외한다면 코딩 교육은 무엇을 목적으로 하여야 할까? 필자는 computational thinking 이어야 한다고 생각한다. 다른 말로 하면 ‘문제 해결 능력’인데, 그냥 문제를 해결하는 것이 아니라 문제 해결의 절차를 실행 가능한 작은 단위로 나누어 서술하는 능력을 말한다. 문제해결의 절차는 논리적으로 서술할 수만 있으면 도구는 무엇이던 크게 상관이 없다. 아래 링크한 두 영상은 컴퓨터 없이 코딩 교육을 진행하는 좋은 예제다. 영상에서 작성한 문제 해결의 절차를 컴퓨터가 제공하는 명령어로 치환하면 바로 코딩이 된다.

EBS 소프트웨어야 놀자 – 쓱싹쓱싹 로봇 청소기

스크린샷 2020-02-16 오후 9.10.29

[한글] 샌드위치 만들기

[원본] Exact Instructions Challenge PB&J Classroom Friendly

스크린샷 2020-02-16 오후 9.26.02

코딩학원이나 학교의 교재를 살펴보면 엔트리나 스크래치 류의 블록코딩 언어부터 시작하는 경향이 있다. 이후에 라즈베리파이나 아두이노, 마이크로비트 같은 IoT 하드웨어를 제어하는 방법을 배우고, 파이썬이나 c언어 등의 프로그래밍 언어를 배우는 식으로 커리큘럼이 만들어져 있다.

블록코딩이나 IoT 기기들로 코딩을 시작하는 것이 나쁘다는건 아니다. 아이들은 쉽게 접할 수 있으면서 결과가 눈에 보이는 것들에 쉽게 흥미를 보인다. 허나 이런 것들은 본질이 아니므로 아이가 충분히 우수하다면 굳이 흥미 본위의 교육에 시간과 비용을 뺏길 필요는 없다. 가끔 블록코딩으로 엄청나게 복잡한 제어로직을 작성하거나 IoT 교재에 많은 비용을 들이는 경우가 있는데 굳이 그럴 필요가 없다는거다.

 

Structured programming

현대의 거의 대부분의 프로그래밍 언어는 구조적이다. 왜냐하면 프로그래밍 언어가 구조적이지 않을 경우, 그 복잡도가 인간이 제어할 수 없는 수준으로 높아지기 때문이다. 아래 링크한 아티클을 굳이 읽어볼 필요는 없으나 업계에서 전설처럼 회자되는 ‘~considered harmful’ 의 시조이자 비구조적 언어의 한계를 명백히 하여 현대의 프로그램 언어가 구조적으로 자리잡는 분기점이 된 사건이기에 링크해 보았다.

GOTO considered harmful(전설의 레전드의 시작…)

각설하고, 아이들에게는 구조적 프로그래밍의 구성단위만을 알려주면 된다. 컴퓨터에 특별한 소질을 보이면서 진짜 내부 동작원리를 궁금해 하는 아이라면 실제 컴퓨터의 명령어 수행은 비구조적이라는 사실을 알려줄 수도 있겠으나, 보통의 아이들에게 필요한 교육은 1) 순차 2) 분기 3) 반복 4) 함수 의 4가지 구성단위이다. 구조적 프로그래밍의 자세한 내용은 기회가 되면 다뤄보도록 하자.

 

그밖에 주제들

다음 주제들을 아이 가르칠 때 염두에 두어야 할 듯 하다. 허나 저학년이 이해하기에는 내용이 쉽지 않으므로 염두에만 두도록 한다. 혹시라도 고학년이나 우수한 학생들을 가르칠 기회가 생긴다면 아래 주제들을 다뤄보도록 하자.

  • 기계의 한계
  • 알고리즘
  • NAND to Tetris
  • No silver bullet – programming paradigm

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중