목요일, 12월 28, 2006

코딩 가르치기

현대의 교육에서 비참하게 실패하는 부분은 코딩 가르치기인것 같다. 실제로 대단한 내용이 없음에도 불구하고, 우리때 c 프로그래밍 랭귀지의 평균학점은 미적분학이나 물리I 보다 나빴던것으로 기억한다. 심지어 M$ 같은 돈있고 사람 많은데서 일한 Joel Spolsky 의 경우도 "학생들아 잡질하지 말고 c 나 지대로 열심히 배워라!" 라고 이야기한다. 면접을 들어가봐도 비슷하다. 랭귀지 컨스트럭트를 잘 이해하고 쓰기는 커녕 strcpy 도 못만드는 친구들이 수두룩하다.

이 문제에 대해서 나는 전혀 이해할 수 없었다. 코딩을 배운지가 너무 오래된지라, 코딩이 어렵다는것 자체가 이해가 불가능했던 것이다. 그러나 몇번 코딩 초년생들과 이야기 할 기회가 있었고 그 이유를 대강 감을 잡았다.

현 대의 코딩은 Dijkstra 의 "goto statement considered harmful" 에서 파생된 structured programming (구조화된 프로그래밍)에서 시작한다. 구조화된 프로그래밍의 사전적 정의는 제쳐두고, 어떻게 하는것이 '구조화된 프로그래밍'인가 하면, function(함수) 을 잘 사용해서 코딩을 하는것을 결국에는 뜻한다. OOP 도 고작해봐야 functional abstraction(함수를 이용한 추상화) 을 잘해서 유지 보수도 쉽고, 보기도 이쁜 코드를 만들자. 라는 취지에서는 그게 그거라고 볼 수 있다.

- 문제는 바로 이 함수를 이용한 추상화에 있다.

우리 두뇌가 문제를 푸는 방법은 어떤 반복되는 패턴을 블랙박스로 만들고 그걸 레고 블록 쌓듯이 쌓아 올라가는것을 즐기지 않는다. 해법은 철저하게 시작이 있고 끝이 있으며, 그 자연스러운 흐름을 따르는데, 함수를 이용한 추상화 보다는 순서도 형태에 적합한 형태인데, 이는 현대의 코딩 훈련도감인 구조화된 프로그래밍에 맞지 않는다.

엎친데 덮친격으로, functional abstraction 을 배우려면, 코드를 읽고, 쓸줄 알아야 하는데, 현대의 언어는 아무리 쉽다고 해도 숙지해야 될 요소가 많고, code 라고 불리듯이 이미 암호여서, 자기 생각을 코드로 만들고 꺼꾸로 읽는것을 익히는것 자체도 어려운일중에 하나가 된다.

그렇다면 코딩을 어떻게 가르쳐야 할까?

1. 코드를 찍어내는 공장에 취업하지 않을사람 (fortran/ matlab/ mathematica 를 쓰게 될 사람)

BASIC(original) 을 가르친다. BASIC 은 구조화된 프로그래밍에 반하고 파워풀 하지도 않지만, 뭔가 computer 로 하기에는 큰 지장없다. 재귀호출 안되는게 뭐 대수라고. 자연스런 문제해결과 코드사용이 맞아 떨어진다는것은 큰 장점이다.

2. 코드를 찍어내는 공장과 여러모로 관계가 생길 사람

이 분들은 어쨌든 structured programming 을 익혀야 한다. 그렇지 않고는 공동작업, 유지보수가 가능한 코드를 만들수 없다. 이쪽의 문제는 코딩을 잘하기 위해서는 functional abstraction 을 잘해야하고, 그 이전에 language 의 construct 를 익히는것 자체가 장애로 작용한다는 것이다. 이쪽의 방법은 langauge 의 construct 를 배우지 않고, functional abstraction 하는 방법을 intensive 하게 익히는 것이다. 언뜻 듣기에 말이 안되지만, 가능하다!

태초에 괄호가 있었다. scheme 을 배우면 된다. 이쪽은 language construct 자체가 거의 없을뿐 아니라, 다른 언어처럼 어설프게 자연어를 사용하여, 인간이 자연어스러운 추론을 하는것을 괄호가 애초에 배제한다. 이게 어려우면 선수과정으로 1번정도를 가볍게 해주는것은 어떨까? 함수를 사용한 추상화에 능숙해지면, 랭귀지 자체를 배우는 것은 어렵지 않다.

적합한 교재로는 어떻게 프로그램을 디자인할까? 를 추천한다


P.S: 다음은 이 주제에 대해 읽을만한 아티클이다.

왜 죠니는 코딩을 못하나요?

코딩 적성 테스트