Java 번역서 두 권과 머리말
헛수고와 부끄러움
이 번에는 내가 쓴 두 편의 짧은 글을 소개한다. 모두 작년(2002)에 번역서 두 권을 감수하고 나서 쓴 글이다. 원서가 꽤 쓸만했기 때문에, 틀어지지만 않았다면 널리 자랑할만한 일이었을 터인데 결과가 그리 좋지 못했다. 하나는 전혀 생각지도 못한 사고로 애쓴 일이 헛수고가 되고 말았고, 다른 하나는 일을 무리하게 밀어붙이다가 부끄러운 작품만 내놓고 말았다.
그럼에도 이제와 그 추천의 글을 추슬러 내 보이는 이유는, 원서를 소개하는 글손보고 싶은 곳이 한 두 군데가 아니지만 부끄러운 글도 추억이라서 고스란히 남긴다. - 2026년 이라 치면 그럭저럭 짧은 서평을 대신할만하다고 생각했기 때문이다.
헛수고한 머리말 #
소프트웨어를 잘 만드는 기술은 크고 작은 실패 속에서 반복되는 고민과 연습을 통해 익힐 수밖에 없다. 특히 소프트웨어는 요구에 따라 계속 고치거나 늘리지 않을 수 없기 때문에, 미래의 변화를 받아들일 수 있도록 제대로 그 틀을 잡는 것이 무엇보다 중요하다. 당연한 얘기지만, 변화에 탄력 있는 틀을 잡는 데는 축적된 경험이 있어야겠고, 경험의 양보다는 질이 중요하다. 그저 많이 만들어 보았다고 해서 좋은 설계가 나오지 않는다. 제대로 된 틀을 잡느라 고민한 경험이 반드시 녹아 있어야 한다.
Java Design Patterns. James W. Cooper, Addison-Wesley Professional
사실 다른 사람의 축적된 경험을 빌어 쓸 수 없다면 좋은 소프트웨어를 생산성 있게 만들어내는 일은 불가능하다. 다시 말해서 개발에 성공하려면 어떤 형태로든 경험을 체계 있게 공유할 방법이 필요하다. 우리가 이 책을 통해 알게 되는 이른바 ‘패턴’의 가장 중요한 가치가 바로 여기에 있다. 패턴은 - 비슷한 문제를 반복해서 풀어가는 과정에서 끌어낸 - 경험의 추상이기 때문에, 소프트웨어 개발에 있어서는 그 무엇보다 실용 가치가 뛰어난 지적 자산이다. 또한 디자인 패턴은 객체지향성의 이점을 제대로 이해하고 연습하는데 아주 좋은 교육 자료가 된다. 이미 알고 있는 바와 같이 객체지향성은 진화를 허락하도록 소프트웨어를 설계하는 데 그 참된 가치가 있기 때문에, 어떻게 하면 그와 같은 틀을 꾸밀 수 있는 지를 잘 이끌어주는 실례와 지침이 필요하다. 적용 사례와 함께 디자인 패턴을 익혀가다 보면 ‘왜 소프트웨어의 틀을 잡는 일이 중요한가?‘를 자연스럽게 이해할 수 있다.
이 책은 자바 프로그래머를 위해 설계 패턴을 알기 쉽게 소개한 책이다. 거의 모든 예제가, 눈으로 결과를 확인할 수 있도록 GUI 응용과 붙여 놓았고 코드 사이사이에 UML 표현을 일일이 달아놓아서 이해가 쉽다. 특히 GoF의 디자인 패턴 책Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. 이 이해하기 어렵다면 이 책으로 시작하는 게 좋다. GoF의 책은 언젠가 꼭 읽어야 하겠지만, 예제가 대부분 C++로 표현되어 있기 때문에 자바만 아는 사람이 처음부터 보기에는 부담스럽다. 이 책에는 이런 점을 감안해서 (GoF의 책을 참고로) 설명이 부족하거나 애매모호한 부분을 군데군데 보충해 두었다. 부족하나마 갈증을 덜 수 있을 것이다.
이 책은 역자가 최선을 다해서 여러 번 고쳐 쓴 것이지만, 아무래도 우리 토양에서 나온 기술이 아니다 보니 용어나 관례를 옮겨 적는 데 문제가 많았다. 어떤 예제는 우리 생리에 전혀 맞지가 않아서 그 의도를 쉽게 알아채기도 어렵다. 사실 번역을 제대로 하자면 오랜 시간 동안 내용을 곱씹어가며, 쉽고 자연스러운 우리말로 옮겨 써야 하겠고, 예제도 우리 분위기에 맞게 다시 만들어야 옳지만 그러다 보면 책이 적당한 시기에 나오기 힘들다. 더구나 정보 기술은 하루가 멀다 하고 수많은 자료가 쏟아져 나오는 분야이므로, ‘제대로’와 ‘빠르게’를 모두 만족시키기 여간 힘들지 않다. 그 때문에 다소 어색한 문장이나 적당치 않은 용어 번역이 있다는 것을 잘 알고 있지만, 너그럽게 이해하고 읽어주길 바란다.
이 책으로 디자인 패턴을 공부할 때는 다음과 같은 점에 주의해야 한다. 우선, 이 책은 쉽다는 장점은 있지만 각 패턴의 가치와 용례의 전형을 보여주는 진지한 예제가 별로 없기 때문에, 패턴을 충실히 이해하려면 더 완성도가 높은 예제를 찾아가며 공부할 필요가 있다. 둘째, GoF 류의 책과 비교했을 때 각 패턴에 대한 설명에서 간결한 맛을 찾아볼 수 없고, 애매모호한 부분도 있으니 이 책으로 시작하되 GoF의 책으로 설명이 부족한 부분을 찾아 이해의 깊이를 더하는 게 바른 공부 방법이다. 마지막으로 디자인 패턴은 설계의 문제와 해법을 보여주는 카탈로그에 지나지 않기 때문에 실제 패턴을 적용해서 소프트웨어를 설계하기까지 많은 경험이 필요하다는 점을 잊지 말아야 한다. 다시 말해 책을 아무리 정성스럽게 읽어도 좋은 예제나 개발 경험을 통해 가슴으로 이해하지 않으면 디자인 패턴은 별달리 쓸모없는 지식이다. 특히 어느 정도 규모의 소프트웨어를 스스로 설계해서 만들어 본 경험이 없는 사람은 성급하게 디자인 패턴을 연구하지 않는 게 좋다. 그보다 먼저 개발 경험부터 쌓아야 한다. 소프트웨어를 제대로 만들려고 오랫동안 고생해 본 경험이 없으면, 디자인 패턴을 온전히 이해할 수 없는 것은 당연하기 때문에, 이런 책을 봐도 그저 부담스러울 뿐 가슴에 응어리진 어떤 문제에 답을 주고 있다는 감동을 얻기 어렵다. 그러므로 우선은 디자인 패턴을 적용하는 라이브러리를 쓰거나 남이 만들어 놓은 틀을 흉내 내면서 그 가치를 점차 체감해 가는 게 옳다. 경험이 뒷받침되지 않는 설계 지식은 그저 겉도는 얘기거리에 머물러 있을 뿐, 생생한 가치를 발하지 못하기 때문이다. 언제나 그렇듯이 엔지니어에게는 이론과 실제의 균형이 가장 중요하다.
어쨌든 역자의 노력으로 꽤 쓸만한 책이 우리말로 소개되어 기쁘다. 겉도는 기술 서적으로 홍수가 날 지경이지만, 정작 이런 좋은 기술을 우리말로 소개하는 책을 찾기가 힘들어서 아쉬웠던 차에, 그나마 이만한 책이라도 나와서 다행스럽다. 앞으로는 당장에 유행하는 기술을 가볍게 다루는 책보다도 쓸만한 주제를 깊이 다루는 책이 더 자주 번역되기를 바란다.
부끄러운 머리말 #
성능과 안전의 균형을 맞추는 일은 프로그래머의 영원한 과제다. 충돌하는 두 가지 목표를 완전하게 해결할 방법은 없으므로, 문제의 성격이나 응용 환경에 따라 가능한 해결책 중에서 가장 적절한 것을 선택해야 한다. 이런 난제에 부딪치게 되었을 때 프로그래머의 균형 감각이 필요하다. 이런 감각은 이론을 바탕으로 오래 동안 쌓아 올린 경험으로부터 우러나와야 더 세련되고 예리해진다.
Practical Java. Peter Haggar, Addison-Wesley Professional
이 책, Practical Java는 프로그래머로 하여금 성능과 안전에 대한 균형 감각을 키워주는 책이다. 독자들은 이 책의 PRAXIS를 하나씩 훑어내려 가면서 여러 가지 언어 기능을 어떻게 이용하는 것이 올바른 지를 잘 알게 될 것이고, 미처 알지 못했던 Java 언어의 특성을 깊이 있게 살펴보면서 그동안의 프로그래밍 습관을 돌이켜 볼 수 있는 기회를 자연스럽게 얻게 될 것이다.
그러나 어떤 지식에도 절대 가치는 없다. 지식은 전체를 바라다보는 지혜의 틀 속에서 움직여야 제 가치를 발휘한다. 저자가 책 속에서 여러 번 지적하고 있듯이 이 책에서 배운 지식을 적용하기에 앞서 반드시 소프트웨어 개발의 큰 맥락에서 가장 우선하는 목표가 무엇인지에 살피고, 적용의 타당성을 먼저 판단하는 일이 선행되어야 한다. 예를 들어 성능(Performance)을 다루는 PRAXIS 들을 고려할 때는 소프트웨어 전체 설계 목표를 무너뜨리는 수준까지 남용하고 있지는 않는지 주의해야 한다. 비슷한 이치로 클래스와 인터페이스(Classes and Interfaces)에서 불변 객체 인터페이스(immutable interface)에 관한 내용을 있는 그대로 받아들여 클래스 계층을 쓸데없이 복잡하게 만드는 실수를 해서는 안된다.
이와 같이, 우리가 프로그래머로서의 냉정을 잃지만 않는 다면, 이 책은 그 모태가 되는 Scott Meyers의 Effective C++Meyers, S. (1997). Effective C++: 50 Specific Ways to Improve Your Programs and Designs (2nd ed.). Addison-Wesley. 만큼 제 가치를 발휘하는 좋은 자산이 될 것임을 의심하지 않는다.