갑자기 자기전 rein 님의 블로그에서 2011, 내 프로그래밍 언어는…라는 글을 보고 탄력 받아 작성한다.

그런데 사실상 맛만 본 언어들이 많다. 맛을 본 것을 토대로 올해는 하나하나 잡고 깊게 파려는 생각이다.

C++

당연히 주력 언어지만, boost는 작년에 처음 써봤다. asio 때문에 써본 것인데, 정식으로 C++11 를 넘어 간 후 필요에 따라 boost를 사용할 생각이라 아직까지는 깊게 써볼 생각이 없다. (많이 나아진 것이다. 예전엔 STL도 사용하기를 굉장히 꺼려했다. 지금 생각하면 부질 없지만, 굳이 좋은 점을 찾자면 필요성을 직접 느끼고 써보는 건 좋은 것 같다.) 어쨌건 올해는 C++11를 본격적으로 파고 들어가야할듯.

Lua

썼다고 할 수 없을 정도로 간단하게 사용했다. Script로 사용해서 C++툴에 붙어서 사용하는 형식이었는데, 썼다고 하기 좀 민망할 정도긴 하다.

JSP (Java Server Pages)

거의 10년만에 다시 JSP를 해보는 것 같다. 웹서버를 Clojure 혹은 Python으로 만들까, PHP로 할까 하다가 좀 고급 기능들을 다루기 위해서 JSP를 썼다(나에게는 PHP보다는 JSP가 더 친숙하다).

여러 곳에서 다양하게 썼는데, 가장 처음 만든건 Crash Dump 파일들을 저장해주고, 웹에서는 다운로드를 지원 해주는 것. 웹에서 다운로드를 할 때는 일별/월별/연도별로 실시간으로 zip파일로 압축해서 다운로드 할 수 있도록 한 것이었다. 역시 Java 가 문서화도 잘되어 있는데다 고급 기능들을 잘 지원해서 별 어려움 없이 진행했다.

하지만 동기화 문제라던가, 속도, 최적화 문제는 그렇게 신경 쓰질 못했다는 점이 아쉽다(대규모 접속용이 아니라 현실적으로는 거의 문제가 없지만, 개발 관점에서는 아쉬운 부분).

HTML5, Javascript

웹 페이지를 JSP로 매우 간단한 HTML로만 만들다가, 슬슬 HTML5로 그래프를 그리거나 하는 작업들을 추가했다. 그래프는 RGraph를 이용하고 쿼리나 UI는 jQuery jQuery UI를 사용한 덕에 쉽게 작성할 수 있었다.

여기서 배우는 교훈은, Internet Explorer 를 추방하자!!!

Python

쉘 스크립트 대신에 썼다. Batch 파일은 한계가 있고, Windows Powershell 생각보다 쓰기 쉽지 않았고(익숙해지는데 시간이 좀 걸릴 듯) 직관적인 언어인 Python 이 여러모로 훨씬 쉬웠다.

그렇다고 고급 기술들을 사용한 것은 아니었는데, 소스 내부를 정규식(Regular Expression)을 이용해서 변환을 한다던지, 자동화 관련 작업들, unicode 관련 작업들을 사용하는데 유용하게 썼다.

인상적인건, 사실 Python 책은 초반에 잠깐 맛만 보고 관뒀는데, 막상 필요한 것을 짜기 시작하니 검색으로 별 어렵지 않게 쉽게 구현할 수 있었다(직관적인 언어인듯).

짜증나는건 공백 4개랑 탭을 구분한다는 거. 언어 스스로가 Fortran 마냥 들여쓰기(indentation)를 문법의 일부로 인식하는데, 탭을 실수로 눌렀다가 컴파일이 안되면 다행, 전혀 의도치 않은 방식으로 돌아간적이 있어서 고생했다.

그 외에는 아주 간단한 socket network programming 을 구현해야하는 상황이 있었는데, C++로 짤까 잠시 고민하다가 결국 python 코드 단 네줄로 해결했다. -_-b

*참고: The Best: Python : Socket Programming

Clojure

Clojure는 Lisp(리습)의 수 많은 방언(dialects) 중 하나로, C/C++ 등 빠른 언어로 짜여진게 아닌 JVM 위에서 돌아간다는게 특징인 언어다. 기존 Lisp이 수 많은 소괄호로 이루어져서 가독성에 문제가 많았는데, Clojure는 중괄호, 대괄호를 도입해서 좀 더 나은 가독성을 제공한다는것이 하나의 장점이고, JVM 위에서 돌아가는 만큼 모든 Java 패키지를 쓸 수 있다는 장점 또한 큰 특징인 언어다.

특정한 목적의 Socket 서버를 구현해야했었는데, 다소 고집을 부려서, Clojure 로 도전을 했다. Clojure는 Java를 기반으로 하기 때문에 다행히 Java에 NIO라는 적절한 패키지가 존재했기 때문에 이것을 토대로 사용했다.

