프로 하스켈러 4일차 | Monad Transformers

김대현
HappyProgrammer
Published in
7 min readMay 19, 2022

“대현님 같은 분을 채용하려면 어떤 조건이 필요해요?”

이직 요인 #1 — 새 직장에 대한 기대

얼마 전 제가 어떤 스타트업으로 이직했단 소식을 접한 H님이 물었습니다. 질문에서 ‘대현님 같은 분’이 어떤 의미였는지 잘 모르겠네요. ‘경력 많은 시니어 개발자’였을 수도 있고, 아니면, ‘처우 수준이 좋은 네카라쿠배에 다니던 사람’일 수도 있고, 아니면, 나 기분 좋자고 김칫국 들이켜 생각해서 ‘실력 빼어난 개발자’였을 수도 있겠습니다. 구체적인 의미를 확인하는 대신, 좋은 쪽으로 생각해서 으쓱해하며, 그저 덤덤히 내 이직 요인이 무엇이었는지 답해보기로 했죠.

여러 이유 중 핵심 요인으로는, 과거 긍정적인 협업 경험이 있는 믿을 만한 CTO가 하스켈로 개발을 한다고 하는 것이 가장 큰 것 같습니다. 내가 하스켈로 하겠다는 것도 아니고, CTO가 코파운더들의 전격적인 지원 아래 하스켈로 개발하겠다는데, 난 숟가락만 얹으면 되는 상황이라니, 이게 웬 떡이란 말인가요?

한편, 기대의 뒷면에는, 연봉 수준에서 우려가 있었습니다. 그런데 어떤 배경 때문인지, 현재 처우 수준에 비해 그렇게 나쁘지 않은, 어쩌면 더 좋은 오퍼를 받았기에, 순수히 업무적으로만 고민하면 되는 상황이 왔습니다. 충분한 투자금을 받았거나, 날 채용하려는 의지가 확고했거나, 제 연봉이 (제) 생각보다 적었거나, 그 셋의 적절한 조합이었거나.

아무튼, 보통의 이직 상황이었다면, 여러 무기(?)를 준비하고 처우 협상에 나섰겠지만, 몇 가지 주요한 조건이 이미 충족되었기에, 별다른 욕심을 부리지 말고 첫 오퍼를 바로 수락하기로 했습니다. 어차피 스타트업으로 가면서, 월급 많이 받자고 이직하는 것도 아닐 테고 말입니다. 제 가치가 유효하다 드러나면, 알아서 어련히 잘 챙겨 줄 거라 믿어보겠습니다. 저라면, 첫 오퍼가 마지막인듯 이미 진심을 다 했을 겁니다. 이런 순진한 생각을 다시 하다니, 낭만 돋습니다.

그래서, H님의 질문에 답변하자면,

“어차피 네카라쿠배 같은데 다니는 팀장급 시니어 개발자를, 일반적인 처우만으로 움직이게 하기는 쉽지 않다. 그들은, 이미 충분한 처우와 복리후생을 누리고 있고, 그 회사 환경이 주는 체계적인 안정성이 좋아서 거기 있는 거다. 그러니, 더 위험 요소가 커지는 불안한 환경으로 이직하려면, 해당 개발자 개인에게 특수히 혹하는 ‘무언가’가 있어야 하지 않겠나? 내 경우에는 그게 ‘함수형 프로그래밍’인 것 같다.”

라고 말하면 답변이 될 것 같았습니다. H님이 납득하실만한 요인이었을지는 모르겠지만, 나로서는 그게 진솔한 답변이겠습니다.

이직 요인 #2 — 현 직장에 대한 아쉬움

새 회사에 대한 기대도 중요하고, 거기에 현재 직장에 대한 아쉬움이 곱해져서 임계치를 넘어야 이직을 실행하게 되는 것 같습니다. 제 경우에, 현 직장에 대한 아쉬움은 뭐였을까요, 객관적으로 볼 때 과분히 좋은 회사였는데 말이죠. 제게 아쉬움은 뭐가 있었나 돌이켜보면, 아마도, 회사라는 범주 안에서 저의 성장 가능성이 적었다는 핑계를 댈 수 있을 것 같습니다.

이미 무르익어 잘 갖춰진 회사에서, 이미 잘하고 있는 사람들이 많은 회사에서, 업무 도메인을 잘 모르는 입장에서 이제 와서 배워가며, 개발자로서 뭔가 두각을 드러낼 만한 여지가 보이지 않았달까. 사람마다 잘 맞는 성장 속도와 단계가 있고, 내 경우에는 완전히 성숙한 회사에서 잘할 수 있는 무언가는 부족한 사람인 것 같습니다. 기존 질서와 규칙에 도전하며 새로운 뭔가를 자꾸 만들어 내는 게 기질인 사람 중 1인일 것 같습니다. 그런 면에서는 진즉에 스타트업으로 왔어야 하는데, 찌질하게 용기가 부족했던 거죠.

애써 합리적인 판단을 한다면, 이미 처우 수준과 복리후생이 훌륭하고, 동료들과도 친하게 잘 지냈던 회사에서, 계속 열심히 일하면서 조금씩 성장하는 것이 가장 현명할 것 같습니다.

하지만 아쉽게도, 전 그렇게 현명한 사람은 아니니까, 이직 요인 #1에 흔들리게 된 거라 보면 되겠습니다. 현명치 못한 일을 저지르고 난 다음, 인지부조화를 해결하는 방법은, 단순하게 보면, 두 가지가 있겠습니다. 앞으로 현명하게 행동하거나, 그냥 현명하지 못한 자신을 받아들이거나. 언젠가부터 후자가 편해지고 있습니다.

