Haskell에 대한 대표적인 오해를 풀고, 왜 배울 가치가 있는지, 다른 언어 실력에 어떤 변화를 주는지, 더 나아가 삶에도 어떤 영향을 미치는지 설명합니다. 6년 후의 보충과 참고 자료도 포함했습니다.
왜 이것을 쓰는가
제가 Qiita에 올린 글을 보신 분으로부터 이메일을 받았습니다.
프로그래밍 언어 Haskell을 공부하기 시작했지만, 어렵고 힘들어서 그만둘까 고민 중이라고 하셨습니다.
그 마음을 저도 너무 잘 압니다.
すごいH本이 출간된 이후 시간이 흐르며 예전에 비해 공부하기 쉬워졌다고는 해도, 솔직히 Haskell을 학습하기에 충분히 정돈된 환경이라고 하기는 어렵습니다.
저는 Haskell로 제품을 개발하는 회사를 실제로 운영·유지보수한 경험이 있고, 개인적으로도 Haskell로 자주 코드를 작성합니다.
또한 Haskell을 보급하고자 “무섭지 않은 Haskell 입문”이라는 글을 쓴 적도 있습니다.
이러한 경험을 바탕으로, 이번 기회에 다시 한번 “왜 Haskell을 배우면 좋은가”를 정리해 보려 합니다.
Haskell을 아직 잘 모르는 분도 입문용으로 읽을 수 있도록 가능한 한 전문 용어를 줄이고, 엄밀한 정의도 최대한 생략하겠습니다.
또 이 글은 “왜 Haskell을 배우면 좋은가”에 관한 것이고, “왜 다른 언어보다 Haskell을 써야 하는가”에 대해서는 많이 다루지 않습니다.
후자에 관심이 있다면 글 말미의 왜 다른 언어보다도Haskell을 사용해야 할까를 참고하시거나 검색해 보시면 정보를 쉽게 찾을 수 있습니다.
스스로 한 발을 내딛어 Haskell을 배우기로 결심한 분들께, “Haskell은 시간을 투자할 가치가 있다”는 확신을 드리기 위한 내용입니다.
먼저 Haskell에 대한 오해를 풀자
제게 온 이메일에는 이렇게 쓰여 있었습니다.
함수형 언어는 절차형과 비교해서 더 좋은 건가요?
사실 이 질문 속에는 많은 Haskell 초심자가 넘어진다고 할 만한 오해가 숨어 있습니다.
그 오해받기 쉬운 Haskell의 진실은 다음과 같습니다.
이 세 가지 사실을 차례로 살펴보겠습니다.
Haskell은 종종 함수형 언어라는 특징을 전면에 내세워 소개됩니다.
아마 당신도 “함수형 언어”를 공부하려고 Haskell을 시작했을지 모릅니다.
세상에는 “함수형”이라는 캐치한 말만 내세워 오류투성이의 책을 낸 분들도 계시니까요
하지만 Haskell이 매력적인 이유는, 그것이 함수형 언어이기 때문이 아닙니다.
예를 들어, 오파츠 같은 언어인 Lisp도 “함수형”이지만, Lisp과 Haskell은 완전히 다른 매력을 갖고 있습니다.
Lisp을 모르는 분을 위해 비유를 들어 보죠.
고양이를 무척 좋아하는 사람이 고양이가 “식육목”이라는 점에서 매력을 느낄까요?
같은 식육목인 강아지와는 전혀 다른 매력이 많을 것입니다.
참고로 저는 고래목·우제목에 속하는 염소를 좋아해서, 염소를 키울 수 있는 집으로 이사했습니다.
그렇다고 해도 Haskell이 함수형적인 성질을 갖고 있는 것은 사실이며, 그걸 배우는 데 어려움을 겪는 분이 많은 것도 사실입니다.
하지만 함수형이라는 것은 Haskell을 매력적으로 만드는 여러 특징 중 단 하나일 뿐이므로, 그 학습을 뒤로 미뤄도 됩니다.
무섭지 않은 Haskell 입문의 취지가 바로 그것인데, Haskell은 절차형 스타일로도 기술할 수 있습니다.
물론 객체지향에 대해서도 @fumieval 님 등이 많은 지견을 발표하셨고, 마음만 먹으면 Forth 같은 스택 지향 프로그래밍도 할 수 있을지 모르겠습니다.
만약 함수형적인 부분의 학습을 미루기가 어렵다면, 먼저 평소 사용하는 언어에서 함수형 스타일을 익힌 뒤 다시 도전해 보세요.
이제 실제 애플리케이션 개발에서도 절차형 스타일의 Haskell 프로그래밍을 자주 사용한다는 것을 보여 드리겠습니다.
다음 샘플 프로그램을 보세요.
-- | Web API 를 제공하는 블로그 서비스에서 글을 가져오거나
-- 글을 게시하는 샘플 프로그램
main :: IO ()
main = myHandler do
-- Web API 를 쓰기 위한 토큰을 얻는다
token <- getToken
-- 모든 글 목록을 가져온다
posts <- getPosts token
let
-- 내가 작성자인 글만 추린다
myPosts = filter isMyPost posts
-- 내가 작성자인 글의 ID만 추린다
myPostIds = map postId myPosts
-- 내가 작성자인 글의 ID가 줄줄이 나열된 문자열로 바꾼다
body = unlines myPostIds
-- 본인이 작성자로서, 글 ID 목록이 적힌 글을 게시한다
postMyPosts "my post list" body
이건 Haskell이지만, 전체적으로 절차형 느낌이 나지 않나요?
(문법을 자세히 이해하려 애쓸 필요는 없습니다. 분위기를 느껴 보세요.)
억지로 전부를 “함수형” 스타일로만 쓰기보다, 이렇게 명령을 순서대로 조합하는 편이 갑작스런 사양 변경에도 유연하게 대응할 수 있습니다.
이 중 “함수형”이라고 부를 만한 것은 map이나 filter 같은 함수뿐입니다.
이런 함수들은 JavaScript 같은 당신의 일상 언어에도 포함돼 있을 것입니다.
Haskell을 배우면 다른 언어의 작성 방식이 바뀐다
이제 Haskell에 대한 오해를 풀었으니, Haskell을 배움으로써 얻는 이점을 이야기해 보겠습니다.
무엇보다 Haskell을 배우면, Haskell 이외의 언어에서의 코드 작성 방식이 크게 개선됩니다.
Haskell은 “할 수 있는 일이 제한된” 언어입니다.
듣기에는 단점 같지만, 즉 “안티패턴을 구현하기 어려운” 언어라는 뜻입니다.
그리고 “좋은 작성 습관을 강요하는” 언어이기도 합니다.
예를 들어 Haskell을 배운 사람은 테스트하기 쉬운 프로그램을 작성하게 될 것입니다.
여기서는 자세히 설명하지 않지만, “순수한 함수와 순수하지 않은 함수의 명확한 구분”이라는 언어 특성이 있기 때문입니다.
다른 혜택으로, 가독성이 높은 프로그램을 쓰게 될 것입니다.
이 역시 자세한 설명은 생략하지만, 순수 함수 내부에서는 변수에 값을 재대입할 수 없고, 문서의 역할을 겸하는 타입 표기, 유연한 추상화 기능 덕분입니다.
그 밖에도 실행 속도와 메모리 사용량을 의식한 프로그램을 쓰게 될 것입니다.
단방향 리스트나 다양한 자료구조 라이브러리의 문서를 읽고, 스스로 유연하게 데이터 타입을 만들다 보면 계산 복잡도에 자주 맞닥뜨리기 때문입니다.
하지만 사실 이런 것들은 원래 다른 언어, 특히 당신이 평소 사용하는 언어에서 먼저 배워 두어야 할 내용입니다.
반대로, 당신이 평소 사용하는 언어를 잘 배워 두었다면 Haskell을 배우면서 막히는 부분은 적을 것입니다.
Haskell을 배우다가 “어렵다”고 느꼈다면, 그건 평소 쓰는 언어에서 고생하며 배워야 했던 내용을 Haskell이 대신 가르쳐 주고 있기 때문일지도 모릅니다.
Haskell을 배우면 인생이 바뀐다
Haskell을 배우는 것은 프로그래밍 외의 삶도 풍요롭게 합니다.
Haskell의 중요한 특성 중 하나가 “추상화”입니다.
추상화를 통해 프로그램의 가독성과 유지보수성을 크게 높일 수 있습니다.
언뜻 다른 사물들 사이에서 공통점을 찾아내는 능력이 추상화력입니다.
여기서 단련된 추상화력을 더 높여, 프로그래밍 바깥 세계에도 Haskell을 응용하면 됩니다.
새로운 프로그래밍 사고를 배우는 경험을 통해, 지금까지 해 보지 않은 새로운 것을 습득하는 방법 자체를 배울 수 있을 것입니다.
저 역시 회사의 운영·유지보수 방법을 익히는 데 크게 도움이 되었습니다.
Haskell을 배우면, 설령 세상에서 프로그래머가 더 이상 필요 없어지는 일이 오더라도 직업으로 곤란을 겪지는 않을 것입니다.
지금까지의 자신은 하지 못했던 일을, 스스로 노력해 할 수 있게 되는 경험을 통해, “항상 말뿐이고 실제로는 아무것도 못 하는, 똥 같은 ‘의식만 높은 계열의 한심한 인간’”을 간파하는 힘이 붙을 것입니다.
똥 인간에게 더는 속지 않게 됩니다.
컴파일러에게 여러 번 “야, 이거 타입이 뭔지 모르겠는데??” 하고 혼나는 경험을 통해, 일상 커뮤니케이션에서도 상대가 이해할 수 있도록 자신의 의도를 적절히 전달하는 법을 터득하게 될 것입니다.
이걸로 이성에게도 인기 폭발입니다.
6년 후의 보충
이 글을 집필한 지 6년이 지나, 저와 Haskell, 그리고 세계를 둘러싼 환경도 변했습니다.
여기서 말한 내용은 본질에 관한 부분이라 기본적으로는 6년이 지난 지금도 변함이 없습니다.
다만 Haskell은 “많은 것을 할 수 있는 언어” 쪽으로 점점 나아가고 있다는 느낌을 받습니다.
범용 언어인 이상 그것 역시 하나의 가치이고, 커뮤니티가 운영하는 만큼 기능이 비대해지는 면도 불가피합니다. 역사가 긴 만큼, 여러 이해관계에 얽매이는 것도 어쩔 수 없는 일입니다.
저 역시 지금도 Haskell을 업무에서 쓰고 있지만, 위에서 말한 혜택을 받고 싶다면 Elm을 배우는 것도 고려해 볼 만합니다.
Elm은 웹 애플리케이션의 프런트엔드에만 쓸 수 있는, 범용성이 없는 언어입니다.
하지만 그 성질 덕분에 많은 혜택을 우리에게 안겨 줍니다. 그중 하나로, 위에서 말한 “할 수 있는 일이 제한된 언어”라는 요소는 Haskell을 능가합니다.
할 수 있는 일은 Haskell보다 더 제한되지만, 그 대신 학습을 통해 얻는 프로그래밍관의 변화는 Haskell 이상일지도 모릅니다.
Elm에 대해서는 “Elm 입문의 입문: 처음 읽는 페이지”를 참고하세요.
왜 다른 언어보다도 Haskell을 사용해야 할까
이 글로 Haskell에 대한 오해를 풀었다면, 다음 단계로 아래 글들을 읽어 보셔도 좋습니다.
Haskell이 다른 언어에 비해 어떤 경우에 우위(혹은 부적합)인지가 보일 것입니다.
다만 언제까지나 Haskell의 특징 설명만 읽고 실제로 써 보지 않는다면, “항상 말뿐이고 실제로는 아무것도 못 하는, 똥 같은 ‘의식만 높은 계열의 한심한 인간’”과 다를 바 없어지니 주의하세요.
또, Haskell을 실제 사업에 도입했을 때의 생생한 이야기나 염소를 좋아하시는 분은
자금력이 없는 웹계 벤처가 Haskell을 도입하면 어떻게 되는가도 읽어 보세요.