← 모든 글

엔지니어링 철학: 도널드 커누스, 프로그래밍은 예술이다

도널드 커누스, 컴퓨터 과학자이자 『The Art of Computer Programming』의 저자

핵심 요점

  • 프로그래밍은 단순한 공학이 아니라 예술입니다. 커누스는 자신의 필생의 역작에 일부러 The Art of Computer Programming이라는 제목을 붙였고, 그 어떤 테스트 스위트로도 측정할 수 없는 아름다움의 기준으로 코드를 대했습니다.
  • 코드는 사람을 위해 쓰는 문학입니다. 첫 번째 독자는 그 프로그램을 다음에 읽을 사람이고, 컴파일러는 두 번째에 불과합니다. 가독성은 예의가 아니라 일급 엔지니어링 요구사항입니다.
  • 엄밀함은 중요한 곳에만, 절제는 나머지에 쏟으세요. 알고리즘을 증명하고, 그 비용을 정확하게 분석하며, 마지막 글자 하나까지 장인의 완성도를 다하되 — 중요하지 않은 97%의 코드에 노력을 쏟아붓기를 거부하세요.
  • “성급한 최적화”란 먼저 측정하라는 뜻입니다. 그 유명한 문장은 느린 코드에 대한 변명이 아니라 측정의 규율입니다. 프로파일링으로 결정적인 몇 퍼센트를 찾아내 그곳만 공략하고, 나머지는 읽기 좋게 두세요.

원칙

“우리의 주된 임무가 컴퓨터에게 무엇을 하라고 지시하는 것이라고 상상하는 대신, 우리가 컴퓨터가 무엇을 하기를 원하는지를 사람에게 설명하는 데 집중합시다.” — 도널드 커누스1

이 한 문장에 그의 입장 전체가 담겨 있습니다. 커누스에게 프로그램은 일차적으로 기계를 향한 명령의 흐름이 아닙니다. 그것은 사람을 — 다음에 읽을 독자, 보통은 모든 것을 잊어버린 채 반년 뒤의 당신 자신을 — 향한 글입니다. 컴파일러는 부차적인 독자입니다. 첫 번째 독자는 사람이며, 프로그램은 그 독자를 위한 문학이거나, 아무리 정확하게 돌아간다 해도 실패작입니다.

그래서 커누스는 자신의 필생의 역작에 The ScienceThe Engineering이 아니라 The Art of Computer Programming이라는 제목을 붙였습니다. 그가 말하는 예술은 문자 그대로의 의미입니다. 만들어진 것의 품질을 위해 추구하는 장인의 일, 그 어떤 테스트 스위트로도 측정되지 않는 아름다움의 기준에 매인 일이라는 뜻이죠. 거기서 따라 나오는 규율은 아주 특정한 방식으로 엄격합니다. 그것은 이렇게 말합니다. 진정으로 중요한 소수의 일을 하되, 그것을 정확하게 해내라. 알고리즘이 올바름을 증명하라. 추측하지 말고 그 비용을 정밀하게 분석하라. 마찰 없이 읽힐 수 있도록 지면을 조판하라. 그리고 — 모두가 인용하지만 거의 모두가 오독하는 부분 — 중요하지 않은 97%의 코드에 장인 정신을 쓰지 마라. 엉뚱한 곳에 쏟아부은 노력은 장인 정신이 아니라 성실로 분장한 낭비이기 때문입니다.

그래서 이 원칙에는 서로 대립하는 듯 보이지만 실은 하나인 두 얼굴이 있습니다. 중요한 곳마다 엄밀함을, 중요하지 않은 곳마다 절제를. 기술은 어느 쪽이 어느 쪽인지를 아는 데 있습니다 — 그리고 어떻게 아는가에 대한 커누스의 답은 이 시리즈 전체를 관통하는 답과 같습니다. 측정하는 것이죠. 성급한 최적화에 관한 유명한 문장은 느린 코드를 써도 된다는 면허가 아닙니다. 그것은 무언가를 건드리기 전에 결정적인 몇 퍼센트를 증거로 찾아내라는 요구이며, 성능은 마지막에 덧붙이는 합격 도장이 아니라 처음부터 만들어 넣고 측정하는 속성이라는 바로 그 신념과 같습니다.

배경

