선과 도형으로 표현한 다이어그램은 오랜 동안 시스템 구현을 설명하는 글을 더 의미 있게 만드는 존재였다. 사람들은 이런 다이어그램들을 보고 깨우침을 얻기도 하고, 영감을 받기도 하며, 필요한 정보를 찾기도 하지만, 이 다이어그램들은 완전무결하다고 할 만큼 정확한 것도 완전한 것도 아니다. 최근 몇 년 사이 시스템 구조를 설계하거나 아키텍처를 수립하는 작업의 중요성에 관심이 모이기 시작했다. 이제 이 책 『소프트웨어 아키텍처 문서화』가 제공하는 지침에는 설계에 도움이 될 뿐만 아니라, 시스템의 소프트웨어 비용 전체에서 절반 정도를 차지하는 유지보수 인력들에 유용한 정보들이 정리돼 있다. 유지보수 비용의 절반은 시스템이 어떻게 구성돼 있고 어디를 고쳐야 하는지 알아내는 데 쓰인다는 사실을 고려하면, 문서화된 아키텍처는 시스템 유지보수 인력들이 구현이라는 밀림을 헤쳐나가기 위해 반드시 지니고 다녀야 하는 지도라고 할 수 있다.
매리 셔 (카네기 멜론 대학교 컴퓨터 공학과 앨런 J. 펠리스 석좌교수)
각자의 시각에서 소프트웨어 아키텍처를 이해하고 활용해야 하는 이해당사자들(사용자, 인수자, 개발자, 테스터, 유지보수 담당자, 상호운용 담당자, 기타 인력)이 다양하게 존재하는 상황에서 다중 소프트웨어 아키텍처 뷰는 필수 불가결한 존재이다. 따라서 자연히 여러 개의 아키텍처 뷰 사이에서 어떻게 일관성을 확보할지 고민하게 되고, 이는 소프트웨어 아키텍처 분야에서 가장 중요하면서도 어려운 과제로 남는다. 이 책은 분석 가능한 소프트웨어 아키텍처 뷰를 정의하고, 그런 뷰를 통합할 수 있는 틀을 만드는 데 매우 소중한 첫발을 내딛고 있다.
배리 보엠 (TRW 소프트웨어 공학 교수, 남가주대학(USC) 소프트웨어 공학 센터 책임자)
이 책의 저자들보다 이 책을 더 잘 쓸 수 있는 사람들은 아마 없을 것이다. 우선 글의 내용이 읽기 쉬운데다, 군데군데 유머도 효과적으로 활용하고 있다. 필요할 때는 적당히 관찰자의 입장에 있다가도 끝으로 가면 직접적이면서도 명확한 결론을 내려준다. 이 책에 담긴 철학적인 요소들도 눈길을 끈다. 이 책에서 저자들은 다른 사람들이 인식하지 못한 개념들을 고찰하고, 그런 개념들과 관련된 문제점들을 제시한 후, 그 문제들을 해결해 버린다. 가히 아키텍처 문서화라는 주제에 해결사 같은 책이라 하겠다.
로버트 글래스 (Journal of Systems and Software 지 수석 편집자)
소프트웨어 아키텍처란 핵심적인 설계 결정사항 중 대부분을 추상적으로 표현해 놓은 것이다. 그래서 소프트웨어 아키텍처에서는 소프트웨어 구현상으로는 직접적으로 보이지 않는 개념들을 사용한다. 그럼 이런 결정사항들을 어떻게 찾아내서 표현할까? 복잡한 소프트웨어를 쉽게 이해할 수 있게 하는 개념들을 어떻게 찾아낼까? 이 책은 전문적인 아키텍트들이 모여 유용한 아키텍처 개념, 핵심적인 설계 결정사항, 복잡한 소프트웨어를 아키텍처 뷰로 표현하는 실무적인 방법 등에 대한 경험과 이해를 서로 공유한 끝에 나온 빼어난 결과물이라 할 수 있다.
알렉산더 란 (노키아 소프트웨어 아키텍처 책임 연구원)
10년 전에 나는 새롭고 야심 찬 제어통제 시스템을 만드는 프로젝트의 아키텍처팀을 이끌게 됐었다. 처음 시작은 별로 매끄럽지 않았지만, 아키텍처 설계 작업이 점점 제 속도를 내며 진행돼 갔다. 아키텍트들은 작업을 진행하면서 새로운 것을 고안해 내고 문제를 해결하며, 설계해서 실제로 돌려 보기도 하면서 흥미진진해했다. 우리는 브레인스토밍 회의를 여러 번 진행했고, 그때마다 화이트보드가 파편적인 설계안들로 메워졌고, 공책은 메모로 가득 차 갔다. 그 과정에서 다양한 프로토타입을 만들어 우리의 이론을 검증하거나 기각했다. 개발팀의 규모가 커짐에 따라, 아키텍트들은 점점 더 많은 사람에게 최신 아키텍처 원칙들을 설명해야만 했다. 설명을 들어야 할 사람 중에는 새로운 개발자들뿐만 아니라 개발 그룹 밖의 여러 부서에서 온 사람들도 있었다. 그 중 일부는 이런 새로운 종류의 소프트웨어 아키텍처 개념에 끌렸고, 일부는 이 아키텍처가 자신들에게 어떤 영향을 미치는지 알고 싶어 했다. 다시 말해 계획수립, 팀 또는 하부조직 구성, 시스템 납품, 시스템 부품 구매 과정에 끼치게 될 영향 등을 알고자 했다. 일부는 이 아키텍처를 설계하는 데 영향을 끼치고 싶어했다. 게다가 개발과 거리가 있는 고객이나 잠재고객들도 한자리 끼고 싶어했다. 이에 따라 아키텍트들은 짧게는 몇 시간에서 길게는 며칠까지 상당한 시간을 들여서 다양한 형태와 수준으로, 다양한 청중에게 맞는 어투로 아키텍처를 설명해야만 했다. 그 결과 각 부서에서 온 청중들이 아키텍처를 더 잘 이해할 수 있었다.
이렇게 의사소통을 하는 데 중심이 잡히자 우리의 역량은 서서히 강화됐다. 한쪽에서는 아키텍처를 설계하고 검증하느라 바빠졌고, 다른 한쪽에서는 가끔 많은 청중을 모아놓고 작업해 놓은 아키텍처의 내용이 무엇인지, 왜 그렇게 돼 있는지, 다른 해결책은 왜 선택하지 않았는지를 발표했다. 그러나 그것이 과했던지 프로젝트가 몇 달 정도 진행된 후에는 우리 내부에서도 스스로 결정해 놓은 아키텍처의 모습에 대해 이견이 생기기 시작했다.
이로 인해 우리는 결국 '기록되지 않은 것은 존재하지 않는다'라는 결론에 이르게 됐다. 이 원칙은 그 이후 두 해 동안 아키텍처팀 내에서 중심사상이 됐다. 고대 중국의 철학자인 노자는 도덕경에서 이렇게 설파했다.
남들이 나의 일을 궁금해하도록 놓아두라.
나중에 가서 그냥 결과만을 알려 주라.
(36장)
우리가 논의했거나 주장했거나 상상했거나 심지어 칠판에 초안까지 적어 놓았거나 상관없이 무엇이든 아키텍처가 될 수 있었다. 그러나 이 시스템에서는 오직 하나의 주력 문서에 기록된 것만이 실제 아키텍처였다. 그 문서가 바로 소프트웨어 아키텍처 문서(SAD, Software Architecture Document)이다. 아키텍처적인 요소와 아키텍처적인 결정 중에서 이 문서에 적혀 있지 않으면 실제로 존재하지 않는 것이다. "SAD에 들어 있지 않으면 실제로 존재하지 않는 것이다"라는 이 한 가지 규칙 덕택에 문서를 계속 개선하고 거의 주 단위로 갱신할 수 있게 됐다. 또한 실제로 시도해 보지 않은 의견들이 분분하게 떠돌아다니는 것이 프로젝트에서 가장 혼동을 일으키는 요소라고 봤을 때, 이런 의견들을 모두 배제할 수 있다는 점도 장점이었다.
소프트웨어 아키텍처 문서는 곧 프로젝트 활동의 중심 요소가 됐다. 아키텍처 문서는 우리의 생각을 남들이 들여다볼 수 있도록 해 주는 최적의 문서일 뿐만 아니라, 우리가 자리를 비우게 되더라도 다른 사람들이 불편하지 않게 됐고, 우리의 설계가 공격받았을 때는 방패막이 역할도 했다.
그 당시 우리가 직면했던 문제 중에서 가장 핵심적인 것들은 다음과 같다. 소프트웨어 아키텍처 중에서 어떤 것을 문서화해야 하는가? 그것을 어떻게 문서화할까? 구성은 어떤 식으로 해야 할까? 표기법은 어떤 것을 사용할 것인가? 얼마나 자세히, 얼마나 추상적으로 표현해야 할까? 우리 시스템만큼 야심 찬 시스템을 기술해 놓은 아키텍처 기술서도 사실 드물었다. 우리는 필요한 것이 생길 때마다 새로 만들어냈다. 이 과정에서 아키텍처라는 것이 평면적인 것이 아니라 어떤 입체적인 실체라는 사실을 곧 깨닫게 됐다. 거기에는 여러 가지 측면이 얽혀 있었고, 그 중에서 몇 가지 측면(뷰라고도 한다)은 소수의 참가자에게만 관심을 끄는 것들이었다. 우리는 문서를 읽어야 할 많은 사람이 0.5그램 가까이 되는 무게의 문서를 만들어 놓으면 열어보지도 않으리라는 사실을 알았다. 게다가 이런 문서들은 갱신하기도 매우 어려워 보였다. 그리고 어떤 선택을 내렸을 때 그에 대한 근거를 제시하지 않으면 다시 재현해내기가 불가능하다는 사실도 깨달았다. 또퇇 예리한 시각을 지닌 이해관계자가 새로 등장할 때마다 이런 사실이 다시 문제가 됐다. 우리는 시각적인 표기법을 선택했다. 표기법을 고를 때는 지나치게 모호하거나 헷갈리지 않되 또한 너무 난해하거나 복잡하지도 않은 것으로 했다. 참가자들 대부분 기를 초장에 꺾어버리지 않도록 말이다.
이제 소프트웨어 아키텍트들은 자신들이 만드는 소프트웨어 아키텍처를 어떤 식으로 문서화할지 결정하는 데 매우 좋은 시작점에 서 있다. 손쉽게 할 수 있기 때문이다. 이 책의 저자들은 내가 겪었던 것과 비슷한 경험을 수없이 겪어 오면서 그 과정에서 깨달은 중요한 내용들을 뽑아 냈다. 이 책의 저자들은 여러 소프트웨어 아키텍처 문서를 참고했다. 또한 연구 자료들을 검토하고 출간된 모든 책들을 연구한 다음, 표준적인 요소를 점검하고 그 과정에서 얻은 지혜를 모두 정리해서 이 안내서를 만들어낸 것이다. 따라서 이 책은 독자들이 소프트웨어 아키텍처 문서를 작성할 때 알아야 할 핵심적인 내용으로 가득차게 됐다. 이 책에는 소프트웨어 아키텍처의 범위나 구성, 사용하거나 사용하지 말아야 할 기법이나 도구, 표기법은 물론 비교법이나 조언, 경험법칙 등에 대한 안내도 들어 있다. 또한 이 책에는 처음 시작할 때 유용하게 활용할 수 있을 뿐만 아니라, 방향을 잃고 절망할 때도 계속해서 방향을 잡아주는 역할을 해줄 문서양식도 들어 있다.
이 책의 가치는 실로 엄청나다. 소프트웨어 아키텍처를 기술해서 여러 이해관계자에게 알리는 일은 매우 중요한 작업이라 할 수 있는데, 이 지침서가 그 과정에서 발생할 수 있는 수 개월 간의 실패와 반복의 시간을 줄이고, 쓸데없는 불편함을 많이 제거해줄 것이며, 궁극적으로 이런 모든 시도 자체를 무의미하게 만드는 값비싼 실수들을 많이 줄여줄 것이다. 이 책은 소프트웨어 아키텍트들이 책장에 꼭 갖춰 놓아야 할 중요한 참고서로 자리 잡을 것이다.
필립 크루첸 (밴쿠버 소재 래셔널 소프트웨어 캐나다의 프로세스 개발 책임자)