note [🌿 다듬는 중 · growing]
책을 쓰던 사람은 왜 조판 프로그램까지 만들었을까 — 도널드 커누스
목차 8
이 사이트에는 67%는에서 %와 는이 서로 다른 줄로 갈라지지 않도록 묶는 규칙이 있다. 수식 뒤에 붙은 조사도 함께 묶는다. 이 글에서 라는 기호와 그 뒤의 ‘라는’을 같은 줄에 두는 식이다. 원고의 문장을 고치다 보니, 그 문장이 화면에 놓이는 방식도 손보게 됐다.
컴퓨터과학자 도널드 커누스
책을 쓰던 사람이 책을 찍는 방법까지 만들기 시작했다. 잠깐 옆길로 샜다고 하기에는 옆길이 꽤 커졌다.
커누스는 이 블로그에 몇 번 등장했다. 설명은 투영이다에서는 그의 여러 성취를 하나의 순위로 나타낼 수 있는지 물었고, AI가 수학을 풀었다는데에서는 그의 작업을 통해 발견과 증명의 차이를 살펴봤다. 이번에는 그 이름 옆에 붙은 업적들이 어떻게 이어지는지 궁금해졌다. 문장을 다 쓰면 책을 쓰는 일도 끝나는 걸까. 커누스의 책과 도구를 따라가며 이 질문을 생각해 보려 한다.
책 한 권에 들어가지 않은 설명
출발은 컴파일러에 관한 책이었다. 컴파일러는 사람이 쓴 프로그램을 기계어 같은 다른 형태의 코드로 옮기는 프로그램이다. 1962년, 출판사 애디슨웨슬리가 커누스에게 그 작성법을 다뤄 달라고 의뢰했다.2
컴파일러를 설명하려다 보니 그 안에서 쓰는 방법부터 짚어야 했다. 손으로 쓴 원고는 약 3,000쪽으로 불어났고, 한 권으로 시작한 계획은 여러 권으로 나뉘었다. 이것이 『컴퓨터 프로그래밍의 예술』, 영어 제목을 줄여 TAOCP라고 부르는 책으로 자랐다.2
이 책의 중심에는 알고리즘 분석이 있다. 알고리즘이 문제를 푸는 절차라면, 분석은 그 절차에 시간이나 저장 공간이 얼마나 드는지 따져 보는 일이다.
가령 이름이 적힌 카드 더미를 가나다순으로 정리한다고 해 보자. 남은 카드 전체를 훑어 가나다순으로 가장 앞서는 이름의 카드를 한 장씩 골라도 된다. 이미 정리된 작은 묶음들을 서로 합쳐 가는 방법도 있다. 어느 쪽이든 마지막에는 정렬된 카드가 나온다. 하지만 이름을 몇 번 비교하고 카드를 몇 번 옮겨야 하는지는 다르다. 카드가 열 장일 때 대수롭지 않던 차이가 십만 장에서는 작업 시간을 크게 바꿀 수 있다.
커누스는 책을 쓰면서 알고리즘이 얼마나 잘 작동하는지 수량적으로 분석하는 관점을 중심에 놓았다고 회고한다.2 독자는 절차를 배운 뒤에 그 절차의 비용도 물을 수 있게 된다. 컴퓨터가 더 빨라져도 다시 따져 볼 만한 질문이다.
그 설명을 책으로 인쇄하려니 다음 문제가 생겼다.
글자 사이에도 알고리즘이 들어간다
조판은 글자와 수식, 문단을 지면 위에 배치하는 일이다. 수학책에서는 작은 첨자가 어디에 붙는지, 분수선 위아래가 얼마나 떨어지는지까지 읽기에 영향을 준다. 수식의 내용이 맞아도 배치가 어색하면 눈은 계속 걸려 넘어진다.
1977년, 커누스는 패트릭 윈스턴의 책 교정쇄에서 디지털 조판의 가능성을 보았다. 컴퓨터로 자기 책도 더 보기 좋게 찍을 수 있겠다는 기대가 생겼다. 그는 예정했던 안식년 계획을 바꾸고 조판 연구에 뛰어들었다.1
그렇게 탄생한 TeX는 어떤 문제를 풀까. 줄바꿈 하나만 생각해 보자.
문단의 양쪽 끝을 가지런히 맞추려면 단어 사이의 간격을 조금씩 늘이거나 줄여야 한다. 지금 줄에 단어 하나를 더 넣으면 그 줄은 보기 좋을 수 있다. 그런데 그 탓에 다음 줄에 남은 단어가 적어져 간격이 지나치게 벌어질 수도 있다. 앞줄을 조금 일찍 끊었더라면 두 줄이 모두 나아졌을지 모른다.
커누스와 마이클 플라스
글자를 배치하는 일과 글자 자체의 모양을 만드는 일은 별개였다. TeX가 지면을 짜는 프로그램이라면, 커누스가 만든 METAFONT는 글자 모양을 기술하고 만들어 내는 시스템이다.4 같은 문장도 어떤 글꼴로, 어떤 간격으로 놓는지에 따라 페이지의 인상이 달라진다.
이 과정에서 커누스는 활자와 인쇄의 전통을 컴퓨터로 옮기는 일에 깊이 빠졌다. 『Digital Typography』의 서문에서도 아름다운 책을 컴퓨터로 만들려 했던 긴 여정을 이야기한다.5 책에 담을 내용을 연구하다가, 그 내용을 독자의 눈에 어떻게 건넬지까지 연구하게 된 것이다.
프로그램에도 독자가 있다
책을 만드는 프로그램을 썼다면, 그 프로그램은 누가 읽을까.
컴퓨터는 코드를 처리한다. 사람도 코드를 읽는다. 오류를 고칠 동료, 기능을 바꿀 후임자, 몇 달 뒤에 다시 파일을 연 작성자 자신이 그 독자다. 실행 결과만으로는 왜 그런 구조를 택했는지까지 알기 어렵다.
커누스가 제안한 문학적 프로그래밍
예를 들어 먼저 프로그램 전체가 무슨 일을 하는지 설명하고, 그 안에서 쓰는 부품을 차례로 펼쳐 보일 수 있다. 독자가 이해하기 좋은 순서로 이야기를 구성하고, 도구가 코드 조각들을 실제 프로그램에 맞게 엮도록 하는 것이다.6
이 생각을 구현한 도구 가운데 하나가 커누스와 실비오 레비
설명을 읽다가 해당 코드로 찾아갈 수 있고, 코드를 고칠 때 그 주변의 설명도 눈에 들어온다. 물론 같은 파일에 있다고 설명이 저절로 정확해지는 것은 아니다. 읽고 고치는 일은 여전히 사람의 몫이다.
이 대목을 읽으니 책과 프로그램 사이의 거리가 조금 줄어든다. 둘 다 누군가가 나중에 펼쳐 보고, 왜 그렇게 되어 있는지 알아낼 수 있도록 쓰는 작업으로 보이기 때문이다.
틀린 곳을 찾아주면 2달러 56센트
독자를 의식하며 쓴다고 오류가 없어지는 것은 아니다. 커누스는 책에서 오류를 찾아준 사람에게 보상하는 것으로도 유명하다. 보상으로 내걸었던 금액은 2달러 56센트다.8
왜 3달러도, 2달러 50센트도 아닐까. 256을 16진수로 쓰면 100이다. 커누스는 256센트를 ‘16진수 1달러’라고 부른다. 오류를 알려준 데 감사하는 방식에도 숫자 농담이 끼어 있다.8
예전에는 실제 수표를 보냈다. 하지만 계좌를 노린 범죄 시도가 이어지자 2008년에 방식을 바꿨다. 가상의 ‘산세리프 은행’ 계좌에 명예 점수를 기록하는 방식이었다.9 익숙한 수표 일화에도 그 뒤의 이야기가 있다.
보상금만큼 눈길이 가는 것은 정오표, 곧 틀린 곳과 고친 내용을 적어 둔 목록이다. 『Selected Papers on Computer Science』의 정오표에는 자신이 여러 해 동안 참이라고 믿었던 명제가 거짓이어서 해당 내용을 다시 썼다는 설명이 있다.10 쉼표나 오탈자만 고치는 목록이 아니다.
TAOCP는 새 내용을 작은 책으로 나누어 먼저 내고 독자의 의견을 받는다. 커누스는 자신이 책에 들어가는 모든 주제의 권위자일 수 없으므로, 정식 권을 준비하려면 독자의 피드백이 필요하다고 밝힌다.11 완성된 책을 내기 전에 독자에게 먼저 읽어 보고 틀린 곳을 알려 달라고 부탁하는 셈이다.
확인 비용에서 생각했던 질문이 여기서 조금 달라진다. 오류를 찾아내는 데 누군가의 시간이 든다면, 저자는 그 일을 어떻게 대할까. 커누스의 보상과 정오표는 적어도 발견한 오류를 알려줄 통로를 열어 두고, 무엇이 바뀌었는지 다음 독자도 볼 수 있게 한다.
계속 고칠 책과 멈춰둘 프로그램
그렇게 꾸준히 오류를 고쳐 온 커누스는 TeX만큼은 언젠가 수정을 멈추겠다고 선언했다.
TeX의 버전 번호는 3.1, 3.14, 3.141처럼 원주율 의 자릿수를 늘려 가는 방식이다. 커누스는 1990년의 글에서 자신이 죽은 뒤에는 당시 TeX를 그대로 두고 버전 이름을 로 바꾸라고 했다. 그 뒤에 발견되는 버그는 영구적인 기능이 된다는 농담도 붙였다.12
그가 원한 것은 오래도록 같은 결과를 내는 기준이었다. 가령 오래된 원고를 다시 조판하는데 프로그램이 ‘개선’되면서 줄바꿈과 페이지가 달라진다면, 이미 정리해 둔 쪽수와 참조도 어긋날 수 있다. 도구를 쓰는 사람에게는 어제와 똑같이 작동한다는 사실이 중요한 기능일 수 있다.
이 방침은 커누스 자신의 TeX를 그대로 보존하려는 것이었다. 그는 다른 이름의 더 나은 후속 시스템을 만드는 일도 장려했다.12 기존 도구를 보존하면서도 그 위에서 새로운 도구를 만들 수 있다.
책에서 잘못된 설명을 발견하면 다음 판에서 고쳐야 한다. 조판 도구에서는 기존 원고가 어떻게 출력되는지도 지켜야 한다. 독자에게 정확한 설명을 주려는 책임과, 사용자가 맡겨 둔 원고를 같은 모양으로 찍으려는 책임이 서로 다른 선택으로 이어진다. 계속 고치는 책과 멈출 시점을 정한 프로그램이 나란히 있는 이유를 나는 이렇게 읽는다.
이 사이트의 줄바꿈으로 돌아오면
처음의 줄바꿈 규칙으로 돌아오면, 어디까지 한 줄에 묶을지도 정해야 한다. 글자들을 길게 묶을수록 어색하게 끊기는 곳은 줄어든다. 하지만 긴 문구를 통째로 묶어 두면 좁은 화면에서는 그 덩어리가 화면 밖으로 넘칠 수 있다. 이 사이트에서는 문장부호 주변의 필요한 글자만 묶고, 나머지는 줄이 바뀔 여지를 남긴다. 수식과 바로 붙은 말은 별도로 함께 묶는다.
문장 하나를 내 화면에서 보기 좋게 만들려면 줄바꿈을 직접 넣어도 된다. 그런데 화면 너비가 바뀌거나 다음 글을 올리면 같은 문제를 다시 만난다. 반복되는 불편을 규칙으로 옮겨 두면, 그다음 원고에서도 그 규칙이 일한다. 이 작은 조판 작업이 글쓰기와 연결되는 지점이다.
도구를 만드는 시간이 아까울 때도 있다. 글 하나를 쓰려고 조판 프로그램부터 새로 만들기 시작하면 정작 원고가 밀릴 수도 있다. 앞으로 이 사이트를 손볼 때에는 어떤 독자가 어디에서 덜 헤매게 되는지를 먼저 적어 두고 싶다. 조사가 자꾸 다음 줄로 떨어지는지, 설명을 따라가기 힘든지, 오류가 고쳐졌는지 알 수 없는지에 따라 손댈 곳도 달라질 것이다.
커누스가 남긴 책과 도구를 함께 읽고 나니, 글을 쓰는 일이 원고 파일 안에서만 끝나지는 않는다는 생각이 든다. 문장을 다 적은 뒤에도 그 문장이 읽히고, 다시 쓰이고, 틀린 곳이 고쳐지는 과정이 남아 있다. 내가 이 사이트에서 어디까지 맡을지는 그때마다 정해야 한다.
더 들어가려면
- 커누스의 구술 인터뷰 — 컴퓨터역사박물관의 2007년 인터뷰. 책을 쓰게 된 경위는 14–18쪽, 조판으로 관심을 옮긴 이야기는 29–31쪽에서 읽을 수 있다.
- TAOCP 공식 안내 — 책의 구성과 분책, 독자의 피드백, 정오표가 한곳에 있다.
- 『Digital Typography』 소개 — 책과 글자와 컴퓨터를 연결한 작업을 저자가 돌아본다.
- 『Literate Programming』 소개 — 사람이 읽는 프로그램이라는 관점에서 커누스의 글들을 모은 책이다.
주석
-
Donald Knuth, Oral History of Donald Knuth, Edward Feigenbaum 인터뷰, Computer History Museum, 2007-03-14·21, 29–31쪽. ↩ ↩2
-
Donald E. Knuth·
Michael F. Plass, “Breaking paragraphs into lines”, Software: Practice and Experience 11(11), 1981, 1119–1184. 문단 전체를 고려하는 줄바꿈, 상자· 늘고 줄어드는 간격· 벌점으로 표현한 모형을 설명한다. 본문의 두 줄 예시는 원리를 풀어 쓴 것이며, 특정 교정쇄의 재현은 아니다. ↩ -
커누스의 Computers and Typesetting 안내. TeX와 METAFONT의 사용법과 프로그램을 다룬다. 특히 E권 설명은 글자·
숫자· 기호를 METAFONT로 기술해 글꼴을 만든다고 밝힌다. ↩ -
커누스의 Digital Typography 소개에 실린 저자 서문. 본문에서 여러 작업을 ‘읽는 사람’이라는 관점으로 연결한 것은 이 글의 해석이다. ↩
-
커누스의 Literate Programming 소개. 같은 제목의 최초 논문은 The Computer Journal 27(2), 1984, 97–111에 실렸다. 저자 원고의 A절과 J절에서 독자의 이해에 맞춘 서술과 코드의 재배열을 설명한다. 웹페이지가 소개하는 책은 1992년 논문집이다. ↩ ↩2
-
Donald E. Knuth·
Silvio Levy, The CWEB System of Structured Documentation 안내. CTANGLE은.w원본에서 컴파일할.c파일을,CWEAVE는 같은 원본에서 조판하고 색인을 붙일.tex문서를 만든다. ↩ -
커누스의 FAQ, “Why do you pay $2.56 for every error found in your books?” 항목. 본문 금액은 책의 오류 보상에 관한 것으로, TeX 프로그램 버그의 별도 보상 규칙과 합치지 않았다. ↩ ↩2
-
커누스의 2008년 공지, “Financial Fiasco”. 개인 수표를 중단하고 가상 은행의 명예 점수로 전환한 경위를 설명한다. 산세리프 은행 페이지에서 보상 기록을 볼 수 있다. ↩
-
커누스의 Selected Papers on Computer Science 정오표, 25쪽 수정 설명. 여러 해 참으로 믿었던 명제가 거짓임을 인정하고 내용을 다시 썼다고 기록한다. ↩
-
커누스의 TAOCP 안내, “Paperback Fascicles” 항목. 정식 권에 앞서 내용을 시험판 분책으로 내고 독자의 피드백을 받는 이유를 설명한다. ↩
-
Donald E. Knuth, “The Future of TeX and METAFONT”, 1990-10-03, NTG 재인쇄본. TeX와 METAFONT의 최종 버전 이름을 각각 와 로 정하려는 의사와 안정성의 이유를 밝히며, 다른 이름의 후속 시스템 개발도 장려한다. ↩ ↩2