함수형 프로그래밍이 유행하면서 기존의 객체지향 프로그래밍(우리가 실제로 객체 지향적으로 프로그래밍하는지는 모르겠지만) 혹은 명령형 프로그래밍에서 함수형 프로그래밍으로 사고를 바꾸려면 어떻게 해야 하는가에 대한 책이다. 일단 책 제목이나 설명을 보았을 때는 그렇게 생각되었다.
이 글을 읽고 있는 모두가 이제껏 수도 없는 컴퓨터 언어를 배워오지 않았는가? 문법은 한낱 세부사항일 뿐이다. 어려운 점은 바로 다른 방식으로 사고하는 법을 배우는 것이다.
전에는 Java로 개발했었지만 Scala도 배운 적이 있고 JavaScript에서도 함수형 프로그래밍까지는 아니더라도 underscore나 lodash같은 라이브러리는 꽤 사용하고 있다. 처음 Scala를 배울 때를 생각해보면 처음에는 익숙하지 않은 map
, foldLeft
, curry
같은 메서드의 사용법이나 재귀호출로 구현하는 방식 등이 어려워서 코드를 짜기 힘들었고 익숙하던 for문을 돌리는 방식보다 무엇이 좋은지도 잘 몰랐다. 이런 메서드나 접근 방식이 좀 더 익숙해 져서 어느 정도 사용할 수 있게 된 뒤로는 간단한 로직 외에 전체 디자인 부분에서 함수형으로 작성한다는 것이 어떤 것인지 이 책에 맞춰 말하자면 함수형으로 사고하려면 어떻게 해야 하는 가에 대해서 궁금해졌다.
리듀스와 같은 고수준의 추상 개념을 어떤 경우에 사용하는가를 터득하는 것이 함수형 프로그래밍을 마스터하는 방법의 하나다.
새로운 어휘를 배우는 것이 함수형 프로그래밍 같은 새로운 패러다임을 배우는 과정에서의 어려운 점 중 하나이다. 여러 커뮤니티에서 다른 어휘를 사용하는 바람에 이것이 더욱 어려워졌다. 하지만 일단 그것들의 유사성을 터득하면 문법적으로 놀랍게도 함수형 언어들이 중복되는 기능을 지원한다는 것을 깨달았다.
이 책의 설명 방식을 보면 왜 함수형이 좋은가에 대해서 (내가 느끼기엔) 추상적인 개념을 설명하면서 map
, reduce
, fold
, memoize
, curry
등을 사용하는 방법을 알려주고 있다. 주로 Java 코드를 보여주고 이를 함수형으로 바꾸기 위해서 Scala, Clojure, Groovy 언어로 바꾸어서 보여주고 있다. 함수형이라고 하더라도 언어마다 구현방법이나 지원하는 메서드 이름 등이 다르므로 여러 언어를 섞어서 보여주고 있는데 나는 그래서 더 이해하기가 어려웠다. Java를 안 한 지도 오래됐지만 나는 거의 안 써본 Java 8의 기능도 꽤 사용하고 있었고 Scala 코드만 약간 익숙할 뿐 Clojure, Groovy 코드는 잘 알지 못하므로(특히 Clojure!!) 함수형 메서드의 개념보다는 코드에 신경을 쓰게 되었고 이게 이 언어의 특성인 것처럼 느껴져서 오히려 함수형 프로그래밍의 개념을 이해하기 좀 어려운 느낌이었다.
마틴 파울러는 스몰토크에서 자바로의 전환을 처음엔 단순히 문법적인 불편으로 봤지만, 종국에는 스몰토크의 세상에서 가능했던 사고방식을 저해하는 일로 생각하게 되었다고 말했다. 여기저기 끼어드는 문법적인 장애 때문에, 추상적 개념이 사고 과정과 불필요하게 마찰을 빚게 된다.
객체지향 프로그래밍은 움직이는 부분을 캡슐화하여 코드 이해를 돕고, 함수형 프로그래밍은 움직이는 부분을 최소화하여 코드 이해를 돕는다. - 마이클 페더스
언어로 하여금 상태를 관리하게 하라.
재귀는 상태 관리를 런타임에 양도할 수 있게 해준다.
OOP 세상에서는 특정한 메서드가 장착된 특정한 자료구조를 개발자가 만들기를 권장한다. 함수형 프로그래밍 언어에서는 이같은 방식으로 재사용을 하려 하지 않는다. 대신 몇몇 주요 자료구조(list, set, map)와 거기에 따른 최적화된 연산들을 선호한다. 이런 기계장치에 자료구조와 함수를 끼워 넣어서 특정한 목적에 맞게 커스터마이즈하는 것이다.
함수형 프로그래밍에서는 전통적인 디자인 패턴들이 다음과 같은 세 가지로 나타난다.
- 패턴이 언어에 흡수된다.
- 패턴 해법이 함수형 패러다임에도 존재하지만, 구체적인 구현 방식은 다르다.
- 해법이 다른 언어나 패러다임에 없는 기능으로 구현된다.
한 3~4년 정도 전에 이 책을 보았으면 꽤 도움이 되었을지도 모르지만 나는 이 책을 읽고 그동안 약간 애매하게 이해하고 있던 부분이나 실제로 좋은지 의문인 것들, 함수형으로 사고하려면 어떤 개념을 가지고 접근해야 하는가에 대해서 어느 정도는 명확해 지고 깨달아지기를 기대했는데 책을 다 읽고 나서도 크게 달라진 것은 없고 여전히 많이 듣던 추상적인 개념만 머릿속에 남아있다. 이는 내가 프로그래밍 언어나 설계에 대한 지식이 깊지 못해서 그럴 수도 있다.
안 좋은 얘기 위주로 한 것 같기는 한데 함수형 프로그래밍이 요즘 얘기가 많이 나오고 있으므로 이 부분에 대해서 공부하고 싶다면 초기 개념을 잡기에는 괜찮을 것 같기는 하다.
Comments