시스템과 지연
지연이 직관과 다르게 작용하는 이유.
연말연시에 일주일이나 이주일쯤 집과 나라를 떠나는 건, 평소 여가를 보내던 뻔한 방식에서 벗어나 다른 일을 해 보기 좋은 기회다. 평소에는 YouTube, Lobste.rs, HackerNews, BlueSky를 지나치게 많이 본다.
최근 휴가에는 비트맵 글꼴을 만들 모눈종이와 책 두 권을 챙겼다. 첫 번째는 체코 포스트 아포칼립스 소설인 Nachové pustiny였다. 내가 구상 중인 "체코판 Fallout" MMO 게임에 쓸 영감을 얻기 위해서였다. 다른 한 권은 직장에서 추천받고 회사 교육비로 산 Thinking in Systems였다. 몇 달째 책장에서 먼지만 쌓이던 책이다.
기쁘게도 세 가지 목표를 모두 달성했다. 비트맵 글꼴을 만들었고(커닝과 악센트는 아직 손봐야 한다), 포스트 아포칼립스 소설도 단숨에 읽었으며(그럭저럭 괜찮았다), 시스템 책도 끝까지 읽었다!
Thinking in Systems는 공급원과 흡수원, 저량과 유량, 피드백 루프, 그리고 이런 요소들이 대개 상향식으로 만들어 내는 시스템을 설명하는 프레임워크와 시각 언어를 소개한다.
이 개념들은 대체로 수학적 모델과 미분방정식에 대응한다. 다만 책은 이를 자세히 다루지 않고, 예제에 사용한 실제 공식만 부록에 실었다.

지연은 이상하다
개인적으로 이 책 전체에서 가장 인상적이었던 아주 흥미로운 장이 하나 있었다. 바로 지연을 다룬 장이다.
계속 사용하는 예제는 위 이미지처럼 자동차 대리점 관리자가 주차장의 차량 재고를 관리하는 상황이다. 관리자는 재고를 항상 판매량의 10배로 유지하려 한다. 고객 수요가 늘어나면 부족분을 채우기 위해 차량을 더 주문한다.

지연이 없는 시스템
이상적인 세계에는 지연이 없다. 관리자는 수요 증가와 현재 재고가 목표 재고에서 벗어난 정도를 즉시 파악하고, 차량을 더 들여오라는 주문을 즉시 보내며, 주문한 차량도 즉시 도착한다.
이 예제에서 시간 단위는 일이다. 하루가 끝날 때 차량 30대가 팔린 것을 확인하고 30대를 주문하면 다음 날 아침 도착한다고 생각하면 된다.
먼저 지연의 영향을 받지 않는 모델의 상수부터 살펴보자.

고객 수요는 하루 20대로 시작해 하루 22대로 올라가며, 특정 하루에는 70대로 급증한다.
판매량은 min(customer demand, inventory)다. 아래의 모든 예제에서는 충분한 차량을 준비해 두었으므로 customer demand와 같다. 하지만 수요가 충분히 빠르게 증가한다면 재고가 바닥날 수도 있다.
관리자는 목표 재고를 sales * 10으로 계산한다. 단순한 계산이지만, 어디까지나 예제니까 넘어가자.
과거 N일의 판매량 평균을 구해 목표 재고를 정한다고 생각할 수도 있다. 그러면 시스템에 또 다른 지연이 생긴다. 하지만 내가 보여 주려는 내용과는 관계가 없어 이 글에서는 제외했다.
그렇다면 지연 없는 모델은 어떻게 움직일까?