도널드 어빈 커누스는 1938년 1월 10일 위스콘신주 밀워키에서 태어났습니다.2 그는 케이스 공과대학에서 학사와 석사 학위를 받았고 — 케이스는 그에게 깊은 인상을 받아 1960년에 학사 학위와 동시에 석사 학위를 수여했습니다 — 1963년 캘텍에서 수학 박사 학위를 받았습니다.2 그는 1969년 스탠퍼드 교수진에 합류했고, 1977년 플레처 존스 컴퓨터 과학 석좌교수가 되었으며, 1990년에는 사실상 자신을 위해 만들어 낸 직함을 얻었습니다. The Art of Computer Programming 교수라는 직함이었죠.2 그는 수년째 스탠퍼드 명예교수로 있으면서도 여전히 손으로, 그리고 우편으로 60년 넘게 매달려 온 바로 그 프로젝트를 작업하고 있습니다.

그 프로젝트는 범위가 뜻하지 않게 커지면서 시작되었습니다. 1962년, 애디슨웨슬리는 젊은 커누스에게 컴파일러에 관한 책을 의뢰했습니다.3 그는 집필을 시작했지만, 그 밑에 깔린 근본 이론 — 정렬, 검색, 자료 구조, 알고리즘이 실제로 얼마나 오래 걸리는지에 대한 분석 — 을 먼저 다지지 않고서는 컴파일러를 어떻게 만드는지 정직하게 설명할 수 없다는 결론에 이르렀습니다. 한 권이던 책은 계획된 시리즈가 되었습니다. 첫 권 Fundamental Algorithms는 1968년에 나왔습니다. 그 계획은 결국 일곱 권으로 늘어났고, 그 작업은 오늘날까지도 미완성입니다.3 American Scientist는 훗날 그것을 한 세기의 과학을 빚어낸 100권 남짓한 책 중 하나로 꼽았고, New York Times는 그것을 “이 직업을 규정하는 논저”라고 불렀습니다.3 합리적인 합의에 따르면, 그것은 컴퓨터 과학에 있어 성경에 가장 가까운 책입니다.

1974년 커누스는 컴퓨팅 분야 최고의 영예인 ACM A.M. 튜링상을 받았습니다 — “알고리즘 분석과 프로그래밍 언어 설계에 대한 다수의 주요 공헌, 특히 그의 잘 알려진 일련의 저서를 통한 ‘프로그래밍 예술(art of computer programming)’에 대한 가장 의미 있는 공헌에 대하여”라는 사유였습니다.4 그의 튜링 강연 제목은 그답게도 “예술로서의 컴퓨터 프로그래밍(Computer Programming as an Art)”이었습니다.4

도널드 커누스의 여러 권으로 된 역작 『The Art of Computer Programming』

작업

The Art of Computer Programming과 알고리즘 분석

커누스는 알고리즘 분석의 아버지라 불리며, 그 칭호는 그가 마땅히 얻은 것입니다.2 TAOCP 이전에는 프로그래머들이 대체로 알고리즘에 대해 비공식적으로 추론했습니다 — 이건 더 빠른 것 같고, 저건 낭비 같다는 식으로요. 커누스의 프로젝트는 그 추론을 엄밀한 수학적 토대 위에 올려놓는 것이었습니다. 알고리즘이 입력의 함수로서 정확히 몇 번의 연산을 수행하는지를 도출하되, 수학자가 정리를 다룰 때와 똑같은 정밀함으로 해내는 것이었죠. 그는 이제 모든 프로그래머가 비용이 어떻게 확장되는지를 설명하기 위해 쓰는 점근 표기법 “빅오(big-O)”를 널리 퍼뜨렸습니다.2 핵심은 결코 표기법이 아니었습니다. 핵심은 프로그램의 비용이 막연히 느껴야 할 감각이 아니라 계산해야 할 알 수 있는 양이라는 신념이었습니다.

이 책들은 일종의 강박적인 완전성 — 모든 주장이 증명되고, 모든 알고리즘이 분석되며, 모든 경계가 처리되는 — 으로 유명하고, 발견된 오류 하나하나에 커누스가 내거는 포상금 수표로도 유명합니다. 그 수표는 2.56달러짜리인데, 그는 이를 “1 16진수 달러”라고 부릅니다. 256센트가 16진법으로 100이기 때문이죠.5 금액은 농담이지만, 그 뒤에 깔린 규율은 농담이 아닙니다. 커누스는 자기 작업이 정확하다는 데 돈을 걸고, 세상에 자신이 틀렸음을 증명해 보라고 초대하고 있는 것입니다. 수십 년이 지나도 다듬어진 채 여전히 권위를 지니는 TAOCP의 상태는 어느 정도는 그 상시 내건 내기의 산물입니다.5 (그는 은행 사기 사건 이후 2008년에 실물 수표 발송을 중단하고, 지금은 가상의 “산세리페 은행(Bank of San Serriffe)” 앞으로 증서를 발행합니다 — 엄밀함은 살아남았고, 종이 자취만 옮겨 간 것이죠.)5

