소프트웨어교육? 코딩교육? 컴퓨터사이언스교육?

소프트웨어교육, 코딩교육이 이야기되고 컴퓨터사이언스적인 사고를 기르기 위해 가르치겠다는 강한 의지가 감동의 물결로 다가오고 있다. 아이들은 적어도 나같은 컴맹이 되지 않도록 훌륭한 기회를 얻게되어 기쁘기 그지없다. 하지만, 여러 관련자료들을 찾아보이도 다들 빼놓고 있는 부분이 있는듯 싶어, 부족하나마 내가 교실에서 활동한 경험을 열어보려 한다.

컴퓨터와 인간

컴퓨터라는 하드웨어와 소프트웨어는 사람이 만들었다. 사람이 사람을 모방해 만들었다는 이야기다. 소프트웨어의 특성도 그렇고, 하드웨어적인 동작 또한 그렇다. 이 것을 이해하지 못하면 다음으로 진행할 수 없을 정도로 중요하다. 근본 원리는 사람이고, 아이들은 이런 근본 원리 속에서 끊임없이 자신을 돌아보면서 개념을 적용하여야 한다.

#define

* 신체 활동과 규칙

눈으로 보고, 귀로 듣고, 머리로 생각하고, 입으로 말하고, 제대로 기록하고…

컴퓨터의 연산장치와 입출력장치, 저장장치는 인간의 신체기관과 상호작용을 바탕으로 하고 있다. 아이들 스스로의 눈과 귀와 뇌와 입과 신체가 정확히 인지되고 동작해야 한다. 그러기 위해 교사의 말과 행동, 아이들의 말과 행동, 서로간의 생각 교환을 위한 간단한 규칙을 정의하는 것이 중요하다. 매번 즉흥적인 명령에 따라 아이들이 움직이는 것도 교사 스스로 컴퓨터사이언스적인 사고에서 벗어나고 있는 것이다.

  • #define 생각 없는 말하기 습관  NULL
  • #define 경청할 때 끄적 메모 습관  true
  • #define 교사와 눈 마주치기 습관  true
  • #define 외치지 말고 가까이 다가서서 이야기하기 습관  true
  • #define 물건(쓰레기) 던지는 습관  false

이런 바른 신체활동을 정의하는 규칙들은 상호작용 네트워크를 돕는 역할을 한다.

* 상호작용 네트워크의 연결

먼저 주의 집중과 동기부여, 생각의 다양화, 표현의 풍부화, 학습과정과 결과의 기록이 모두 갖추어질 수 있는 교실 환경이 준비되어야 함은 두 말할 나위가 없겠고, 상호작용 네트워크가 연결되기 위해서는 문제 해결을 위한 교사와 아이들, 아이들과 아이들간의 다양한 협력 활동이 준비되어야 하는데

  • 배우고자 하는 내용에 대해 사전 학습한 단순 암기 습관을 탈피해야 하고,
  • 이를 위해 교사의 연구를 바탕으로 동기를 부여하는 발문도 풍부해야 하고,
  • 아이들의 창의적 활동을 존중하여 동일 과제에 대해 다양한 관점에서 접근할 수 있어야 하고,
  • 필기 습관과 다양한 기교재를 활용한 개인의 포트폴리오가 꾸준히 누적되어야 한다.

무엇보다도 학습 활동에 대해 ‘꼭 해야 하나? 안해도 되겠지?’ 라는 의문이 생기지 않도록 하여, 배움은 당연히 해야하는 활동이고, ‘문제를 해결하기 위한 방법을 찾는 것’에만 의문을 갖도록 하는 컴퓨터 사고적(?) 학습 습관이 밑바탕이 되어야 한다.

교사와 아이들, 아이들과 아이들간의 문제 해결 과정 속에서 상호작용 네트워크는 자연적으로 형성되고, 끊임없는 토의와 토론 활동 속에서 포트를 통한 장치와 장치간의 통신과 합리적인 의사소통을 위해 프로토콜의 개념이 형성될 것이다.

Sequence

* 생활습관이 곧 순차처리

하루 일과를 계획하고 실천하는 것 자체가 프로그래밍의 기본인 순차처리다. 컴퓨터프로그래밍을 가르쳐야 한다는 사람들 중에 왜 하필 프로그래밍이어야 하는지 제대로 이해하지 못하는 경우가 있다.

아이들이 그저 ‘프로그래밍(코딩)을 배우고 나면 그게 나중에 어딘가 쓰이겠지’라는 생각은 올바른 교육적인 판단이 아니다. 그런 생각은 아이들이 더 잘 안다. ‘어떻게 되겠지, 나중에 쓰이겠지, 그렇지만 일단 해둬’ 이런 바탕에서 ‘그러니까 공부해야 해’라는 건, 세 살 짜리 아이에게도 통하지 않는 말이다.

