다시 붙는 무

컴퓨터공학에서 배우는 개념 중에 분할 정복 이라는게 있다. 이름 그대로 분할 정복이란 어려운 문제를 여러개의 쉬운 문제로 쪼개어 푸는 것이다. 알고리즘 시간에 배우는 방법들은 대부분 나뉜 여러개의 문제가 원래 문제와 본질적으로 동일한, 대신 크기가 작은 문제인 경우이다. 하지만 알고리즘 외에 다른 분야에서 분할 정복을 시도하면 부분 문제들의 동질성이 보장되지 않는다. 이를테면 설계가 그렇다.

큰 시스템을 쪼갠 여러개의 작은 조각 문제들은 본래의 큰 문제와도, 조각들끼리도 서로 동질적이지 않다. 따라서 작은 문제들을 풀고 나서 이를 조합해 큰 문제의 답을 만드는 것도 수고가 필요하다. 문제를 잘못 쪼개면 부분 문제 각각이 혼자서는 풀리지 않거나 오히려 더 어려워질 수도 있다. 부분 문제들이 쉽게 풀리더라도, 쪼갠 부위가 영 좋지 않으면 이를 다 합치는데 드는 수고가 너무 커질 수도 있다. 시스템을 쪼갠 부분들은,

  1. 충분히 독립적이고,
  2. 풀 수 있어야 하고,
  3. 다시 합칠만 해야 한다

이중 세번째는 CS의 정수 중 하나인 추상화 와 깊게 연관되어 있다. 다시 합치는게 쉬우면 다른 큰 문제의 부분으로도 사용할 수 있다. 세상엔 아주 많은 사람들이 풀어놓은 아주 많은 추상화 블럭들이 있어서, 내가 만들고 싶은 시스템에 이미 풀려있는 추상화 블럭을 끼워 넣을 수도 이다. 일반적으로 많은 시스템에 쓰이고 있는 추상화 블럭은 가져다 쓰기 좋은 - 다른 문제와 합치기 좋은 - 상태인 경우가 많다. 그리고 다른 사람들이 풀어놓은 문제를 구경하며 문제의 쪼개진 부위 - 인터페이스 - 가 어떤 모양이어야 가져다 쓰기 좋은가에 대한 예를 볼 수 도 있다.

설계란 복잡도를 공략하기 위한 절차다. 중요한 것은 두 가지다. 1. 쪼갠 문제가 풀릴 것인가(이미 풀려있으면 더 좋다), 2. 쉽게 다시 합칠 수 있을 것인가(좋은 추상화). … 이렇게 설계 자체를 를 두 개의 부분 문제로 쪼개 보았다.


  • SOA, Microservice Architecture 등이 이런 방향의 일반화 시도라고 볼 수 있다
  • 달인이 잘 드는 칼로 깔끔하게 잘라내면, 원래 잘라지지 않았던 것처럼 다시 붙는다는 말도 안되는 개소리를 하던 만화가 하나 있다. … 사실 개소리까지는 아닌게, 절단 부위가 깨끗할수록 붙이기 쉬운게 맞다. 코드 조각도 인터페이스가 깨끗할수록 붙이기 쉽다.


사진 1장

Comments