ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 함수형 프로그래밍(FP) - 현실에서 함수형 사고
    CS지식/함수형 프로그래밍 2024. 3. 26. 12:23

    현실에서 함수형 사고 

     

    미래에 피자 가게를 운영하는 토니는 피자를 만드는 로봇에 함수형 사고를 많이 적용시켰다. 먼저 토지의 가게가 어떻게 돌아가고 있는지, 또 주방과 재고 창고는 어떻게 운영되고 있는지 살표보며 함수형 사고가 어떨게 적용되었는지 알아보자

     

    액션

    • 반죽 펴기
    • 피자 배달
    • 재료 주문

    액션은 호출 횟수와 시점에 의존한다. 배달차 같은 자원과 요리재료를사용하는 것은 액션이다. 액션을 사용할 때 조심해야 한다.

     

    계산

    • 조리법에 나온 것을 두 배로 만들기
    • 쇼핑 목록 결정

    어떤 것을 결정하거나 계획하는 것은 계산이다. 계산은 실행해도 다른 곳에 영향을 주지 않는다. 계산은 아무 때나 사용해도 주방이 엉망진창이 될 걱정이 없기 때문에 토니는 계산을 좋아한다.

     

    데이터

    • 고객 주문
    • 영수증
    • 조리법

    토니는 변경 불가능한(immutable)데이터를 가능한 한 많이 쓰려고 한다. 결제, 재고, 피자 조리법 같은 것이 데이터이다. 데이터는 유연하기 때문에 저장하거나 네트워크로 전송하는 등 다양하게 사용할 수 있다.


    변경 가능성에 따라 코드 나누기

    계층화 설계 맛보기

    피자 산업이 성장아면서 토니가 만든 소프트웨어도 사업에 맞춰 달라져야 했습니다. 토니는 토드를 변경할 때 비용을 줄이기 위해 함수형 사고로 코드를 구성하면 좋다는 것을 알고 있습니다.

    먼저 변경 가능성에 따라 코드를 나눠보자. 토니의 코드를 가지고, 위쪽으로 갈 수록 자주 바뀌는 코드가 위치하고 아래쪽으로 갈 수록 자주 바뀌지 않는 코드가 있는 그림을 그려보자.

     

     

    • 자주 바뀌지 않는 것(아래) 것을 기반으로 자주 바뀌는 것을 구현한다.
    • 계층화 설계가 비지니스, 도메인 및 기술문제를 명확하게 분리한다.

    각 계층은 그 아래 있는 계층을 기반으로 만들어진다. 그래서 각 계층에 있는 코드는 더 안정적인 기반 위에 작성할 수 있다. 이런 구조로 소프트웨어를 만들면 변화해 유연해진다. 가장 위에 있는 코드는 자신을 의존하고 있는 것이 없기 때문에 쉽게 변경이 가능하다. 아래 계층에 존재하는 코드들은 위에 있는 코드보다 의존하고 있는 대상이 많아 바꾸기 어렵지만 자주 바꾸지 않는다. 

     

    함수형 프로그래밍에서는 이 아키텍쳐 패턴이 계층을 만들기 때문에 계층형 설계(staratified design)라고 부른다. 계층형 성계는 일반적으로 비지니스 규칙, 도메인 규칙, 기술 스택 계층으로 나눈다.  이렇게 계층형으로 만든 코드는 테스트, 재사용, 유지보수가 쉽다.


    일급 추상

    주방을 자동화하기

    토니의 주방에는 로봇이 혼자 일하고 있기 때문에 얼마 지나지 않아 확장성에 문제가 생겼습니다. 토니는 고객이 원하는속도로 피자를 만들기 힘들어 졌습니다. 다음 타임라인은 다이어그램은 로봇한대가 피자를 만들기 위한 액션을 보여준다.

    • 각 단계에서 다음 단계에 할 일을 볼 수 있다.
    • 타임라인에 있는 모든 단계는 액션이다. 

    타임라인 다이어그램을 사용하면 액션이 시간 순서에 따라 어떻게 실행되는지 볼 수 있다. 액션은 실행 시점에 의존하기 때문에 실행 순서가 중요하다는 것을 기억해야한다. 토니는 주방을더 효율적으로 운영하기 위해 다이어그램을 고치려고 한다.


     

    분산 시스템을 타임라인으로 시각화하기 

    토니가 로봇 한 대로 피자를 만들고 있다. 좋은 피자를 만들고 있지만 고객의 수요를 따라 갈 만큼 빠르지는 않다. 한 대의 로봇이 모든 타임라인의 공정을 도맡고 있기 때문입니다.  토니는 피자 하나를 로봇 세 대가 함께 만들면 더 빠를 것이라고 생각했다. 피자 만드는 작업을 반죽만들기, 소스 만들기, 치즈 갈기로 작업을 나누고 로봇 세 대가 동시에 일을 하면 더 빨리 만들 수 있다고 생각했다.

     

    여러 대의 로봇이 함께 일을 하는 것은 분산 시스템을 의미한다. 분산 시스템에서 독립된 액션의 실행 순서는 어떻게 될지 모른다. 토니는 타임라인 다이어그램을 그려 로봇이 프로그래밍한 대로 동작할 지 알아보기했다. 아래 그림 처럼 로봇은 각자 타임라인을 가지고 있다.

     

     

    • 로봇 세 대가 각자의 타임라인을 가지고 동시에 일한다.
    • 각각의 타임라인에서 처리되는 일은 순서가 섞여서 누가 먼저 끝날지 알 수 없다.

    타임라인 다이어그램은 문제를 파악하는 데 도움이 되었지만 실행 순서가 섞이는 것은 어떻게 할 수 없다. 토니는 저녁에 로봇 세대로 장사를 해봤지만 좋은 결과를 거두지 못했다. 많은 피자가 잘못나왔고, 토니가 로봇 세대가 일하도록 바꾼 타임라인은 엉뚱한 피자가 만들어질 가능성이 높았습니다.

     


     

    각각 타임라인은 다른 순서로 실행

     

     

    기본적으로 타임라인은 서로 순서를 맞출 수 있는 기능이 없다. 다른 타임라인 작업이 끝날 때까지 기다리라는 표시가 없어서 순서대로 다음 단계를 진행한다. 각각 다른 타임라임에 있는 액션 간 실행 순서는 보장할 수 없다. 소스가 먼저 완성되고 반죽이 나중에 완성될 수도 있다. 이 경우 소스를 만드는 로봇은 반죽이 나오기도 전에 반죽을 펴는 작업을 한다.

     

    또는 치즈를 가는 작업이 오븐을 넣어아 하는 순선에 완성될 수도 있다. 이경우 소스 만드는 로봇은 치즈가는 작업이 끝나기도 전에 치즈를 뿌리는 작업을 하게된다.

     

    • 소스 만들기가 마지막에 있어야 제대로 동작한다.

    타임라인을 서로 맞추지 않은 분산 시스템은 예측 불가능한 순서로 실행된다. 3개의 로봇에게 반죽, 치즈, 소스 준비가 끝나면 피자를 만들도록 해야 한다.


    타임라인 커팅: 로봇이 서로를 기다릴 수 있게 하기

    토니는 타임라인 커팅(cutting)이라 부르는 기술을 쓰려고한다. 타임라인 커팅은 여러 타임라인이 동시에 진행될 때 서로 순서를 맞추는 방법이다.

     

    타임라인 커팅은 고차 동작(high-order operation)으로 구현한다. 각 타임라인은 독립적으로 동작하고 작업이 완료되면 다른 타임라인이 끝나기를 기다리기 때문에 어떤 타임라인이 먼저 끝나도 괜찮다.

    • 점선을 '컷(cut)' 이라고 부른다.
    • 점선은 모든 작업이 끝날 때까지 진행하지 말라는 뜻이다.

     

     

    [출처- 쏙쏙 들어오는 함수형 코딩, 저 에릭 노먼드]

    https://jpub.tistory.com/1265

     

    쏙쏙 들어오는 함수형 코딩

    심플한 코드로 복잡한 소프트웨어 길들이기 도서구매 사이트(가나다순) [교보문고] [도서11번가] [알라딘] [예스이십사] [인터파크] [쿠팡]전자책 구매 사이트(가나다순)[교보문고] [구글북스] [리

    jpub.tistory.com

     

    댓글

Designed by Tistory.