2018년 7월 14일 토요일

[haskell]하스켈을 접한지 일주일이 되었다.

하스켈을 접한지 일주일

나는 자바 개발자이지만 자바에 대해 제대로 공부하려 하지 않는다. 정확히 말하면 이제 공부를 하다가 관둔 느낌이랄까... 재미가 없다.
왜 재미가 없을까?

첫번째. 자바를 공부하면서 재미있어 하는 사람을 본 적이 없다.


약간 과장을 하였지만 정말 그러하다. 결국에는 슬픔과 좌절(?)로 귀결된다. 내 경험상 적지 않은 고객사이 대부분(전부) JAVA6을 사용하고 있었다.
누가 JAVA8을 배우고 람다를 사용하는가. 처음 자바 학원을 다니면서 JAVA8을 사용하면서 이것저것 해보고 있는 우리들을 보면서 강사는 "절대 안쓴다..." 라고 했던 말이 생각난다.
우리를 무시하면서 했던 말이었다고 그때는 믿었었으나, 지금 생각하니 씁쓸함이었던 것 같다.
분명 쓰는 사람들도 있겠지만 대부분은 쓰지 않을테니...

그런데
왜 그것이 씁쓸했을까?
그것은 개발자가 생각하는 방식을 방해하기 때문이다. 개발자가 생각하는 방식으로 생각하고 싶지만 우리는 JAVA6 안에 굳어간다. JAVA6 안에서 모든 것을 다 만들 수 있다고 하여도 고통스럽다.
우리는 하루하루 기획서를 받고 요구사항을 얻어서 그것을 구.현.하는데 시간을 쓴다. 구현을 하기 위해 더 많은 자유가 있고 선택권이 있다면 우리는 더 편하게 더 즐겁게 노동을 할 것이다.

JAVA8을 신나게 사용하고 업무로 돌아오는 사람들의 표정을 보면, 아니 키보드 소리만 들어도... 화가 느껴진다. 사실 JAVA8이 람다만을 준 것은 아니기에 더 그러할 것이다.

두번째. 누군가에게는 큰 차이가 없어보인다.


사실 큰 차이가 있다. Executors 로 스레드를 가지고 놀다가 parellel 이란 단어를 붙이는 것만으로 뭔가가 되는 것이 보이는 것은 참으로 대단한 일이다.
하지만 자바8에서 주어지는 병렬기능의 뭐 붙이기만 하면 빨라지는 만능도 아니고, Executors에 붙어있는 기능들도 아주 좋아 보인다.
이전에는 대량으로 이메일을 보내는 회사에 있었다. 가끔(?) 문제가 발생하긴 했지만 Executors와 BlockingQueue AtomicInt 같은 것들로 잘 작동했다.

이렇게 되는 것이다. JAVA8로 해야만 버그가 없습니다. 라고 할 수가 없다.
JAVA6으로도 잘 못짜는데, JAVA8로 잘 짤다고?

이렇게 되는 것이다.
기존에 있는 거나 잘써.

세번째. 새로운 거 배울꺼면 뭣하러 JAVA 하나?


이게 가장 큰 것 같다. 나는 이쪽에 속한다. 사실 자바 개발이 싫은 것보다, 자바 웹개발이 좀 그렇다.
Spring과 JSP 로 이루어지는 기능들을 뚜까뚜까 만드는 내 모습은 참으로 공장에서 찍어내는 듯한 생각이 든다.
아마 대부분 사람들이 그러할 것이다.
다들 공장의 부품으로 살아가고 싶지는 않을 것이다.
새로운 것을 하고 싶을 것이다.
내 자신이 변하고 싶을 것이다.

그러니 새로운 언어를 기웃거리며, 새로운 생각을 습득하고, 내 자신이 뭔가 더 많은 것을 수용하고 있다는 확신이 들게 된다.

하스켈 일주일 접한 후기

나는 여기저기 찔러보는 방식으로만 배운다. 이게 내 잘못된 습관인지도 모르지만 "어짜피 안 쓸거 깊게 들어가서 뭐하나 필요할 때 빨리 배우면 되지" 라는 마음으로 기웃거리기만 한다.
하스켈도 기웃거리기 위해서 배우기 시작했다. 하스켈을 설치할 때는 stack을 선택했다. 패키징 매니저인 것 같았다. 사실 뭣도 모르고 찍어서 일단 설치한 건데, 잘 고른 것 같다.