그래서 하루 일과를 미리 생각해 일기장에 기록하고 실천하도록 하였다. 프로그래밍의 순차 처리(시퀀스)도 결국 가장 합리적인 타임라인을 구성하는 작업이다.

  • 하루 일과를 미리 생각해서 적어도 1-6교시 배울 과목(+ 단원, 목표)을 미리 계획하고
  • 반드시 해야 할 중요한 일과들에 대해 미리 예상해서 일기장에 기록하는 활동과
  • 계획한 일에 대해 실천여부를 표시하도록 하였다.
  • 도움을 주기 위해 플래너 용지를 만들어 사용했고, 일기장에 부착하게 하였다.

아이들에게 시간관리라는 것을 익히게 하는게 너무 이른 것 아니냐 하실 수 있겠다. 그럼 언제부터 시작해야 하는지 반문하고 싶다. 그저 선생님이 앉으라면 자리에 앉고, 펴라면 펴고, 나가라면 나가고, 먹으라면 먹는 습관을 가진 아이들에게 프로그래밍과 코딩 이전에 몸으로 순차처리를 경험하게 하는 것 또한 매우 중요한 일이다. (프로그래밍을 가르치고나면 생활 습관이 순차적이 될 것이다? 어른도 그렇게 변화하기 어렵지 않을까…)

* 글쓰기의 중요성

낱말 < 문장 < 문단 < 장(챕터) < 글

우리가 잘 알고 있는 글의 레벨이다. 낱말부터 시작해서 모이고 모이면 결국 글이 완성된다. 프로그래밍은 글을 쓰는 과정과 매우 흡사하고, 형태 또한 글과 같다. 앞서 이야기했듯이, 컴퓨터의 모든 부분들은 인간이 만들었기 때문에 그 범주를 벗어날 수 없다. 굳이 외계 기술처럼 생소하고 이해하기 어렵게 만들기 위해 노력할 이유가 없기 때문이다.

컴맹이 되기 전에는 코딩하기 전에 간단히 소설을 한 편 썼다. 프로그래밍 세상을 베이직과 순서도가 장악하던 시절이었지만, 난 그냥 꿋꿋하게 글로 적었다. 학교 수업 때문에 워드프로세서(에디터)로 입력할 여건이 안되면, 틈나는대로 공책에 낙서처럼 기록하고 수학공식도 찾아서 미리 적고 풀어보는 등 생각을 글로 정리한 다음에 코드로 옮겼었다. 일종의 프로그래밍 스케치(?)인데… 예를들면,

  1. 타이머가 알람을 울려야 할 시각을 입력받아서 (1시간 30분)
  2. 지금 시각을 유닉스타임으로 받아서 (1시간 30분) 후의 시각을 설정해 변수에 담고,
  3. 만약, (1시간 30분) 후의 변수와 지금 시각과 비교하여 같다면
  4. { 시각을 라벨박스에 표시하고 빈 문자와 현재 시각을 0.5초 간격으로 반복하여 반짝반짝 효과를 준 뒤
  5.    알람음을 발생시키는데,
  6.    0.01초마다 키 입력을 기다려서
  7.       만약, ESC키가 눌리면 알람음을 멈추고 종료
  8.       그렇지 않다면, 알람음 재생으로 반복  }
  9. 그렇지 않다면, // (1시간 30분) 후의 시각 변수와 지금 시각과 비교하여 같지 않다면
  10. 지금 시각과 비교하는 곳으로 돌아가기

이렇게까지 세련되게(?) 표현하지는 않았지만 나만의 글로 열심히 적었었다. 스케치를 열심히 한다고 해서 멋진 그림이 완성되는 것은 아니다. 컴파일러의 수준에 따라 현재 시스템 시각을 받아오기 위한 노력도 다양하게 필요하고, 1시간 30분 후라는 시각을 계산해 내는 것도 의외로 귀찮은 일이고, 키 인터럽트도 제어해야하고, 알람음 파일의 헤더를 분석하고 버퍼를 잘라내어 디코딩하고 장치로 보내는 등등의 수 많은 문제들을 해결해 나가야 한다.

물론, 세부적인 알바(?)는 한 계단 한 계단 오르면서 학습을 통해 저절로(?) 체득하게 되지만, 분명한 사실은 전체적인 흐름을 그리지 못하면, 세부 코드들은 그저 연습용 예제일 뿐이라는 것이다. 평소에 일기나 짧은 글을 쓰이라도 처음-가운데-끝으로 나누어 체계적이고 분명한 글쓰기 습관이 전체적인 흐름을 잡는데 무척 중요한 부분이고, 설령 프로그래밍이 아니더라도 삶의 전반적인 수준을 높이는 데에도 상당히 중요한 역할을 한다.

아이들에게는 Scratch 와 같은 높은 수준의 인터프리터를 사용함으로써 아이들이 생각을 빠르고 손쉽게 구현할 수 있도록 도울 수 있다. 그 전에 글과 그림으로 전체적인 흐름과 완성된 후의 모습(UI)을 표현해 보는 활동이 선행되어야 할 것이다.

