프로젝트 오일러 회고

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

프로젝트 오일러 회고

프로젝트 오일러의 처음 100문제를 모두 풀어 블로그에 정리했다. 처음 맛보기로 몇 문제 풀어보고는 재미를 붙여 '100번까지 풀어보자' 생각했다. 새로운 문제가 계속 추가되고 있었고 뒤로 갈수록 문제도 어려워졌기 때문에 모든 문제를 풀기는 무리일 것 같았고, 100번 정도까지가 적당해 보였다.

처음에는 Scala로 풀었는데, Scala에 흥미를 잃어 중단했가 Clojure를 공부하면서 다시 풀기 시작했다. 문제를 풀어도 시간이 지나면 풀이를 잊어버렸다. 코드를 다시 봐도 어떻게 풀었는지 감이 잡히지 않는 경우가 많았다. '이래서는 문제를 풀어봐야 소용이 없다, 나중에 참조할 수 있게 블로그에 풀이를 정리해야 겠다'고 생각했다.

정리를 시작한지 거의 4년 만에 100번까지 정리를 마쳤다. 100번까지 다 푼 것은 훨씬 전이지만, 정리하는 데 시간이 많이 걸렸다. 나중에 읽어도 쉽게 이해할 수 있도록 자세히 정리하려고 노력했지만, 지금 다시 읽으면 뭔 소리인지 알 수 없어 문제와 풀이를 몇 번씩 다시 읽어야 하는 경우도 많다.

문제를 풀자마자 풀이를 정리하는 게 제일 좋지만, 풀이와 정리 사이에 시간이 벌어지는 일이 잦았다. 문제를 풀고 한참 지난 후에 정리를 하려고 코드를 보면 이해할 수 없는 경우가 많았다. 아예 문제를 다시 풀어야 하는 경우도 있었고, 풀이에서 오류를 발견하는 경우도 있었다.

프로젝트 오일러를 Clojure로 풀기로 했을 때, Clojure를 배우는 것도 목표 중 하나였지만 크게 성공한 것 같지는 않다. 처음에 기본을 익히는 데는 도움이 되었지만, 어느 정도 지난 다음부터는 비슷한 패턴이 반복되고 항상 쓰는 기능만 사용하게 되어, 더 이상 새로운 것을 배우기 어려웠다.

프로젝트 오일러 문제의 특성 상 일반 애플리케이션에서 사용할 다양한 기능을 연습할 일은 없었다. 따라서 Clojure로 웹 애플리케이션을 구현하는 방법이나 데이터베이스에 접근하는 방법 등은 다른 프로젝트로 익혀야 했다. 그러나 Clojure의 기본 문법과 함수형 프로그래밍 개념을 배우는 데 큰 도움이 된 것이 분명하다.

map, filter, reduce, apply와 같은 함수를 편하게 사용할 수 있게 되었고 함수를 리턴하거나 함수를 인자로 받는 고차함수를 마음대로 사용할 수 있게 되었다. Scala나 JavaScript와 같은 다른 언어를 더 잘 이해하는 데 도움이 되었다. 이를 바탕으로 업무에서 JavaScript를 사용할 때도 더 간결한 코드를 작성할 수 있었다.

Clojure를 공부하면서 Lisp을 배운 것도 큰 소득이라 할 수 있겠다. Emacs를 사용하면서도 Emacs Lisp을 공부할 생각은 하지도 않았지만, 이젠 Emacs 패키지를 수정할 수 있게 되었다.1 물론 아주 간단한 것이지만, Emacs Lisp을 따로 공부한 적이 없음을 고려하면 큰 성과라 할 수 있다.

프로젝트 오일러 문제를 풀면서 알고리즘과 프로그래밍 퀴즈에 더 많은 관심을 갖게 된 것도 소득이라 할 수 있다. 문제를 풀 때 어떻게 풀지 생각하고 공책에 수식이나 코드를 정리한 다음, 방향이 보이면 코드로 옮기곤 했다. 이게 나중에 코딩 면접을 보는 데도 큰 도움이 된 것 같다.

100번 이후에도 드문드문 몇 문제를 더 풀었지만, 여기서 멈추려 한다. 문제 풀이와 정리를 계속하는 일도 분명 가치있는 일이겠지만, 지금은 다른 더 중요한 일들이 많다. 지금껏 살아오며 목표를 잡고 성취한 경우가 매우 드물기 때문에, 이정도 성취도 자축할 일이라 할 수 있겠다.