Chapter 1

함수형 코딩에 오신 것을 환영합니다

  • 1.1 함수형 프로그래밍이란
  • 1.2 실용적 관점에서의 함수형 프로그래밍
  • 1.3 액션, 계산, 데이터
  • 1.4 함수형 프로그래머는 코드를 세 가지로 분류한다
  • 1.5 함수형 사고가 왜 중요한가

함수형 프로그래밍은 "수학적 순수함수"가 아니라 실용적 소프트웨어 설계 기법이야. 에릭 노먼드는 1장에서 이 관점을 확실히 박아놓거든.

보통 함수형 프로그래밍 하면 "부수효과 없는 순수함수", "불변 데이터", "모나드" 같은 키워드가 떠오르는데, 저자는 이런 학술적 정의를 좀 치워놓자고 해. 대신 실용적 정의를 내리는데, 그건 액션(Action), 계산(Calculation), **데이터(Data)**를 구분하는 것, 액션보다 계산을 많이 쓰고 계산보다 데이터를 많이 쓰는 것, 그리고 **일급 추상(first-class abstraction)**을 활용하는 거야. 핵심은 "부수효과를 없애라"가 아니라 **"부수효과를 잘 관리하라"**는 것. 현실 세계에서 부수효과가 전혀 없는 프로그램은 아무 쓸모도 없잖아.

저자가 반복해서 강조하는 게 있어 — 함수형 프로그래밍은 특별한 언어가 필요한 게 아니라 사고방식이라는 거야. 자바스크립트로도 함수형 코딩을 할 수 있고, 하스켈을 쓴다고 자동으로 함수형이 되는 것도 아니거든. 중요한 건 코드를 바라보는 **렌즈(lens)**를 바꾸는 거야. 이 책에서는 두 가지 큰 아이디어를 다루는데, 파트 1 — 액션, 계산, 데이터는 코드를 이 세 가지로 분류하고 액션을 줄이고 계산을 늘리는 기법이고, 파트 2 — 일급 추상은 함수를 값처럼 다루면서 코드의 재사용성과 추상화를 높이는 기법이야.

이제 이 책의 핵심 중의 핵심 개념으로 들어가볼게. **액션(Action)**은 호출 시점이나 횟수에 따라 결과가 달라지는 거야. 이메일 보내기, 데이터베이스 읽기, 현재 시간 가져오기 같은 것. 부수효과가 있거나 외부 세계에 의존하지. **계산(Calculation)**은 같은 입력에 항상 같은 출력을 내는 거야. 순수 함수. 더하기, 문자열 합치기, 장바구니 합계 계산 같은 것. 언제 몇 번 호출해도 결과가 같아. **데이터(Data)**는 이벤트에 대한 사실(facts)이야. 변하지 않는 기록. 숫자, 문자열, 리스트, 맵 같은 것. 이 구분이 왜 중요하냐면 — 테스트 난이도, 재사용성, 이해 용이성이 전부 달라지기 때문이야. 계산은 테스트하기 쉽고 재사용하기 쉽고 이해하기 쉬운 반면, 액션은 그 반대거든. 그러니까 액션에서 계산을 최대한 빼내서 코드 품질을 높이자는 게 저자의 핵심 주장이야.

일반 프로그래머는 코드를 볼 때 "이 함수가 뭘 하지?"를 보는데, 함수형 프로그래머는 거기에 하나 더 — "이게 액션이야, 계산이야, 데이터야?"를 봐. 예를 들어 장보기를 생각해보면, 냉장고 확인하기는 액션(냉장고 상태는 시간에 따라 바뀜), 필요한 재료 목록 만들기는 계산(레시피와 재고를 입력하면 항상 같은 목록이 나옴), 장보기 목록은 데이터(그냥 기록), 마트에서 물건 사기는 액션(실제 세계를 변경함)이야. 같은 프로세스를 이렇게 분류하기 시작하면, 어디에 버그가 생기기 쉬운지, 어디를 테스트해야 하는지가 눈에 들어와.

함수형 사고의 실질적인 이점도 뚜렷해. 분산 시스템에서 강하다 — 액션은 타이밍에 민감하고 계산은 그렇지 않으니, 계산이 많을수록 동시성 문제가 줄어들거든. 테스트가 쉬워진다 — 계산은 입력 넣고 출력 비교하면 끝이야. 목(mock)이나 스텁(stub) 같은 거 필요 없어. 코드가 읽기 쉬워진다 — 이 함수가 외부 상태를 건드리는지 안 건드리는지를 시그니처만 보고 알 수 있으면 코드 리뷰가 빨라지지. 재사용이 쉬워진다 — 계산은 컨텍스트에 의존하지 않으니 어디서든 갖다 쓸 수 있어. 결국 핵심 메시지는 이거야 — 함수형 프로그래밍은 "멋진 기법"이 아니라 **"복잡한 소프트웨어를 덜 복잡하게 만드는 실용적 도구"**다.


정리

1장 읽고 기억할 거 세 가지:

  1. 액션, 계산, 데이터 — 이 세 분류가 전부다. 이 책 전체가 이 세 가지를 깊이 파는 여정
  2. 함수형 프로그래밍은 언어가 아니라 사고방식. 자바스크립트로도 충분히 가능
  3. 목표는 부수효과 제거가 아니라 부수효과 관리. 현실 프로그램에서 부수효과를 완전히 없앨 수는 없으니, 격리하고 최소화하는 게 핵심