이 책은 다른 사람들이 이해하기 쉬운 코드를 만드는 프로그래밍에 대한 내용을 담고 있다. 하지만 너무 큰 기대는 금물이다. 아쉽게도 그런 코드를 만드는 비법 같은 것은 없다. 읽기 쉬운 코드를 작성하는 과정은 읽기 쉬운 글을 쓰는 것과 같다. 대상 독자를 정해야 하고, 명확한 전체 구조를 갖고 있어야 하며, 전체 줄거리를 생각하며 세부를 묘사해야 한다. 자바는 다른 사람이 이해할 수 있는 코드를 작성하는 여러 가지 방법을 제공한다. 이 책은 읽기 쉬운 코드를 작성하는 자바 프로그래밍 습관을 모은 것이다.
이 책은 “어떻게 하면 다른 사람들에게 코드를 전달(커뮤니케이션)할 것인가?”라는 고민에 대한 답이기도 하다. 프로그래머는 혼자 생각하면서 보내는 시간이 너무 많으므로, 다른 사람의 관점에서 코드를 바라보려 시도하는 것 자체가 커다란 변화이다. 프로그래머는 “컴퓨터가 이 코드를 어떻게 처리할까”뿐 아니라 “내 생각을 다른 사람에게 어떻게 전달할까”하는 고민까지 해야 된다. 하지만 기존 코드를 이해하는 데 엄청난 소프트웨어 개발 비용이 투입되는 것을 감안하면, 이러한 변화는 건전할 뿐 아니라 경제적 이득을 가져올 수도 있다.
미국 TV 프로그램 중에 ‘제퍼디(Jeopardy)’라는 게임 쇼가 있다. 쇼 진행자가 정답을 알려주면, 각 참가자들은 질문을 유추해내는 게임이다. 예를 들어 진행자가 “2월”이라고 하면 참가자가 “1년 열두 달 중 가장 짧은 달은?”이라 대답하는 형식이다.
코딩은 제퍼디와 비슷하다. 자바는 언어를 구성하는 요소들을 통해 정답을 제공한다. 프로그래머는 언어에서 제공하는 각 요소들이 어떤 문제를 해결하기 위해 설계된 것인지 알아내야 한다. 예를 들어 정답이 “Set 클래스를 사용하라”라면, 질문은 “다른 프로그래머에게 중복 원소를 허용하지 않는 자료 모음이란 사실을 어떻게 전달할 것인가?”가 될 것이다. 구현 패턴은 프로그래밍을 할 때 빈번히 발생하는 문제들과, 그 문제들에 대한 해결책을 자바로 제시한 것이다.
프로그래밍에서 변수가 사용되는 범위를 정하는 것(scope management)이 중요한 것처럼, 책을 쓸 때도 책에서 다룰 내용의 범위를 정하는 것이 매우 중요하다. 이 책은 스타일에 대해 많은 설명을 하고 있지만, 최종 결정을 독자에게 맡기고 있으므로, 스타일 안내서는 아니다. 또한 프로그래머가 하루에도 여러 번 내려야 하는 자잘한 결정 사항에 관한 책이지 설계에 관한 책은 아니다. 이 책에서 다루는 패턴의 형태는 일반적이지 않고 특정 목적을 위한 것이므로, 패턴에 관한 책도 아니다. 아울러 자바의 많은 기능에 대해 다루지만, 독자가 자바를 이미 알고 있다고 가정하므로 자바에 관한 책도 아니다.
사실 이 책은 “좋은 코드는 중요하다”라는 빈약한 전제를 기반으로 만들어졌다. 좋은 코드가 상업적 성공이나 광범위한 사용자 확보에 대한 필요조건 혹은 충분조건이라고 믿기에는, 사람들이 조잡한 코드로 돈을 많이 버는 사례를 너무 많이 봐왔다. 코드 품질이 회사나 개인의 미래를 좌우하는 요소가 아니라 할지라도, 나는 여전히 코드 품질이 매우 중요하다고 믿는다. 자신 있게 코드를 개발, 출시하고 기회와 경쟁 상황에 따라 개발 방향을 바꿀 수 있으며 위기 속에서도 직원들의 사기를 높일 수 있는 회사는 조잡하고 버그가 있는 코드를 작성하는 회사에 비해 성공할 확률이 높다.
설사 좋은 코딩이 장기적으로 경제적 이득을 가져오지 못한다고 하더라도 나는 여전히 내가 작성할 수 있는 최고의 코드를 작성할 것이다. 인생이 70년이라 할 때 우리 인생은 20억 초에 불과하다. 그 소중한 순간들을 자랑스럽지 않는 일을 하면서 낭비하고 싶지는 않다. 코딩을 잘하는 것은 그 자체로도 프로그래머에게 만족감을 주지만, 다른 사람들이 내 코드를 이해하고 감탄해주며 내 코드를 사용하고 점차 발전시킨다는 점을 생각할 때 더욱 중요하다.
결국 이 책은 책임감에 대한 이야기이다. 여러분은 프로그래머로서 시간과 재능과 돈과 기회를 부여 받았다. 이러한 자원들을 책임감 있게 잘 사용하려면 어떻게 해야 하는가? 이 책은 이러한 고민에 대한 나의 답이다. 프로그래머는 자기 자신과 CPU뿐 아니라, 자신의 코드를 보고 사용할 다른 사람들을 배려해서 코딩을 해야 한다.
--- 저자 서문
한글 맞춤법을 안다고 글을 잘 쓰는 것은 아니다. 마찬가지로 자바 문법을 안다고 자바 프로그램을 잘 짜는 것도 아니다. 내가 쓰는 한글과 김훈 같은 작가가 구사하는 한글의 공력에 엄청난 차이가 있는 것처럼, 훌륭한 프로그래머와 초보 프로그래머가 작성하는 코드의 품질 차이는 엄청나다.
그렇다면 어떤 코드가 좋은 코드인가? 켄트 벡은 명쾌하게 말한다. 다른 사람 입장에서 읽기 쉬운 코드가 좋은 코드라고. 여러분도 다른 사람이 짠 코드를 받았는데, 도대체 이해하기가 너무 어렵고 수정하기도 쉽지 않아서 차라리 새로 짜는 편이 낫겠다고 푸념하곤 했던 기억들이 있을 것이다. 이런 코드는 사람들의 사기를 저하시킬 뿐 아니라, 유지 보수 비용을 크게 증가시키므로 경제적 관점에서도 좋지 않다.
그러면 어떻게 해야 읽기 쉬운 코드를 작성할 수 있을까? 지금까지 많은 사람들이 읽기 쉬운 코드를 작성하는 기법은 경험을 통해서만 얻을 수 있다고 생각했다(그래서 읽기 쉬운 코드를 짜는 능력에 대해 ‘내공’과 같은 단어를 사용했다). 하지만 켄트 벡은 자신의 경험을 반추해가며 읽기 쉬운 코드를 만드는 법을 77개의 패턴으로 정형화하는 데 성공했다. 또한 책에 제시된 패턴으로 해결할 수 없는 문제에 부딪혔을 경우에 대비해, 물고기 잡는 법에 해당하는 가치와 원칙들을 제시했다(가치와 원칙 - 익스트림 프로그래밍의 주창자답다).
하지만 가장 중요한 것은 스스로의 코드에 자부심을 갖고 더 좋은 코드를 작성하려는 마음 가짐이라 본다. 백 개의 구현 패턴을 알고 있더라도 실전에서 사용하지 않으면 아무 소용이 없다. 늘 자신의 코드를 읽게 될 동료들을 생각하면서 조금이라도 이해하기 쉬운 코드를 작성하려는 자세야 말로 그 어떤 패턴보다도 강력한 힘이 될 것이다.
개인적으로 박사 과정 연구를 하면서 자바로 차세대 컴파일러를 작성하고 있는데, 내가 많은 시간을 들여서 체득한 기법들을 책에서 정형화된 패턴으로 접할 때마다 이 책을 미리 봤더라면 하는 안타까움이 들었다. 켄트 벡의 조언이 이후 나의 컴파일러 코드 품질 향상에 큰 기여를 했음은 물론이다. 역자의 경우에서와 마찬가지로 여러분의 프로젝트에서도 구현 패턴이 큰 도움이 되리라 확신한다.
--- 역자 서문