기본 코드가 존재하는 상황에서도 작업 시간이 좀 걸렸는데, 그 이유는 Living Coding의 맛을 좀 더 살리고, 단발성의 코드를 그대로 사용하기보다는 Multi-thread 기반으로 작업을 위해 이것저것을 시도해봤다. 아니, 아직 이 부분은 해결 중이다. 그리고 이런식의 wrapping package를 만들 때마다 항상 있던 평소 버릇대로 가급적 범용적으로 사용할 수 있도록 수정하고 테스트하느라 시간이 걸린듯.

이 서버를 좀 더 확장해서 성능도 좀 더 신경쓰고, 기능도 여러가지를 넣어볼 예정. 다음 주에는 MongoDB를 붙여보게 되지 않을까 싶다.

그리고 lein을 이용한 프로젝트 관리는 정말 최고다.

Clojure에 관련된건, NIO 서버, lein, 3D 에 관해서 조만간 블로그에 자세히 다룰 예정(이라고 말하고 안쓴게 한두가지가 아닐텐데......).

Java

얜 곁다리. JSP가 Java기반이고, Clojure도 역시 Java 기반으로 JVM 위에서 돌아가는데다 java 자료구조와 패키지를 그대로 쓸 수 있다는 점에서 java 역시 많이 간접적으로 찾아보게 되었다.

정리

여러 언어를 해본 후 얻은 진짜 교훈은 각 언어의 특징도, 몇가지 언어를 알게 되었다는 점도 아니었다(물론 Clojure에서 느끼는건 그 이상).

Javascript의 예

가령 Javascipt의 경우는 난 아직 책 전체를 보진 못했고, 기초 부분만을 봤다. 하지만 이 기초 부분, 그러니까 아주 아주 재미 없는 뻔히 아는 문법이라던가 기초 자료구조 부분 등을 보면 매우 중요한 것들이 많이 나온다.

사실 Javascript라는 언어 자체가 쉽다면 굉장히 쉬울 수 있는 언어라서 검색하다보면 금방 원하는 것을 구현할 수 있다. 현실적으로 어느정도 프로그래밍에 익숙한 프로그래머라면 대부분의 구현은 쉽고, 빠르게 해낼 수 있다. 하지만 성능상의 문제, 버그를 막는 문제는 그 지겨운 책 기초 부분에 많이 나와있었고, 이 부분은 단순히 필요한 것을 찾아 구현해내는 것으로는 배울 수 없는 부분들이었다.

어느정도 숙련된 프로그래머라면 새로운 언어를 배우는 것은 그다지 어려운 일이 아니다[1]. 하지만 그 훌륭함(?) 때문에, 인터넷을 통해 상대적으로 얻기 쉬운 정보와 라이브러리등을 통해 원하는 구현은 어렵지 않게 해낼 수 있지만, 그 덕분에 다시 한번 기초를 접한다는 것은 굉장히 괴로운 상황(심심한, 재미 없는, 죽을 것 같이 따분한, 두꺼운 책을 다 볼 시간 따윈 없음)에 대면하게 되는 것이라서 정작 중요한 핵심과 기초를 놓치게 되기 쉽다. 다시 말해, 아이러니하게도, 직관을 가지고 핵심을 습득하는 훌륭함 때문에 기초를 놓쳐 훌륭함을 잃게 된다는 말이다.

그러다보니 필요에 따라 상황에 맞는 적절하다고 생각하는 언어를 선택해서 코딩을 한다는게 좋으면서도 참 위험하다는 생각을 하게 되었다. 상황에 맞는 언어를 다양하고 빠르게 익히는 것도 분명 중요하고 좋은 것이지만. 그것으로 언어 전체를 판단하거나 그 언어의 묘미를 놓치게 된다는 것은 다소 아쉬운 상황인 것 같다.

다른 사람들의 조언

책 실용주의 프로그래머(Pragmatic Programmer)에서 저자 앤드류 헌트(Andrew Hunt)와 데이비드 토마스(David Thomas)는 1년에 프로그래밍 언어 한개씩을 배우라고 조언한다.

피터 노르빅(Peter Norvig)은 프로그래밍 1년 완성(Teach Yourself Programming in Ten Years)이라는 글에서 다음과 같은 좋은 말들을 해준다.

  • 최소 다섯가지 프로그래밍 언어를 배워라. class abstractions (자바 또는 C++) 지원하는 언어, coroutines을 (Icon 또는 Scheme) 지원하는 언어, functional abstraction (Lisp 또는 ML) 지원하는 언어, syntactic abstraction (Lisp) 지원하는 언어, declarative specifications를 (Prolog또는 C++ 템플렛) 지원하는 언어, 그리고 parallelism을 (Sisal) 지원하는 언어를 한개씩 배워라.
  • Pascal: (이미 비슷한 언어를 알고 있다면) 3일안에 Pascal의 문법은 배울 수 있을지 몰라도 그 문법을 어떻게 제대로 쓰는지는 배울 수 없다. 예를 들어, 당신이 Basic 프로그래머라면 Pascal의 문법으로 Basic 스타일의 프로그램을 짤 수 있을지 몰라도 실질적으로 Pascal이 어떤 과제를 해결하는데 좋은지(그리고 나쁜지) 배울 수 없다. 핵심은 무엇인가? Alan Perlis는 이렇게 말했다: "당신의 프로그래밍에 대해 생각에 영향을 미치지 않는 언어는 배울 가치가 없다.