성급한 최적화와 결정적인 3%

소프트웨어 공학에서 가장 많이 인용되는 단 한 문장은 커누스의 것이며, 그것은 거의 언제나 잘못 인용됩니다 — 그 의미를 부여하는 절이 떨어져 나간 채로요. 다음은 1974년 그의 논문 “go to 문을 사용한 구조적 프로그래밍(Structured Programming with go to Statements)”에서 가져온 ACM Computing Surveys 게재 전문입니다.

“프로그래머들은 자기 프로그램의 중요하지 않은 부분의 속도에 대해 생각하거나 걱정하느라 엄청난 시간을 낭비하며, 이러한 효율 추구 시도는 디버깅과 유지보수를 고려하면 사실 강한 부정적 영향을 미칩니다. 우리는 작은 효율들에 대해, 말하자면 97% 정도의 경우에는 잊어야 합니다. 성급한 최적화는 모든 악의 근원입니다. 그러나 그 결정적인 3%에서의 기회마저 놓쳐서는 안 됩니다.”6

전문을 통째로 읽으면, 그것은 성능에 반대하는 논변이 아닙니다. 그것은 측정을 위한 논변입니다. 커누스의 요점은 경험적입니다. 프로그램은 자기 코드의 아주 작은 일부에서 거의 모든 시간을 보내고, 나머지 97% — 거의 실행되지 않는 부분 — 를 최적화하는 일은 실제로 노력이 들고, 얻는 것은 거의 없으며, 코드를 읽고 신뢰하기 더 어렵게 만든다는 것이죠. “악”은 최적화가 아닙니다. 악은 시간이 어디로 가는지 알기도 전에 최적화하는 것 — 증거 대신 믿음에 장인 정신을 쏟는 것입니다. 그가 처방하는 규율은 게으름의 정반대입니다. 프로파일링으로 결정적인 3%를 찾아내고, 그다음 그것을 강하게 공략하라는 것입니다.

귀속에 관해 한마디 — 그 문장을 정직하게 인용하는 사람에게는 중요한 문제이기 때문입니다. 이 문장은 커누스의 1974년 논문에, 그 자신의 글로 등장합니다. 하지만 15년 뒤 커누스 본인이 이를 “호어의 격언(Hoare’s dictum)”이라 부르며 토니 호어에게 돌렸고 — 호어에게 직접 물었을 때 그 역시 부인하며, 그것이 데이크스트라의 것일 수도 있고 “공동의 문화 또는 구전”으로 다루는 게 가장 낫겠다고 했습니다.7 그래서 가장 깔끔하고 정확한 진술은 이렇습니다. 우리 모두가 인용하는 그 표현은 커누스의 것으로, 1974년 커누스가 발표한 것이고, 그 발상은 그가 너그럽게도 온전히 자신의 것이라 주장하기를 거부한 것입니다. 그 거부 자체가 그의 성품 그대로입니다. 자기 오류를 찾아내라며 돈을 주는 사람은, 자신이 받을 자격이 있다고 확신하지 못하는 공을 가로채는 데 관심이 없습니다.

TeX, METAFONT, 그리고 장인의 일로서의 디지털 조판

1976년, 커누스는 제2권 제2판의 교정쇄를 받아 들고 경악했습니다. 제1판을 아름답게 만들었던 활자 조판이 초기 사진 식자로 대체되고 있었고, 그 결과는 흉했습니다 — 특히 수식이 잘못되어 보였죠.3 다른 사람이라면 그것을 발전의 대가로 받아들였을 것입니다. 자기 책이 형편없이 조판되는 것을 견딜 수 없었던 커누스는 1977년에 더 나은 것을 만드는 데 약간의 시간을 쓰기로 결정했습니다. 그 약간의 시간은 거의 10년이 되었습니다. 그 결과가 조판 시스템 TeX과, 글꼴 자체를 디자인하기 위한 동반 시스템 METAFONT였습니다. 둘 다 완성되어 1986년에 책으로 출간되었습니다.3

