디자인 패턴, 패턴 언어, 그리고 질서의 본질
이전 기술 부채에 대한 글에서 크리스토퍼 알렉산더와 패턴 언어에 대해 언급했습니다. 또한 소프트웨어 업계에서 패턴 언어를 적극적으로 수용한 결과로 나온 디자인 패턴에 대해 이야기했습니다.
이번 글에서는 패턴 언어, 이를 최초로 제안한 크리스토퍼 알렉산더, 그리고 패턴 언어 이후 발전한 개념을 소개하려 합니다. 이를 통해, 디자인 패턴을 넘어 알렉산더의 아이디어가 소프트웨어 개발 분야에서 더 깊고 넓게 탐구되는 계기가 되기를 바랍니다.
디자인 패턴의 탄생과 패턴 커뮤니티
연대기적 순서를 따르기보다는 소프트웨어 개발자에게 친숙한 디자인 패턴부터 시작해봅시다. 개발 분야에서 널리 알려진 ‘디자인 패턴’은 주로 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides라는 네 명의 저자가 쓴 Design Patterns: Elements of Reusable Object-Oriented Software 책에서 소개된 23개의 디자인 패턴을 말합니다.
이러한 패턴들—예를 들어 팩토리 패턴, 옵저버 패턴, 싱글톤 패턴, 전략 패턴—은 널리 가르쳐지고 사용되고 있습니다. 이 패턴들은 반복되어 나타나는 프로그래밍 문제에 대해 여러 사람들이 공통적으로 사용하는 해결책을 제공하여, 개발자가 견고한 솔루션을 효율적으로 구현하고 의사소통하는 데 도움을 줍니다. 그러나 이러한 패턴들이 어디서 비롯되었는지, 어떻게 생겨난 것인지는 잘 가르치지 않는 것 같습니다.
이 네 명의 저자가 이 책을 쓰게 된 배경은 무엇일까요? 그들이 만난 것은 우연이 아니라, 알렉산더의 사상을 소프트웨어 디자인에 적용하려는 패턴 커뮤니티의 성장 덕분이었습니다.
GOF 디자인 패턴 책은 1995년에 출판되었지만, 그 태동은 그 몇 년 전부터 이루어졌습니다. 소프트웨어 패턴 운동은 크리스토퍼 알렉산더의 건축 작업에서 직접 영감을 받으며 1980년대 후반과 1990년대 초에 형성되기 시작했습니다.
1987년, 워드 커닝험과 켄트 벡은 OOPSLA 컨퍼런스에서 Using Pattern Languages for Object-Oriented Programs라는 제목의 발표를 했습니다.
C2 위키 페이지의 패턴 역사에서 볼 수 있듯이, 소프트웨어 분야에서 패턴을 연구하고자 하는 사람들이 크고 작은 모임이나 커뮤니티를 형성하기 시작했습니다.
에리히 감마는 ET++라는 객체 지향 응용 프레임워크에 대한 박사 논문을 작성 중이었을 때 이 아이디어를 처음 접했습니다. Bruce Anderson이 TOOLS 90에서 강연을 했고, 감마는 이 워크샵에 참석했고, 그 강연을 좋아했습니다. Bruce는 Ecoop OOPSLA 90에 페이퍼를 냈고, _Toward an Architecture Handbook_라는 BOF(Birds of a Feather) 소그룹 모임을 이끌었습니다. 이 자리에서 에리히 감마와 리처드 헬름은 서로 처음 만나 소프트웨어 설계에 대한 접근 방식에서 공감대를 형성했습니다.
이 그룹은 OOPSLA 91에서 랄프 존슨과 존 블리사이디스가 대화에 합류하면서 본격적으로 이루어졌습니다. 이로부터 4인방의 디자인 패턴 작업의 기반을 다져갔습니다.
이러한 운동은 알렉산더의 지속적인 작업과 병행하여 성장했습니다. 알렉산더의 “The Timeless Way of Building” (TWOB)은 1979년에 출판되었으며, TWOB에서 소개한 패턴 언어의 실제 사례를 보여준 “A Pattern Language” (PL)는 1977년에 출판되었습니다.
워드 커닝햄의 인터뷰인 The Starting Point of Software Patterns는 소프트웨어 분야에서의 패턴 운동 초기의 이야기를 전해줍니다.
패턴 언어의 연구를 지원하는 힐사이드 그룹이 만들어졌고, PLoP(Pattern Languages of Programs) 컨퍼런스가 만들어졌습니다. 각자의 패턴 언어를 만든 사람들이 이 컨퍼런스에 모여서 서로의 시도를 공유하고, 독특한 “저자 워크샵” 형식을 통해 협력적인 개선을 모색하는 등, 패턴 커뮤니티 형성에 중요한 역할을 해오고 있습니다. PLoP는 아직도 매년 계속 개최되고 있습니다.
패턴 언어, 크리스토퍼 알렉산더
어떤 사람들은 디자인 패턴을 개발에 적용할 수 있는 일련의 고급 베스트 프랙티스로 여기고 열심히 공부하고 외웁니다. 디자인 패턴이 개발 분야에서 널리 알려졌지만, 그것은 패턴 언어의 하나의 사례에 불과합니다. 개인적으로 저는 디자인 패턴을 패턴 언어의 불완전한 적용이라고 부르고 싶습니다. 패턴 언어의 중요성과 가능성을 진정으로 이해하려면 우리는 크리스토퍼 알렉산더의 원래 아이디어를 봐야 합니다.
재미있게도 위키위키와 애자일 개발방법론에 상당한 기여를 한 워드 커닝햄이 여기에서 알렉산더의 아이디어를 소프트웨어에 적용하는 데 중요한 인물로 등장합니다.
패턴 언어란 무엇일까요? 알렉산더의 “The Timeless Way of Building”은 철학적 기초를 제공합니다. 알렉산더는, 여러 건물이나 마을은 어떠한 수준의 생명력을 가지고 있다고 말합니다. 간단히 비유하자면, 어떤 건물에 들어가서 생활하면 사람이 편안하고 생동감 있지만, 어떤 건물에 들어가서 생활하면 답답하고 눌려있는 것 같은 느낌을 받는 것을 우리는 일상에서 경험하곤 합니다. 알렉산더의 화두는, 어떤 것이 이런 차이를 만들어내는가 하는 것이었습니다. 알렉산더는 이것을 무명의 질(QWAN: Quality without a Name)이라고 불렀습니다. 그리고 이 무명의 질에 도달하려면, 살아 있는 패턴 언어를 통해서 가능하다고 했죠. 현재 존재하는 여러 건물이나 마을들을 봤을 때, 우리는 경험적으로 어느 건물들이 더 살아있는지 구별할 수 있습니다. 이런 살이있는 건물들에 내재되어 있는, 이런 살아있는 건물들을 만들 때 사용한 공통적인 방법을 패턴이라고 부릅니다. 패턴 언어는 이러한 패턴들이 구조적으로 모여 조화롭고 생동감 있는 시스템을 만드는 방식입니다.
왜 이것을 단순히 “패턴”이 아니라 “패턴 언어”라고 부를까요? 패턴 요소의 조합은 단순한 나열이 아니라 특정한 의미론적 구조를 가지고 있기 때문입니다. 패턴은 특정한 방식으로 서로 관련되어, 설계를 위한 일종의 문법을 형성합니다. 마치 언어의 단어가 조합되어 의미 있는 문장을 생성할 수 있는 것처럼, 패턴도 조합되어 의미 있는 디자인을 만들어낼 수 있습니다.
알렉산더의 접근법은 사람들이 잘 작동하는 디자인을 만드는 미묘하고 종종 암묵적인 지식을 체계화하려는 것이었습니다. 게다가 건축 전문가 집단이 아닌, 건물과 마을을 이루는 공동체 스스로가 사용할 수 있는 언어를 만든다는 점에서 혁신적이었습니다. 이러한 공동체 주체적인 특징은 그의 책 ‘오레건 대학의 실험(Oregon Experiment)’에도 잘 나타나 있습니다.
알렉산더는 소프트웨어 분야에 끼친 공로로 ACM OOPSLA 96에 초청받아 기조 연설을 했습니다. 이 강연에서 그는 소프트웨어 커뮤니티가 그의 아이디어를 수용한 것을 돌아보고, 패턴 언어의 기계적 부분에 그치지 않고 인간 경험을 증대하는 살아 있는 구조를 만들 수 있는 능력을 깊이 고민할 것을 촉구했습니다.
패턴 언어를 넘어서, 질서의 본질 탐구하기
패턴 언어를 개발한 후 알렉산더는 거기서 멈추지 않았습니다. 그의 지적 여정은 “The Nature of Order”라는 네 권의 작품으로 이어졌습니다. 이 작품은 디자인, 삶, 우주에 대한 그의 사고를 종합한 것이라고 할 수 있습니다.
Jenny Quillen의 인터뷰: A Pattern Language에서 The Nature of Order로의 역사는 알렉산더가 패턴 언어를 만들게 된 계기와 그가 왜 나중에 The Nature of Order를 썼는지에 대한 흥미로운 단서를 제공합니다.
알렉산더의 패턴 언어 연구는 미국 정부가 발주한 연구 프로젝트에서 시작되었습니다. 그 주제는 ‘공간과 환경이 사람의 행복과 정신 건강에 미치는 영향’을 발견하는 것이었습니다. 알렉산더 팀이 이 연구를 맡았을 때, 사전에 정해진 방법론은 없었습니다. 패턴 언어는 공간과 인간 경험 간의 복잡한 관계를 연구하면서 나온 발견이었습니다.
그렇게 해서 패턴 언어가 발표되었고, 널리 사용되었습니다. 그러나 알렉산더는 사람들이 패턴 언어를 실천에서 활용하는 방식에 매우 실망했습니다. 그가 보기에 사람들이 만들어내는 패턴 언어는 종종 아름다움과 생명력이 없는, 추한(ugly) 것으로 보였습니다.
그래서 “A Pattern Language”이 출간된 후 “The Nature of Order(NOO)”가 완성까지의 30년 동안, 알렉산더는 다시 근본적인 질문으로 돌아갔습니다. 패턴 언어가 살아있는 구조를 만들기 위한 완전한 답이 아니라면(충분조건), 뭐가 빠진 것일까?
알렉산더는 NOO에서 생명의 정도(Degree of Life)에 대해 말합니다. 우리는 건물이나 장소, 사물 등에서 살아있음을 느낄 수 있습니다. 그런데 각 건물이나 장소, 사물에서 느껴지는 살아있음의 정도는 조금씩 다릅니다. 하지만 여러 사람이 공통적으로 비슷한 답을 하는, 주관적 객관성이 있다고 합니다. 쉽게 말하자면, 각 개인이 주관적인 느낌을 토대로, A 건물이 B 건물보다 좀 더 살아있다고 말했는데, 알고 보니 그 질문을 받은 100명 중 90명이 같은 대답을 했다면, 이것은 주관적인걸까요 객관적인걸까요? 알렉산더는 이를 위해서 느낌(feeling)을 적극적으로 사용하라고 합니다.
그리고 알렉산더는 이러한 생명의 정도가 왜 발생하는 것인지를 분석적으로 탐구합니다. 그리고 “STRONG CENTER”부터 “GRADIENT”, “LOCAL SYMMETRY”까지 살아있는 구조를 특징짓는 15개의 속성(properties)을 제시합니다.
“The Nature of Order”에서 알렉산더는 패턴 언어가 여러 레벨에 존재한다고 말합니다. 각 패턴은 더 큰 전체 내에서 센터로 작용합니다. 일부 패턴은 하위 패턴을 가지며, 계층적 구조를 만듭니다. 패턴들은 복잡하게 연결되어 있으며, 선형적이 아닌 그물 모양으로 배열됩니다. 진정으로 좋은 패턴 언어는 개별 패턴을 뛰어넘는 메타품질을 지닙니다.
알렉산더의 후기 작업은 이러한 메타품질과 패턴 간의 연결에 초점을 맞추고 있습니다. 그는 패턴 간의 접합부를 연구하기 시작했으며, 이는 전체를 살려내기 위해 서로를 연결하고 강화합니다.
NOO의 1권이 살아있는 구조의 정적인 측면(static)을 다루었다면, NOO의 2권은 동적인 측면(dynamic)을 다룹니다. 그러한 살아있는 구조는 어떻게 만들 수 있는가. 알렉산더는, 살아있는 과정(living process)을 통해서만이 그러한 살아있는 구조를 만들 수 있다고 말합니다. 그리고 전체성(wholeness), 펼쳐짐(unfolding), 구조를 보존하는 변형(structure-preserving transformation) 등의 개념을 소개합니다.
앞으로의 방향
흥미롭게도 소프트웨어 개발자들은 알렉산더의 패턴 언어를 적극적으로 수용했지만, 그의 후기 작업에는 그만큼 관심을 갖지 않았습니다.
생각해보면, 이 선택적 수용은 어느 정도 이해가 됩니다. 디자인 패턴은 당장 실용적인 것을 제공했습니다—바로 적용할 수 있는 일반적인 프로그래밍 문제의 구체적인 솔루션이었습니다. 이것은 소프트웨어 개발에 대한 기존의 사고방식에 잘 맞았습니다. 심지어 디자인 패턴을 일종의 베스트 프랙티스로 이해하는 경우도 많습니다. 하지만 패턴 언어는 베스트 프랙티스와는 다릅니다. 반면, The Nature of Order는 설계의 기본 원칙과 살아 있는 구조를 만드는 질에 대해 더 깊이 생각하도록 요구합니다. 이것은 철학적이고, 더 도전적이며, 처음에는 명백하게 적용 가능하지 않을 수 있습니다.
이는 애자일 방법론이 거쳐온 길과도 오버랩됩니다. 애자일 방법론의 초기에는 여러 방법론들이 공존했습니다. 사실 애자일 선언은 5~6개 정도의 각 방법론들의 주요 인사들이 모여서 만든 것입니다. 그 전에는 그 방법론들이 하나의 우산 아래에 속해있지 않았습니다. 하지만 시간이 흐르면서, 지금은 스크럼 방법론 단일종만이 살아남았습니다. 왜 여러 방법론들 중에서 스크럼이 살아남았을까요? 저는 방법론들 중에서 가장 TODO가 많은 방법론이었기 때문이라고 생각합니다. 가장 명확하고, 뚜렷한 방법론이었던거죠. 스크럼이 무엇인가, 어떻게 하는 것인가를 설명하는 2분짜리 동영상들이 많이 있습니다. 그림 한 장으로 명확하게 설명할 수 있습니다. 하지만 다른 방법론들은, 뭔가 설명이 모호하고 명쾌하지 않습니다. 하지만 과연 명확한 스크럼이 애자일의 묘리를 다 담을 수 있을까요?
우리는 무엇을 놓치고 있을까요? 패턴 언어 개념의 초기 차용이 소프트웨어 구축 방식을 깊이 있게 형성했다면, The Nature of Order의 더 풍부한 프레임워크는 우리에게 어떤 것을 제공할 수 있을까요?
저는 특히 알렉산더의 unfolding 개념, 그리고 structure-preserving transformation 개념이 시스템을 진화시키는 방법이라는 측면에서 굉장히 흥미롭습니다. 소프트웨어를 정적인 설계도로 건설하는 것이 아니라, 시간의 흐름에 따라 자연스럽게 성장하고 펼쳐지는 것으로 이해하게 해줍니다. 저는 여기서 TDD+Refactoring이 왜 동작하는지 힌트를 얻을 수 있었습니다.
The Nature of Order의 원칙을 소프트웨어 설계에 적용한다면 어떤 모습일까요? 아마도 우리의 아키텍처는 더 일관성이 있을 것이고, 우리의 인터페이스는 더 직관적일 것이며, 우리의 시스템은 변화에 더 쉽게 적응할 수 있을 것입니다. 아마도 기술 부채 및 복잡성 관리와 같은 지속적인 문제를 해결할 새로운 방법을 찾을 수 있을 것입니다.
실제적으로 이는 설계 논의 중에 다른 질문을 하는 것을 의미할 수 있습니다: 이 솔루션이 우리의 아키텍처에서 명확하고 강력한 중심을 만들어내는가? 의미 있는 경계를 설정하는가? 요구사항이 발전하면서 시스템이 자연스럽게 펼쳐질 수 있도록 하는가? 이러한 고려사항은 기존의 기술적 기준을 보완할 수 있습니다. 소프트웨어 뿐 아니라, 애자일을 조직에 도입하는 과정 또한 펼쳐짐을 적용해볼 수 있습니다.
저는 여러분에게 — 건축가, 디자이너, 개발자 또는 훌륭한 소프트웨어를 만드는 것에 관심이 있는 사람이라면 누구든지 — 디자인 패턴을 넘어 진정으로 훌륭한 소프트웨어 설계를 정보화할 수 있는 더 깊은 원칙을 살펴보시기를 말씀드립니다.