if() – else

* 만약에?라는 생각

어릴 적 짧은 동화를 읽더라도 ‘만약에 내가 주인공이었다면?’이라는 생각으로 한참을 상상의 세계에 빠져들었던 경험이 누구나 있을 것이다. ‘만약’ 속에 존재하는 세상을 상상하는 것만으로 즐겁고 행복하듯이, 프로그램을 살아 움직이게 만드는 조건문이야말로 컴퓨터프로그래밍의 꽃이 아닐까 생각해 본다. 흔히 볼 수 있는 세탁기나 냉장고에 사용되는 단순한 인공지능도 조건문의 다발이다.

  • 만약 (냉장실의 온도가 -2도가 된다면) 냉각기를 가동하고, 만약 (냉장실의 온도가 -4도가 된다면) 냉각기를 멈추어라.
  • 만약 (이 컴퓨터에 내가 감염되어 있지않다면) 나를 복제하여 디스크에 감염시켜라.
  • 만약 (엑셀레이터가 10% 동작한다면) 쓰로틀밸브를 10% 개방하고, rpm을 측정해 계기판에 표시해라.

* 순차처리와 조건문의 콜라보

아이들과 교실에서 이런 놀이도 해본다.

  1. 앉은 자리에서 화장실까지 다녀오는 순서를 목록으로 만들어라.
  2. 목록에 따라 로봇의 역할을 맡은 친구에게 명령해보자.
  3. 잘못된 부분을 수정하여 로봇 친구를 완벽히 작동시켜보자.
  4. 완성한 목록으로 다른 팀의 로봇 친구를 작동시켜보자.
  5. 등등…

의자를 뒤로 밀고, 일어서서, 오른쪽으로 돌고… 만들어낸다. 오른쪽으로 여섯 걸음을 걷고, 열린 문을 통과해서… 하지만, 새로운 과제인 내가 만든 코드로 다른 친구를 움직이려면 목록의 수정이 불가피하다. 이럴 때, ‘만약’이라는 방법의 사용법을 알려주고 나면, 상당히 널리 사용할 수 있는 목록을 완성할 수 있게 된다. 솔직히, 이 단계까지 진화(?)하기란 쉽지 않다. 그냥 맛보기 정도면 충분하다. 개방적이고 범용적 코드는 상당한 노하우가 필요한 영역이라 결코 쉽지 않다.

  • 만약, 앞이 막혀 있다면 오른쪽으로 한걸음 옮기기
  • 만약, 앞에 물체가 있다면 멈춰서 5초 기다리기
  • 만약, 문이 닫혀있다면 발로 걷어 차기(?)

do – while()

순서대로라면 while()을 기대하셨겠지만, 아이 재우다가 함께 잠들었다가 새벽에 깜짝놀라 깨서 써내려간 포스트인지라 정신도 없고, 두서도 없어서 이쯤 마무리 짓자면…

소프트웨어교육, 프로그래밍교육, 코딩교육 어떤 이름이나 방향이 되었건 간에, 컴퓨터사이언스도 결국 사이언스(과학)의 응용 분야인지라

  • 시작과 끝은 반드시 철학적이어야 하고,
  • 아이들의 수준에서 실생활의 문제를 해결하는데 중점을 두어야 하고,
  • 경쟁과 성과가 아니라 협력과 과정을 중심으로 해야 하고,
  • 활동 속에서 성취감과 도전의식을 충분히 맛보고 매력을 느낄 수 있도록 해야 하고,
  • 아이들의 다양성을 존중하여 반드시 다른 교과들과 연계하고 통합한 교육과정을 제안해야 하고,
  • 교사의 전문성을 이야기 하기 전에 목표와 비전을 명확히 제시할 수 있어야 하고,
  • 기술교육이 아닌 응용과학의 관점에서 예비교사들의 소양을 길러주어야 하고,
  • 외부 전문가는 기술적 영역에서 교사와 함께 협력할 뿐이지 실질적으로 수업을 진행해서는 안되며,
  • 프로그래밍으로 시작해서 프로그래밍으로 끝나는 우를 범해서는 안될 것이다.

당연히 한 술 밥에 배부를 리 없다.

for() 문은 while()문에 if()가 합쳐진 구문이다. while()이라는 반복되는 시도는 if()라는 평가를 통해 방향을 꾸준히 수정해 나가야 하고, 이를 정확히 분석하고 평가해서 우리 환경에 가장 적합한 컴퓨터사이언스교육을 완성해 나가야 한다.

  • 대기업의 이익
  • 단기간의 목표
  • 눈에 보이는 성과
  • 최고를 위한 경쟁
  • 무모한 정책 수립

과 같은 장애물을 극복해서 아이들이 행복해질 수 있는 교육을 만들어 보자.

 

:맥노턴.

글쓴이: 맥노턴

초등교사커뮤니티 '인디스쿨' 대표