그의 경력에서 이보다 더 많은 것을 드러내는 우회는 없습니다. 한 수학자가 자신의 대표작을 8년 동안 중단하고, 지면에 아름다운 글자를 앉히는 문제를 제1원리에서부터 풀어냈습니다 — 그의 마음속에서 지면의 외양은 작업의 품질과 분리될 수 없는 것이었기 때문입니다. TeX은 40년이 지난 지금도 전 세계 수학 조판의 표준입니다. 그것은 커누스에게 있어 만들어진 결과물이 마지막 글자의 마지막 픽셀까지 뻗어 있다는, 장인의 일은 코드에서 멈추지 않는다는 가장 분명한 선언입니다. 그것은 울타리의 뒷면을 마무리하는 일의 엔지니어 버전입니다 — 독자가 결코 의식적으로 알아차리지 못하는 그 부분이야말로, 그가 허투루 하기를 거부한 부분입니다.

스탠퍼드 대학교의 도널드 커누스

문학적 프로그래밍

프로그램이 사람에게 읽히도록 만들어진 것이라면, 우리가 그것을 쓰는 방식 — 컴파일러 순서대로, 주석은 나중에 덧대는 식의 방식 — 은 거꾸로 된 것입니다. 1984년, The Computer Journal에 실은 논문에서 커누스는 그것을 뒤집자고 제안했습니다. 그는 그 실천을 문학적 프로그래밍(literate programming)이라 부르고, 그것을 구현하기 위해 WEB이라는 시스템을 만들었습니다.1

문학적 프로그래밍에서는 사람의 사고 순서대로 단일 문서를 씁니다 — 무엇을 의도하는지 설명하는 산문에, 설명이 부를 때마다 코드 조각을 가장 잘 읽히는 순서로 엮어 넣는 식이죠. 그다음 두 도구가 그것을 처리합니다. tangle은 컴파일러가 필요로 하는 순서로 코드를 추출하고, weave는 사람이 읽을 서식 잡힌 조판 문서를 만들어 냅니다.8 WEB은 파스칼과 TeX을 결합했고, 실비오 레비와 함께 만든 후속작 CWEB은 C에 대해 같은 일을 했습니다.8 커누스 자신의 표현으로는 “프로그램은 하나의 웹으로 생각하는 것이 가장 좋다… 프로그래머의 임무는 그러한 부분들과 그 관계들을, 사람의 이해에 가장 좋은 순서가 무엇이든 그 순서로 진술하는 것”입니다.8

문학적 프로그래밍은 결코 주류 실천이 되지 못했고, 그 점은 정직하게 짚어 둘 가치가 있습니다. 하지만 그 밑에 깔린 신념 — 설명은 프로그램에 대한 문서가 아니라 프로그램 그 자체이며, 가독성은 예의가 아니라 일급 엔지니어링 요구사항이라는 신념 — 은 조용히 승리했습니다. 그것은 스스로를 설명하는 코드를 우리가 가치 있게 여기게 만드는 바로 그 본능이며, 프로그래밍이 무엇을 위한 것이냐는 물음에 커누스가 내놓는 가장 깊은 답입니다.

방법

이 방법은 60년과 네 영역 — 알고리즘, 조판, 언어 설계, 그리고 글쓰기 자체 — 에 걸쳐 일관됩니다.

사람 독자를 먼저 위해 쓰라. 기계는 두 번째 독자입니다. 프로그램은 증명이나 문단과 마찬가지로, 다음 사람이 따라갈 수 있는가로 평가됩니다. 문학적 프로그래밍은 이 신념을 도구로 만든 것입니다.18

증명하고, 그다음 테스트하라. “위 코드의 버그를 조심하라. 나는 그것이 올바름을 증명했을 뿐, 실행해 보지는 않았다.” 커누스가 1977년 메모에 쓴 문장입니다 — 정확히 그가 실제로 자기 코드를 증명하는 드문 사람이기 때문에 우스운 문장이죠.9 그 농담 안에 규율이 담겨 있습니다. 올바름은 가정되는 게 아니라 논증되는 것이며, 증명은 필요하지만 그래도 충분하지는 않다는 것입니다. 당신은 둘 다 빚지고 있습니다.