참고로 책을 읽으면서 Elm으로 Monte Carlo 시뮬레이터를 직접 만들었다. 이 글의 예제에 사용한 의사 코드 공식도 확인할 수 있다. 물론 스프레드시트만으로도 충분하고, 이런 미분방정식 모델을 다루는 다른 도구도 있다. 심지어 JS 라이브러리를 기반으로 만든 무료 그래픽 웹 앱은 예제 중 하나에서 내가 다루는 것과 똑같은 사례를 보여 준다. 이 책이 정말 영향력이 있긴 한가 보다.
이 모델에는 지연이 없지만, 고객 수요가 갑자기 치솟을 때 과잉 반응해 차량을 너무 많이 사들이는 문제가 있다. 이렇게 들여온 차량을 모두 파는 데는 아주 오랜 시간이 걸린다. 무엇보다 현실적이지 않다. 현실의 모든 일에는 어느 정도 지연이 있기 때문이다. 주문을 처리하는 데 시간이 걸리고, 차량이 대리점 주차장에 도착하는 데도 시간이 걸린다. 이를 배송 지연이라고 부르자.

나쁜 지연처럼 보이지만, 지연이 항상 나쁜 것은 아니다. 관리자가 갑작스러운 수요 급증에 과잉 반응하지 않으려 한다고 생각해 보자. 평소에는 하루에 약 20대만 주문하는데, 수요가 한 번 급증했다고 550대를 주문했다! 그 대신 부족분의 절반이나 3분의 1만 주문해 목표 재고에 서서히 도달할 수도 있다. 다음 날 수요가 정상으로 돌아온다면 과잉 반응하지 않고 변화를 훨씬 부드럽게 흡수할 수 있다. 이때 사용하는 나눗수를 대응 지연이라고 부르자.

지연이 있는 시스템
두 지연을 적용해 모델을 실행해 보자.
배송 지연: 5일(주문을 보낸 시점부터 차량이 주차장에 도착할 때까지)
대응 지연 나눗수: 2(차량 30대가 부족해도 오늘은 15대만 주문한다.)

뭐지? 방금 무슨 일이 일어난 걸까? 모든 일을 제대로 처리했고, 대응 지연은 좋은 장치라고 생각했다!
실제로 대응 지연 자체는 좋다. 하지만 두 지연이 결합하면서 시스템이 진동하기 시작했다! 이후 고객 수요가 일정하게 유지돼도 시스템은 안정되지 않는다.
관리자는 악순환에 빠진다. 처음에 차량을 너무 많이 주문한 뒤, 첫 주문이 도착하기 전까지 며칠 동안 계속 주문량을 늘린다. 주문한 차량이 도착하기 시작하면 이제 재고가 지나치게 많아져, 목표 수준으로 돌아갈 때까지 더 이상 주문하지 않는다. 그러나 차량이 계속 팔리면서 재고가 다시 목표보다 낮아지고, 똑같은 주기가 반복된다.
수학적으로 무엇 때문에 이런 진동이 필연적으로 발생하는지 배워 보고 싶다. 이런 모델과 미분방정식을 수학적으로 더 깊이 다루는 책이라면 설명해 줄 것 같다. 지금은 지연이 진동을 일으킨다는 사실만 받아들이자.
지연을 줄이면 당연히 해결되지 않을까?
지연 때문에 문제가 생겼으니 지연을 최대한 줄여야 한다고 생각할 수 있다. 피드백 루프도 짧게 만들고 말이다. 하지만 대응 지연은 갑작스러운 수요 급증을 더 안정적으로 견디기 위해 도입했다는 점을 기억해야 한다. 어쨌든 직접 줄여 보고 무슨 일이 일어나는지 살펴보자.
배송 지연: 5일(이 지연은 단축할 수 없다.)
대응 지연 나눗수: 1(최대한 빠르게 대응한다. 하루가 끝날 때 부족한 수량을 정확히 주문한다.)

음. 보다시피 더 빠르게 대응하려 하자 상황이 악화됐다. 차량 재고의 진동 폭이 훨씬 커져 132대에서 518대까지 치솟는 주기가 반복된다. 목표는 약 220대인데도 말이다. 수요가 급증한 뒤에는 주차장에 차량 1,160대를 한꺼번에 보관해야 한다! 지연이 전혀 없는 경우보다도 나쁘다! 해결할 방법이 있기는 할까?
지연을 늘리기: 진정해, 친구…
어떤 일이 벌어지는지 확인하기 위해 더 인내심 있는 관리자를 시뮬레이션해 보자. 재입고를 더 긴 기간에 걸쳐 나누는 관리자다. 대응 지연 나눗수를 더 크게 설정해 6으로 바꿔 보자. 하루가 끝났을 때 차량 30대가 부족하다면 10대나 15대, 30대 대신 5대만 주문한다.
배송 지연: 5일(여전히 우리가 통제할 수 없다.)
대응 지연 나눗수: 6(더 느리게 대응한다! 지연이 더 길어진다!)

