2019년 1월 27일 일요일

소프트웨어 엔지니어 육성법으로서 패턴 언어의 가능성

디자인 패턴의 기원

일반적으로 GoF의 디자인 패턴이라는 이름으로 잘 알려진 디자인 패턴은 원래 건축가 크리스토퍼 알렉산더가 설계자와 사용자의 단절을 해체하기 위해 도입한 패턴 언어에 그 뿌리를 두고 있다.

여러 단어들이 모여 한 문장이 되고, 여러 문장들이 모여 하나의 글이 되듯이, 여러 패턴이 모여 하나의 패턴 언어가 되어 사람들이 기분 좋다고 느끼는 환경에 대한 분석을 가능하게 한다. 크리스토퍼 알렉산더에 의하면 각각의 패턴은 세계 각국의 아름다운 도시 및 주거 공간에 공통적으로 적용되는 보편적인 것으로, 예전에는 누구나 알고 있었던 것이지만 급격한 근대화로 인한 현대 도시 계획이 진행되면서 점차 잊혀져 버린 것이라고 한다. 각각의 패턴은 현대 도시 계획의 발상과는 정반대의 발상을 갖고 있으며, 인간적 척도 요소가 중시되고 있다.
바람직한 사회 전체를 한 번에 설계 및 건설 하는 것은 불가능하지만, 각각의 패턴에 따라 하나 하나의 진행되는 과정에서 일종의 커뮤니티를 형성하여 간다. 이러한 각각의 패턴을 찾아내는 것은 해당 도시 및 주거 공간에 거주하는 주민 자신이며, 건축가는 그들이 패턴을 찾아가는 것을 도와주고, 실제 모양이 되도록 설계 및 시공 감리를 하는 역할을 맡는다.     출전: 위키백과 패턴 언어페이지

크리스토퍼 알렉산더는 오늘날의 건축이 사용자를 위한 건축이 아닌 시공자를 위한 건축이 되어버린 원인을 설계에 대한 모든 권한이 건축가에게 일임 되는 건축설계 과정에서 발생하는 불완전한 커뮤니케이션에서 찾았고, 이를 해소하기 위해 일반인인 사용자를 건축의 설계에 참여시키기 위한 아이디어로서 패턴 언어를 생각해 내었다.

건축에 있어서 디자인 패턴은 이러한 패턴 언어를 지원하기 위해 과거 이루어졌던 건축이나 도시설계를 분석하여 패턴을 수집 하고 이를 바탕으로 패턴 언어를 구축하기 위한 어휘들을 지칭한다.

크리스토퍼 알렉산더의 이러한 주장은 건축분야에서는 큰 반향을 일으키지 못했지만 여기에서 영감을 받은 소프트웨어 개발자들의 연구에 의해 등장한 디자인패턴으로 소프트웨어 개발에 있어서는 큰 반향을 불러일으키게 된다.

프로그래밍에서의 패턴언어

소프트웨어 개발에 있어서 프로그래머 개개인간에 엄청난 생산성의 차이가 존재하는것은 익히 알려진 사실인데, 이러한 차이의 상당부분은 경험의 차이에서 오고 있다.
1994년 애릭감마를 포함한 네명의 저자에 의해 발표된 [디자인 패턴: 재활용 가능한 객채 지향 요소]는 소프트웨어 장인이라 불리우는 저자들의 수많은 성공과 실패의 경험속에서 축적된 노하우를 정제하여 스물세가지 패턴을 제시하였다. 초판 발간으로부터 20년이 흐른 오늘날에도 이 스물세가지 패턴은 꾸준히 이용되고 있으며, 오늘날에 와서는 이러한 패턴들을 기반으로 하여 앤터프라이즈 어플리케이션, 멀티스래드, UI, 데이터 구조, 아키텍쳐에 이르기까지 다양한 분야로 패턴을 확장하려는 노력이 꾸준히 시도되고 있다.

