한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

선정 이유

별명이란 그 대상에 대한 애정이 있어야 생길 수 있다. '마법사 책(Wizard Book)'이라는 멋진 별명이 붙은 책이라면 제대로 소화를 못 할지라도 시도할 가치가 있다고 생각했다. 이러한 별명이 붙은 이유는 원서의 표지 때문이기도 하지만 저자들이 프로그램을 마법으로 프로그래머를 마법사로 바라보기 때문이기도 하다.

이제부터 우리가 공부할 것은 계산적 과정(computational process)이라는 아이디어이다. 계산적 과정은 컴퓨터 안에 사는 추상적인 존재이다. 과정은 점차 전개되면서 데이터라고 부르는 또 다른 존재를 조작하게 된다. 하나의 과정은 일정한 규칙들의 패턴에 따라 전개되는데, 그러한 패턴이 바로 프로그램이다. 인간은 프로그램을 작성함으로써 과정의 전개를 이끈다. 본질적으로 프로그래머는 자신의 주문(spell)들로 컴퓨터의 영혼을 불러낸다.

실제로 계산적 과정은 마법사가 생각하는 영혼의 개념과 아주 비슷하다. 영혼은 볼 수도 없고 만질 수도 없으며, 애초에 어떠한 물질로 만들어진 것이 아니지만, 마법사가 보기에 그 영혼은 엄밀히 실재한다. 마법사가 불러낸 영혼처럼 계산적 과정은 어떤 지적인 일을 할 수 있다. 질문에 답할 수 있고, 은행에서 돈을 지급하거나 공장에서 로봇 팔을 제어해서 세상에 영향을 미칠 수 있다. 우리가 계산적 과정을 불러내기 위해 사용하는 프로그램은 마법사의 주문과 비슷하다. 프로그램은 난해하고 비밀스러운 프로그래밍 언어로 만들어진 기호 표현식들로 세심하게 구성되며, 과정이 수행해야 할 과제들을 상세하게 서술한다.

— p. 43-44

또 다른 이유는 1984년 초판이 나올 때 사용된 Scheme이라는 언어가 아니라 JavaScript로 다시 쓰였기 때문이다. 프론트엔드 개발자로서 매일 자바스크립트를 다루기 때문에 익숙한 언어로 예제를 볼 수 있다는 점이 메리트로 느껴졌다.

주제 및 구성

이 책은 계산적 과정 다시 말해 프로그래밍의 원리에 대한 이해를 돕기 위해 추상화, 데이터, 모듈, 시간, 동시성, 비결정론 등 중요한 주제들을 포괄적으로 다룬다. 단순한 함수부터 작성하기 시작해 차근차근 복잡도를 높여가며 마침내 컴파일러까지 구현하는 과정을 따라가게 되는데 현실 세계의 복잡한 현상들을 프로그래밍하기 위해 사고방식이 어떻게 변화하는지 고민해볼 수 있다.

1장부터 5장까지 계산적 과정에 대한 모형이 변화하고 발전하는 모습을 소개하는데 이는 각 모형이 현실 세계의 복잡한 개념을 표현하기에 한계를 가지기 때문이다. 1장에서는 치환(대입) 모형, 3장에서는 환경 모형, 4장에서는 메타순환적 평가기, 5장에서는 명시적 제어 평가기 그리고 우리가 흔히 아는 컴파일러가 등장한다.

책은 이러한 모형들에 관해 설명할 때 다음과 같은 순서를 따르고 있다. 먼저 표현식을 사용해 개념을 이해하는 데서 출발한다. 이렇게 만들어진 설계를 자바스크립트 코드를 통해 동작하도록 구현한다. 마지막으로 이 구현에 대한 시뮬레이션을 만들어 검증하는 것으로 마무리한다. 중간중간 등장하는 풍부한 연습 문제는 독자들에게 스스로 학습하고 도전할 기회를 제공한다.

유익한 점

무엇을 기대했던 내 예상을 벗어났다. 1장에서부터 등장하는 함수는 주인공으로서 책의 마지막 장까지 함께한다. 데이터도 객체도 함수로 표현할 수 있다는 건 다소 충격적이었다. 컴퓨터 프로그램의 구조와 해석에 관해 설명하는 도구가 함수가 될 줄은 몰랐지만 함수에 대한 저자들의 깊은 이해와 함수의 무한한 가능성을 엿볼 수 있었다.

책 전반적으로는 여러 가지 새로운 관점을 제시하고 많은 질문들을 일깨워 주었다. 상수도 함수도 모두 추상화라는 것, 함수와 데이터는 다르지 않다는 것, 시간을 표현하는 방법에 상태뿐 아니라 스트림이 있다는 것, 추상화를 위해서 장벽이 필요하다는 것, 형식을 넘나드는 연산을 구현하는 것이 얼마나 어려운지, ...

