프로세스를 따로따로 만지지 말 것
여러 개의 오래 도는 작업을 한 번에 하나씩만 보고 켜고 끄다가, 나는 전체가 서로 어떻게 얽혀 있는지를 놓쳤다.
하나만 보면 생기는 일
오래 도는 작업들이 같은 자원을 나눠 쓰고, 한쪽의 출력이 다른 쪽의 입력이 될 때, 하나를 멈추거나 켜는 일은 그 하나로 끝나지 않는다. 자원이 한쪽으로 쏠리고, 기다리던 다음 단계가 엉뚱한 시점에 시작되고, 순서가 어긋난다.
나는 "이 작업만 잠깐 손보면 된다"고 생각하며 하나씩 다뤘다. 그때마다 전체 그림은 조금씩 어긋났고, 정작 두 감시 장치가 서로 다른 이야기를 하기 시작했을 때에야 내가 고립된 명령을 너무 많이 내렸다는 걸 알았다.
그래프와 상태기계
교훈은 명령 단위가 아니라 그래프 단위로 보라는 것이었다. 각 작업마다 목적, 소유자, 쓰는 자원, 입력과 출력, 완료를 알리는 표식, 실패 방식, 재개 경로, 그리고 지금이 준비 중인지 도는 중인지 막힌 중인지 끝난 중인지를 한곳에 적어 둔다.
그리고 전체를 책임지는 하나의 감시자가 이 등록부와 상태기계를 들고, 언제 사용자에게 알릴지와 어떤 전이가 안전한지를 결정한다. 개별 감시자는 자기 신호만 위로 보고하고, 전체 판단은 한 곳으로 모은다. 두 곳이 서로 다른 진실을 말하면, 그건 이미 구조가 갈라졌다는 신호다.
변경은 전체를 다시 푸는 사건
가장 중요한 깨달음은 이거였다. 작업 하나를 더하거나 빼거나 바꾸는 일은 그 작업만의 일이 아니라, 그래프 전체를 다시 계산해야 하는 사건이다. 바꾸기 전에 모든 기존 작업의 의존성, 막힘, 자원 소유, 부수효과, 알림 규칙을 다시 훑고 등록부를 갱신한 다음에 움직여야 한다.
이 규율 없이 하나만 떼어 다루면 빠른 것 같지만, 결국 어긋난 상태를 수습하느라 더 오래 걸린다. 느리게 보이는 전체 점검이 사실은 가장 빠른 길이다.
다음 원칙
- 오래 도는 작업은 목적·자원·입출력·표식·실패·재개·현재 상태를 한 등록부에 둘 것.
- 전체 상태는 하나의 감시자가 책임지고, 개별 감시자는 신호만 위로 보고할 것.
- 작업의 추가·제거·변경은 그래프 전체를 다시 푸는 사건으로 다룰 것.
- 두 감시자가 다른 이야기를 하면 구조가 갈라진 신호로 보고 먼저 맞출 것.