태권도 품새
디자인패턴을 익히고 사용하는것은 태권도에 있어서 품새을 익히고 사용하는 것과 동일하다. 태권도의 품새는 수많은 실전을 겪은 고안자가 수비와 방어 이동등에 있어서 이상적인 몸의 움직임을 정리하고 이를 패턴화 시켜 초보자가 이를 따라 함으로서 혼자서도 쉽게 익힐 수 있도록 한 것이다. 하지만 실전이나 겨루기에서는 품새의 형태대로 싸우지는 않으며, 그때그때 상황에 맞추어 대응하지만 기본이 되는것은 평소에 익혀둔 품새가 바탕이 된다.


패턴 랭귀지 3.0의 등장

물리적인 건축에서 시작된 패턴 랭귀지는 버전 2.0으로 불리우는 추상적인 소프트웨어의 디자인 패턴을 거쳐 교육이나 협력에 있어서 개인의 경험을 효과적으로 공유하기 위해 인간 행동을 대상으로 하는 버전 3.0이 등장하였다.

출전 :  패턴랭귀지:창조적인 미래를 만들기 위한 언어(Iba Takashi, 2014)
소프트웨어 개발자라면 디자인패턴의 유용성에 대해 잘 알고 있을것이다. 패턴 랭귀지는 대상을 소프트웨어 구현에서 인간 행동으로 확장 함으로서 개인의 경험을 효율적으로 공유하고 커뮤니테이션을 돕는 것을 목적으로 한다.

사실 패턴 랭귀지에서 다루는 패턴 그 자체는 대부분 전혀 새로울것이 없이 이미 존재하고 사용해 오고 있는 것 들이다. 패턴 랭귀지는 존재하는 패턴을 찾아내어 이름을 붇이고 일반적으로 적용하기 쉽게끔 언어를 정제하는 작업을 거친후에 마지막으로 각각의 패턴들간의 연관성을 찾고 연결함으로서 하나의 맵을 만드는 과정을 통해 완성된다.

프로그래머의 육성과 패턴 랭귀지

필자는 오래전부터 소프트웨어 개발자의 육성에 있어서의 패턴의 역할에 주목했다. 베테랑 개발자의 모든 습관에는 그 나름의 이유가 있으며 이를 패턴으로 정립하여 신입개발자들이 익혀서 따라해 볼 수 있게 한다면 이른바 도제 방식의 개발자 양성을 넘어 개발자 육성에 좀 더 효과적이지 않을까? 태권도의 품새와 같이 얼마간의 연습 기간을 통해 익히게 한 후 이것들이 일과 생활에서 효울적으로 사용 될 수 있도록 하면 효과적이지 않을까? 달인이라 불리우는 사람들이 저술한 설계와 구현, 매니지먼트 패턴은 이미 여러 책을 통해 세상에 나왔고 충분히 검증된 상태이다. 하지만 이 외에도 좀 더 패턴들이 있지 않을까?

예를 들자면 다음과 같은것들이 있다

학습패턴 : 우수한 개발자들은 끊임없이 변화하는 기술트렌드에서 뒤처지지 않게 나름의 학습패턴을 지니고 있다.
커뮤니케이션 패턴 : 주석을 포함한 문서화나 각종 메일, 프레젠테이션, SNS, 블로그 뿐만 아니라 일상의 대화나 회의등이 여기에 속한다.
네고시에이션 패턴 : 작업범위조정, 일정조정, 예산조정등 개발과 관련된 사항들에 대한 이해관계자들과의 조정능력.
품질 관리 패턴: 우수한 프로그래머들은 코드를 포함해 문서화등의 품질을 관리하는 나름의 방법론을 확립한 경우가 많다. 정밀 코드 레뷰나 믿을 만한 동료를 이용한 크로스 체크등 다양한 품질 관리의 패턴이 존재한다.
이 밖에도 일정관리/추정, 문서작성등은 물론이요 식사나 운동 습관, 구직/이직과 같은 사실상 인간 생활의 모든 분야에서 패턴을 찾을 수 있을것이다.

이러한 패턴을 찾아낸다면 그 다음엔 이름을 붙이고 사람들과 공유하고 토의해 보자. 아직도 세상에는 수많은 이름 없는 패턴들이 이름을 붙여주길 기다리고 있다.