프론트엔드 개발자로서 JavaScript나 React를 통해 알게 된 개념에 대해서도 다시 생각해볼 수 있었다. 용어가 직접적으로 등장하지 않는 경우도 있지만 호이스팅, 람다, TDZ, 실행 컨텍스트, 제너레이터, 디스패치, 제너릭 등 내가 이해하는 개념에 대해 설명하는 것이 맞나 추리해 나가는 것은 책을 읽으며 느낀 즐거움 중 하나였다.

아쉬운 점

1장부터 등장하는 수학 예제들은 큰 진입 장벽이라고 본다. 궁극적인 목표인 대규모 시스템 설계를 위해서는 수학적 엄밀함에 익숙해지는 것이 좋겠지만 대부분의 사람들에게 개념을 이해하기 위해 넘기에는 너무 큰 산으로 느껴질 것 같다. 하지만 쉽게 읽히지 않는다는 것을 염두에 두고 적극적으로 리소스를 활용한다면 아무리 어려운 책이라도 읽지 못할 이유는 없다고 본다.

또 하나의 아쉬운 점은 자바스크립트를 자바스크립트라 부를 수 없다는 것이다! 대부분의 개념을 설명할 때 함수 표현을 빌리기 때문에 파이썬이나 그 어떤 다른 언어로 쓰였더라도 크게 달라 보이지 않았을 것 같다. 이는 이 책이 특정 언어에 종속되지 않고 프로그래밍 그 자체의 원리를 설명하는 데 중점을 두고 있기 때문이다. 책이 다루는 주제가 쉽지 않기 때문에 스킴과 비교하면 어떨지 모르겠으나 자바스크립트라서 더 이해하기 쉬울 거라는 가정은 잘못된 것으로 판명 났다.

총평

책을 읽다 보면 저자들이 프로그래밍을 마법과 같이 경이로운 것으로 여기며 한 줄 한 줄마다 마법사가 스펠을 쓰듯이 주의를 기울인다는 걸 깨닫게 된다. 하지만 오늘날 대부분의 개발자들은 추상화 덕분에 하드웨어 수준 또는 로우 레벨의 소프트웨어 수준에 대한 이해 없이도 원하는 결과물을 만들어낼 수 있다. 최적화 덕분에 성능에 이상이 생기기까지는 성능에 대해 고민하지 않아도 된다. 이러한 경향은 프로그래밍을 이미 규격화된 공장에서 상품을 찍어내는 것처럼 느껴지게 한다. 하지만 어린 시절 드라이버를 손에 쥐고 전자 제품을 뜯어본 적이 있는 사람이라면 추상화라는 블랙박스를 한번 열어보고 싶을지 모른다.

추천 대상

  • 최근 인기를 끄는 함수형 프로그래밍의 가능성과 한계를 알고 싶은 사람
  • 작고 단순한 프로그램에서 복잡하고 큰 프로그램을 만들어 나가는 방법을 알고 싶은 사람
  • 다른 사람의 것을 가져다 쓰기보다 본인만의 언어나 컴파일러를 만드는 데 관심이 있는 사람
  • 이미 알려진 문제를 빠르게 해결하는 것뿐만 아니라 정답을 알지 못하는 문제를 해결하는 능력을 기르고 싶은 사람

참고 자료

이 책에 정말 관심이 있다면 책만 읽는 것보다 아래 리소스와 함께 활용하는 것을 추천한다.

책에서는 ECMAScript 명세에 따른 JavaScript를 그대로 사용하지 않고 하위언어인 Source라는 언어를 사용하는데 Source Academy의 Playground에서 이 프로그램을 실행할 수 있는 환경을 제공한다.

마찬가지로 Source Academy에는 SICP JS 원문도 공개되어 있으므로 영어로 읽는 데 거부감이 없거나 확신이 없어 내용을 훑어보고 싶은 사람들에게 추천한다.

사족

800쪽이 넘는 책을 약 2주 만에 읽어야 한다니. 연습 문제를 건너뛴 덕분이지만 사실 끝까지 읽을 수 있었던 것이 놀랍다. 한 달에 1권 읽는 것이 그리 어렵지 않을 거라 생각했는데 역시 쉬운 일은 없나 보다. 예제와 연습 문제를 볼 시간도 부족했고 이 서평도 하루 만에 쓰려니 잘못된 정보를 담고 있을까 걱정이다.

chatGPT가 등장한 시대에 추상화란 어떤 의미일까? React를 사용하는 프론트엔드 개발자로서 선언적(declarative) 프로그래밍이라는 개념에 익숙하다. 이처럼 이제는 원하는 결과가 '무엇'인지 설명하고 '어떻게' 프로그램을 구현할지는 chatGPT라는 마법사에게 맡길 날도 머지않은 것 같다.

감사하게도 2월 우수 리뷰어로 선정되었습니다! 뽑힌 리뷰만 해도 이렇게 많은데 각 도서마다 제출된 리뷰를 하나 하나 검토하기란 쉽지 않겠구나라고 느꼈습니다.

공개를 원하지 않는 분들이 있을 수 있으므로 다른 리뷰어분들의 링크는 숨김 처리하였습니다.

0개의 댓글