와! 진동이 잦아들고 시스템이 안정됐다!
결론
책에서 이 내용을 읽었을 때는 직관에 크게 어긋난다고 느꼈다. 직관적으로는 지연을 줄여야 할 대상으로 여기기 쉽다. 하지만 여기서는 지연을 줄이자 문제가 악화됐고, 지연을 늘리자 시스템의 움직임을 더 예측하기 쉬워졌으며 낭비도 감소했다.
책의 후반부에서 Donella Meadows는 짧은 피드백 루프를 언급한다. 그러나 무턱대고 적용할 수 있는 명확한 규칙은 없다. 자신의 시스템을 모델로 만들고, 여러 매개변수를 적용해 보면서 어떻게 움직이는지 확인해야 한다.
많은 관리자와 리더는 연구자들이 제공한 레버를 잡고 잘못된 방향으로 끝까지 밀어붙인다. 어느 방향이 옳은지 안다고 생각할 수도 있다. 하지만 혹시 모르니 시스템이 양쪽 방향에서 어떻게 움직이는지 파악한 뒤, 직관이 아니라 데이터에 따라 행동하자.
P.S.
이 예제의 간단한 시뮬레이터를 자유롭게 사용해 보길 바란다. 코드는 Github에 공개돼 있다.
source https://martin.janiczek.cz/2026/07/24/systems-and-delays.html
HN에서는 지연 자체보다 시스템의 반응 속도와 강도가 더 중요한 쟁점으로 떠올랐다. 시스템이 감당할 수 있는 속도보다 제어가 빠르면 과잉 보정이 반복되고 진동이 커진다. 주문량을 서서히 조정하는 값도 엄밀히 말하면 지연이라기보다 관측값의 증폭을 낮추는 필터에 가깝다. 안정성을 높인 것은 느린 대응 그 자체가 아니라, 최신 수치에 지나치게 민감하게 반응하지 않도록 제어 강도를 낮춘 결과라는 해석이다.
재고를 직전 수요에 맞춰 즉시 바꾼다는 모델이 현실과 동떨어졌다는 비판도 나왔다. 실제 주문에는 조달 기간과 계절별 수요 이력, 재고 가치, 위험 회피 가능성까지 반영해야 한다. 데이터를 실시간으로 계산할 수 있다고 해서 의사결정 주기까지 짧아야 하는 것은 아니다. 다만 단순 모델의 목적은 공급망 전체를 재현하는 데 있지 않다. 작은 피드백 구조에서도 진동이 어떻게 생기며 조정값이 이를 어떻게 완화하는지 보여주는 데 의미가 있다.
개발자들은 자동 확장에서도 비슷한 문제를 경험했다. 공격 자체보다 뒤늦게 몰려온 확장 작업이 더 큰 장애를 일으키고, 공격이 끝난 뒤까지 영향을 남긴 사례가 언급됐다. 제어 이론을 실제 설계에 얼마나 체계적으로 적용하는지는 분야마다 달랐다. 일부는 PID 같은 기법을 쓰지만, 분산 시스템에서는 게임 이론이 더 유용할 수 있고 일반적인 현장에서는 조건문과 순차 로직으로 처리하는 경우가 많다는 경험도 나왔다.
결국 점검할 대상은 지연의 유무가 아니라 관측 주기와 반응 강도, 조치의 효과가 나타나는 시점이다. 모델의 경계도 목적에 맞게 정해야 한다. 모든 변수를 담을 수는 없지만, 조달 시간이나 과거 이력처럼 제외한 요소가 결론을 뒤집지는 않는지 확인해야 단순화한 모델을 실무 판단에 안전하게 활용할 수 있다.
