프로그래밍 입문서의 문제점

모바일앱, 웹서비스 등을 스스로 만들어보려는 사람이 늘면서 코딩을 배우는 사람들도 늘고 있습니다. 페이스북 그룹 “생활 코딩”에 가입자가 4만명 이상 있고, 여러 온오프라인 행사들을 개최하는 것을 보면 코딩을 배우고자 하는 열기가 느껴지기도 합니다.

하지만 입문자들에게 코딩을 가르치는 방식을 보면 우려가 되는 부분이 있습니다. 많은 분들이 우려하는 전산 전공 지식이 아닌 “코딩”만 가르친다는 문제 제기를 하려는 것은 아닙니다. 코딩만 놓고 봐도 나쁜 습관을 가르치고 있는 것이 문제입니다.

가장 큰 문제는 변수를 값을 담을 수 있는 용기로, 변수 값의 변경(mutation)을 계산 방법으로 설명하는 것입니다. 다음의 생활코딩 JavaScript 강의 변수 편에서 인용한 변수에 대한 설명입니다.

변수(Variable)는 (문자나 숫자 같은) 값을 담는 컨테이너로 값을 유지할 필요가 있을 때 사용한다. 여기에 담겨진 값은 다른 값으로 바꿀 수 있다.

이 설명이 기술적으로 틀렸다는 뜻은 아닙니다. 컴퓨터 프로그램은 결국 메모리를 읽고 쓰면서 계산을 수행하기 때문입니다. 문제는 입문자들에게 프로그래밍을 “풀고자 하는 문제에 대한 답을 컴퓨터가 알아들을 수 있게 메모리 읽기/쓰기로 표현하라”고 가르치는 것입니다. 반복문에 대한 설명을 보면 이런 경향이 명확해 집니다.

다음은 생활 코드 JavaScript 강의 반복문 편에서 인용한 “coding everybody”라는 문장을 10번 출력하는 코드입니다.

var i = 0;
// 종료조건으로 i의 값이 10보다 작다면 true, 같거나 크다면 false가 된다.
while(i < 10){
    // 반복이 실행될 때마다 coding everybody
이 출력된다.
 줄바꿈을 의미하는 HTML 태그
    document.write('coding everybody
');
    // i의 값이 1씩 증가한다.
    i++
}

요구사항은 그저 같은 문장을 10번 반복해서 출력하는 것인데, 변수 i를 선언하고 while 루프를 돌면서 i를 하나씩 증가시키고 i가 10보다 작은지 판단해서 루프를 빠져나오는 코드를 예로 보이고 있습니다.

이미 이런 스타일에 프로그래밍에 익숙해지신 분들은 입문자들에게 이런 스타일로 프로그래밍을 가르치는 게 얼마나 저수준(기계에 가까운) 사고를 요구하는지 이해하기 힘드실 수도 있습니다. 위 코드를 다시 읽어 봅시다.

  • 변수 i가 가르키는 메모리 공간이 있고 이 공간에 값 0을 초기화합니다.
  • while 루프에서 변수 i가 가르키는 메모리 공간의 값을 읽어 이 값이 10보다 크면 루프를 빠져 나가고 아니면 다음 코드를 수행합니다.
  • 문자열을 출력하고, 변수 i가 가르키는 메모리 공간의 값을 읽어 1을 더한 다음에 이 값을 다시 변수 i가 가르키는 메모리 공간에 씁니다.
  • 다시 while 루프를 반복합니다.

변수 그 자체가 값이 아니라 메모리 공간에 대한 포인터 개념으로 설명을 하고 있고, 실제로 이 메모리 공간의 값을 변경해서 계산을 수행하고 다음 수행될 코드를 결정하기 때문에 얼핏 간단해 보이는 이 코드는 사실상 어셈블리에 가까운 코드인 걸 알 수 있습니다.

어떤 문자열을 10번 출력하는 프로그램은 다음과 같이 요구사항 그대로 말로 옮긴 코드가 되어야 합니다.

_.times(10, function () {
  document.write('coding everybody');
});

저는 입문자에게 변수라는 개념을 가르칠 때 단순히 이름 붙이기(바인딩)로 가르치는 것이 적절하다고 생각합니다. 예를 들어, 아래 코드에서 x는 10, y는 20, z는 10+20입니다. x는 10이라는 값을 담고 있는 메모리 공간, y는 20이라는 값을 담고 있는 메모리 공간, zx 메모리 공간이 담고 있는 값과 y 메모리 공간이 담고 있는 값의 합을 계산하여 그 결과를 담고 있는 메모리 공간으로 생각하는 것과 복잡도 면에서 큰 차이가 있습니다.

var x = 10;
var y = 20;
var z = x + y;

물론 어떤 프로그램이 값의 변경(mutation)이 없이 유용한 일을 할 수는 없습니다. 하지만 mutation은 프로그램이 복잡해지는 가장 큰 이유이고, 프로그래밍에 입문할 때부터 mutation이나 side effect는 꼭 필요한 경우에만 조심스럽게 하도록 가르치는 것이 필요하다고 생각합니다.

케이팝스타 같은 오디션 프로그램을 보면 심사위원들이 가장 큰 문제로 지적하는 것이 “나쁜 습관”입니다. 노래 연습을 열심히 한만큼 나쁜 습관은 더 고치기가 어렵고, 그래서 나이 어린 참가자들에 비해 성인 참가자들의 발전 가능성을 더 낮게 봅니다. 프로그래밍도 마찬가집니다. 사람은 튜링 머신이 아닌데, 모든 문제를 메모리 읽고 쓰는 문제로 보는 습관은 복잡한 소프트웨어를 작성할 때 가장 큰 걸림돌이 됩니다. 그리고 이런 사고 방식은 오래될수록 고치기 어렵습니다. 그래서 처음 프로그래밍에 입문할 때 어떻게 배우느냐가 중요합니다.

One thought on “프로그래밍 입문서의 문제점

  1. Pingback: 프로그래밍 입문서의 문제점 | 서광열의 코딩 스쿨

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s