The Elements Of Style For Programming

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
아래는 김창준이 2001년 7월에 월간 마이크로소프트웨어 "이럴 땐 이런 책" 코너에 기고한 글이다.

프로그래머, 塔 꼭대기의 古書를 읽다


필자가 처음 본 "전문" 컴퓨터서적은 커니건과 리치의 화이트북이었다. 그 책을 본 것이 80년대 중반이었으니 그후로 15여년이 흐른 셈이다. 그 동안 읽은 컴퓨터 관련 책 수만 해도 꽤 될텐데, 당대 최고의 저널리스트라는 다치바나 다카시가 읽은 책이 다섯 자리 수가 된다고 하니 필자의 독서편력도 그에 비하면 유치한 수준일터이다. 그래도, 필자의 집을 찾는 지우들은 "城이다!"라는 농담을 하곤 한다. 서재가 부족해서 바닥에 층층이 쌓아놓은 책을 보고 하는 소리다. 그렇게 책이 정리(?)되어 있다보니, 책 찾기가 여간 고역스러운 게 아니다. 중간의 하나를 빼낼 손 치면 그 성이 무너질까 걱정부터 해야한다. 그래도 역시 책을 사고 또 한 권 마쳤다는 성취감에 기뻐하며 탑 하나를 올리는 기분에, 필자는 21세기에도 아직 성에서 산다.

자다가 책에 깔려본 적이 있는가. 성을 쌓는 데에는 공학적 접근이 필요하다. 물론 그 튼튼함 뿐만이 아니라 용이성도 고려해야 한다. 필자가 쌓는 탑의 경우, 가장 빈번히 액세스하는 책일 수록 상단부에 위치하고, 기단은 불쌍하게도 그 무게와 부피만으로 유용한 책들이 차지한다. 어느 때이건 항상 상단 캐쉬 영역에 올라와 있는 책 중 하나가 지금 소개하려는 TheElementsOfStyle(이하 EoS)이다. (참고로 이 책은 지난 97년 DDJ 북리뷰에서, 튜링상 수상자와 전산학 형성에 지대한 공헌을 한 사람 20여명이 꼽은 '자신에게 영향을 준 컴퓨터 책' 공동 5위를 차지했다)

EoS는 본디 작문의 바이블이다. "스트렁크와 화이트(EoS의 저자)에 따르면"이라는 呪文에 모든 영작 논쟁은 종지부를 찍는다. 처음 쓰인 지 80년이 넘었지만, 여전히 베스트셀러 자리를 내주지 않고있다. 독서에 애들러와 반도렌의 How To Read a Book이 있다면, 작문에는 EoS가 있다.

이 책의 영향력은 '스타일'이 적용되는 거의 모든 분야에 최소 한 권씩의 스타일 가이드북을 낳게 했다. 프로그래밍 쪽에도 예외가 아닌데, 가장 대표적인 The Elements of Programming Style이나, 비교적 최근의 The Practice of Programming, Smalltalk with Style, The Elements of Java Style 등이 모두 이 책에서 영향을 받았다.

"유비에 의한 증명은 사기다"(Bjarne Stroustrup, The C++ Programming Language)라는 명제를 좋아하는 사람은 이런 부류의 책이 못마땅할런지도 모르겠다. 하지만 이 책에서 우리가 찾을 것은 또 하나의 定理나 증명의 옳고 그름이 아니고, 경험에서 우러나는 지혜와 영감의 유용성이다. How to Solve it으로 유명한 폴리야는 수학적 발견에 있어 이런 '유비'의 중요함을 역설한다. 하물며 수학에서도 이것이 유용하거늘 보다 인간적인 프로그래밍에서는 어떻겠는가.

결국 프로그래밍이라는 것도 짓고 쓰는 일이다 -- 자신의 대뇌 피질 속에 들어 있는 무언가를 외부로 표현해 내는 일이다. 더군다나 그걸 컴퓨터만이 아니고 인간도 읽을 수 있어야 한다. 문법에 맞고 버그가 없으며, 빨리 돌아가는 프로그램을 만드는 것 외에도 분명 무언가가 있다. Code Complete의 저자 스티브 맥코넬은 "먼저 인간을 위해 프로그램하고, 그 다음에 컴퓨터를 위해 프로그램하라"는 말을 한다. 컴퓨터가 이해하는 프로그램을 만드는 것은 대단한 것이 아니다. 거기에 더해서 인간이 이해할 수 있는 프로그램을 만들어야 비로소 '대단하다'고 해줄 여지가 있다.

EoS는, 단순하고 명료하며 정돈된 글이어야 한다고 말한다. 우선 이것이 이루어져야 글쓰기의 일차적 목표인 '독자의 이해'가 달성될 수 있기 때문이다. 프로그램에서도 가독성(readability)이라는 것은 다홍치마가 아니다. 설사 자신만을 위한 프로그램일 지라도, 언젠가는 그 프로그램을 다시 읽을 요량이라면 가독성을 고려해야 하며, 일회용 프로그램이라고 해도, 가독성이 낮은 프로그램일 수록 버그가 있을 확률이 높고, 또 디버깅이 어렵다는 통계를 명심해야 한다.

