2008. 1. 11.

SICP에서 알짜배기가 되는 가르침

책을 읽어서 얻고자 하는 것, 얻을 수 있는 것, 얻게 된 것은 사람마다 다 다르다. 하지만 나는 감히 말한다. SICP란 책의 알짜배기는 다름 아닌 아랫 구절에 있다는 것.

The technology for coping with large-scale computer systems merges with the technology for building new computer languages, and computer science itself becomes no more (and no less) than the discipline of constructing appropriate descriptive languages.

커다란 컴퓨터 시스템을 다루는 기술이 새로운 컴퓨터 언어(셈말)를 만드는 기술과 하나로 묶이면, 컴퓨터 과학에서 하는 일이란 넘침도 모자람도 없이 그저 그에 알맞은 말을 만들어 내는 기법을 다루는 일에 지나지 않는다.


그리고 이 책은 첫머리서부터 이렇게 말하며 시작한다.

Every powerful language has three mechanisms for accomplishing this:

- primitive expressions, which represent the simplest entities the language is concerned with,
- means of combination, by which compound elements are built from simpler ones, and
- means of abstraction, by which compound elements can be named and manipulated as units.


간추리자면, 프로그램을 짠다는 것은 한 분야에 지식을 담을 컴퓨터 언어를 만드는 일과 같고, 좋은 컴퓨터 언어를 만드는 일은 그 언어가 갖추어야 할 세 가지 것을 잘 그려내는 데 있다. 해서, 이 책은 처음부터 끝가지 오로지 하나, 새로운 컴퓨터 언어, 셈말 만드는 일을 한다.

첫 절에서는, 언어 만들기에서 가장 큰 일을 하는 움직씨(동사)만드는 일을 한다. 프로시저가 바로 움직씨다.
그 다음 절부터는 곧바로 언어를 만든다. 유리수 셈말, 복소수 셈말, 구간치 셈말, 다항식 셈말, 글자 미분식 셈말, 스택 셈말, 큐 셈말, 표 셈말, 같기식(equation) 셈말, 전자 회로 셈말...

또한 여러 셈말을 모아서 하나의 셈말로 엮어내는 연습도 한다. 보통 Generic Programming이라고들 하지. 낱말, 쓰임새, 생김새가 서로 다른 셈말을 한 셈말로 어우러지게 하려면 어찌 해야 좋을지를 가르친다. 더욱이, 말이란게 어디 가만히 있나, 자꾸 자꾸 바뀌고 늘어나게 마련이지. 그러려면 솜씨 좋은 옛 말쟁이들이 어떻게 좋을 말을 만들어 냈는지 마땅히 익히고 배워야 할 일이지.

이어서는 같은 말이라도 어떻게 하면 더 맛갈지고 쌈박하고 쉽고 또렷하게 뜻을 나타낼 수 있는지를 가르친다. 해서, 빨리 셈하는 법, 미루었다 셈하는 법, 제 때 셈하는 법, 논리에 따라 셈하는 법 따위를 가르친다. 이는 사람이 제 뜻을 펴기에 더 좋은 셈말을 어떻게 만드느냐를 다루는 대목이다.

다음에는, 컴퓨터가 새로 만든 말을 어떻게 떠 빠르고 쉽게 알아듣게 만들런지 가르친다. 그래서 만드는 것이, 셈말(Computer Language)을 틀말(Machine Language)로 알아서 바꿔주는 가짜 틀(Virtual Machine)이다.

따라서, 난 이 책을 읽고도 이를 깨닫지 못한다면 헛 공부했다고 본다. 한 술 더떠, 좋은 프로그램 짜는 일이 좋은 셈말 짜는 일이랑 같은 것임을 모르는 이는, 소프트웨어 설계를 가르칠 자격이 없다고 본다.

다시 말하건데, 프로그램 짠다는 것은 한 분야의 지식을 제대로 틀림없이 멋드러지게 나타낼 수 잇는 셈말을 만드는 일이다. 그게 다다. 그래서 이 책은 오로지 그 일을 잘하는 방법을 익히도록 꾸며져 있다. 나머지 모든 겉멋든 이름, 무엇보다 이 분야가 지나친 감이 있는데, 어쨌거나 번쩍거리는 이름이 잔뜩 붙어 있는 기술들은 다 여기서 갈라져 나온 것일 따름이다. 이 책의 가르침을 또렷이 깨우친 다음에, 그 사이 배웠던 모든 것을 그에 비추어 돌이켜 보라. 어디가 뿌리이고 어디가 가지인지가 시원하게 보일터다.

하면, 그리 쉬운 것을 왜 이 책에서는 이렇게 길고 어렵게 풀이하고 있을까? 프로그램 짜는 일이, 새로운 셈말을 만드는 일과 같다고 말했다. 말과 글이란 아는 것을 나타내는 틀이다. 거꾸로 말해, 먼저 뭘 제대로 알고 있어야, 비로소 그 아는 것을 나타내는 틀 또한 만들 수 있다. 알지 못하는 것은 못 나타낸다. 영어로는 이를 Domain Knowledge라고 하지. 아니, 적어도 나타낼 것이 참말 무엇인지를 잘 아는 사람이 옆에 붙어는 있어야 한다. 영어로는 이를 Domain Expert라고 하지. 따라서 좋은 셈말 아니, 좋은 프로그램 짜는 일을 가르치려면 마땅히 말로 나타내야할 곧 아는 것이 있어야 하고, 그 아는 것, 나타내야 할 것, 더 잘 나타내는 방법이란 얼마든지 많기에 이 또한 배워야 한다. 이를 배우는 방법이란 딱 하나, 남의 것이든 내 것이든, 아는 것을 가져다 이를 나타내기에 알맞은 셈말을 끝없이 만들어 보는 길 말고는 없다.

