Haskell에 대한 흔한 오해를 풀고, 왜 배우면 좋은지, 그리고 그 배움이 다른 언어 사용과 삶 전반에 가져다주는 이점을 설명합니다.
제가 Qiita에 올린 글을 보신 분에게서 메일이 왔습니다.
프로그래밍 언어 Haskell을 공부하기 시작했지만, 어렵고 포기할까 고민 중이라고 합니다.
그 마음 충분히 잘 압니다.
すごいH本이 출간된 지 시간이 꽤 지나 예전보다 공부하기 쉬워지긴 했지만, 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 "내 글 목록" body
이건 Haskell이지만, 전체적으로 절차형 같지 않나요?
(문법을 자세히 이해하려고 할 필요는 없습니다. 분위기만 느껴 보세요)
괜히 모든 것을 ‘함수형’ 스타일로만 적는 것보다, 이렇게 명령을 순서대로 조합하는 편이 프로그램의 갑작스런 요구사항 변경에도 더 유연하게 대응할 수 있습니다.
이 중 ‘함수형’이라고 불리는 것은 map
이나 filter
같은 함수뿐입니다.
이런 함수들은 JavaScript 등 당신이 평소 사용하는 언어에도 들어 있을 것입니다.
자, Haskell에 대한 오해를 풀었으니, Haskell을 배우는 것의 장점을 이야기해 봅시다.
무엇보다 Haskell을 배우면 Haskell 이외의 프로그래밍 언어를 쓰는 방식이 크게 개선됩니다.
Haskell은 할 수 있는 것이 제한된 언어입니다.
언뜻 들으면 단점 같지만, 곧 안티패턴을 구현하기 어려운 언어라는 뜻이기도 합니다.
그리고 좋은 작성법을 강제하는 언어입니다.
예를 들어 Haskell을 배운 사람은 테스트하기 쉬운 프로그램을 쓰게 될 것입니다.
여기서 자세히 설명하진 않겠지만, ‘순수한 함수와 비순수한 함수의 명확한 구분’이라는 언어 특성이 있기 때문입니다.
다른 혜택으로, 가독성이 높은 프로그램을 쓰게 될 것입니다.
이것도 자세한 설명은 생략하되, 순수한 함수 안에서 변수에 값을 재할당할 수 없다는 점, 문서의 역할을 겸하는 타입 표기, 유연한 추상화 기능 덕분입니다.
그 밖에도 실행 속도나 메모리 사용량을 의식한 프로그램을 쓰게 될 것입니다.
단방향 리스트나 다양한 자료구조 라이브러리의 문서를 읽고, 직접 유연하게 데이터 타입을 만드는 과정에서 계산량(복잡도)을 접할 일이 많기 때문입니다.
하지만 이런 것들은 본래 다른 언어, 특히 당신이 평소 사용하는 언어로 미리 배워 두어야 할 내용입니다.
반대로 당신이 평소 사용하는 언어를 잘 배워 두었다면, Haskell을 배우면서 막히는 일이 적을 것입니다.
Haskell을 배우며 ‘어렵다’고 느꼈다면, 그것은 평소 사용하는 언어에서 애써 배웠어야 할 것을 Haskell이 대신 가르쳐 주고 있기 때문일지도 모릅니다.
Haskell을 배우는 것은, 프로그래밍 이외의 삶에서도 당신을 풍요롭게 합니다.
Haskell의 중요한 특성 중 하나가 ‘추상화’입니다.
추상화를 통해 프로그램의 가독성과 유지보수성을 크게 높일 수 있습니다.
언뜻 다른 것처럼 보이는 현상들 사이에서 공통되는 부분을 찾아내는 능력이 추상화력입니다.
여기서 갈고닦은 추상화력을 더 키워, 프로그래밍 밖의 세계에도 Haskell의 사고를 응용하면 됩니다.
새로운 프로그래밍 사고를 배우는 경험을 통해, 지금까지 해 보지 못한 새로운 것을 습득하는 방법을 배울 수 있을 것입니다.
저도 회사의 운영·보수 방법을 배울 때 큰 도움이 되었습니다.
Haskell을 배우면, 만약 세상에서 프로그래머가 필요 없어진다 해도, 일자리에 곤란을 겪지 않을 것입니다.
지금껏 자신이 못하던 일을 스스로 노력해 해낼 수 있게 되는 체험을 통해, ‘맨날 입만 살고 실제로는 아무것도 못하는 똥 같은 의식만 높은 계열의 쓰레기’ 같은 인간을 간파하는 능력이 생길 것입니다.
그런 똥 인간에게 속지 않게 됩니다.
컴파일러에게 여러 번 “너, 이거 무슨 타입인지 모르겠는데??” 하고 혼나는 경험을 통해, 일상 커뮤니케이션에서도 상대가 이해할 수 있도록 적절하게 자신의 의도를 전달할 수 있게 될 것입니다.
이러면 이성에게도 인기가 많아집니다.
이 글을 집필한 지 6년이 지나면서, 저와 Haskell, 그리고 세계를 둘러싼 상황도 변했습니다.
여기서 말한 내용은 본질에 관한 부분이므로, 기본적으로는 6년이 지난 지금도 변함이 없습니다.
다만, Haskell은 ‘많은 것을 할 수 있는 언어’라는 방향으로 점점 나아가고 있는 듯합니다.
범용 언어인 이상 그것도 하나의 가치이고, 커뮤니티로 운영되는 만큼 기능이 비대해지는 면도 어느 정도 불가피합니다. 역사도 긴 탓에 여러 이해관계에 얽매이는 것 역시 어쩔 수 없습니다.
제 자신도 아직 Haskell을 일에서 사용하고 있지만, 위에서 말한 혜택을 얻고 싶다면 Elm을 배우는 것을 검토해 봐도 좋을지 모릅니다.
Elm은 웹 애플리케이션의 프런트엔드에만 쓸 수 있는, 범용성이 없는 언어입니다.
하지만 그 성질 덕분에 우리에게 많은 혜택을 가져다줍니다. 그 혜택 중 하나로, 앞서 말한 ‘할 수 있는 것이 제한된 언어’라는 요소는 Haskell을 능가합니다.
할 수 있는 일은 Haskell보다 제한되지만, 한편으로 배우면서 얻는 프로그래밍 관점의 변화는 Haskell 이상일지도 모릅니다.
Elm에 관해서는 「Elm入門の入門 最初に読むページ」를 참고하세요.
이 글로 Haskell에 대한 오해를 풀었다면, 다음 단계로 아래 글들을 읽어 보셔도 좋습니다.
Haskell이 다른 언어에 비해 어떤 경우에 우위(혹은 부적합)인지 알 수 있습니다.
다만 언제까지나 Haskell의 특징을 설명하는 글만 읽고 실제로는 코딩을 시작하지 않는다면, ‘맨날 입만 살고 실제로는 아무것도 못하는 똥 같은 의식만 높은 계열의 쓰레기’와 큰 차이가 없어지고 말 것이니, 주의하시기 바랍니다.
또, Haskell을 실제 사업에 도입해 본 생생한 이야기나 염소를 좋아하시는 분은
資金力のないWeb系ベンチャーがHaskellを採用したらどうなったか도 함께 보세요.