소프트웨어 설계는 서로 모순되는 요구사항 집합을 해소해야 한다. 그렇기 때문에, 많은 사람들이 그토록 다른 생각을 하면서도 상황에 따라 모두 다 옳을 수 있는 것이다. 이 모순들을 사라지게 할 수 있는 건 없다. 설계 품질은 그 모순들이 어떻게 해소되는가, 어떤 제약들이 먼저 충족되고 나중을 위해 남겨지는 것은 무엇인가에 의존한다. 완벽한 설계 스타일이 불가능하다고 인정하는 것이 사려깊게 설계하는 길로 가는 중요한 첫 발걸음이다.
제약조건
해소가 불가능한 제약조건들이 아래에 있다.- 비용. 설계는 개발 비용을 단기와 장기에 걸쳐 최소화해야 한다.
- 구현을 앞선다. 특히, 설계는 구현하기 전에 이루어져야 하는데 좋은 설계로 만들어진 기능은 나쁜 설계로 만들어진 기능보다 훨씬 저렴하기 때문이다.
- 변화 비용. 설계 결정을 바꾸는 것은 비쌀 수 있기에, 설계 결정을 한 번 내리고 바꾸지 않으면 비용을 절약할 수 있다.
- 수익. 설계는 수익을 최대화해야 한다. 장기적으로 더 비싼 설계가 훨씬 더 값어치 있는 경우가 있다. 그 설계가 대규모 판매를 결정하기 위해 꼭 필요한 데모에 꼭 필요한 기능을 가능케 해준다면, 그리고 그 때가 특히 제품 수명의 초기라면.
- 시간 가치. 비용과 수익은 제품 수명 전반에 걸쳐 단순히 계속 누적되어서는 안된다. 오늘의 1달러는 내일의 1달러보다 더 값어치 있다. 설계는 비용은 미래로 미루고 수익은 현재로 당겨와야 한다.
- 옵션 가치. 소프트웨어 사업은 불확실하기 때문에 미래의 개발을 위한 옵션을 유지하는 설계 스타일이, 경직된 것보다 더 가치있다.
- 요구사항 불확실성. 현 설계가 어떤 기능을 지원해야 할지 미리 알지 못한다. 그래서 필요성이 확증될 때까지 설계 결정을 내리는 일을 미루어야 한다.
- 설계는 개선된다. 작업을 하다보면 더 나은 설계를 하는 방법을 배우게 될 것이다. 진행 중에 자신이 배운 것을 융합시켜 나갈 준비를 하라.
- 계승(과거의 소프트웨어를 물려받기 : 역자주)은 성공의 비용이다. 설계에 대한 필요는 진화한다.
- 정답은 없다. 일반적으로, 주어진 문제에 대해 수용가능한 설계군(families of designs)은 몇 개 있는데 반해 더 나쁜 설계는 그 종류가 무한대이다. 심지어, 더 나쁜 설계는 적어도 당장은 치명적이지 않을 수 있다.
모두 모아 보면, 이 제약조건들은 과도하게 제약화된 시스템을 만든다. 예컨대, 당신은 비용을 최소화 하길 원하고(당신은 당연히 그렇기를 원한다), 변화에는 비용이 발생하고(실제로 그렇다), 진행 중에 학습하게 될 것이다(정말 그렇게 된다)라는 관찰이 있다면, 어떤 해소도 불가능하다.
이 제약조건들은 상황에 따라 다른 힘을 가질 것이다. 어떤 경우에는, 제품 기능의 범위(scope)가 대략적으로만 알려져 있을 것이다. 잘 알려진 도메인 하에서는 설계에 대해 작은 발견들만 하게 될 수도 있다. 제품의 초기 단계에서는 돈의 시간 가치가 극단적일 수 있지만 성숙한 제품에서 그 효과는 그저 그런 수준일 수도 있다. 성숙한 제품에서는 장기 비용이 수익성을 좌우한다. 모든 경우에 적용될 수 있는 단일한 설계 규칙 집합은 없다. 어떤 가치와 원칙들은 공통적이긴 하지만 실천방법은 다양할 것이다.
일반적으로 나는 반응적 설계 스타일을 실천하고 지지한다. 나는 요구사항 불확실성, 시간 및 옵션 가치, 설계자의 학습, 그리고 계승의 중요성을 강조한다. 나는 다른 제약사항을 더 선호하는 대신 "변화는 비싸다"라는 제약사항은 뒤로 미룬다. 나는 테크닉, 사회적 조직, 도구, 설계를 바꾸는 단순한 실천법 등의 조합을 통해 변화 비용을 낮추기 위해 나의 개발 스타일로 열심히 일한다. 그 결과, 어느 정도의 장기 비용을 들이면서 결과를 빨리 만들어 내되, 프로젝트 불확실성의 일부가 해소되었을 때 재빨리 비용 감소를 할 수 있는 스타일이 가능해진다.
단기와 장기 모두에 있어, 비용을 최소화하고 수익을 최대화하며 옵션을 최대화하는 일을 모두 동시에 할 수 있는 설계 스타일은 없다. 어느 제약조건을 먼저 해소하고 어느 것을 미룰지 결정하게 되면 어떤 특별한 설계 스타일이 가능해 진다. 이 설계 스타일에서 가치와 과정은 명료하고 의사소통하기도 쉽다. 명료해지는 것은 설계에 관한 대화의 시작이다.
나는 반응적 설계(Responsive Design)에 대한 최초의 전일 튜터리얼을 2009년 9월 4일 서울에서, 그리고 9월 10일 베이징에서 진행하려고 한다.
--켄트 벡(Kent Beck)