[책] 쏙쏙 들어오는 함수형 코딩 후기

Posted on Aug 28, 2023

책 링크

후기를 적기 앞서 나는 우선 함수형 프로그래밍에 대해 관심이 많고 위키피디아 등을 통해서 학습을 이미 했었다. 나는 병렬적인 프로그램 구성에 대해 관심이 아주 많기 때문에 함수형 프로그래밍을 좋아할 수 밖에 없었다. 또, 함수형 프로그래밍은 수학에 가깝다. 처음 프로그래밍을 배웠을 때 제일 이해할 수 없었던 것은 a = 3; a = 4; 같은 문장들이었다. 기존의 프로그래밍은 수학에서 이름과 기호들을 빌려왔지만 실제 행동을 전혀 그와 같지 않았다. 그래서 나는 함수형 프로그래밍을 처음 알았을 때 계속해서 관련 지식을 탐구하기 시작했고, 그러다가 이 책을 알게되었다. 이 글은 해당 책을 읽은 후기지만 선입견을 가진 개인적인 내용이 있을 수도 있다.

이 책에 대해 좋은 점은 거의 모든 설명에 대해서 실제 코드를 들어서 직접적으로 설명해주는 것이었다. 책의 설명에 2~5년 차의 종사자가 읽기 좋은 책이라고 써있는데 솔직히 이 책의 난이도나 아주 잘 되어 있는 설명을 봤을 때 누구나 읽어도 상관이 없다고 생각이 들었다. 왜 이렇게 생각이 들었나면 기본적으로 함수형 프로그래밍에 대해 설명을 들어도 이를 바로 적용시키기란 굉장히 어려운 일이기 때문이다. OOP든 FP든 설명만으로 실제 적용을 하기엔 굉장히 어렵다. 그게 만약 psuedo 코드로 되어 있다고 해도. 이 책에서는 자바스크립트로 굉장히 친절하게 A부터 Z까지 설명해주는 느낌이었다. 그래서 나는 이 책이 굳이 2~5년차의 종사자가 읽기 적합한 책인가? 하는 의문이 들었다. 대학생에서 2년차 까지의 종사자가 읽기 적합한 책이 아닌가 싶었다.

또 다른 좋은 점은 그 동안 내가 함수형 프로그래밍에 대해 영어 위키피디아 문서 등 다양한 소스에서 학습해왔던 내용들을 체계적으로 정리할 수 있었다는 것이었다. 보통 프로그래밍을 공부할 때 이렇게 내가 필요한 혹은 궁금한 부분들을 위주로 학습하다 보면 (이렇게 공부하는 게 인터넷으로 공부할 때는 적합하다고 생각한다) 지식들이 엉커져 있어 제대로 이해하지 못한 것 같은 느낌이 들 때가 있다. 그것을 이 책으로 설계, 실제 패턴 등을 통해 더 구체화할 수 있었던 것 같다.

액션에서 계산 빼내기 부분 그리고 아키텍쳐에 대한 부분은 정말 좋았다. 계산을 빼서 최대한 함수화하는 것을 굉장히 선호한다. 하지만 실제로 업무를 할 때 이게 사이드 이펙트를 불러옴에도 그냥 사용할 때가 있었다. 어차피 사내에서는 시퀀셜한 흐름을 가지고 있던 프로그램이었고 레거시 코드가 엉켜있어서 상관이 없었지만, 굉장히 좋지 않은 결과로 이어졌다고 생각한다. 앞서 언급했듯이 병렬적이지 않아 실제로 운영이나 플로우에서는 이상이 없었지만 테스트의 어려움이 첫번째 인것 같다. input output만으로 이루어져 있는 계산인 함수들을 최대한 유지하는 것이 테스트함에 있어서 엄청난 이점으로 작용한다. 그리고 이게 앞에 언급했던 것처럼 수학의 함수의 모습을 하고 있는 형태이다. 어느 순간 나도 프로그래밍에서의 함수에 익숙해져서 수학에서의 함수의 모습을 유지하는 노력을 하지 않는 듯하다. 이게 좋은지 나쁜지는 모르겠지만 개인적으로는 되게 싫어한다. 앞서 말한 부분을 저번에 테스트하려고 하는데 뭔가 이상해서 계속 비틀어서 하다가 다른 직원분과 얘기할 때 발견했다. 스스로 이렇게 코드를 짜놓고 레거시 코드를 탓하는 것 같아 솔직히 너무 부끄러웠고 옆에서 이렇게 얘기해줄 수 있는 분이 있어서 좋았다.