내 말이 잘 와닿지 않으면, 우리가 배운 엉터리 영어 교육을 떠올려 보라. 왜 우리는 그토록 죽어라 영어 공부를 하고서도 제 바람 만큼, 품들인 만큼, 돈들인 만큼 말도 썩 잘하지 못하고 글도 잘 못쓰는가? 영어 또한 속에 품은 뜻을 나타내려고 사람들이 만들어낸 말이다. 또 말하건데, 아는 것을 나타내려고 만들어낸 틀이 바로 말이다. 따라서 아는 걸 나타내는 연습을 해야함에도, 우리는 미친듯이 멍청하게 영어 그 스스로를 파헤쳤다. 우리가 배우고 익혀야 할 것은, 영어를 더 좋은 말로 다듬고 고치는 기술이 아니라, 영어를 써서 내가 아는 것, 밝혀 낸 것을, 되는 한 또렷이 제대로 재미있게 살아있게 나타내는 좋은 버릇을 들이는데 있다. 한데, 우리는 영어로 말하는 공부를 한 적이 없다! 그래서 영어를 못하는 것이다.

한 편, 영어를 잘 한다고 치자. 그런데 뭐 아는 게 있어야 말을 하지! 영어를 잘 알면, 갑가기 조지 부시 대통령과 이라크 문제에 대해 막힘없이 말싸움을 할 만치 똑똑해 지는가? 우리네 먹을 거리에 대해서 아무 것도 모르던 사람이, 갑가지 오프라 윈프리 쇼에 나가서 술술 그런 얘기 보따리를 풀어 낼 수 있단 말? 그러니까, 영어만 알면?

좀 달리 말해 보랴? 피아노 건반에서 도레미파솔라시도를 알고, 딱 듣기만 해도 어떤 소리인지를 잡아내는 귀가 있다고 해서, 갑자기 교향곡을 지어낼 수 있는가? 그 것도 사람들을 기뻐하게, 눈물짓게, 방방뛰게 만들 만치, 뛰어난 가락으로?

이제부터 우리 좀 말이 되는 얘기를 하고 살자.

프로그램 짜기도 이와 같다. 프로그램 잘 짜려면, 프로그램 짜는데 쓰는 말을 배우는데 들이는 품을 되는한 줄이고, 그 말로 다른 새끼 말(Embedded Language, 길게 쓰자면 Domain-Specific Embedded Language) 만드는 연습을 죽으라고 해야한다. 그래서 이 책에서는 그토록 많이 알아야 할 것이 나오는 것이다. 새끼 말 만드는 연습을 하려면, 그 말로 나타낼 거리(Domain Knowledge)가 마땅히 있어야 하니, 어쩔 수 없는 일 아닌가! 어떻게 나타낼 거리가 무엇인지를 알지 못한 채로, 말 만드는 힘을 기를 수 있는가? 말 만드는 힘을 기르는데, 그 밖에 도데체 무슨 더 나은 길이 있는가?

요사이 Software Engineering에서는 Domain-Specific Modeling이니 Domain-Specific Language니 하는 말이 숱하게 나온다. 감이 오는가? 이 책은 아주 오래 전에, 곰팡내 날만큼 아주 아주 오래 전에 지겨워 쓰러질 정도로, 한 치도 틀림없이 똑 같은 얘기를 줄기차게 하고 있었다.

댓글 4개:

Kizoo :

이 글은 아직 덜 다듬은 글입니다. 고칠 곳,보탤 얘기가 있다면 언제든 말하세요. 제 마음에 글이 차면 이 덧글을 지우겠습니다.

익명 :

좋은글 잘읽었습니다.
늦은나이에 프로그래밍에 입문해서 나름대로 기본기를 다지기위해서 고른책이 SCIP번역서 입니다. 그런데 혼자 독학하기가 쉽지않아서 도움되는 자료를찾아 웹서핑하다가 우연히 들르게 되었습니다. 그런데 감사하게도 동영상 강의를 만들고 계시더라구요. 유투브에는 3장 강의밖에 없어서 1장부터의 강의를 공유받을 수 있을까해서 코멘트 남깁니다. 코멘트로 답변부탁드립니다. 여러가지로 감사드리고 수고하세요~^^

Kizoo :

요사이 번잡한 일이 많아서 동영상 만들 틈이 없었답니다. 곧 만들어 올리게 되면 여기다 소식 전할게요.

익명 :

"my God, i imagined you had been going to chip in with some decisive insght at the end there, not go away it with ‘we depart it to you to decide’"

--------------------------------------------
美国留学生
Also welcome you!