비용을 분석하라. 추측하지 마라. 알고리즘의 실행 시간은 직감이 아니라 수학적으로 도출되어야 할 양입니다. 이것이 알고리즘 분석의 창립 행위이며, “빅오”가 모든 프로그래머의 입에 오르내리는 이유입니다.2

최적화하기 전에 측정하라. 성급한 최적화가 모든 악의 근원인 까닭은 그것이 증거 대신 믿음에 장인 정신을 쏟기 때문입니다. 결정적인 3%를 증거로 찾아내고, 그곳만 최적화하며, 나머지는 읽기 좋게 두세요.6

장인의 일을 마지막 글자까지 밀어붙이라. 필생의 역작을 8년간 멈추고 TeX을 만든 것은 이 방법의 가장 순수한 모습입니다. 결과물의 품질은 코드가 끝나는 곳에서 멈추지 않습니다. 그것은 지면의 가장자리에서 끝납니다.3

깊은 집중을 지키라. 커누스는 1990년 1월 1일에 이메일을 끊었습니다 — “그 이후로 나는 행복한 사람이었다”고 그는 썼죠 — 그 이유는 이메일이 모든 일의 정점에 있어야 하는 사람들을 위한 것인 반면, 자기 일은 일의 밑바닥에 있는 것, 곧 어떤 주제를 잘 설명할 수 있을 만큼 깊이 파고드는 것이라는 데 있었습니다.10 방해를 거부하는 것은 괴벽이 아닙니다. 그것은 그 작업의 전제 조건입니다.

영향의 사슬

그를 빚은 이들

수학 전통, 특히 조합론과 정수론. 커누스는 수학자로서 프로그래밍에 들어섰고, 수학자의 타협 불가능한 기준 — 주장은 증명되기 전까지는 지식이 아니다 — 을, 직관에 기대어 굴러가던 분야로 가져왔습니다. (형성적 영향)

애디슨웨슬리의 1962년 의뢰. 그 궤적을 설정한 우연이었습니다. 컴파일러에 관한 책을 요청받은 커누스는 그 문제를 토대까지 따라 내려갔다가 다시는 올라오지 않았습니다. 알고리즘 분석이 오늘날의 형태로 존재하는 것은 그가 요청받은 쉬운 책 쓰기를 거부했기 때문입니다. (직접적 영향)

활자 조판과 인쇄된 책. 조판된 지면이 어떻게 보여야 하는가에 대한 그의 기준은 이전 시대 인쇄의 장인 정신에 의해 형성되었습니다 — 바로 그것이 1976년의 사진 식자 교정쇄가 견딜 수 없었던 이유이자 TeX이 필요해진 이유입니다. (형성적 영향)

그가 빚은 이들

모든 현역 프로그래머. 빅오 분석, 알고리즘에 대한 엄밀한 연구, 그리고 TAOCP 자체는 기본 소양입니다. 한 세대는 그의 책을 펼쳐 보았든 아니든, 알고리즘이 무엇을 치르는지를 커누스에게서 배웠습니다.

세계의 수학·과학 출판. TeX과 LaTeX은 지난 40년간 조판된 사실상 모든 수학 논문, 물리학 사전 인쇄본, 기술 서적의 바탕입니다. 커누스의 8년짜리 우회는 인프라가 되었습니다.

올바름과 가독성의 문화. 문학적 프로그래밍, 포상 수표, “증명했을 뿐 실행해 보지는 않았다” — 이것들은 하나의 기조를 세웠습니다. 진지한 코드는 증명 가능하게 옳으면서도 읽기에 즐거워야 한다는 기대는, 어느 정도는 커누스가 남긴 유산입니다.

관통선