그리고 이맥스를 세팅했다. 코드컴플릿은 안되더라도 이쁘게는 보이게 해야 했다. 코드 자동완성은 없어도 구글신이 있지만, 이쁘지 않으면 보질 않으니까...
첫날 일단 변수의 종류는 빠르게 훑고 함수를 생성하는 법을 익혔다. 별반 차이 없어보였다. (Clojure를 공부했던 경험에서 끈기를 배웠다)
그러다가

Monad에서 좌절했다. 뭐라는 거야.
하나도 모르겠다. 왜 사람들이 Monad에서 막히는지 알았다. 대부분 하스켈을 가르쳐주는 사람들은 그전까지는 "참 쉽죠?" 라는 식으로 가르쳐주다가
Monad로 오자마자 잘난척을 하고 싶은지 수학적 내용으로 얼버무린다.
그런데 이정도 수학적 내용을 모르면 하스켈을 사용할 수 없는 것인가. 하면서 계속 보게 된다.

하루에 한 시간정도 시간을 내는 것으로는 부족함을 느꼈다.

그리고, 아래 내용이 내가 이해한 Monad에 대한 파편이다. (전혀 이게 맞는지 모르겠음...)
Monad는 카테고리 이론에서 나온 개념이다. 카테고리이론은 어떤 집합(세계)에서 다른 집합(세계)를 함수로 연결시킬 수 있다고 믿었다.
더 나아가서, 집합A를 알기 위해서는 그 집합 자체를 몰라도 집합A에서 집합B으로 연결되는 함수를 가지고 있으면 집합A를 알 수 있다고 한다.

뭐 그렇다고 하고, Monad는 사실 저 위 내용보다는 다른 집합을 가두기 위해서 사용하는 것처럼 보인다.
Haskell은 함수형 언어이다. 인풋이 있다면 그에 따른 아웃풋을 만들어줘야 한다. 그 사이에 몰래 시간값 바꾸고 count값 바꾸고 그런 헛다리짓을 하면 안된다.
하지만 바깥세상에서 들어오는 값들은 그 딴게 어디있나 진흙탕에 들어가야 진흙탕에 빠진 사람들을 구해주지 혼자 깨끗할 순 없다. 그래서 만든 것이. 보호막 같은 것이다.

그래서 Monad라는 개념을 만들었다. 값을 가두는 것이다. 예를 들면 많은데, Maybe 나 [] 가 있고 가장 중요한 IO가 있다.
이제 IO에서 가져온 값을 변경 하려면 IO에서 그냥 꺼낼 순 없다.
IO라는 배리어는 아주 강하다. Haskell 세상에서 그냥 바꿀 순 없는 것이다. 바깥세상 내용을 Hakell 세상에서 맘대로 꺼낼 순 없다.

그렇다면 어떻게 해야 하나?

IO라는 배리어 안에 들어가야 한다. 그 일은 하는 녀석은 bind operator이다. ">>=" 로 보이는데 이 녀석을 이용하면 된다.
이 녀석을 사용하면 안에 들어가서 무언가를 할 수 있다. 안에 들어가서 꺼내올 것인가? 내가 보기에는 그럴 수는 없는 것 같다.
한번 배리어 안으로 들어가면 그 값을 가지고 나올 수는 없다. 대신 그 안에서 여러 함수들로 바깥 세상의 값을 변경할 수 있고 그 값을 다시 내보내서 세상에 반영할 수 있다.

e그래서 일단 짬짬이 토이 프로젝트를 만들어봤다. 정말 단순해서 100줄도 안짰다. 그런데 Monad가 이해가 안되서 끙끙댔다.
이것은 내가 필요해서 만든 것인데. 그냥 여러 패스에 파일들을 한번에 각각 다른 패스에 복사해주는 것이다. 바깥세상과 단순히 어떻게 연결이 되나 실험을 해볼 겸 해서 만들어봤다.
https://github.com/ssisksl77/dockeybay

여기까지가 일주일을 바짝 익혀본 소감이다. 이젠 심심할 때마다 구경하면서 하스켈에 대해 더 친해져 봐야겠다. 이 녀석은 정말 재미있다.
다른 사람들하고 같이 공부했으면 좋겠다.

댓글 없음:

댓글 쓰기