본문으로 건너뛰기

19 함수형 프로그래밍 여행에 앞서

이번 장에서 살펴볼 내용
  • 직장 상사의 심기를 건드리지 않고 새로운 기술을 적용하거나 학습하는 방법을 배웁니다.
  • 함수형 기능에 심취하기 위해 함수형 프로그래밍 언어 한두 개를 골라 봅니다.
  • 함수형 프로그래밍의 수학적인 관점으로 깊이 들어가 봅니다.
  • 함수형 프로그래밍을 더 배우기 위한 책을 알아봅니다.

마지막 장의 계획

이 책에서 배운 기술을 다시 보기

이 장까지 오는 과정을 돌아보기 위해 배운 기술을 다시 살펴보겠습니다.

마스터를 향해 가는 길

기술을 배웠습니다. 기술을 배우면서 우리는 비슷한 길을 걷게 됩니다. 마스터가 되기 위해 가는 길을 한 차원 높은 곳에서 살펴보겠습니다. 투 트랙 모델에 대해 배우게 됩니다.

트랙 1: 샌드박스

새로운 기술을 실험하고 연습해 보기 위한 장소가 필요합니다.

  • 사이드 프로젝트
  • 연습 문제로 훈련하기

트랙 2: 제품

기술이 숙력되었다면 기술을 더욱 갈고닦기 위해 실제 제품에 적용해 봐야 합니다. 원하는 대로 적용해 볼 수 있지만, 다음과 같은 곳에서 먼저 해보면 좋습니다.

  • 오늘 당장 버그를 없애 보기
  • 설계를 하나씩 개선해 보기

전문가의 기술을 배웠습니다.

전문적인 함수형 개발자들은 강력함과 깊이를 위해 이런 기술을 선택했습니다.

파트 1: 액션과 계산, 데이터

  • 코드에서 액션과 계산, 데이터를 구분해 가장 문제가 되는 부분을 찾습니다.
  • 액션에서 계산을 뺴내 재사용하기 좋고 테스트하기 쉬운 코드를 만듭니다.
  • 암묵적인 입력과 출력을 명시적인 것으로 바꿔 액션의 설계를 개선합니다.
  • 불변성을 구현해 데이터 읽기를 계산으로 만듭니다.
  • 계층형 설계로 코드를 구성하고 개선합니다.

파트 2: 일급 추상

  • 언어의 문법을 일급으로 만들어 코드를 추상화할 수 있습니다.
  • 함수형 반복과 함수형 도구를 사용해 고차원으로 추론합니다.
  • 함수형 도구를 연결해 데이터 변환 파이프라인을 만듭니다.
  • 타임라인 다이어그램을 통해 동시성 분산 시스템을 이해합니다.
  • 버그를 없애기 위해 타임라인을 활용합니다.
  • 고차 함수로 안전하게 상태를 변경합니다.
  • 반응형 아키텍처를 사용해 원인과 효과의 결합을 줄입니다.
  • 세상과 상호작용하기 위해 어니언 아키텍처 설계를 서비스에 적용합니다.

꼭 기억해야 할 것

아래 3가지 내용은 가장 중요하기 때문에 꼭 기억하세요.

어떤 경우에는 액션에 계산이 숨어 있습니다.

계산을 찾아서 빼내는 것은 귀찮지만 가치있는 일입니다. 계산은 액션보다 재사용하기 좋고, 테스트하거나 이해하기 쉽습니다. 그리고 빼내는 데 그렇게 많은 시간이 걸리지 않을 것입니다. 액션과 계산, 데이터를 구분하는 것은 함수형 프로그래밍 기술의 기본입니다.

액션과 계산, 데이터는 변경되는 빈도에 따라 각각 다른 계층으로 구성할 수 있습니다. 넓은 관점에서 보면 아키텍처에 대한 문제이고 결국 어니언 아키텍처로 구성하게 됩니다.

고차 함수를 사용하면 추상화에 대한 개념이 넓어집니다.

고차 함수를 사용하면 똑같은 저수준의 코드를 반복적으로 만들지 않아도 됩니다. 고차 함수를 사용하면 반복되는 코드를 한 번만 작성하면 됩니다. 그리고 도메인에 집중할 수 있습니다.