커누스와 에츠허르 데이크스트라는 이 시리즈에서 올바름의 두 위대한 사도이며, 둘 사이의 생산적인 긴장은 이 시리즈에서 가장 많은 것을 가르쳐 줍니다. 둘 다 손으로 썼고, 진리의 심판자로서의 기계를 불신했으며, 프로그램은 단지 실행될 게 아니라 추론되어야 한다고 고집했습니다. 그러나 데이크스트라가 테스트는 버그의 존재만 보여줄 뿐 그 부재는 결코 보여주지 못한다고 보며 — 유일하게 진정한 토대로서 증명 쪽으로 강하게 기울었던 반면 — 커누스의 “나는 그것이 올바름을 증명했을 뿐, 실행해 보지는 않았다”는 증명 자체의 한계에 눈을 찡긋합니다. 그는 증명 하고 테스트 하며, 둘 다 놓치면 당신에게 돈을 줍니다. 엄밀함 안의 실용주의죠. 존 카맥은 같은 축의 반대쪽 끝에 앉아 있습니다 — 핫스팟을 프로파일링하고, 기계를 그 토대까지 이해하며, 결정적인 루프를 공략하는 것 — 이는 증명의 천장이 아니라 하드웨어의 천장을 겨눈, 정확히 커누스의 “결정적인 3%”입니다. 그리고 톰프슨과 리치의 유닉스 — 운영체제가 한 기계에 손으로 용접되는 대신 읽히고 이식될 수 있도록 C가 만들어진 그곳 — 는 커누스가 명시적으로 드러낸 것과 같은 믿음입니다. 프로그램은 사람을 위해 쓰인다는 믿음 말이죠. (시리즈 가교)

내가 여기서 얻는 것

내가 간직하는 교훈은, 내 분야에서 가장 많이 인용되는 그 문장이 격언의 의상을 걸친 측정의 규율이라는 점입니다. “성급한 최적화는 모든 악의 근원이다”는 느리고 게으른 코드를 변명하는 데 쓰이는데, 이는 커누스가 의미한 바의 정확한 반대입니다. 그가 실제로 요구하는 것은 모든 것을 최적화하는 일이나 아무것도 최적화하지 않는 일보다 더 어렵습니다. 먼저 프로파일링하고, 결정적인 3%를 증거로 찾아내며, 바로 그곳에 장인 정신을 쏟아붓고, 나머지는 읽기 좋게 두라는 것이죠. 그것은 품질이 유일한 변수라는 것과 같은 기준입니다 — 물음은 결코 “이것이 충분히 빠른가?”나 “이것이 충분히 영리한가?”가 아니라 “비용이 실제로 어디에 있는지에 대한 증거를 내가 가지고 있는가?”입니다. 그것은 성능에 적용된 증거 관문입니다. 핫스팟에 대한 직감은 측정하기 전까지는 지식이 아닙니다.

내가 지금 짓고 있는 세계 — 에이전트, 도구 루프, 모델 호출 — 에서 커누스의 두 얼굴은 둘 다 하중을 떠받칩니다. 절제: 측정해 보지 않은 프롬프트나 검색 경로를 최적화하지 마라. 거의 모든 지연은 몇 번의 호출에 깃들어 있고, 나머지는 읽기 좋게 둬야 할 잡음이다. 엄밀함: 중요한 곳에서는 증명하고, 테스트하며, 자신이 옳다는 데 무언가를 걸어라. 그리고 문학적 프로그래밍의 신념은 쉰 살이 된 지금 내가 가장 의미 있다고 느끼는 것입니다 — 시스템이 누구라도 읽을 수 있는 속도보다 더 빠르게 코드를 생성할 수 있게 되면, 사람 독자를 먼저 위해 쓰는 일은 더 이상 예의가 아니라 그 시스템을 들여다볼 수 있게 지켜 주는 유일한 것이 됩니다. 그 신념 — 안목은 우기는 분위기가 아니라 측정하고 지켜 내는 기술적 시스템이라는 신념 — 은 1962년의 책 의뢰에서 2026년의 에이전트 하니스까지 곧장 이어집니다.

자주 묻는 질문

도널드 커누스의 엔지니어링 철학은 무엇인가요?

커누스는 프로그래밍을 첫 번째 독자가 기계가 아니라 사람인 예술로 다룹니다. “우리가 컴퓨터가 무엇을 하기를 원하는지를 사람에게 설명하는 것”이죠.1 거기서 따라 나오는 규율은 엄정한 엄밀함과 의도적인 절제를 짝짓습니다 — 알고리즘이 올바름을 증명하고, 그 비용을 수학적으로 분석하며, 장인의 일을 조판된 지면까지 끝까지 마무리하되, 프로그램에서 중요하지 않은 부분을 최적화하는 데 노력을 쏟기를 거부하는 것입니다. 어느 쪽이 어느 쪽인지는 측정으로 가려내며, 이것이 성급한 최적화에 관한 그의 문장의 진짜 의미입니다.6

“성급한 최적화는 모든 악의 근원이다”는 실제로 무슨 뜻이었나요?

