이 글은 켄트 벡이 자신의 Responsive Design 세미나 소개를 위해 작성한 블로그글(Design Dilemma)을 김창준이 번역한 것입니다.

소프트웨어 설계는 서로 모순되는 요구사항 집합을 해소해야 한다. 그렇기 때문에, 많은 사람들이 그토록 다른 생각을 하면서도 상황에 따라 모두 다 옳을 수 있는 것이다. 이 모순들을 사라지게 할 수 있는 건 없다. 설계 품질은 그 모순들이 어떻게 해소되는가, 어떤 제약들이 먼저 충족되고 나중을 위해 남겨지는 것은 무엇인가에 의존한다. 완벽한 설계 스타일이 불가능하다고 인정하는 것이 사려깊게 설계하는 길로 가는 중요한 첫 발걸음이다.


제약조건

해소가 불가능한 제약조건들이 아래에 있다.
  • 비용. 설계는 개발 비용을 단기와 장기에 걸쳐 최소화해야 한다.
  • 구현을 앞선다. 특히, 설계는 구현하기 전에 이루어져야 하는데 좋은 설계로 만들어진 기능은 나쁜 설계로 만들어진 기능보다 훨씬 저렴하기 때문이다.
  • 변화 비용. 설계 결정을 바꾸는 것은 비쌀 수 있기에, 설계 결정을 한 번 내리고 바꾸지 않으면 비용을 절약할 수 있다.
  • 수익. 설계는 수익을 최대화해야 한다. 장기적으로 더 비싼 설계가 훨씬 더 값어치 있는 경우가 있다. 그 설계가 대규모 판매를 결정하기 위해 꼭 필요한 데모에 꼭 필요한 기능을 가능케 해준다면, 그리고 그 때가 특히 제품 수명의 초기라면.
  • 시간 가치. 비용과 수익은 제품 수명 전반에 걸쳐 단순히 계속 누적되어서는 안된다. 오늘의 1달러는 내일의 1달러보다 더 값어치 있다. 설계는 비용은 미래로 미루고 수익은 현재로 당겨와야 한다.
  • 옵션 가치. 소프트웨어 사업은 불확실하기 때문에 미래의 개발을 위한 옵션을 유지하는 설계 스타일이, 경직된 것보다 더 가치있다.
  • 요구사항 불확실성. 현 설계가 어떤 기능을 지원해야 할지 미리 알지 못한다. 그래서 필요성이 확증될 때까지 설계 결정을 내리는 일을 미루어야 한다.
  • 설계는 개선된다. 작업을 하다보면 더 나은 설계를 하는 방법을 배우게 될 것이다. 진행 중에 자신이 배운 것을 융합시켜 나갈 준비를 하라.
  • 계승(과거의 소프트웨어를 물려받기 : 역자주)은 성공의 비용이다. 설계에 대한 필요는 진화한다.
  • 정답은 없다. 일반적으로, 주어진 문제에 대해 수용가능한 설계군(families of designs)은 몇 개 있는데 반해 더 나쁜 설계는 그 종류가 무한대이다. 심지어, 더 나쁜 설계는 적어도 당장은 치명적이지 않을 수 있다.

모두 모아 보면, 이 제약조건들은 과도하게 제약화된 시스템을 만든다. 예컨대, 당신은 비용을 최소화 하길 원하고(당신은 당연히 그렇기를 원한다), 변화에는 비용이 발생하고(실제로 그렇다), 진행 중에 학습하게 될 것이다(정말 그렇게 된다)라는 관찰이 있다면, 어떤 해소도 불가능하다.
 

이 제약조건들은 상황에 따라 다른 힘을 가질 것이다. 어떤 경우에는, 제품 기능의 범위(scope)가 대략적으로만 알려져 있을 것이다. 잘 알려진 도메인 하에서는 설계에 대해 작은 발견들만 하게 될 수도 있다. 제품의 초기 단계에서는 돈의 시간 가치가 극단적일 수 있지만 성숙한 제품에서 그 효과는 그저 그런 수준일 수도 있다. 성숙한 제품에서는 장기 비용이 수익성을 좌우한다. 모든 경우에 적용될 수 있는 단일한 설계 규칙 집합은 없다. 어떤 가치와 원칙들은 공통적이긴 하지만 실천방법은 다양할 것이다.


일반적으로 나는 반응적 설계 스타일을 실천하고 지지한다. 나는 요구사항 불확실성, 시간 및 옵션 가치, 설계자의 학습, 그리고 계승의 중요성을 강조한다. 나는 다른 제약사항을 더 선호하는 대신 "변화는 비싸다"라는 제약사항은 뒤로 미룬다. 나는 테크닉, 사회적 조직, 도구, 설계를 바꾸는 단순한 실천법 등의 조합을 통해 변화 비용을 낮추기 위해 나의 개발 스타일로 열심히 일한다. 그 결과, 어느 정도의 장기 비용을 들이면서 결과를 빨리 만들어 내되, 프로젝트 불확실성의 일부가 해소되었을 때 재빨리 비용 감소를 할 수 있는 스타일이 가능해진다.


단기와 장기 모두에 있어, 비용을 최소화하고 수익을 최대화하며 옵션을 최대화하는 일을 모두 동시에 할 수 있는 설계 스타일은 없다. 어느 제약조건을 먼저 해소하고 어느 것을 미룰지 결정하게 되면 어떤 특별한 설계 스타일이 가능해 진다. 이 설계 스타일에서 가치와 과정은 명료하고 의사소통하기도 쉽다. 명료해지는 것은 설계에 관한 대화의 시작이다.


나는 반응적 설계(Responsive Design)에 대한 최초의 전일 튜터리얼을 2009년 9월 4일 서울에서, 그리고 9월 10일 베이징에서 진행하려고 한다.

--켄트 벡(Kent Beck)