코드에서 시간의 의미는 마음대로 바꿀 수 있습니다.

어떤 코드가 여러 타임라인에서 실행된다면 기대하지 않은 실행 순서 때문에 버그가 생길 수 있습니다. 요즘은 대부분의 소프트웨어가 여러 타임라인을 갖습니다. 따라서 코드가 실행되는 순서를 이해하는 것은 매우 중요합니다.

타임라인 다이어그램으로 시간 흐름에 따라 코드가 어떻게 실행되는지 시각화할 수 있습니다. 액션이 동시에 실행되는지 차례로 실행되는지 알 수 있습니다. 액션은 실행 시점과 실행 횟수가 중요하다는 것을 기억하세요. 함수형 개발자는 액션의 순서와 반복을 바꿀 수 있다고 생각합니다. 기본형을 만들어 문법적 실행 방법을 다른 순서나 반복으로 바꿀 수 있습니다.

시간에 따른 기술과 열정의 변화

새로운 기술을 배울 때마다 완전한 숙달을 위해 누구나 비슷한 과정을 거칩니다. 처음에는 새로운 기술을 알게 된 기쁨을 주체하지 못하고 여기저기 적용할 곳을 찾아 이것저것 해봅니다. 하지만 곧 너무 높이 올라갔다는 것을 알고 바닥으로 추락하게 됩니다. 그리고 계속해서 기술의 한계에 대해 배웁니다. 서서히 기술을 적용할 때를 알게 되면 원래 알고있던 다른 것들과 어떤 관계가 있는지 배우고 적용하지 않아야 할 때를 깨닫게 됩니다.

img

이 과정은 함수형 프로그래밍을 배울 때 겪게 되는 자연스러운 과정입니다. 그리고 끝에 도달했을 때 기술은 온전히 나의 것이 됩니다.

제품: 오늘 당장 버그를 없애 보세요.

어떤 곳이나 작은 부분에 적용이 가능하고, 작은 부분을 고쳐도 코드를 개선할 수 있습니다.

변경 가능한 전역변수를 하나씩 줄입니다.

암묵적 입력과 출력은 변경 가능한 전역변수일 때도 있습니다. 전역변수는 공유할 수 있는 데이터입니다. 변경 가능한 데이터를 공유하는 곳은 버그의 진원지가 될 수 있습니다. 큰 성과를 얻기 위해 변경 가능한 전역변수를 하나씩 줄여보세요.

타임라인을 하나씩 줄입니다.

타임라인 다이어그램으로 경쟁 조건과 순서에 관한 문제를 알 수 있습니다. 타임라인을 격리하고 공유하고 조율하면 기대하지 않는 실행 순서를 없앨 수 있습니다.

제품: 설계를 하나씩 개선하세요

설계는 중요하지만 당장 좋은 점을 느끼지 못할 수도 있습니다. 하지만 시간이 지나면서 설계를 하나씩 개선하다 보면 좋은 설계의 장점이 빛나기 시작할 것입니다.

액션에서 계산을 빼내세요.

코드에서 액션을 없애는 것은 어렵습니다. 대부분의 액션은 목적이 있습니다. 불필요한 액션은 거의 없습니다. 할 수 있는 것은 액션을 작게 만드는 것입니다. 액션에서 로직을 찾고 로직을 계산으로 빼내세요. 간단하고 직접적인 액션이 좋은 액션입니다.

암묵적 입력과 출력을 명시적으로 바꿔 보세요.

액션을 없애는 것은 정말 어렵습니다. 암묵적인 입력과 출력을 없애는 것보다 더 효고적입니다. 암묵적 입력과 출력이 줄어들어도 여전히 액션이지만 더 좋은 액션입니다. 시스템의 상태와 느슨하게 결합하기 때문입니다.

반복문을 바꿔 보세요.

반복문 하나를 없애는 것이 큰 의미가 없어 보일 수 있지만 반복문에는 많은 알고리즘이 숨어 있습니다. 반복문은 함수형 스타일로 가기 위한 디딤돌이 되기도 합니다.