좋은 프로그래머를 만드는 마법서, SICP
마이크로소프트웨어 2002년 8월호에 기고한 글을 옮겼다.
이 글은 내 개인 경험에 바탕을 둔 서평이자 추천이다. 뒤에 프로그래밍 교육 관점에서 비평한 글 ‘SICP, 그리고 HTDP‘을 같은 잡지에 (아니면 프로그램세계에?) 기고하였다.
내가 이 책을 처음 본 것은 학생 시절이다. 당시 이 책이 신입생에게 프로그래밍을 가르치는 교재로 사용되고 있었기 때문에, 강의를 들으며 이
책을 공부하는 기회를 얻을 수 있었다. 지금이야 그 기회가 큰 복이었다는 사실을 잘 알고 있지만, SICPHarold Abelson and Gerald Jay Sussman with Julie Sussman, Structure and
Interpretation of Computer Programs, 1st ed., 1984, MIT Press
씩피라고 읽거나 **마법서(wizard book)**로 별칭하기도 했다.
2008년부터 MIT에서도 안쓴다. Gerald Jay Sussman, SICP: the end of an era, 2021. 12. 21
내가 쓰던 SICP. 1984년에 MIT Press에서 출간한 프로그래밍 입문서다. 그로부터 12년 후인 1996년에 두 번째 판이 나왔으니,프로그래밍을 주제로 삼아 이리 오랫동안 읽혀온 책도 드물지 싶다. 그야말로 프로그래밍 과학 분야의 고전이라 할만한 책인데, 모르긴 해도 우리나라에선 그리 인기를 얻지 못한 듯 싶다.
의 가치를 깨닫기까지는 그저 황당한 경험일 뿐이었다. 처음 접했을 때, 이 책의 내용은 독특하다 못해 고집스러워 이해하기가 쉽지 않았다. 강의를
들을 때는 그나마 고개를 끄덕이는 척이라도 하겠는데, 다시 보고 내 손으로 문제를 만지려고 하면 도대체 어디서부터 어떻게 생각을 밟아가야 이
책에서 볼 수 있는 그런 프로그램 구조를 얻을 수 있는지 어림잡을 수가 없었다. 거기다 매주마다 해결해야 할 연습문제가 고학년인 내게도
부담이었을 정도이니, 놀기 바쁜 신입생들에게는 어림없는 요구였다.
다른 측면에서 한 가지 더더욱 이해가 가지 않는 것은, SICP가 채택한 이상한 프로그래밍 언어였다. Scheme이라 불리는 이 언어는 LISP의 방언이라는데, 그동안 써오던 언어와는 너무 달라서 이걸로 뭐 쓸만한 프로그램을 만들 수나 있을까 의심이 들었을 정도다. Scheme이란 언어를 배우는 데는 정말 하루가 걸리지 않았다. (그때까지만 해도) 작고 가벼운 언어는 아무래도 초보가 쓰는 게 아니겠냐는 생각을 옳다고 믿었기 때문에, Scheme은 충분히 무시해도 될 만한 장난감 같았다. 또 산업에서 잘 쓰지도 않는 언어를 가르쳐서 무엇하나 싶어 한동안 후배들을 모아놓고 섣부른 비판을 하기도 했다. 그러나 수업이 약 반 학기 가량 진행되면서부터는 이 책의 재미가 조금씩 느껴지기 시작했다. 쓸모 있는 내용인지 어떤지는 모르겠지만 이 책이 소개하는 여러 가지 프로그래밍 아이디어가 정말 굉장하다는 생각을 하게 된 것이다. 이듬해 다시 한번 이 수업을 듣게 되었을 때 비로소 이 책의 목적이 지금까지 보던 것과는 바탕부터 다르다는 점을 알게 되었다. 좁은 생각을 가두고 있던 어설픈 벽은 SICP에 의해 여지없이 무너져 내렸다.
SICP는 프로그래밍 입문서다. 난이도의 적정성에 대해서는 예전부터 논란이 많았지만, 분명 처음으로 프로그래밍을 배우는 이들을 깊이 배려해서 쓴 책이라는 점에는 재론의 여지가 없다. 다만 그 “프로그래밍"에 대한 생각이 흔히 보는 다른 책과 아주 많이 다를 뿐이다. 예를 들어 “얼마 안에 어떤 언어 배우기” 식의 책과는 아예 근본이 다르다. 또, 특정 언어나 이론을 초급부터 고급까지 단계별로 집중 연습시키는 책은 더더욱 아니다—사실 대부분의 대학 프로그래밍 입문은 이런 방식을 따른다.
SICP는 종합적인 책이다. 패러다임도 하나만 쓰지 않는다. 상태를 가진 객체, 함수, 논리, 관계, 병행성, 비결정성, 소극 계산법 등 여러 계산 모델을 총동원한다. 취급하고 있는 응용분야도 다양하다. 수치해석, 심볼 연산, 디지털 회로 시뮬레이션, 인터프리터, 그래픽스, 컴파일러 등을 총망라한다. 그러나 내용이 많아 수박 겉핥기로 지나치겠지라고 생각하면 오산이다. 하나하나를 전문으로 다루는 교재에 비하면 덜하겠지만 각각의 아이디어와 이치에서 핵심은 심도 깊게 다뤄지고 있고, 모자라는 부분은 교재와 유기적으로 결합된 예제를 통해 배우는 이 스스로가 도전하고 보충할 수 있도록 안배해 두었다. 무엇보다 이 모든 주제가 한 가지 목적을 달성하기 위해 묵직하게 흘러가기 때문에 산만하지 않은 점은 다른 책에서는 찾아보기 어려운 이 책만의 장점이다.
우리의 목표는 학생들이 이 과목을 끝마치고 나서, 프로그래밍의 미와 스타일을 구성하는 여러 구성 요소에 좋은 감각을 가질 수 있도록 만드는 데 있다. 학생들은 하나의 큰 시스템 속의 복잡도를 제어하는 데 필요한 주요 기술을 다룰 수 있어야만 한다. 만약 틀에 박힌 대로 쓴 것이라면, 50페이지 정도 되는 프로그램을 읽을 능력이 있어야 한다. 또 읽지 말아야 할 게 무엇이고, 어떤 시점에서는 이해할 필요가 없는 게 무엇인지 알아야만 한다.
바로 이것이 SICP를 공부하는 이유다.
SICP에 대한 여러 사람의 의견들 #
자기가 좋아하는 책을 남들이 어찌 생각하나 살펴보는 일도 때로는 재미있다. 그래서 나는 새로 책을 살 때는 물론이고, 이미 가지고 있는 책에 대해서도 시간을 내어 독자 서평을 거의 다 읽어보는 편이다. 독자가 일정량을 넘어가게 되면 그보다 더 객관성 있게 책의 질을 평가내릴 수 있는 근거 자료는 없을 것이라 믿는 이유에서다. 특히 SICP에 대한 독자 서평은 정말 독특해서, 어떤 글은 책 자체만큼이나 시사하는 바가 크다. 나는 그중에 마음에 드는 서평을 엄선해서 스크랩해두었다. 이어지는 서평을 읽노라면, 마치 뉴스그룹에서 첨예한 의견 대립을 보이는 격렬한 쓰레드를 읽어내려가는 듯하다. 크게 엇갈린 의견은 그칠 줄을 모르고 1996년부터 2002년까지 이어져 있다. 한 독자의 서평이다.
이 책을 정말 좋아하는 사람과 죽도록 싫어하는 사람이 이런 식으로 갈려 있다는 게 신기합니다. 서평 대부분이 별 다섯 개(최고)이거나 별 한 개(최저)지 그 중간인 경우는 드물더군요. 어쩌면 이렇게 될 수 있을까요?
참말 서평이 양쪽으로 이렇게나 갈리는 경우도 많지 않을 것이다. 어떤 이는 “여태 본 책 중 최고"이며 “기념비적 책"이라고 찬사를 아끼지 않는가 하면, 다른 이는 “확실한 시간 낭비"고 “흔하고 쓸데없는 말을 주절대는 책"이라며 더할 수 없는 혹평을 해댄다.
도대체 SICP의 어떤 특성이 그리도 엇갈린 평가가 나오게 만들었을까? 아마 내 글을 읽고 이 책에 도전하는 독자들도 상반된 양극의 견해로 대립하게 될지 모른다. 그러나 제대로 이 책을 공부한다면 아래의 독자와 마찬가지 경험을 하게 될 가능성이 많다. (말하자면 나는 SICP 스타일의 책을 아주 사랑하는 사람이다. 그러니 이 글을 쓰고 있겠지만.)
학생시절에는 이 책을 정말 싫어했습니다. Scheme을 배워야 한다는 것도 끔찍했습니다.
(그러나) 지금은 이 책을 아주 좋아합니다. 프로그래밍에 관해 아주 깊이 있는 얘기를 담고 있기 때문입니다. (중략) 난 이 책을 공부하면서 프로그램이 어떻게 움직이는지에 관해 정말 많은 것을 배웠습니다. 연습문제를 풀어가는 과정에서 계속 생각하는 노력을 기울인다면 여러분도 같은 성과를 얻게 될 것입니다. 연습문제를 풀어보지 않으면 뭔가 얻을 게 없습니다.
(중략)
학생시절 이 책을 본 다음에, 절대 팔아버리지 마십시오. 꼭 보관하세요. 그리고 4, 5년 정도 프로그래머로 활동한 후에 다시 한번 읽어보세요. 이번에는 틀림없이 좋아하게 될 것입니다.
또 다른 독자는 왜 SICP가 고생해서 공부할 만한 가치가 있는 책인지 다음처럼 말한다.
이 교재가 쉽지는 않습니다만, MIT나 Berkeley에서 입문서로 쓴다고 해도 놀랄 필요는 없습니다. 물론 정말 열심히 노력해야 이 교재의 수준과 진도를 겨우 따라잡을 수 있겠지만, 고생에는 그만한 보상이 따라옵니다; 결국 이 책은 독자로 하여금 이론과 실제, 양면에서, 다른 어떤 컴퓨터 과학 서적과도 견줄 수 없을 만치 광범위한 주제를 철저하게 다뤄 보도록 만듭니다.
그리고 초보자만 그런 보상을 얻는 것은 아니다.
이 책은 컴퓨터 과학의 위대한 고전이지요. 제가 이 책을 15년 전에 한 권 샀습니다만, 아직도 가르치고자 하는 모든 걸 다 배웠다고 생각하지 않습니다.
내 경험도 이 사람과 같다. 입문서임에는 분명한데, 세월이 갈수록 경험 많은 엔지니어에게 더 많은 감명을 주는 책임을 부정할 수 없다. 점차 저자의 의도가 더 잘 이해되고 경험으로 공감하게 되는 진리가 많아지기 때문에, 책을 다시 볼 때마다 미처 찾지 못했던 내용을 새로 발견하게 되는 기쁨이 있다.
SICP를 고르기 전에 #
이 책에 대해 부정적인 견해를 가지는 사람도 적지 않다. 대부분 소문을 듣거나 추천을 받아 이 책을 보게 된 경우로, 스스로 찾고자 하는 것이 무엇인지 몰라 애궂은 책을 나무라는 경우라 할 수 있다. 그러나 학습 목적에 맞는 질 좋은 책을 골라 보는 것은 독자의 책임이다. 그리고 만일 이 책을 교재로 선택하고자 한다면 배우는 학생들의 수준과 성향에 따라 학습 동기를 놓치지 않도록 준비를 철저히 해둘 필요가 있다. 아니라면 온라인 서점마다 이 책에 대한 어거지 서평이 꼬리를 물게 될런지도 모른다.
이제 몇 사람의 서평 속에 숨어 있는 충고를 들으면서, 이 책의 성격이 자신의 학습목적에 맞는지 미루어 짐작해 보자. 그리고 가르치는 이라면 준비가 덜 된 학생들에게 어떻게 이 책을 공부하도록 설득할지도 함께 고민해야겠다.
코딩과 프로그래밍의 차이점. 그냥 코드를 쓰고 싶을 뿐이라면,뜻은 알겠지만 이런 말 장난은 좋지 않다. 오해만 커진다. 그냥 써도 되는 코드란 없다. 코딩과 프로그래밍은 같은 뜻 다른 말이다. 달리나 뛰나 그게 그거다. -2026 이 책을 읽지 말라. 그런 독자는 이 책을 이해하지 못할 것이고, 오로지 불평만 늘어놓을 것이다. 대신에 “21일 안에 C++ 자습하기” 식의 제목이 붙은 많은 책 중에 하나를 골라 읽는 게 낫다.
이 책의 유용성은 즉시 드러나지 않는다. 말하자면 이 책은 소프트웨어를 만드는 방법에 관한 책이 아니다. 그래서 나는 많은 소프트웨어 엔지니어들이 이 책을 무시하는 것을 봤다. 제시된 코드 대부분이 실제 소프트웨어 엔지니어링 프로젝트와 비슷한 비즈니스 로직이 없다는 이유에서다. 심지어 이 책이 설명하는 많은 개념조차도 일상에서 써먹을 수 없는 것들이기 때문이다.
그러나 끝끝내, 이 책은 내가 지금까지 보아온 것 중에 컴퓨터 과학과 소프트웨어 엔지니어링의 어려운 부분들을 설명하는 데 있어 내가 그려왔던 것에 가장 가까웠다. 이 책은 드러내어 논하지는 않지만 패턴에 대한 책이다. 설계 과정을 그리 대놓고 다루지는 않지만 소프트웨어 설계 방법을 잘 다루고 있다. 이 책이 제시하는 추상
화기법과 “메타"의 개념처럼, 이 책은 프로그래밍을 배우는 방법을 어떻게 배울 것인지 가르치고 있다.
다시 말하지만 SICP는 오로지 “프로그래밍이 무엇인가?“를 제대로 소개하고 연습시키는 데 충실한 책이다. 프로그래머로 하여금 쓸만한 프로그램을 만들도록 구체적인 문제의 공략법을 알려주는 것은 이 책의 목적이 아니다. 좋은 프로그래머가 되고 싶은 이에게 가장 중요한 소양—주어진말과 글에서 ‘주어진’을 버릇처럼 붙인다. 내 생각엔 Given의 번역투다. 우리말과 글에서는 굳이 안 붙여도 된다. 빼는 게 훨 낫고, 그래도 뜻을 온전히 전달하는 데 문제가 않될 때가 더 많다.
문제의 해결책을 프로그래밍 언어로 잘 표현해내는 능력을 스스로 키울 수 있게끔, 프로그래밍의 사고를 제대로 갖춘 프로그래머를 길러 내는 책이다.
사실, SICP가 어떤 프로그래밍 책인지 설명하기는 정말 어렵다. 그만큼 논란의 여지가 많은 책이다. 그래서 직접 읽어보는 것으로도 이 책을 논할 자격은 불충분하다 하겠다. 나로서도 이 책의 가치를 이러쿵저러쿵 내 산만한 말로 어설프게 묘사하고 싶지는 않았다. 그래서 여러 사람의 서평을 빌어 SICP의 가치를 설명하고자 애썼다.
이제 ‘호그와트’로 가는 기차를 탈지 말지는 독자 여러분의 결정에 달려 있다.
고쳐 쓴 날 : 2026-02-03