그것은 성능에 대한 거부가 아니라 측정에 대한 요구입니다. 1974년 인용문 전문은 이렇습니다. “우리는 작은 효율들에 대해, 말하자면 97% 정도의 경우에는 잊어야 합니다. 성급한 최적화는 모든 악의 근원입니다. 그러나 그 결정적인 3%에서의 기회마저 놓쳐서는 안 됩니다.”6 커누스의 요점은 프로그램이 자기 코드의 작은 일부에서 거의 모든 시간을 보낸다는 것입니다. 나머지 97%를 최적화하는 일은 노력을 낭비하고 가독성을 해칩니다. 규율은 먼저 프로파일링하고, 결정적인 몇 퍼센트를 찾아내, 그곳만 최적화하는 것입니다. 이 문장을 느린 코드를 변명하는 데 쓰는 것은 그 의미를 뒤집는 것입니다.

커누스가 “성급한 최적화” 문장을 만들어 냈나요, 아니면 호어였나요?

모두가 인용하는 그 표현은 커누스의 것으로, 그 자신의 1974년 Computing Surveys 논문 “go to 문을 사용한 구조적 프로그래밍”에 발표되었습니다.6 그러나 15년 뒤 커누스 본인이 이를 “호어의 격언”이라 부르며 토니 호어에게 돌렸고, 호어에게 직접 물었을 때 그 역시 저작권을 부인하며, 그것이 데이크스트라까지 거슬러 갈 수도 있다고 시사하고, “공동의 문화 또는 구전”으로 다루는 게 가장 낫겠다고 말했습니다.7 정직한 요약은 이렇습니다. 우리가 인용하는 그대로의 문장은 커누스의 것이지만, 그는 너그럽게도 그 발상을 온전히 자신의 것이라 주장하기를 마다했습니다.

도널드 커누스는 무엇을 만들었나요?

커누스는 The Art of Computer Programming(1962년 시작, 첫 권 1968년, 진행 중 — 컴퓨터 과학을 규정하는 논저)을 썼고, 현대 알고리즘 분석을 창시하며 빅오 표기법을 널리 퍼뜨렸습니다.23 자기 책이 형편없이 조판되는 데 좌절한 그는 조판 시스템 TeX과 글꼴 시스템 METAFONT를 만들었고, 둘 다 1986년에 출간되어 지금도 수학 출판의 표준입니다.3 그는 또한 사람이 읽도록 프로그램을 쓰는 실천인 문학적 프로그래밍과 WEB 시스템을 창안했습니다.18 그는 1974년 ACM 튜링상을 받았습니다.4


