오늘도 MySql에 속썩여서 바뻣다. 이 족같은 디비는 JDBC 드라이버도 아주 족같아서 UTC 시간을 저장하고 가져오려 해도 병신같이  UTC를 로컬타임으로 저장하거나 가져옴. 하여간 병신들이 지랄하고 만든 거는 안쓰는게 상책인데 돈벌이 때문에 어쩔 수 없이 씀. 아뭏든 결국 최소의 노력으로 생각한대로 돌아가게 만들어 놓긴 함.


각설하고




함수형이라는 것은 흔히 말하는 대입을 안하고 프로그래밍 하는 거다. 이걸 언어에서 전폭적으로 지원해 주면 그걸 함수형 언어라고 불러


이건 걍 아무나 씨부리는 수준의 정의야




객체지향이란 뭐냐하면 니가 시스템에 다양한 객체들을 만들고 그 각각의 상태를 바꿔가면서 객체들의 총합으로 구성된 세계를 변경해 나가는 프로그래밍이야.

근데 니가 멀티 쓰레드를 추가하고 객체지향을 하게 되면 때때로 매트릭스에 나오는 거처럼 세계를 잠깐씩 멈춰서 동기화 시켜야 함

이게 말처럼 쉬운게 아니야. 해서 니가 왠만한 복잡한 현대적인 시스템을 객체지향으로 만들다 보면 어느 순간부터 세계를 점점 길게 멈추고 정확히 동기화 하려고 머가리 뽀개지는 일들을 해야 됨.


이런 일이 왜 생기냐? 왜냐하면 상태를 대입으로 바꿔가면서 하기 때문에 어떤 함수를 콜 했을 때 그 리턴 값이 수시로 달러질 수 있기 때문이야. 함수형 언어는 그 리턴 값이 항상 동일함. 왜냐하면 상태를 대입으로 바꾸지 않기 때문에


함수형 언어로 시스템을 만들면 세계를 멈추는 일이 없어지거나 최소화 됨. 그래서 대입이 없으면 버그가 줄어든다는 얘기임




그런데 대입이 없으면 사실 효율이 떨어질 수가 있으므로 특수한 방법으로 특별한 경우에 대해서 대입이 되게 하는게 보통이야. 하지만  함수형 언어를 제대로 사용하다 보면 99% 대입을 안쓰고 1% 정도에서 대입을 쓴다.


Lazy eval 얘기가 나오던데, 이건 메모리 효율을 높이기 위해 실행 속도를 희생하는 테크닉이야. 어떤 스칼라 코드를 봤더니 그 씨방 새끼가 개념없이 Lazy를 무조건 non-lazy로 바꿔 버리고 대입을 밥먹듯이 하더라고... 완전 C++나 Java 보다도 더 스파케티 ㅋㅋㅋ... 니가 딱 봐서 언제 Lazy를 쓸지 안쓸지 알아야 되는 거야.



그러면 함수형 언어는 뭐가 있냐? 요즘 밥법이 되는 거로만 얘기 하자면 Haskell, Scala, Clojure, OCalm,  Erlang 대략 이정도가 운좋으면 밥벌이가 가능함.


이중 Scala와 Clojure 가 JVM 위에 올라가고, Haskell, Scala, OCalm 이 부류는 스태틱 타이핑, Clojure와  Erlang은 다이나믹 타이핑 이런거야.





이제부터 내가 경험해 본 봐를 알려줄꼐. 니들이 함수형 언어를 택할 때 중요한 고려점들이야.


* 하스켈과 스칼라 계열은 멀리해라 - 모나드 부심 있는 생키들 치고 프로그래밍 제대로 해논 생키 한번도 못봄. 하스켈 게이들이 현실에서 밥벌이 안되니까 JVM 언어이고 제일 유사한 스칼라를 택하거든. 스칼라 언어 프로젝트, 시발 메인 개발자 중 한 새끼가 개 줙같이 만들어 졌다고 GG 치고 튀는 그런 언어임. 에러 메시지 아주 줙같음. 니가 에러 메시지를 보고 문제를 해결할 가능성 0에 수렴한다고 보면 된다. 경험상 에러 처리 제대로 못하는 새끼들이 만들어 논건 절대 쓰지 말아야 됨. 대부분 학교 식당 밥만 먹던 생키들이라 현실에서 제대로 맞는 프로그래밍에 대해 조또 모름


* 스태틱 타이핑 vs 다이나믹 타이핑 - 니가 뭘하는 지 잘 모르고 타입 에러 잘 내고 시간이 널널하면 스태틱 타이핑 함수형 언어를 골라라. 조낸 컴파일되고 끝나는 거임. 

니가 뭐하는지 니 능력을 스스로 잘 알고 언제 타입을 써야 될지 알면 다이나믹 타이핑 함수형 언어를 택해라. 자유를 얻게 됨. 예를들어 프로덕션에 버그가 있다 치자. 거기 접속해서 핫픽스 - 새로 함수 정의 해주면 버그 픽스 되는 그런게 다이나믹 타이핑 함수형 언어 시스템이야. 알고리듬은 내비두고 데이터 타입만 바꾸겠다, 이런거 쉽게 됨. 왜냐하면 타입 체킹을 런타임에 하거덩. 타입에러가 있으면 런타임 에러 되는거임.

쉽게 말해서 컴파일러에게 타입 힌트를 많이 주면 줄수록 런타임 타입 에러는 줄어들겠지만, 프로그래머 생산성은 떨어지는 거임. 둘 사이 젖절한 점을 찾는 게 좋다 (다이나믹 타이핑 함수형 언어 중 원하면 타입 힌트를 많이 줄 수 있는 거도 있음. 물론 난 꼭 필요할 때만 타입 힌트를 붙임)


* 밥벌이가 중요하면 JVM 계열에서 골라라 - JVM이거 예전엔 별거 아니었는데 이제는 아주 물건임. 니가 자바 프로그래머이고 실력 좀 있으면 JVM 계열 함수형 언어로 살며시 프로젝트를 전환할 수 있는 경우가 있다 - JVM 언어 아닌거로 하자 하면 워낙 반발이 새니까


* 개중에 OOP 가 되는 함수형 언어가 있다. 이 부류 잘못 건드리면 함수도 OOP도 아닌 희안한 프로그래밍이 됨. 조팝들은 촉수금지





한줄요약: 니들은 배우고 싶으면 Clojure, Erlang, OCalm, Haskell, Scala 이 순서대로 공부해라. 보통 Clojure 까지만 하면 딴거 안해도 무궁무진 흥미진진 함.