내 살 길 궁리

함수형 프로그래밍을 지금 생각해야 할까?

깊은바다거북 2022. 8. 30. 21:54

결론부터 말하자면, 아니라고 생각한다.

 


<<쏙쏙 들어오는 함수형 코딩>>이라는 책을 읽었다.

내가 읽을 깜냥이 아니라는 걸 알았지만, 도서관에서 급하게 나서며 쓸어담느라 집으로 데려오게 되었다.

첫 장을 넘겼는데, 세상에 책 디자인이 너무 좋아서 빠져들어 읽었다. 책을 프로그램에 비유하자면, 인터페이스가 정말 깔끔하고 취향 저격이었다고나 할까. 이걸 읽고 있을 때인가 의심이 들면서도 '어, 어어..? 이해가 돼..!' 하면서 다음 걸 읽고 다음 걸 읽고 했다. 이 책에 가장 감탄하고 감사하는 것도 바로 쉽게 쓰여졌다는 이 점이다. 코드가 자바 기초 문법을 막 뗀 내가 읽어도 이해할 수 있는 정도의 수준으로 계속 쓰여있다. 읽으니 이해가 되더라는 그 놀라움과 기쁨이란. 

 

물론 끝까지 다 읽은 것은 아니다. 아주 개괄적으로 읽었다. 

그리고 배경지식 없이 처음부터 무턱대고 읽었다면 재미가 없었을 것도 같다. 나는 마침 리팩토링이나 클린 코드 방법같이, 그저 동작하도록 만드는 게 아니라 읽기도 쉽고 테스트나 유지보수도 쉬운 코드를 만들어야 한다는 니즈가 있었다. 우테코의 코딩 테스트가 그런 걸 요구한다고 귀동냥(눈동냥?)으로 들어 알고 있었기 때문에, 눈앞에 닥친 일이었던 것이다. 코드를 조립하고 쪼개고 분리하고 무슨 기법을 사용하고 무슨 원리에 입각해서 구조를 짜고... 그런 용어들이 뭘 뜻하는지 알아야 했다.

 

 


기억나는 키워드들

책에서 만나서 반가웠던 개념들과 기억해두고 나중에 더 알아볼 용어들을 짧게 적어본다.

  • 함수형 프로그래밍의 핵심은 코드를 액션, 계산, 데이터로 분리하는 것이다.
  • 액션은 사이드 이팩트 함수
  • 계산은 순수 함수
  • 데이터는 이벤트로 인해 발생한 사실
  • 액션 < 계산 < 데이터 (많이 사용해야 하는 순서대로)
  • 카피-온-라이트와 방어적 복사의 감격적인 포옹
  • 얕은 복사와 깊은 복사
  • 함수 호출 그래프로 특정 코드(함수)의 유지보수성, 테스트 가능성, 재사용성을 쉽게 파악할 수 있다. 
  • 계층화 패턴 네 가지: 직접 구현, 추상화 벽 외 둘
  • 코드 냄새와 두 가지 리팩토링
  • 일급 함수
  • 콜백 = 아마도 자바에서 람다식 무명 함수?
  • 함수형 도구 map(), filter(), reduce() => 오늘 자바 스트림 공부할 때 배운 거!!
  • 함수형 도구 체이닝
  • ...
  • 타임라인 다이어그램
  • ...
  • 공유와 동시성
  • ...
  • 어니언 아키텍처

 


책의 말미에 얻은 화두

내가 고민한 주제는 이 책의 마지막에 나온다. 함수형 프로그래밍에 어떻게 마스터가 되는지를, 투 트랙 모델을 통해 설명하고 있다. 책에서 배운 기술을 재밌고 자유롭게 연습할 수 있는 공간인 샌드박스와, 실제 프로젝트인 제품에 적용하는 것을 동시에 진행하는 것이다. 물론 어느 정도 기술이 익어야 실제 제품에 테스트해 볼 수 있음을 전제하고 있다. 

 

안전한 샌드박스에는 다음과 같은 것들이 있다:

  • 사이드 프로젝트 : 작고 재미있는(엉뚱한) 것에서 시작해 언제든지 기능을 추가해 볼 수 있는 기반이 되는 프로젝트를 만들기까지. 
  • 연습 문제로 연습: 추천 사이트는 Edabit, Project Euler, CodeWars, Code Katas
  • 제품 코드에서 버려진 브랜치

제품에 적용해 볼 수 있는 방법에는 다음과 같은 것들이 있다:

  • 변경 가능한 전역변수를 하나씩 줄이기
  • 타임라인을 하나씩 줄이기
  • 액션에서 계산을 빼내기
  • 암묵적 입력과 출력을 명시적으로 바꿔 보기
  • 반복문을 함수형 도구로 바꿔보기

 

왜인지 이 부분을 읽을 때 확 느껴졌다. 내가 지금 무엇을 해야 하는지가.  

  1. 일단 스트림을 사용하지 않고 자바 연습문제를 많이 풀어봐야 겠다. 생각을 많이 해야하는 것보다도 단순 구현 위주로, 아주 바닥부터.
  2. 스트림을 사용해서 다시 풀어본다. 
  3. 생각이 필요한 문제들을 푼다. 

결국 함수형 프로그래밍은 아주 당장은 적용해보지 않는 것으로 한다. 뭐라도 기본적인 프로그래밍을 짤 수 있어야 하는데 그것도 지금은 버벅거리는 상태라서, 빠르고 자유롭게 기본적인 구현을 할 수 있도록 연습하기로 한다.

 

지난 번에 10월 초까지 어떻게 공부해야할지를 계획한 게 있었는데, 

1. 자바 기초 문법 떼기

2. 1개월 반 안에 프로그레머스 2단계까지 자바 언어로 풀 수 있도록 연습하기.

3. 우테코 프리코스에 나온 역대 미션들 풀어보고 사람들의 코드와 비교학습하기. 

9월이 시작되려는 오늘, 이 중에 1번은 완료했다. 그리고 오늘 계획한 게 바로 2번에 대한 구체적인 방법 되시겠다. 복습도 잊지 말고 하도록 하자.