출처


  1. Donald E. Knuth, “Literate Programming,” The Computer Journal 27 (1984). “우리의 주된 임무가 컴퓨터에게 무엇을 하라고 지시하는 것이라고 상상하는 대신, 우리가 컴퓨터가 무엇을 하기를 원하는지를 사람에게 설명하는 데 집중합시다.” 다음도 참고: “Literate programming,” Wikipedia. 

  2. “Donald Knuth,” Wikipedia. 1938년 1월 10일 위스콘신주 밀워키 출생. 케이스 공과대학(BS/MS 1960), 캘텍 수학 박사(1963), 스탠퍼드 교수진(위키백과 기준 1969 — 일부 전기 자료는 Fundamental Algorithms가 출간된 해인 1968년을 들기도 하며, 흔한 혼동의 원인), 플레처 존스 컴퓨터 과학 석좌교수(1977), The Art of Computer Programming 교수(1990), 현재 명예교수. “알고리즘 분석의 아버지”; 점근(빅오) 표기법을 널리 퍼뜨림. 

  3. “The Art of Computer Programming,” Wikipedia. 애디슨웨슬리가 1962년 컴파일러 책을 의뢰; 프로젝트는 계획상 일곱 권으로 확장; 제1권 1968년 출간, 작업은 여전히 진행 중; American Scientist가 한 세기의 과학을 빚어낸 책들 중 하나로 꼽았고 New York Times가 “이 직업을 규정하는 논저”라 부름; 1976년 사진 식자에 대한 좌절로 커누스가 1977년 TeX을 시작해 8년 뒤 돌아옴; TeX과 METAFONT는 1986년에 책으로 출간; 2.56달러 “1 16진수 달러” 포상 수표. 

  4. “Donald E. Knuth — A.M. Turing Award Laureate,” ACM (공식 페이지는 자동 요청을 차단함; 아래의 봇 접근 가능한 1차 자료 미러 참고). 시상식에서 낭독되고 강연과 함께 재수록된 1974년 수상 사유 그대로: “1974년 A.M. 튜링상은 알고리즘 분석과 프로그래밍 언어 설계에 대한 다수의 주요 공헌, 특히 그의 잘 알려진 일련의 저서를 통한 ‘프로그래밍 예술’에 대한 가장 의미 있는 공헌에 대하여 스탠퍼드 대학교의 도널드 E. 커누스 교수에게 수여된다.” 튜링 강연: Donald E. Knuth, “Computer Programming as an Art,” Communications of the ACM 17, no. 12 (December 1974): 667–673 (전문, 수상 사유도 재수록). 

  5. “The Art of Computer Programming,” Wikipedia, 그리고 “Knuth reward check,” Wikipedia. 발견된 오류 하나하나에 대한 “1 16진수 달러”(256센트 = 2.56달러) 가치의 포상 수표; 실물 수표는 은행 사기 사건 이후 2008년에 중단되고, 가상의 “산세리페 은행” 앞으로 발행되는 증서로 대체됨. 

  6. Donald E. Knuth, “Structured Programming with go to Statements,” ACM Computing Surveys 6, no. 4 (December 1974): 261–301. “프로그래머들은 자기 프로그램의 중요하지 않은 부분의 속도에 대해 생각하거나 걱정하느라 엄청난 시간을 낭비합니다… 우리는 작은 효율들에 대해, 말하자면 97% 정도의 경우에는 잊어야 합니다. 성급한 최적화는 모든 악의 근원입니다. 그러나 그 결정적인 3%에서의 기회마저 놓쳐서는 안 됩니다.” 논문 인용은 다음에도 있음: “Structured programming,” Wikipedia. 

  7. 귀속에 관하여: 커누스는 1974년 논문 이후 약 15년 뒤 이 문장을 “호어의 격언”이라 불렀고, 직접 물었을 때 토니 호어는 이를 부인하며 데이크스트라와 “공동의 문화 또는 구전”을 시사했습니다. 논의와 호어의 답변은 다음에 기록되어 있음: “Programming Myths and Folklore: The Origin of ‘Premature optimization is the root of all evil’,” 그리고 귀속에 관한 주석은 “Donald Knuth,” Wikiquote. 

  8. “Literate programming,” Wikipedia. 커누스의 1984년 Computer Journal 논문; WEB 시스템(파스칼 + TeX)과 후속 CWEB(실비오 레비와 함께, C용); tangle은 컴파일 가능한 코드를 추출하고 weave는 조판 문서를 만들어 냄; “프로그램은 하나의 웹으로 생각하는 것이 가장 좋다… 프로그래머의 임무는 그러한 부분들과 그 관계들을, 사람의 이해에 가장 좋은 순서가 무엇이든 그 순서로 진술하는 것이다.” 

  9. Donald E. Knuth, “Notes on the van Emde Boas construction of priority deques: An instructive use of recursion” (메모, 1977), 다음에 기록됨: “Donald Knuth,” Wikiquote. “위 코드의 버그를 조심하라. 나는 그것이 올바름을 증명했을 뿐, 실행해 보지는 않았다.” 

  10. Donald E. Knuth, “Knuth versus Email,” 스탠퍼드 홈페이지. “나는 더 이상 이메일 주소를 갖지 않게 된 1990년 1월 1일 이후로 행복한 사람이었다.” 이메일은 모든 일의 정점에 있는 것이 역할인 사람들에게 어울린다. 커누스의 역할은 일의 밑바닥에 있는 것, 곧 설명하기 전에 어떤 주제를 깊이 파고드는 것이다. 

관련 게시물

엔지니어링 철학: 이와타 사토루

이와타 사토루는 닌텐도 사장이 되고 나서도 게이머이기를 멈추지 않은 프로그래머였습니다. 기술적 숙련은 언제나 플레이어의 즐거움을 위한 것이었습니다.

14 분 소요

엔지니어링 철학: 레슬리 램포트, 코딩 전에 생각하라

레슬리 램포트는 분산 시스템을 과학으로 만들었습니다. 시간은 전역적이지 않고, 실재하는 것은 인과이며, 코드를 쓰기 전에 설계를 명세합니다.

12 분 소요

The Shader Gallery That Lied: Debugging 216 WebGL Presets

A user said the shader playground looked broken. Pixel-readback testing found 30 dead presets, 11 that never compiled, a…

11 분 소요