본문 바로가기

Homo Design

Responsive Design - Kent Beck

올해 많은 세미나 중에 Software 공학의 대가라고 불리는 사람들의 방한은 큰 사건이 아닐 수 없다. 특히, 이러한 대가들이 모두 Agile, TDD, Refactoring을 공통적으로 이야기하고 있으며, 국내에서 그러한 주제에 대해서 관심의 시각이 늘어나고 있다는 것이 가장 주목할 만한 사건들인 것 같다.

다음은 Kent Beck 세미나의 주요 내용들이다.

- Responsive Design은 테스트하기 쉬워야 한다.
- 설정이나, 배포하기 어려운 구조 역시 설계 문제로 보아야 한다.
- 개발의 목표(goal)은 기능의 안정된 흐름(steady flow of feature)을 추구해야 한다. 이는 responsive design을 통해 달성될 수 있다.
- 기능을 추가하는 것(adding features)은 어린아이가 도형 맞추기 장난감에 도형을 끼워넣듯이 간단해야(straightforward) 한다.

- 추악한 설계(ugly design) : Kent Beck은 이와 같은 용어를 주로 사용한 반면에, Erich Gamma는 고통(pain)이라는 용어를 주로 사용함.
- 효율성(efficiency) = (initial work + cost of features + cost of changes + cost of mistakes + opportunity cost) * risks
  : 특히 기회 비용이 추가되었음을 주의, 우리는 설계시 모든 선택사항들이 기회 비용이 발생함을 잊어서는 안된다.
- 성능과 관련되어서 설계를 하는 방식에 회전문을 사용하여 비유함.
  : 하나의 회전문이 설치된 건물에서 회전문을 통해 들어오는 사람의 비율을 나타내는 분단 통과 인원수를 throughput 이라 하고,
   회전문 앞에 대기해 있는 시간(waiting time)을 latency라 하며, 그 회전문들 앞의 줄의 형태 (긴 줄 혹은 짧은 줄)를 variance라고 함.
   이러한 상태에서 성능을 높이는 방법은 회전문의 회전 속도를 높일 수도 있지만, 이는 사람들이 그 속도에 맞춰야 하는 불편함이 있으며,
   회전문을 여러개 설치해서 latency를 줄이고, variance를 평균적으로 유지하게끔 할 수도 있다.
   하지만, responsive designer는 좀 더 넓은 안목을 가지고 그 시야를 확장할 필요가 있는데(expand universe),
   좀 더 뒤로 물러나서(step back, step back), 더 큰 그림을 바라볼 필요가 있다.(look at bigger pictures)
   특히, 건물 안에 커피숍이 있다면, 커피숍을 사용하는 사람이 회전문에 대기할 필요없이 커피숍에 들어갈 수 있는 통로를 별도로
   내게끔 설계하는 더 큰 안목(bigger context)이 필요하며, 이때에 다양한 설계의 제약사항의 유형들(style of design constraint)을 고려해야 한다.
- 설계는 사회적인 활동(social activity)이다.
- 설계나 코딩시 나비 효과(butterfly effect)와 같은 민감성(sensitivity)에 유의해야 한다.
- 설계는 끊김이 없이 지속적이어야(continuous, succession) 하다.
  : 이는 다리를 짓는 건축에 비유했는데, 일반적으로 기존 다리를 새로운 다리로 대체하는 경우, 교통에 대한 연속성을 고려하여(thinking about sequence), 임시 다리를 설치하고, 기존 다리를 철거하게 된다. 즉, 새로운 설계로 변경하는 경우, 기존 기능의 연속성을 유지하기 위한 철거(destruction)에 대비한 임시 방편을 만들어 놓을 필요가 있다.
- Kent Beck은 자신이 어떻게, 왜 시작하는지에 대한 초점은 항상 value (비즈니스 가치)에 두고 있다고 한다.
- TDD는 빨리 API를 좋은 설계로 만드는 것이며, 이는 개발자게에 빠른 피드백을 가지고 와야 한다.
- Responsive design을 위해 용기(courage)가 필요하며, 이는 여러가지 제약사항에도 불구하고 앞으로 전진해야 함을 의미한다. 또한, 이렇게 용기를 가지고 전진할 때에는 어떤 확신이나 편안함을 느낄 수 있어야(feel comfortable) 한다.
- 모호함(ambiguity)는 혼돈에서 패턴을 끄집어내어 해결해야 하며, 이는 설계를 추출하는(factor the design) 과정이기도 하다.
- responsive design은 요소들의 관계를 모두 이익이 발생되게끔(beneficially relating elements) 구조화시키는 작업이다.
- 설계에 대한 변경은 비용(cost)이 발생되며, 커플링(coupling)에 영향을 미치게 되기 때문에, 이를 최소화시켜야 한다.
- 트레이드 오프(trade-off)는 균형(balance)에 대한 것이다.
- responsive design의 네가지 접근 방식은 leap / parallel / stepping stone / simplification 이며, stepping stone은 산을 올라갈 때 바로 앞의 장애물들을 제거하면서 최선을 선택하는 방식이며, simplification은 산정상만을 바라보면서 최적을 선택하는 방식으로, 전자가 bottom-up 방식이라면 후자는 top-down 방식으로 생각할 수 있다. 즉, 전자는 설계는 하는 주체가 출발점을 도착점에 가까이 가지고 가는 형태라면 후자는 도착점을 출발점으로 가까이 가지고 오는 형태라고 할 수 있다.
- 어찌되었든 간에 responsive design은 기능을 안전하고 효율적으로 추가해야 한다. (add it anyway)
- responsive designer는 리팩토링 기법을 마스터해야 한다.
- 구조(structure)와 행위(behavior)의 변경은 리팩토링에서 모두 발생되지만, 두가지를 모두 한꺼번에(at the same time) 변경해서는 안된다. 즉, 구조만 리팩토링을 하든지 행위만 리팩토링을 해야하며, 이는 테스트를 통해 검증되어야 한다.
- 리팩토링은 모두 쌍으로 되어 있으며, 즉, 추출(extract)과 삽입(inline)의 두가지 반대방향의 접근방식이 쌍을 이룬다. 예를 들면, 긴 메소드를 별도의 짦은 메소드로 추출(extract)하는 방식과 짧은 메소드를 다른 메소드로 삽입(inline)하는 방식이 역방향의 접근방식 형태로 쌍을 이룬다.
- 변경은 독립화시킬(isolate change) 필요가 있으며, 예를 들어, 긴 메소드의 리팩토링시 긴 메소드 내에서의 변경은 더 많은 위험을 안고 있는 반면에서 긴 메소드를 별도의 메소드로 추출(extract)하여 변경을 국소화시켜 응집된 형태로 리팩토링을 수행한다.
- 즉, 추출(extract)후 변경을 가하고(make the change), 변경을 국소화시키고(isolate change), 다시 삽입(inline)을 수행하여 위험을 줄인다.
- responsive design은 매우 다루기 어렵다.
- 설계는 고립된 섬과 같아야 한다. (design is an island) 수용가능한(acceptable) 결과와 솔루션을 제시해야 한다.
- responsive design은 fractal과 같이 동일한 유형들이 여러 군데에서 발견되어야 하며, symmetry 처럼 양쪽의 균형이 맞아야 한다.

반응형