GN⁺: 크래프팅 인터프리터스(Crafting Interpreters): 15개월 만에 완성한 640페이지 분량의 저서
(journal.stuffwithstuff.com)15개월 만에 640페이지 책 완성
- 2021년 7월 29일, 프로그래밍 언어에 관한 "Crafting Interpreters" 책을 완성함. 15개월 전에 완성했다고 했지만 이제는 진짜 완성됨. 인쇄본, e-book, PDF 버전 모두 완료되어 구매 가능해짐.
- 640페이지에 가로 8인치, 세로 10인치로 예상보다 훨씬 큰 책이 됨.
새로운 빌드 시스템 개발
- 한달 정도 휴식 후 다시 작업 시작. 독자들이 제보한 오타와 실수들 수정.
- 특별한 이유 없이 책의 빌드 시스템을 Dart로 새로 작성함. 기존 Python으로 만든 것은 너무 느리고 유지보수하기 어려웠음.
- 새 빌드 시스템은 원하는 대로 정확히 HTML과 syntax-highlight된 코드를 생성하고, 기존 Python 버전 대비 10배나 빨라짐.
- Markdown 처리를 더 잘 제어할 수 있게 되었는데, 당시에는 그냥 재미로 한 작업이었음.
책 디자인
- 큰 그래픽 디자인 프로젝트는 웹이나 게임 프로그래밍처럼 두 단계로 진행됨. 우선 "프레임워크"나 "엔진"을 설정하고, 그 구조에 콘텐츠를 넣음.
- Adobe InDesign에서는 스타일과 마스터를 설정함. 마스터는 페이지의 여백과 그리드 라인을 정의하고, 스타일은 CSS처럼 특정 텍스트나 오브젝트에 글꼴, 스타일, 색상을 지정함.
- 책 디자인은 문자 그대로 2차원 공간 작업임. 수평과 수직 방향 모두 쉽지 않은 작업이 됨.
너비와 높이 결정
- 메인 텍스트 열은 가장 긴 코드 라인을 수용할 만큼 너비가 필요함. Aside는 특정 문장 옆에 배치되어야 해서 공간이 더 필요함.
- 결국 8인치 폭의 페이지 메트릭을 사용하기로 함. 10인치 높이를 선택한 것은 POD (Publish on Demand) 업체에서 지원하는 사이즈 제약 때문.
- 전체적으로 크긴 하지만 너무 큰 느낌은 아니길 바람. 다음에 책을 쓴다면 더 작은 책을 쓰겠음.
XML 처리
- InDesign은 XML import를 지원함. 특정 태그에 자동으로 스타일을 적용할 수 있음.
- 마크다운 프로세싱을 완벽히 제어할 수 있어서 InDesign에 최적화된 XML을 직접 생성할 수 있었음.
InDesign에서의 JavaScript
- XML import만으로는 한계가 있음. Aside와 코드 위치 표시는 본문에서 빼내서 옆으로 배치해야 함.
- InDesign은 JavaScript로 스크립팅이 가능함. 하지만 디버거나 스택 트레이스 같은 건 없고 alert() 뿐임.
- 어찌어찌 Aside와 위치 태그를 뽑아내서 별도 텍스트 박스로 만드는 스크립트는 작성했으나, 정확한 위치 지정은 못했음. InDesign의 앵커 기능으로 어느정도 해결.
편집 작업
- 전체 책을 다시 한번 읽으며 편집함. 같은 말장난을 많이 반복한 걸 알게됨. 5개월 걸림.
- 전문 교정 편집자를 고용함. Word를 사용하는 편집 세계와 달리 나는 plain text와 Git을 고수함. 편집자가 잘 적응해줌.
조판 작업
- 조판 작업 과정은 다음과 같음:
- 다음 장의 새 InDesign 파일 생성
- XML로 export
- InDesign으로 XML import
- JS 스크립트로 Aside와 위치 태그 추출
- Sidebar 요소들에 앵커 지정
- 페이지 끝 부분 공백 조정
- 1~5 단계는 쉬웠으나 6단계가 가장 어려웠음.
- 그림이 잘리거나 Aside가 다음 페이지로 넘어가선 안되고, 가능하면 코드도 페이지에 잘리지 않아야 함. 헤더 아래 내용 없이 페이지가 끝나는 것도 피해야 하고, widow/orphan 피하는 것도 중요함.
- 630개나 되는 페이지에 이 규칙들을 모두 적용하는게 쉽지 않았음.
삽화
- 삽화는 비교적 쉬웠음. 흑백으로 펜으로 그렸기에 인쇄에 적합함.
- 하지만 페이지에 배치하는 건 또 다른 문제였음. 내 책은 삽화를 직접 참조하도록 글을 썼기에 삽화가 언급된 위치 근처에 삽화가 있어야 함. 그래서 630개의 페이지에 삽화와 코드, 본문이 잘 배치되도록 수작업으로 조정해야 했음.
앞/뒷부분 작업
- 전문 색인 작성가도 있다는 걸 처음 알게됨. 나는 직접 2주에 걸쳐 색인을 만듦.
- 앞부분에는 제목, 저작권, 헌사, 감사의 글을 넣고 InDesign이 자동으로 목차를 만들어 주도록 함. 여기까지 하니 드디어 책 내부가 완성됨.
표지 디자인
- 책 표지는 중요함. 내 책에는 펜화 스타일의 삽화가 특징이라 그걸 활용하기로 함.
- 등반 은유로 사용한 산 그림을 좀더 크고 디테일하게 그림. 직접 손글씨로 제목도 새로 씀.
- 1950년대 스카우트 매뉴얼 같은 느낌의 색상을 사용함.
교정쇄 검토
- POD로 주문한 교정쇄로 처음 책의 크기를 실감함. 오랜 시간의 작업량이 느껴짐.
- 하지만 아직 끝난게 아님. 많은 부분 수작업으로 조판 작업을 했기에 실수가 있을 수 있어서 다시 한번 읽어보며 체크해야 함.
- Git에 InDesign 파일을 올렸지만 바이너리라 변경사항 확인이 어려움.
- 교정쇄와 변경사항 비교를 위해 Dart 스크립트로 PDF를 한 페이지씩 이미지로 만들고, Photoshop 액션으로 픽셀 차이 나는 부분에 빨간 테두리를 그리게 함.
- 프로그래밍으로 정확히 의도한 변경만 되었음을 확인할 수 있어서 안심이 됨.
E-book 제작
- 빌드 시스템을 활용해 EPUB에 필요한 XHTML과 메타데이터를 모두 생성함. 여러 리더기에서 테스트하며 CSS를 조정함.
GN⁺의 의견
-
6년에 걸친 대장정 끝에 640페이지나 되는 분량의 책을 완성한 것은 대단한 성과임. 집필 과정에서 Dart로 빌드 시스템을 직접 개발하고, 조판을 위해 InDesign용 스크립트를 만드는 등 프로그래밍 기술을 총동원한 점이 흥미로움.
-
특히 교정쇄 단계에서 변경 검증을 위해 PDF 비교용 스크립트를 만든 부분은 감탄을 자아냄. 이런 아이디어와 실행력이 있어야 개인이 책을 self-publishing할 수 있을 것 같음.
-
다만 목표한 페이지 사이즈가 크다보니 조판 작업이 쉽지 않았던 점, 인쇄소 사정으로 사이즈 선택에 제약이 있었던 점은 아쉬움. 차기 작에는 좀더 출판 친화적인 사이즈를 택하는 것이 좋겠음.
-
저자가 언급했듯 프로그래밍 언어 해설서의 경우 표지 디자인이 판매에 크게 영향을 주진 않겠지만, 이 책의 디자인 컨셉처럼 내용의 특징을 반영한 개성있는 표지는 오히려 눈에 띄는 장점이 될 수 있을 것임.
-
무려 6년간 틈틈이 집필했다는 점에서 저자의 열정과 끈기에 경의를 표함. 이제 독자들이 얼마나 이 책을 찾을지, 어떤 피드백을 줄지 지켜볼 일만 남음. 분명 프로그래밍 언어를 학습하려는 많은 이들에게 도움이 될 책임은 분명해 보임.
Hacker News 의견
-
Crafting Interpreters
는 책 구매 링크와 무료 온라인 버전 링크를 모두 제공하는 웹페이지를 가지고 있음 - 저자인 Nystrom이 물리적 사본 디자인에 기울인 세심한 주의와 손으로 그린 삽화, 훌륭한 글쓰기 덕분에 기술서적의 99%보다 나은 책으로, 구매할 가치가 충분함
- 2017년부터 이 책을 통해 공부하기 시작했고, 책의 전반부를 마치면서 토크나이저/렉서/파서/인터프리터에 대한 이해가 명료해짐. 이는 Nystrom의 훌륭한 글쓰기와 주제에 대한 깊은 이해 덕분임
- 저자가 실물 책으로 만들기로 결정했다는 사실을 몰랐는데, 비록 내게 가장 적합한 학습 방식은 아니지만 소장용으로, 그리고 저자를 후원하기 위해 구매하고 싶음
- 지금까지 읽었던 기술서적 중 최고 수준으로, 읽으면서 많은 것을 배우고 정말 즐거웠음. 훌륭한 기술적 내용 외에도 글이 잘 쓰여졌고, 재치있으며, 삽화도 잘 그려져 있음
- 각 챕터 말미에 진화하는 코드와 실행 가능한 프로그램을 갖추겠다는 비전이 인상적이었고, 저자가 그것을 해냈다는 점에서 찬사를 보냄. 트리-워킹 인터프리터는 건너뛰고 C 기반 바이트코드 인터프리터 부분을 통해 훨씬 더 많은 것을 배움
- ironically 15개월 걸려 책을 다 읽었다는 댓글러가 있는데, 저자의 노고에 감사와 축하를 전함. 언어 영역에서 기술적 깊이가 있을 뿐 아니라 레이아웃과 그래픽의 작은 디테일도 독자를 몰입하게 만드는 책으로, 앞으로 오랫동안 의미있는 책이 될 것 같음
- 이 책을 읽고 배운 내용을 바탕으로 직접 https://hexmos.com/compiler 페이지를 만들 정도로 책에 큰 애착을 느낌
- 저자 Bob과의 인터뷰(https://corecursive.com/032-bob-nystrom-on-building-an-interpreter/)를 들어볼 만함
- 저자가 그래픽 디자이너 출신 컴파일러 엔지니어라는 사실이 인상적임
-
Writing an Interpreter in Go
책을 읽은 후 다음 인터프리터 책으로 이 책을 읽을 예정인데, 200페이지 정도로 분량도 적당하고 마음에 듦 - (2021년 댓글) 훌륭한 책이며 읽으면서 정말 즐거웠다고 함