1. 루비로 배우는 객체지향 디자인
여기 한 소설가가 있습니다. 소설의 첫 대목을 시작합니다. 주인공이 나오고 주변인물도 등장합니다. 시간이 흘러갑니다. 모든 사건은 소설가가 의도한 순서대로, 순차적으로 벌어집니다. 그러다가 어느 순간 소설 속 인물들이 각자의 성격과 개성이 확고해지면서 이상한 일이 벌어집니다. 소설 속 인물들의 관계가 복잡해집니다. 소설가가 미처 생각하지 못한 사이에 인물들이 부딪히고 사건이 생기며 이야기가 전개됩니다.
뜬금없이 소설 이야기로 시작해보았습니다. 그 이유는 제가 나름대로 절차적 프로그래밍과 객체지향적 프로그래밍을 이해한 것을 표현해보고 싶었기 때문입니다. (이렇게 소설에 비유를 하다보니, 비록 글짓기와 프로그래밍이 문과와 이과로 분류가 나뉘어져 있지만 실제 세계를 모델 삼아 텍스트로 무언가를 짓는 작업이라는 점에서 참 많이 닮았다는 생각이 듭니다.)
절차적 프로그래밍으로 시작해 객체지향이 등장하면서 발전해온 프로그래밍의 역사를 생각해봤습니다. 더 효율적이고 더 생산성 높고 더욱 좋은 소프트웨어를 만들기 위한 다양한 개발자들이 있었겠구나 하는 짐작도 할 수 있었습니다. 우리가 사는 세상에 해결되지 않은 문제가 많듯이 프로그래밍의 세계에도 만병통치약은 아직 없습니다. 소설가의 손을 벗어난 소설 속 인물들이 서로 부딪히며 말도 안 되는 상황을 만들어버릴 수 있듯이 객체지향 프로그래밍을 한다 해도 관리하기 힘들고 더 이상 손댈 수 없을 정도의 프로그램이 만들어지곤 합니다.
그럼 대체 객체지향 소프트웨어를 잘 만들려면 어떻게 해야 할까요? 객체지향을 검색해보면 나오는 ‘캡슐화’ ‘상속’ ‘다형성’ 같은 용어에서 이미 머리가 지끈거려 오는데요.
이 책은 객체지향 소프트웨어를 디자인하는 방법을 설명합니다. 세상을 이미 정해진 절차들의 묶음으로 생각하지 않고 객체가 서로 주고 받는 메시지들의 연쇄로 파악하는 것이 객체지향 디자인을 바라보는 관점이라고 말합니다. 그리고 저자는 이렇게 말합니다.
“객체지향 디자인을 배우기 위한 첫걸음은 객체들 속에 푹 빠져보는 것이다. 일단 객체지향적 관점을 얻고 나면 나머지는 자연스럽게 따라온다.”
저자 샌디 메츠가 30년이 넘는 시간 동안 셀 수 없이 많은 애플리케이션을 만들며 생각해온 것을 담은 책이라고 하니 한번 믿고 더 이야기를 들어볼까요?
2. 루비로 배우는 객체지향 디자인
디자인을 바라보는 저자의 관점 또한 매우 뚜렷하고 명확합니다. 문제의 해결방식은 여러 개가 될 수 있기 때문에 디자인은 공장에서 찍어내는 공산품이 아니라 주문제작하는 작품과 비슷하다고 말합니다.
“디자인은 예술이다. 코드 배치의 예술이다.”
디자인을 할 때 어려운 점은 바로 ‘지금만 생각하면 안 된다’는 점일 것입니다. 오늘은 잘 돌아가던 프로그램이지만 내일은 내/외부적 변화로 인해 잘 돌아가지 않을 수도 있기 때문입니다. 그러면 어떻게 해야할까요? 미래의 변화를 다 예측할 수도 없는데 말이죠. 저자의 답변은 다음과 같습니다.
” 프로그래머는 초능력자가 아니다. 미래의 특수한 요구사항을 미리 예측하는 디자인은 거의 언제나 좋지 않은 결과를 낳는다. 실용적 디자인은 우리의 애플리케이션에 어떤 일이 벌어질지 예측하는 것이 아니라, 단지 언젠가 무언가는 변한다는 사실 그리고 지금은 무엇이 변경될지 알 수 없다는 사실을 받아들이는 것이다. 디자인은 미래를 추측하지 않는다. 미래를 대비해서 가능한 선택지를 여러 가지 만들어 놓을 뿐이다. 디자인은 선택하지 않는다. 변화하고 움직일 수 있는 공간을 남겨 놓을 뿐이다.”
디자인 원칙에 대한 생각은 어떨까요? 유명한 원칙들을 따른다고 해서 정말로 코드의 질이 높아지는 것인지 의심하는 독자에게 저자는 여러 가지 근거와 연구결과를 알려주며 이렇게 마무리합니다.
“이 연구들을 직접 읽어보지 않았더라도 그 결론은 확실히 알 수 있다. 좋은 디자인 원칙을 따르면 코드의 질이 높아지며, 이는 측정할 수 있는 과학적 사실이다.”
그렇다면 디자인 패턴은요? 동일한 문제에 이름을 부여하고 같은 방식으로 해결책을 제시하는 디자인 패턴은 매우 강력하며 한 세대의 모든 프로그래머가 서로 소통하고 협업할 수 있는 도구를 제공해주었습니다. 하지만 초보 프로그래머는 패턴을 오용하기도 하지요. 아무리 패턴이 강력하다지만 잘못 쓰면 복잡하고 혼란스러운 코드를 낳을 뿐입니다. 저자는 이렇게 초보 프로그래머를 다독입니다.
“이 책은 패턴을 설명하지 않는다. 하지만 독자가 패턴을 이해할 수 있도록 준비시켜 줄 수 있고, 올바른 패턴을 선택하고 제대로 사용할 수 있는 지식을 제공한다.”
위의 인용은 모두 이 책의 1장에 포함되어 있습니다. 저는 프로그래머가 아님에도 불구하고 이 책의 1장을 읽으며 감탄했습니다. 이 주제에 한해서는 정말 오래, 깊은 고민을 한 저자의 마음이 느껴졌기 때문입니다. 그 설득하는 태도가 강압적이지도 감정적이지도 않았기 때문이기도 합니다.
3. (루비로 배우는) 객체지향 디자인
마지막으로, 이 책은 분명 루비 예제를 썼고 루비의 특성을 감안하지 않을 수 없지만 이 책에서 설명하는 개념을 이해하기 위해 루비를 알아야 하는 것은 아닙니다.
“객체지향 디자인(object-oriented design, OOD)을 배우고 싶지만 객체지향 프 로그래밍 경험이 없다면, 이 책을 읽기 전에 튜토리얼 정도는 끝내고 오면 좋다. 객체지향 디자인은 특정 문제들을 해결하기 위한 방식이다. 이 문제들 때문에 고민해 본 경험은 문제의 해결책을 이해하기 위한 선결과제와 같다. 경험이 많은 프로그래머라면 이 단계를 생략해도 괜찮지만, 대부분의 독자는 이 책을 읽기 전에 간단한 객체지향 코드를 작성해 보면 이 책에 대한 만족감을 더 높일 수 있을 것이다.
이 책에서는 루비를 이용해서 객체지향 디자인을 설명하지만, 여기서 소개하는 개념을 이해하기 위해 루비를 알아야 하는 것은 아니다. 루비로 작성한 코드 예시가 많이 있지만 그 내용은 매우 명확하다. 객체지향 언어로 작업해 본 경험이 있는 사람이라면 루비를 쉽게 이해할 수 있을 것이다. “
저자가 밝힌 이 책의 목적을 올리며 책소개를 마무리하겠습니다.
“프로그래머가 행복을 느끼는 이유는 자기 자신이 쓸모 있다고 느낄 수 있기 때문이다. 행복이 고통으로 바뀌는 순간이 바로 우리가 좀 더 많은 작업을 할 수 있고, 또 해야 한다는 신호다. 코딩의 즐거움은 이제 일이 되기 시작한다.이 책은 객체지향 소프트웨어 디자인에 대한 책이다. 두툼한 교과서가 아니다. 코드를 어떻게 작성하면 좋을지에 대한 한 프로그래머의 이야기를 담고 있다. 오늘 당장 생산적이고, 다음 달 그리고 내년에도 계속 생산적일 수 있는 방식으로 소프트웨어를 정리하는 방법을 가르친다. 오늘 성공적이면서, 미래에도 적응할 수 있는 애플리케이션을 작성하는 법을 보여준다. 애플리케이션이 사용되는 기간 내내, 생산성을 끌어 올리고 시간과 비용을 낮출 수 있도록 해준다.
이 책은 우리가 모두 훌륭한 결과물을 만들고 싶어 한다고 생각하며, 이를 위해 가장 열심히 연마해야 할 도구들을 제공한다. 매우 실용적인 내용이며, 그렇기 때문에 이 책의 핵심은 우리를 다시 행복하게 만들어 줄 수 있는 코드를 작성하는 방법을 알리는 것이다.”
책 소개글을 쓰기 전에 고민이 좀 있었는데요. 제가 프로그래머가 아닌지라 내용을 확 와닿게 설명할 자신이 없었습니다. 그냥 좋은 책이 나왔다고만 소개하면 너무 겉핧기식 소개글이 되지 않을까 하는 생각도 들더군요. 그래서 어설프나마 제 수준에서 이해할 수 있는 비유로 시작해봤습니다. 혹시 잘못 표현된 부분이 있다면 말씀해주시기 바랍니다. 객체지향에 대한 서로의 의견이나 책에 대한 기대평을 실시간으로 달려주시는 것도… 권장합니다. ^ ^
(저자 샌디 메츠)
참, 저자인 샌디 메츠의 홈페이지를 방문해보시는 것도 추천합니다. 굉장히 유쾌한 에너지가 넘치는 분인 것 같습니다.
* 정오표
* 구입처
댓글이 닫혀있습니다.