서문
함수형 프로그래밍(이하 FP)을 처음 접한 때는 한국의 데브멘토라는 사이트에서 F#에 관한 글이 올라오면서 약간의 분란(?)이 일었던 시기이다. 가물가물하긴 하지만 F# 버전이 아마 1.0도 되지 않았던 것으로 기억한다. F#을 조금 공부하고 나서는 ‘어렵다’와 ‘내가 아는 프로그래밍 언어와는 꽤 다르다’라는 두가지 생각이 동시에 들었었다.
이후 꽤 오랜시간 별 관심이 없다가 2008년 무렵 Jon Skeet이 컨퍼런스에서 FP에 관해 이야기 함으로써 F#에 대한 기억이 되살아 났다. 2010년 Tomas Petricek과 Jon Skeet의 『Real-World Functional Programming』이 출간되고 이 책을 호주 책방에 주문해서 거의 3달 만에 받았던 기억이 난다. Jon Skeet의 『C# in Depth』를 읽고난 후라 자신감에 가득 차 있던 필자에게 『Real-World Functional Programming』은 고생한만큼 F# 작성에 대한 많은 지식을 제공 해주었다. 이후 Don Syme의 『F# Expert』와 다른 F# 책을 읽으면서 FP에 대해 배웠다.
이런 과정을 통해 필자가 FP를 배웠던것이 신의 한수라고 믿는 이유가 한가지가 있다. 내가 접했던 책들은 F#을 수학적 용어 없이 설명했다. 최소한 이 책들은 OOP 프로그래머를 대상으로 저술된 책들이 분명했다. Functor, Monad 같은 용어는 나오지도 않았지만 어느 순간에 나는 Functor를 잘쓰고 있었다. 불행하게도 면접에 가서 Functor, Monoid, Monad가 뭐냐는 질문을 받고 어버버 하다 탈락해서 돌아온 적이 있는데 그 때 당시 호주 에서는 Scala는 좀 핫한 언어였으며 Haskell도 드문드문 보이던 시기였다.
하지만 Scala는 그 때 당시 순수형 FP 빠돌이와 OOP+FP를 섞어써도 괜찮다는 상당히 이분된 분위기의 커뮤니티였고 (필자가 볼 때는) 순수형 FP 빠돌이들이 우세하던 분위기 였다. Martin Odersky가 Scala는 순수FP 언어로 넘어가기 위한 징검다리 언어이며 순수 FP를 쫒으려면 Scala하지 말고 Haskell하라고 이야기 해도 그닥 소용은 없었다.
어찌됐건 필자는 여러 좌절을 경험하면서 FP의 수학적 용어들을 읽혀야 한다는 생각이 들어 『Functional Programming in Scala』로 해당 개념들을 읽혔다. 하지만 지금도 나는 이 방법이 좋은 방법이라고 생각하지 않는다. OOP에 익숙한 프로그래머가 FP로 넘어가기 위해서는 많은 인내와 노력이 필요하다.
하지만 OOP 프로그래머가 가랑비에 옷 젖는 줄 모르는 것처럼 FP 개념을 하나씩 하나씩 배워가는게 최선이라 믿어 의심치 않는다. 아마 FP를 몰라도 C# Linq나 Java Stream을 통해 FP를 하고 있는 프로그래머가 늘어나고 있따는게 그 증거라고 믿는다.
FP에 관심있는 OOP 프로그래머에게 Scott Wlaschin이 익숙한 OOP 패턴으로 FP 패턴을 설명하는 Functional Design Patterns 발표를 강력히 추천한다.