어제 "차라리 외울건 외우게 하고 그 외운것 위에서 생각하도록 가르치는 것이 머리가 보통인 아이들에게는 훨씬 쉽게 코딩을 접근 할 수 있게 한다. 그런 방법으로 보통의 재능을 가진 아이들도 머리 좋은 애들이 느끼는 성공감과 성취감을 맛보게 할 수 있다" 라는 나름의 교육철학을 적었다. 헌데 이렇게 이야기 하면 잘 이해가 안된다는 사람들을 은근히 만났다. ( 필자는 나름 어떻게 가르치고 어떻게 코딩해야 하는가에 대한 고민이 많다. 해서 서로 의견을 나눌 수 있는 사람들을 만나서 필자의 얘기도 하고, 상대방의 이야기를 듣고... 하는 걸 즐긴다 )
해서 오늘은 그 진실을 보여주겠다 ㅎㅎ 외우면 왜 편한지... 실제의 사례를 가감없이 보여주려고 한다. 해서 지금부터 아래의 글은 필자가 강의하는 강의실을 그대로 옮겨보는 느낌으로 쓴다는 것을 이해 하고 읽어주면 좋겠다.
....
"자 어제 우리는 배열에 대해서 배웠다. 일단 배열의 정의부터 다시 읊고간다. 반장! 배열이 뭐라고 했지?"
"네 배열은 동일한 자료형의 변수가 연속으로 존재하는 형태의 기억공간이라고 배웠습니다"
"그래 잘 했다. 프로그래밍에서 제일 처음으로 익혀야 하는 개념이 변수라고 했고, 바로 그 변수가 연속으로 여러개 모여있는 공간을 하나의 이름으로 접근할 수 있도록 만들어진 개념이 배열이라고 했기도 하고... 노트 다 정리 해 놓았냐?"
"네"
"그거 당분간은 노트 보고 보고 또 보고 ... 자기전에 보고 출근하면서 보고 ( 학원 오는 걸 출근이라고 한다 ) 계속해서 보고 보면서 머리속에 넣어야 한다. 까먹어도 되. 또 보면 익숙해 지니까... 자 그러면 배열의 기본코드 외워서 짜서 돌려본다 실시!"
그러면 이런 코드를 짜서 돌려야 한다.
int main(){
int l[3];
l[0] = 100;
l[1] = 200;
l[2] = 300;
printf( "%d\n" , l[0] );
printf( "%d\n" , l[1] );
printf( "%d\n" , l[2] );
return 0;
}
"자 그러면 for 반복문을 다시 복습하고 간다. 0 부터 2 까지 3회 반복하는 반복문을 외우라고 했었지? 자 짜서 돌린다 실시!!"
그러면 이런 코드를 짜서 돌려야 한다.
int main(){
int j;
for( j = 0 ; j < 3 ; j++ ) {
printf( "%d\n", j );
}
return 0;
}
필자는 외우라고 할때 정말 최대한 간결하게 정리된 코드를 외우라고 한다. 두개 세개 개념이 짬뽕되어 있는 코드를 외우라고 하지 않는다 머리 나쁜 아이들에겐 그건 정말 고역이거든... 필자가 대략 목표치로 삼고 있는 머리는 IQ 100 ~ 110 사이 정도?
"자 그러면 간단한 응용을 해 본다. for 반복문하고 배열을 섞는건데 위에서 배열의 값을 출력하는 printf 문장을 세줄에 걸쳐서 반복해서 쓰고 있는거 보이지? 자 그 부분을 for 반복문을 이용하여 바꿀 수 있을까?"
이러면 코딩 경험해 본 애들은 금방 뚝딱 해 치워 버리지만... 코딩 처음하는 애들은 머뭇머뭇 하다가 못하는 경우가 허다한데... 그런 애들을 붙들고 이런 얘기를 해 준다.
"길동아 길동아. 지금 내가 무슨 문제를 낸 건지 이해는 하냐?"
"네. 배열 안에 세개의 값이 저장되어 있는데, 그것을 다 순서대로 출력하는데 반복문을 써서 출력하는 거요"
"그래, 그럼 지금 네가 짜야하는 코드에 무슨 무슨 개념이 들어가야 하니?"
"반복문하고 ... 배열이요!"
"자 그럼 그 두개의 기본코드를 일단 하나의 파일에 작성해서 돌아가게 하자. C 언어에서는 변수선언은 어떻게 한다고 했지?"
"어... 함수의 제일 위에 몰아서 한다고 했던거 맞나요?..."
"오케이 잘 기억하고 있네. 짜서 돌려봐"
그럼 이런 코드가 나와야 한다.
int main() {
int l[3];
int j;
l[0] = 100;
l[1] = 200;
l[2] = 300;
printf( "%d\n" , l[0] );
printf( "%d\n" , l[1] );
printf( "%d\n" , l[2] );
for( j = 0 ; j < 3 ; j++ ) {
printf("%d\n" , j );
}
return 0;
}
어려운 코드 아니다. 그냥 두개의 기본코드를 하나의 파일에서 돌아가게 만든 것일 뿐이다.
"자 여기서 생각을 한번 해 보자. j 값이 0 1 2 로 변하면 그걸 이용해서 l[j] 로 만들어도 될것 같니? 안될 것 같니?"
"음... 아 될것 같아요. j 는 변수고 값이 들어 있으니까 j 가 가진 값을 이용해서 배열을 이용해도 될 것 같아요"
"그래 맞아. 만일 네가 헷갈리면 연습하고 다시 이 코드를 보면 되는데, 이런 코드를 써 보면 확실하게 할 수 있을 것 같다"
int main() {
int t[2];
int j;
t[0] = 100;
t[1] = 200;
j = 1;
printf("%d\n" , t[j] );
return 0;
}
"자 이런 코드를 만들어 보면 변수에 값을 넣고 그 값을 이용해서 배열을 사용할 수도 있는지 없는지를 확인해 볼 수 있겠지? 돌려보고 결과 알려줘봐"
"네... 잘 돌아가네요. 그럼 배열을 이용할때 구체적인 값인 0 1 2 를 꼭 쓰지 않고 변수에 대입된 값을 이용해서 작성할 수도 있는 것이군요?"
"오케이! 바로 그거야 그러면 내가 준 과제 할 수 있겠지?"
"음 ... j 값이 0 1 2 로 바뀌니까 l[j] 를 써서 고치면 이렇게 하면 되는거겠죠?"
int main() {
int l[3];
int j;
l[0] = 100;
l[1] = 200;
l[2] = 300;
for( j = 0 ; j < 3 ; j++ ) {
printf("%d\n" , ㅣ[j] );
}
return 0;
}
"그래 그렇게 하면 되는거야. 잘 했어 ㅎㅎ 여기서 한번 생각해 보자. 만일 배열의 크기가 1000 정도로 크게 잡혀 있다고 하면 반복문은 다 고쳐야 하니? 아니면 거의 고치지 않아도 되니?"
" j < 3 에서 반복하는 조건이 결정되니까 j < 1000 으로만 고치면 다른 곳은 고칠 필요 없어져요"
" 오케바리 바로 그거다. 그래서 반복문을 이용해서 배열을 출력하는 코드가 더 좋은 코드가 되는거다."
이렇게 가르친다는 거다....
"자 그러면 문제 다 풀었으면... 위의 코드를 이렇게 고쳐서 돌아가는 거 한번 확인해 보자"
int main() {
int l[] = { 100, 200, 300 };
int j;
for( j = 0 ; j < 3 ; j++ ) {
printf("%d\n" , ㅣ[j] );
}
return 0;
}
"자 결과가 어떻게 나오는감?"
"똑 같이 나옵니다"
"그러면 int l[] = { 100, 200, 300 }; 이라고 적은 코드는 어떤 의미의 코드인지 설명하자면?"
"3개 변수가 연속된 배열을 만들고 각각의 배열 요소에 100 200 300 을 대입하는 걸 한 문장으로 할 수 있다는 얘기 맞나요?"
"어 바로 그거야. 해서 배열을 생성할때 코드가 많이 길어지는 걸 저렇게 줄여서 쓰면 코드가 읽기 편해지지. 저런걸 다이나믹 어레이... 라고 하기도 해. 해서 오늘 어제 배운 배열의 개념에 새로운 개념 하나를 더 배웠다... 자 노트정리들 할 시간 줄테니까 노트 정리 하자."
.....
사실 선행학습이 되어있거나 아니면 머리가 아주 좋은 아이들이라면 그냥 문제를 풀었을 수도 있다. 아마도 그랬을 것이다. 하지만 그냥 보통의 머리 정도를 가지고 있는 애들이라면 특히 기본을 익히는 단계에서는 신중하게 많이 생각하면서 많이 경험하고 또 경험으로 배운것들을 정리하고 적고... 그러면서 까먹은거 다시 외우면서 한발 한발 조금씩 전진하는게 필수적이다.
하지만 "짧은 기간안에 많은 걸 가르쳐서, 취업때 좀 있어보이게 포장해서, 그 포장의 힘으로 취업률을 조금이라도 올리고 올려서, 그 취업성과를 가지고 성공한 과정을 인정받으려는" 욕심이 앞선다면 아마도 처음 코딩을 접하는 아이들은 힘들어 할 수 밖에 없다. 정말 중요한건 앞으로의 최소한 10년 이상을 살아남을 수 있는 기본기라고 생각하는데 그런 기본기는 많이 가르쳐서 되는 게 아니다. 많이 가르친다고 해서 머리속에 들어가지도 않는다.
이전 글에서도 분명히 이야기 하지 않았는가... 가르치고 싶은 걸 가르치지 말고 ( 포장을 잘해서 성과를 내고 싶은 마음에서 과정을 만들지 말고 ) 정말 저들에게 필요한 것을 가르치는게 맞다고 말이다...
해서 필자는 이야기하는게... 보통의 머리를 가지고 있는... 코딩을 경험해보지 못한 아이들을 대상으로 가르친다고 생각했을때 그네들이 할 수 있는 최대한의 노력을 가지고 "코딩을 해 낼 수 있는 방법" 을 보여 주는 것이 선생의 의무이고 또 그렇게 선생이 가르칠 수 있도록 행정과 정책은 도와주어야 한다고 생각을 하는데... 아쉬울때가 정말 많다. 설사 교육기관이 '성과를 내기 위해 그럴듯 해 보이는 걸 많이 집어넣고 싶어하는' 마음을 가지고 있다 하더라도 정부에서 그런 걸 지혜롭게 컨트롤 할 수 있고 또 그래야 하는 건데, 솔직히 이 바닥에서 먹고 살면서 보면 그런 정부의 역할이 아쉽다는 게 느껴진다. ( 사립학교에게 자율을 주면서도 또한 그 자율로 과도한 일이 벌어지지 않도록 할 수 있는 것도 정부가 할 수 있는 일 아닌가? 그런 역할을 왜 학원에 하지 못하는가... 아주 간단한 방법이 있는데 말이지... )
정부에서 지원을 운영하는 부서도 사실 국민이 낸 세금 받아서 운영하는 곳인데... 그런 곳이 교육 현장을 ( 구체적으로 말하자면 교실에서 공부하는 학생과 선생님을 ) 도와줄 생각을 하는게 아니라, 감시 감독을 넘어서 지휘할 생각을 하는 것 같다. 이건 이렇게 해야 하고... 저건 저렇게 해야 하고...
코딩에 대해서도 모르고, 교육에 대해서도 모르고, 개발 현장에 대해서도 모르는 사람들이 주도권은 죽어도 놓기 싫어하더라는...
그런 느낌을 받을 때면 마치 자신들이 그 자리에 있을때 "이렇게 했더니 나는 과거에 이 자리에 있었던 사람이 해 내지 못한 성과를 더 적은 예산을 들여서 해 낼 수 있었다" 라는 것을 과시하기 위한 일들이 많아보이는 건... 필자가 삐딱해서 일른지 모르겠다...
하여간 그렇다. 필자는 기초를 튼튼히 하는 단계에서 바닥에서 차곡차곡 쌓아가는 걸 굉장히 중요하게 여긴다.
"여기에서 부터 시작한다. 그리고 시작지점에서 외운 코드부터 적고 시작하자. 그러면 구체적으로 생각할 수 있다. 아무런 코드를 보지 않고 머리로 모든 결과를 만들어 낼 수 있는 사람이라면 꽤 숙련된 프로그래머 이거나 아니면 코딩할 수 있는 두뇌를 타고 난 걸로 봐야 하는데, 솔직히 너희들이 그렇게 대단한 사람일 필요는 없다."
"다만 외워야 할 것을 외우고 거기에서 출발 할 수 있도록 기억하고 타이핑하고 돌려보면서 생각하면 그걸로 어떻게든 될 수 있다고 나는 생각하거든... 그래도 된다. 보통 머리 가지고도 코딩으로 먹고 살수 있어. 오케이?"
이게 필자가 외워야 하는 것을 강조하는 이유다.
단단한 시작지점은 생각에서 불안함을 없애 주고 집중할 수 있게 해 준다.
그리고 그 단단한 시작지점은 외우는 것에서 부터 시작하는 것이 바람직하다.
까먹으면? 또 외우면 된다. 몸에 밸 때 까지!! 마치 숨쉬는 것 처럼 자연스럽게 될 때까지 반복 또 반복.
이렇게 하면 보통의 머리로도 코딩이 가능한데....
필자가 위에 적은 교실안에서의 이야기가 전혀 이해가 안가고 뭐가 뭔지 도통 모르겠다... 라고 한다면
솔직히 그런 사람들은 코딩 안배우는 게 나을 수 있다고 본다. 그건 부끄러운게 아니다.
노래 못하고, 스케이트 못하는 게 부끄러운 게 아니듯이
코딩도 재능이 있고 하고 싶어하는 애들만 하면 되는 거니까... 말이다.
코딩 안해도 먹고살 수 있는 길은 얼마든지 있다.