뭔가 무서운 하스켈 나라

하스켈은 뭔가 이름부터 이상해서 배우기 겁이 나는 언어입니다. 워낙 배우기 어렵고 특이하기로 유명하기도 하니까요. 그래도 하스켈을 배우면 프로그래밍에 대해 더욱 폭넓게 이해할 수 있다고 다들 그래서 하스켈 나라를 방문할 기회는 항상 눈독들이고 있었습니다.

계획 수립!

알아보니 크게 두 가지 이유 때문에 하스켈을 배우기 힘들다고 하는 것 같습니다.

  • 하스켈은 일반적인 명령형 언어와 극명히 다르다.
  • 입문자가 편히 하스켈을 배울 수 있는 자료가 거의 없다.

첫 번째 이유는 하스켈 자체의 특성이니 제가 뭐 어쩔 수 없는 부분입니다. 하지만 두 번째 이유에 대해서 듣자마자 떠오르는 심상이 있었습니다. 대학 시절 경험인데요, 자기 분야를 정말 잘 아는 교수가 오히려 교수법을 배우지 못해서 가르치는 것은 정말 못 하는 경우가 있죠. 하스켈을 가르치려는 사람들은 다들 워낙 똑똑하기에 오히려 마찬가지로 잘 못 가르치는 것이 아닐까? 대학 때 그런 교수들 때문에 이미 많이 고생했기 때문에 하스켈을 배우면서 똑같은 경험을 하고 싶은 생각은 결코 들지 않았습니다. 뭔가 좋은 안내서가 필요했습니다.

그러다가 @bitemyapp이 작성한 Functional Education라는 글을 읽게 되었습니다. 함수형 프로그래밍을 배울 때 문제점에 대해서 논의하고, 하스켈을 배우는 여러 자료를 평가한 글입니다. 제게는 그 글을 처음 읽었을 때나 지금이나 그 글에서 저자가 내린 평가들이 얼마나 정확한지 검증할 만한 안목이 없습니다. 하지만 글의 논조가 꽤나 합리적이었기 때문에 그 사람이 추천한 방식을 따르기로 했습니다.

저자는 먼저 브렌트 요기의 cis194 강의를 듣고나서 Data61 강의를 진행하라고 추천했습니다.

이제 어떤 방향으로 가야할 지 대충 알게 되었으니 하스켈 나라로 출발하기만 하면 되는 상황이었습니다.

회상: 내가 이미 갖추고 있던 지식

하스켈을 배우는 과정에서 깨달은 점인데, 저는 생각보다 하스켈을 배울 준비가 잘 되어 있었습니다. 소프트웨어 개발을 본격적으로 한 기간은 일 년 정도밖에 안 되었음에도 불구하고 어쩌다보니 하스켈의 기본이 되는 개념들에 많이 익숙해져 있었습니다. 구체적으로는 고차함수, 재귀, 타입 추론, 파라미터 폴리모피즘, 느긋한 계산법, 폴드, 그리고 패턴 매칭 등을 이미 접해봤었습니다.

처음으로 제대로 소프트웨어 개발을 할 때 사용한 언어는 루비였습니다. 루비는 객체지향 언어지만 블록 문법에서 고차함수를 정말 많이 사용합니다. 함수형 프로그래밍의 기본 패턴이 되는 map이나 reduce 함수도 루비에서 일상적으로 사용됩니다.

그리고 나서 iOS 개발 때문에 스위프트를 잠깐 다루었습니다. 스위프트는 가변형 데이터 타입이 반드시 필요한 것이 아니라면 불변형 데이터 타입을 기본적으로 사용하는 것을 권장합니다. 또한 고차함수를 콜백 형식으로 많이 사용합니다. 컴파일 타임 타입 체킹과 타입 추론도 제공하고요. 그리고 제너릭 프로그래밍을 스위프트에서 많이 사용해보지는 않았지만, 스위프트를 통해서 그게 어떤 개념인지 익숙해질 기회는 있었습니다.

그 후 가장 많이 다룬 언어는 엘릭서입니다. 패턴매칭과 재귀는 엘릭서의 기본이 되는 도구이기 때문에 매우 익숙해질 수 있었습니다. 그리고 스위프트와 달리 엘릭서는 불변형 데이터 타입만 사용할 수 있기 때문에 불변형에도 더 익숙해졌습니다. 그리고 루비에서는 잘 이해하지 못하고 그냥 사용했던 폴드를 보다 잘 이해하게 되었습니다. 마찬가지로 느긋한 계산법의 개념도 엘릭서에서 조금 더 체화할 수 있었습니다.

물론 하스켈을 처음 배우려고 할 때는 제가 이런 요소들을 이미 갖추고 있다는 것을 모르고 있었습니다. 어쩌다보니 점이 연결된 셈이라고 할 수 있겠죠.

CIS194 (SP 13) 추천합니다

강의에서 가장 마음에 드는 점은 그 간결함인데, 너무 짧지도 너무 번잡하지도 않은 설명이 좋았습니다. 게다가 강사가 Learn You a Haskell for Great Good 책과 Real World Haskell 책에서 강의 내용에 관련된 챕터를 권장 과제로 내주었는데, 강의 내용이 너무 짧다고 느껴질 때는 해당 책의 챕터를 읽으면서 보다 꼼꼼하고 천천히 내용을 익힐 수 있었습니다. 핵심 내용을 간결하게 전달하고 이를 보조할 수 있는 구체적인 자료를 제공하는 것은 제가 가장 좋아하는 방식입니다.

하지만 제 생각에 이 강의에서 가장 뛰어난 부분은 숙제입니다. 쉽지는 않습니다. 숙제를 하면서 어디부터 시작해야 할지 감도 안 잡힐 때는 저도 인터넷에 공개된 해답을 참고하기도 했습니다. 하지만 실제로는 강의 내용에 소개된 개념만 가지고도 숙제를 풀 수 있습니다. 이건 꽤나 대단한 일입니다. 연습 문제를 만들려고 해보셨다면 아시겠지만 간결한 강의 내용의 범위 안에서 적절히 어려우면서도 학습 효과가 뛰어난 숙제를 만드는 것은 정말 어렵습니다.

그래서 하스켈을 배우고 싶은 사람에게는 이 강의를 추천하고 싶습니다. 하지만 조건이 있습니다. 함수형 프로그래밍이 완전 처음이라면 멘토나 교사를 구하세요. 그런 사람에게는 이 수업의 페이스는 여전히 너무 빠를 것 같습니다. 제가 혼자서 공부할 때 학습자료를 선택하는 기준이 있는데, 전체 내용의 70%는 쉽게 이해할 수 있어야한다는 것입니다. 그래야 나머지 30%에 집중력을 쏟아 공부해도 중간에 지쳐서 포기하는 일이 없어지니까요. 제가 이 강의를 혼자서 공부할 수 있었던 이유는 앞서 언급한 개념들을 이미 알고 있었기 때문에 모르는 부분만 배우면 되었기 때문입니다. 아마 처음부터 모든 것을 배우려고 했다면 끝내지 못했을 겁니다.

함수형 프로그래밍을 처음부터 독학하시려면 엘릭서도 추천드립니다. 엘릭서는 간단하고 실용적인 언어이기 때문에 함수형 프로그래밍의 기초적인 개념을 배우기에 적합합니다. 그런 기초 개념을 익히고 나면 하스켈을 통해서 함수형 프로그래밍의 고급 개념을 배우는 것이 훨씬 덜 부담스러울 것입니다.

다음 글에서는 하스켈 나라를 탐험하면서 무엇을 배웠나에 대해서 적어보겠습니다.