이 책은 총 다섯 개의 장으로 이루어졌다. 1장이 문장 구성의 마이크로 법칙이라면 2장은 작문의 매크로 원칙이고, 3장과 4장이 부호와 형식, 오용되는 단어에 대한 것이다. 마지막 5장은 스트렁크 교수의 제자 화이트가 새로 써서 덧붙인 장인데, 스타일에 대한 일반적인 조언을 해주고 있다. 여기서 특별히 프로그래머들에게 유용할만한 부분은 -- 만약 기술문서이건 뭐건 영어로 작문할 일이 있다면 어느 하나 뺄 것 없이 -- 2장과 5장이다. 과연 어떠한 것들이 프로그램과 연결되는지 몇 가지만 살펴보도록 하자.

가장 많이 언급되는 법칙 중 하나인 17번 "필요 없는 말은 생략하라"에서는 "문장에 불필요한 단어가 있어선 안되고, 단락에도 불필요한 문장이 있으면 안되며, 같은 이유로 그림은 불필요한 선이, 기계는 불필요한 부품이 있어선 안된다. ... 모든 단어가 말을 해야한다"고 한다. 이것은 XP의 YAGNI나 OAOO (Kent Beck, Extreme Programming Explained), DRY 법칙(The Pragmatic Programmer)에 적용될 수 있을 것이다. 또, 13번 "단락을 작문의 기본단위로 만들어라"에서 한 단락이 한가지 개념을 표현해야 한다는 것이나 단락이 쓰여진 후에는 그것을 쪼갬으로써 더 개선될 여지가 있는지 살펴보라는 것 등은 OOP의 CRP(Common Reuse Principle)나 OCP (Bertrand Meyer, Object-Oriented Software Construction), 리팩토링의 Extract Method/Class (Martin Fowler, Refactoring)등과 연결된다. 11번의 "너무 많이 설명하지 마라"와 "명백하게 써라"는 XP의 DTSTTCPW나 "단순한 디자인"에 대한 선호 등에서 다시 확인할 수 있고, 14번 "능등태를 써라"에서는 Responsibility-driven Design (Wirfs-Brock, R. et al., Designing Object-Oriented Software)이나 LoD(Law of Demeter) (Lieberherr, K.J. et al., Assuring Good Style for Object-Oriented Programs)와의 관련성을 볼 수 있으며, 19번 "관련된 개념은 비슷한 형식으로 표현하라"와 20번 "관련된 단어들을 가까운 곳에 두어라"는 각각 LSP(Liskov Substitution Principle) (Barbara Liskov, Data abstraction and hierarchy. ACM SIGPLAN Notices, 23(5), May 1988)와 ISP(Interface Segregation Principle)의 메아리처럼 들린다. 5장 1번 "자신을 배경에 두어라"나 17번 "사견을 끼워 넣지 마라"는 Code Stewardship과 Egoless Programming (Gerald Weinberg, The Psychology of Computer Programming)의 지혜를 전한다.

커니건과 파이크가 자신의 책에서 말하듯이 이런 '스타일'은 규범적 법칙이 아니고 경험에서 온 상식이다. 그러면서도 EoS는, 그 상식을 '비권위주의적'인 법칙으로 만든다: "최고의 작가는 때로 수사법칙을 무시한다. 하지만, 그럴 때에 독자는 보통 그 문장에서, 법칙위반의 희생에서 얻는, 뭔가 보상해주는 장점을 찾을 수 있다. 그러나 그럴 확신이 서지 않는다면, 아마도 법칙을 따르는 것이 최선일 게다."

필자는 이 책을 공부할 책이라고 생각하지는 않는다. 오히려 자신의 삶 속에서 끊임없이 확인하고 동의하며 실천해 나가야할 책이요, 몸으로 얻어야(體得) 할 책이라고 생각한다. 그러기 위해서는 저자가 조언하는 것처럼 훌륭한 작가(혹은 프로그래머)의 작품을 많이 접하고 흉내내어서, 그 스타일을 내재화하는 것이 최선일 듯 싶다. 물론 그 과정에 있어 이런 책을 항상 몸에 가까이 하고, 짬짬이 훑어보는 일이 큰 도움이 될 것이다. 자신이 컴퓨터를 타는(ride) 이상으로 컴퓨터가 자신을 탄다(컴퓨터가 자신을 매개로 표현을 한다)고 고백하는 켄트 벡의 수준이 되는 그날을 기대하며 오늘도 필자는 책을 집어든다. 탑의 꼭대기에서.

추신: 사실 이 서평 자체가 하나의 사기극일지도 모른다 -- EoS를 빌어 다른 책(여기 제목이 비친 모든 책)을 소개하는 것이 필자의 숨은 의도였을 수도 있다. 또 하나의 '지적사기'인지 아닌지 돈 안들이고 확인하고 싶으신 분은 인터넷을 통해서 이 책의 초판본을 보시면 되겠다. (http://www.bartleby.com/141/)

--김창준


"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>