2011년 9월 14일
…귀찮다고 글 쓰기를 차일 피일 미뤘더니 한 달동안 아무 글도 쓰지 않았구나!!!
어떤 프로그래밍 언어를 배우는 가장 확실한 방법은 그 언어로 충분히 큰 프로그램을 (바닥부터) 짜 보는 것이다. 시간 대비 효과가 얼마나 되는지는 사람마다 다르긴 한데, 나 같은 경우 그 효과가 굉장히 확실하다. 물론 시간을 감당할 수 있을 때의 얘기지만.
- C: 앙골모아. 정확히 말하면 C는 잘 알고 있었지만 C로 어디까지 기괴하게 만들 수 있는가를 테스트한 것에 가깝다.
- C++: theseit. STL, Boost 모두 적극적으로 써 보고 적극적으로 쓴 맛(…)을 맛봤다.
- D: Delight. D로 뭔가 짜 볼까 기웃거리고 있는데 어째 쓰려는 라이브러리마다 성에 차지 않아서 결국 새로 만들다가 망한 비운의 프로젝트.
- PHP: TiniWiki. 아마도 처음부터 끝까지 혼자서 짠 PHP 프로그램 중 가장 큰 것 같다(다른 것들은 협업이거나 말아 먹거나 해서). 데이터베이스를 쓰지 않는다는 특징이 있다.
- Ocaml: Esotope. 모든 난해한 프로그래밍 언어를 아우르는(…) 거대한 구현체. 덕분에 설계에서 애를 먹고 있다.
- 하스켈: Liquid라고 하는 프로젝트가 있는데, 아직 공개할 만한 수준이 못 된다.
특이하게도 파이썬과 자바스크립트는 이런 대규모 프로젝트 없이도 부드럽게 잘 익혔는데, 아무래도 둘은 워낙 짧게 짧게 짤 일이 많아서 다른 언어와는 성격이 다르기 때문에 그렇게 된게 아닌가 싶다. 그 밖에 대강 할 줄은 알지만 목록에 들어가지 않은 언어로 루비, 자바, C# 같은 게 있는데 워낙 쓸 일이 없어서 코드 읽기에 부족하지 않을 정도로만 알아 둔 탓이 크다.
시간이 굉장히 많이 걸리긴 하지만, 이런 식으로 밑바닥부터 시작하면 언어를 사용하면서 느끼는 웬만한 의문점을 자기 스스로 해소할 수 있다는 장점이 있다. 예를 들어서 C++에서 직접 라이브러리를 만들어 보면 왜 다른 라이브러리들이 그런 식으로(= 종종 필요 이상으로 일반화되어) 설계되는지 이해할 수 있게 된다. 그리고 C++에 대한 적대심이 커진다. 또한 코드만으로는 알기 힘든 언어 사용자의 문화나 자주 쓰이는 코딩 컨벤션 등을 이해하는 데도 도움이 되는데, 예를 들어 Ocaml에서는 좋든 싫든 모듈 구조화를 해야 하는데 이 모듈 구조화라는 것이 의외로 다단계로 올리기가 쉽지 않아서1 모듈을 한 단계에 몰아 넣고 대표 모듈을 만들어서 open SomeProject 같이 쓰면 안에 들어 있어야 할 모듈들이 다단계처럼 보이게 하는 꼼수를 쓰는 경우가 종종 있다. 직접 이런 구조가 필요한 프로젝트를 안 짜 보면 나중에 이런 상황이 닥칠 때 어떻게 해야 할지 알 수 없다(…).
-
특히 모듈이 여러 단계로 구성되어 있을 때 모듈을 “거슬러 올라가서” 접근하는 게 사실상 안 된다고 보면 된다. 예를 들어서
SomeProject라는 모듈에SomeProject.Algorithm과SomeProject.Handler라는 부모듈이 있어서 각각 알고리즘들과 (그게 뭐든간에) 핸들러들을 담는다고 하자. 그럼SomeProject.Handler.Foo에서SomeProject.Algorithm.Bar를 접근하고 싶은 게 당연한 얘긴데, 실제로 해 보면 거의 안 된다고 보면 된다. 굳이 하고 싶으면 함수자(functor)를 써서 실제로Foo를 쓰려는 곳에서SomeProject.Handler.Foo.Make(SomeProject.Algorithm.Bar)따위를 하거나 해야 한다…. 애초에 Ocaml의 모듈 시스템은 보통 생각하는 패키지 시스템과는 어느 정도 거리가 있어서 어쩔 수 없는 노릇이긴 하지만 이럴 때는 많이 짜증난다. ↩