Lisp에 굉장한 매력을 느끼는 나로써는 Lisp계열의 언어(혹은 다른 함수형 언어라도)를 꼭 배우길 권장한다. 해커와 화가라는 책을 쓰기도 한 폴 그레이엄(Paul Graham)은 리스프의 근원(The Root of Lisp)이라는 글에서 모든 프로그래밍 언어는 Lisp에 닯아 간다고 했을 정도고 나도 실제로 어느정도는 그렇다고 본다.

피터 노르빅은 Design Patterns in Dynamic Languages에서 GoF 책의 23가지 패턴 중 16가지가 Lisp에서는 보이지 않거나 더 간단하다고 말한다[2]

가급적 여러 언어를 안다는 것...

Lisp 언어를 모른 다는 것은 언어의 틀에 빠지기 쉽다고 본다. 그리고 python 등의 실용적이면서도 사용하기 쉬운 언어를 모르고 가령 익숙하다는 이유로 C++만을 고집한다면, 정말 어리석은 일이 아닐 수 없다(다시 강조하지만 간단한 테스트 소켓 프로그램을 단 4줄만으로 해결했다).

다양한 언어를 아는 것, 그리고, 단순히 그 언어로 표면적으로 보이는 목적만을 달성하기 보다는, 기초를 충분히 습득해야한다는 것이 정말 중요하다는게 지난 1년간 배운 것들이다.



  1. 또 그래야만 훌륭한 프로그래머라고 주장하는 사람도 있다. [본문으로]
  2. 논쟁거리가 될 수 있는 주제인데, 찬우님이 디자인 패턴(Design Patterns)에 대한 생각에서 좋은 말씀을 해주신다. [본문으로]
크리에이티브 커먼즈 라이센스
Creative Commons License
2012/01/14 01:42 2012/01/14 01:42

트랙백 주소 :: http://www.hybrid.pe.kr/tt/trackback/700

  1. Subject: GS test demo

    Tracked from GS test demo 2013/04/02 23:17  삭제

    Hybrid :: 지난 1년간 몇가지 언어들을 사용해보며..

  2. Subject: lån uden sikkerhed - laanpengenu.info

    Tracked from lån uden sikkerhed - laanpengenu.info 2013/04/24 20:02  삭제

    Hybrid :: 지난 1년간 몇가지 언어들을 사용해보며..

  3. Subject: online casinos

    Tracked from online casinos 2013/04/25 11:10  삭제

    Hybrid

  4. Subject: online casino

    Tracked from online casino 2013/04/28 10:36  삭제

    Hybrid :: 지난 1년간 몇가지 언어들을 사용해보며..

  5. Subject: Gambling Slots Online

    Tracked from Gambling Slots Online 2013/04/28 18:37  삭제

    Hybrid :: 지난 1년간 몇가지 언어들을 사용해보며..

  6. Subject: Sonya

    Tracked from Sonya 2013/04/29 15:02  삭제

    Hybrid :: 지난 1년간 몇가지 언어들을 사용해보며..

  7. Subject: Online Casino Spiele

    Tracked from Online Casino Spiele 2013/04/30 02:44  삭제

    Hybrid

  8. Subject: casino reviews

    Tracked from casino reviews 2013/04/30 11:49  삭제

    Hybrid

  9. Subject: http://vindenipad.info

    Tracked from http://vindenipad.info 2013/04/30 22:32  삭제

    Hybrid

  10. Subject: Online Casino Spiele

    Tracked from Online Casino Spiele 2013/05/07 21:19  삭제

    Hybrid

  11. Subject: Abril 1st

    Tracked from Abril 1st 2013/05/08 16:27  삭제

    Hybrid

  12. Subject: Online Casino Spiele

    Tracked from Online Casino Spiele 2013/05/09 02:50  삭제

    Hybrid

  13. Subject: gratis casino - casinoonlinecasinos.dk

    Tracked from gratis casino - casinoonlinecasinos.dk 2013/05/10 10:26  삭제

    Hybrid

  14. Subject: Casinoonlinespiele911.de

    Tracked from Casinoonlinespiele911.de 2013/05/12 02:54  삭제

    Hybrid

  15. Subject: Online Casino Spiele

    Tracked from Online Casino Spiele 2013/05/12 07:36  삭제

    Hybrid

  16. Subject: casinoonlinespiele911.de

    Tracked from casinoonlinespiele911.de 2013/05/12 07:53  삭제

    Hybrid :: 지난 1년간 몇가지 언어들을 사용해보며..

  17. Subject: billige lån - laanpengenu.info

    Tracked from billige lån - laanpengenu.info 2013/05/13 19:17  삭제

    Hybrid

댓글을 달아 주세요