토니는 로봇이 피자를 만드는 가게를 운영한다. 함수형 사고를 이용하여 주방과 재고 창고를 관리하고 있다.
액션과 계산, 데이터로 구분하여 계층형 설게 원칙을 세우고, 이를 통해 분산 시스템을 사용하며 가끔 실패하는 분산 시스템을 이해하기 위해 타임라인 다이어그램도 사용하고 있다.
코드를 변경할 때 드는 비용을 줄이기 위해 함수형 사고로 코드를 구성하면 좋겠다는 생각이 든 토니는 변경 가능성에 따라 코드를 나누기로 했다.
가장 아래 쪽에는 배열이나 객체 같은 언어 기능을 놓고, 가운데에는 바뀔 수도 있지만 자주 바뀌지 않는 피자 조리에 대한 것들을 두고, 가장 위쪽에는 이번 주 메뉴와 같이 자주 바뀌는 사업적인 내용을 두기로 했다.
각 계층은 그 아래에 있는 계층을 기반으로 만들어진다. 이와 같은 패턴을 계층형 설계라고 부르고, 일반적으로 비즈니스 규칙, 도메인 규칙, 기술 스택 계층으로 나뉜다.
테스트, 재사용, 유지보수가 쉽다.
토니는 로봇 한 대가 피자를 만들기 위해 해야 할 일, 액션들을 다이어그램으로 정리했다.
주문 접수
반죽 만들기
반죽 펴기
소스 만들기
소스 뿌리기
치즈 갈기
치즈 뿌리기
오븐에 넣기
10분 기다리기
서빙
로봇 한 대는 이 일을 끝내기 전까지 다른 피자를 만들 수 없다. 그래서 토니는 로봇 세 대가 일을 나누어 함께 만들면 빠를 것이라 생각했다.
< 🧀 치즈피자 만들기 >
그러나 실행순서가 섞여 토니의 예상대로 빠르고 올바른 피자가 나오지 못했다.
반죽이 다 만들어지지 않았는데 반죽을 편다던가 치즈가 다 갈아지지 않았는데 치즈를 갈아야 하는 등의 문제가 생겼다.
❓왜 이런 일이 생겼을까요?
타임라인은 서로 순서를 맞추는 기능이 없어 다른 타임라인의 작업이 끝날 때까지 기다리지 않고 바로 다음 순서의 액션을 실행한다.
순차적인 프로그램을 분산 시스템으로 바꾸는 것은 어렵다는 걸 안 토니는 올바른 순서로 동작하는 프로그램을 만드려면 시간에 의존적인 액션에 집중할 필요가 있다는 것을 알게 된다.
토니는 회고 끝에 여러 타임라인이 동시에 진행될 때 서로 순서를 맞출 수 있는 커팅이라는 기술을 쓰기로 한다.
커팅은 고차 동작으로 구현한다.
각 타임라인은 독립적으로 동작하고 작업이 완료되면 다른 타임라인이 끝나기를 기다려서 어떤 타임라인이 먼저 끝나도 상관없다.
< 🧀 치즈피자 만들기 >
✂️------ 타임라인 커팅 ------✂️
위의 액션들이 끝나야 아래의 액션들을 실행할 수 있다.
토니는 타임라인 커팅 기술을 통해 로봇 세 대는 협력하여 빠르고 올바른 피자를 만들었다.
액션, 계산, 데이터 구분하기
코드의 변경 가능성에 따라 계층형 설계 사용
타임라인 다이어그램으로 시간에 따라 변하는 액션을 시각화 하기
액션이 올바른 순서로 실행할 수 있도록 타임라인 커팅 기술 사용하기
혹시나 잘못된 정보가 있다면 댓글로 알려주세요 ! 저의 성장의 큰 도움이 될 것 같습니다.🌱