아키텍쳐는 어떠한 방식으로 프로그래밍을 하든 다 적용될 수 있는 지식이라고 생각하는데, 이러한 부분들도 집어주는 게 앞으로의 프로그램 설계에 영향을 줄 것 같았다. 또, 반응형과 어니언 아키텍쳐는 전에 유튜브에서 잠시 스쳐가듯이 봤었는데 아무리 생각해도 너무 좋은 설계인 것 같다. 그 중 상호작용과 실제 도메인을 분리하는 것. 지금 내가 실무에서 운영을 할 때 레거시 코드들은 이렇게 분리되어 있지 않은데 코드를 분석하고 CS 등에 대응할 때 너무 쉽지 않다. 다음에는 내가 설계를 해나간다면 책에 나온 아키텍쳐들을 적용해봐야겠다는 생각이 들었다.

솔직히 책의 내용 중 실습의 내용은 거의 다 코드로 이미 해봤던 내용이라 좀 빠르게 넘어갔다. 한 300 페이지 정도까지는 그냥 술술 넘겼던 것 같다. 그렇지만 그 실습들이 절대로 대충 만들어져 있다거나 그런 것은 아니다. 전부 다 머릿속으로 그려보고 넘어갔다. 어차피 바로 연상될 정도로 익숙한 내용이었기 때문이었다.

마지막으로 가장 인상 깊었던 문장이 있었는데 바로 고차 함수로 추상화의 개념이 넓어진다는 것이었다. 이 부분은 정말 너무 너무 동의한다. 맨 처음 함수형 프로그래밍을 공부할 때 함수를 넘긴다는 것이 처음에는 조금 어색했지만, 매개변수의 분리를 통해 추상화를 아주 쉽게 만들어 낼 수 있다. 책을 읽기 전에 실제 내 업무에서 이런 식의 코드에 사용한 적이 있었다. 예를 들어 한 유저의 이벤트 정보에 대해 작업을 할 때가 있었다. 그 때 변경점을 로깅하려고 했었는데,

fun exec(user_info, f) ->
	ret = f(user_info)
	log(diff(ret, user_info))

그 때 내가 했던 방식은 이런 느낌이었는데 이렇게 실제 함수를 인자로 받고 실제 처리는 f에서 처리하는 것이었다. 그리고 이 때 저 f에서 필요한 정보가 예를들어 미션 혹은 출석 정보라 할 때 이 미션 혹은 출석 정보는 실제 exec 함수가 알 필요가 없기 때문에 이런 식으로 다형성을 유지할 수 있다. 이렇게 액션(로깅)을 분리하는 것은 책에도 나온다 !

fun mission_logic(user_info, mission) ->
	return something
mission = get_mission()
exec(user_info, fun (user_info) -> mission_logic(user_info, mission))

fun attend_logic(attend) ->
	return fun (user_info) ->
		return something2
attend = get_attend()
exec(user_info, attend_logic(attend))

이렇게 함수를 리턴하는 함수를 작성할 수도 있고 아니면 그냥 함수를 적용할 때 익명함수로 감싸서 매개변수로 보내면 된다. 이렇게 너무 유연하게 우리는 다형성을 형성할 수 있는데 왜 굳이 클래스와 상속이 필요한 건지 아직도 의문이다. 클래스와 상속은 너무 딱딱해서 머리가 아프다. 그리고 상속은 상하적으로 다형성을 형성하는데 이 다형성을 상하 관계로 표현할 수 없을 수도 있다. 만약 둘 다 공통적인 함수가 필요하다면? 아마 자바같은 언어에서는 interface 등으로 이룰 것이다. 나는 상속보다 이 인터페이스를 통한 다형성을 훨씬 선호한다. 아마 내 지식 혹은 내 식견이 모자란 것이 문제일 수도 있지만 아무리 봐도 상속은 너무 무겁고 딱딱해서 좋은 설계에 가까이 위치하지 않은 것 같다.

개인적인 견해가 아주 많이 담긴 후기였다. 나는 계속해서 함수형 프로그래밍을 공부하고 사용하게 될 것 같다.