나중에 후회하게 될까 살짝 두렵기도 하지만, 뭐 그건 그때 가서 고민합시다. “걱정해서 걱정이 없어지면, 걱정할 일이 없겠네.”라는 말이 떠오릅니다. 일단은 오늘의 신남을 만끽합시다. 걱정과 후회, 둘 다 인생에 별로 좋을 일이 없는 것들입니다.

후회하며 지낸 순간들을 후회합니다.

이제는 후회하지 않는다는 기저조건(Base condition)을 넣어서, 불행한 리커전에서 탈출합시다.

모나드 트랜스포머 — Monad Transformers

연일 이어지는 감사한 온보딩 교육. 3일차의 모나드에 이어서, 오늘은 모나드 트랜스포머에 대한 교육을 들을 수 있었습니다. 직전 회사에서, IO 모나드와 Either 모나드를 EitherT로 합쳐서 쓴 일이 많았는데, 어렴풋이, 하나의 모나드를 다른 모나드 형태로 변환해주는 것으로 생각하고 있었습니다. IO모나드의 값으로 Either 값이 들어있는데, 그 IO 모나드를 Either 모나드로 취급할 수 있게 해주는 거죠.

IO (Either e a) → ExceptT e IO b

더불어, Reader모나드를 변환한 ReaderT 모나드도 연습해보며 배울 수 있었는데, 저는 이전까지는 리더 모나드는 잘 안 썼었더라고요. 이번 기회에 리더 모나드도 익히면서, ‘모나드 환자들은, 모든 걸 모나드로 처리하려 하는 건가?’ 하는 의심을 굳혀가고 있습니다. 아직, 제 함수병이 증세가 약해서인지 의구심이 남아있습니다.

진짜 계속 이렇게 간단한 일도 힘들게 할 거야? 응?!!

그래도 잘 따져보면, 아주 탄탄한 이론을 바탕으로 우아한 방법들을 마련해 둔 건 맞는 것 같습니다. 그리고 무엇보다, 이토록 힘들게 노력해서 얻어내는 것은, “참조 투명성”인 것 같습니다. 참조 투명성을 사기 위해, 초기의 멘탈 에너지라는 비용을 지불해야 합니다.

하지만 전 이미 중도금까지 다 지불했기에, 빼박 잔금까지 지불해야만 하는 상황에 처했습니다. 돌이킬 수 없습니다.

It’s very persistent and immutable.

아름다운 코드 감상

아름다운 코드의 기준이 뭔지는 잘 모르겠습니다. 아니, 애초에 아름다움의 기준은 뭔가요? 공돌이 주제에 아름다움을 말하기 민망하지만, 그래도 말해보자면, 그냥 봤을 때 주관적으로 아 “아름답다” 느끼면 그게 아름다움 아닌가요? 굳이 분석을 시작해보자면, 무언가 처리하고자 하는 일의 핵심을 간결하게 추려내어 군더더기 없이 표현한 코드가 아름답게 느껴질 수도 있겠다 싶습니다. 많은 아름다움이 그러하듯, 실용적 측면과는 조금 동떨어질 수 있겠습니다.

“난 원체 무용한 것들을 좋아하오. 달, 별, 꽃, 바람, 웃음, 농담, 그런 것들…” — 미스터 션샤인 중 김희성

토드의 온보딩 교육 중, 아래의 코드를 보며 함께 이야기했습니다.

“참 아름다운 코드네요”

비록, 실제 flatten 코드는, 조금 더 어렵게 작성돼 있는 것 같습니다만, 위 29번째 줄에 기술한 구현으로, 쉽게 풀어보면, Foldable t 클래스와, Monoid m을 가져다가, 모노이드의 항등원과 결합 연산을 써서 계속 접어내면(fold), 하나의 값으로 합쳐낼 수 있게 됩니다. 보통의 (비 함수형) 언어들도 리스트(배열)에 대한 flatten 메소드 정도는 들어있습니다만, 함수형 언어들은 여기서 한 발 더 나아가서, 무언가 접을(fold) 수 있는 것들로 끝까지 추상화하는 것 같습니다. 트리 같은 구조도, Foldable로 만들어서 그대로 활용할 수 있는 건 물론이고, 내가 직접 만든 추상적인 무언가도, 접을 수 있다면, 그대로 이 함수를 활용할 수 있게 됩니다. 모노이드는 무언가 합칠 수 있는 건데, 결합 법칙이 성립해야 하죠. 거기까지는 세미그룹이라 부르는 것들이고, 거기에 항등원이 더해지면 모노이드가 됩니다.

이런 아름다운 코드들을 볼 수 있고, 또 그걸 공감할 수 있어서 감사합니다. 아름다운 음악 선율을 듣고 고마운 마음이 들 때와 비슷한 느낌입니다.

내일은 또 어떤 신나는 일이 있을지 기대됩니다.

이 신나는 일을 함께 하며 아름다운 서비스를 만드시려면,

ㅎㅎ 감사합니다.

--

--

김대현
HappyProgrammer

시니어 백엔드 개발자. 함수형 프로그래밍을 선망하며 클로저, 스칼라, 하스켈로 도전하며 만족 중. 마이너리티 언어만 쫓아다니면서도 다행히 잘 먹고 산다. 최근엔 러스트로 프로그래머 인생 확장.