[이만용의 Open Mind] 프로그래밍 지형도를 바꾸는「파이썬」 |
이만용 (리눅스코리아) 2004/01/26 |
IT의 핵심 도구인 프로그래밍 언어는, 각 시대와 분야별 구체적인 당면 과제와 함께 변천해 왔다. 70년대 유닉스를 구현한 C 언어, 80년대 소프트웨어 규모의 성장과 재사용성 문제를 다룬 C++, 90년대 컴포넌트, GUI 문제를 다루는 비주얼 베이직과 델파이 등이 대표적이다. 80년대까지 언어개발은 대학, 연구소 등 아카데미 중심이었지만, 90년대 이후에 급격히 업체 중심으로 옮겨왔다. MS의 비주얼 C++과 베이직 시리즈, 볼랜드의 델파이 그리고 썬의 자바가 좋은 예다. 특히 자바는 프로그래머와 업계 간의 전선이 형성될 만큼 업체 주도의 재미있는 언어이다. 자바에 위협을 느낀 MS는 딴지를 놓기 위해 비주얼 J++, 비호환 자바 VM 등 치졸한 방법도 마다하지 않았고, 최근 들어서는 닷넷 전략에 CLR(Common Language Runtime) 개념을 넣어 언어 전쟁 자체를 종식시키고 새로운 전선을 재정립하려 시도하고 있다. 그렇다면 이제 아카데미 진영의 언어개발은 기력을 완전히 잃은 것일까? 업계 주도 언어의 화려함에 가려 있을 뿐 실제로 그렇지는 않다. 80~90년대 펄(Perl)과 Tcl/Tk 같은 언어가 등장해 많은 프로그래머들의 사랑을 받았고, 파이썬(Python), 루비(Ruby) 등이 바통을 이어 받고 있다. 현재는 전세계 개발자들이 가세해 오픈소스라는 새로운 형태로 확대 발전하고 있다. 필자가 이 새로운 언어 가운데 파이썬에 파고 들었던 것은 처음부터 실용적인 목적에서였다. 90년대 후반 레드햇 리눅스 배포판의 설치 프로그램인 아나콘다(Anaconda)를 한글화하면서 처음으로 파이썬과 대면했다. 리눅스의 응용 프로그램은 대부분 C로 작성된 것이어서 ‘패치(patch)’라는 소스 코드 변경 작업은 C 소스 코드를 읽고 필요한 사항을 변경한 후 컴파일하여 동작을 재확인하는 지겨운 과정이었다. 반면 파이썬으로 작성한 코드는 인터프리트(interpret) 방식이여서 소스 코드 변경 후 즉시 실행하여 동작을 확인할 수 있다. 당시 필자는 파이썬을 이용해 아나콘다 한글화 작업을 하루만에 마칠 수 있었다(나중에 알고 보니 파이썬은 그리스 신화에 나오는 커다란 뱀 이름이었고 레드햇 설치 프로그램 개발자는 파이썬과 대응되는 의미로 아마존에 사는 뱀 이름인 아나콘다를 사용한 것이었다. 참고로 개발 언어 ‘파이썬’의 명칭은 신화가 아니라 영국 코미디 제목에서 따온 것이다). 당시 필자가 스스로 놀랐던 것은 파이썬이라는 언어 자체를 배우지 않은 상태에서도 무리없이 활용할 수 있었다는 사실이다. 실제로 파이썬 코드는 C 언어를 알고, 개발을 몇 년 해 본 사람이라면 사전 지식이 없어도 읽고 이해할 수 있을 만큼 단순했다. 파이썬의 위력을 확인하다 그 이후 지난 2001년 경 필자는 두루넷의 DHCP 서비스 현대화 프로젝트에 참여한 적 있다. 당시 두루넷은 가입 신청을 받고 가입자에게 케이블 모뎀(CM)을 대여하면 해당 지역의 관리자가 DHCP 서버에 로그인해 CM의 하드웨어 MAC 주소와 신청 서비스에 알맞은 설정 정보를 추가한 후 DHCP 서버 소프트웨어를 재가동하는 형태로 업무를 진행했다. 사람이 하는 일인 만큼 오류도 많고 무엇보다 신속하게 처리할 수 없었다. 이를 자동화, 중앙집중화하는데 가장 큰 걸림돌은 트래픽이었다. 100만을 훨씬 넘는 두루넷 가입자가 CM이나 PC를 켤 때마다 각 지역의 DHCP 서버가 LDAP 서버에 검색 요청을 보내 어마어마한 부하가 발생하는 것이었다. 여러 가지 악조건을 고려한 최종 예상치는 초당 1500개였으나 이를 감당할 상용 제품을 쓰기에는 예산이 허락치 않았다. 대안은 오픈소스 LDAP 소프트웨어인 OpenLDAP였다. 그러나 며칠 간의 고통스런 튜닝과 테스트 결과 OpenLDAP으로부터 뽑아낼 수 있는 최대값은 초당 200개 안팎이라는 결론이었다. 고객에게 프로젝트의 가능성을 보여주기 위해 주어진 시간은 채 일주일도 남지 않은 상태였기 때문에 온 회사가 발칵 뒤집혔다. 그럼 이제 남은 며칠 동안 LDAP 서버를 만들 수 있을까? 물론 말도 안되는 이야기다. 우리는 두루넷 프로젝트에서 필요한 만큼, 정확히 말해서 LDAP 서버와 연동하는 DHCP 서버 소프트웨어 기능만을 갖춘 초경량 LDAP 서버를 만들기로 하고 여기에 파이썬을 사용했다. 파이썬을 이용하면 프로토타입(prototype)을 빠른 시간 안에 만들 수 있기 때문이었다. 분석 소프트웨어에 코드를 조금씩 추가해 나갔기 때문에 DHCP 서버가 LDAP 서버인양 인식하도록 하는데 채 하루도 걸리지 않았다. 코드를 넣고 재시동하면 성공인지, 실패인지를 바로바로 확인할 수 있어 더욱 단축할 수 있었다. 이제 남은 것은 성능과 안정성. LDAP 분석 소프트웨어로부터 시작한 파이썬 초미니 LDAP 서버는 기능을 최소화한 덕분에 초당 500개 이상의 성능을 나타냈다! 실행속도가 훨씬 빠른 C 언어로 만들 경우 프로젝트 목표치를 달성하기란 어렵지 않을 것 같았다. 충분히 희망적인 징후였다. 이후 파이썬에 재미들인 필자는 무엇이든 파이썬으로 해결하려는 욕심을 갖게 됐다. SMTP 메일 엔진부터 시작해서 무선랜 RADIUS 서버, 무선랜 DHCP 서버 등 인터프리트 언어가 사용될 것이라고 생각하지 않은 영역에까지 도전했다. 모든 시도가 100% 성공적이었던 것은 아니다. 파이썬으로 만든 웹 메일 시스템은 웹 서버와 수신한 메일을 중계하는 컴포넌트의 성능이 끔찍한 수준이었다. 이와 같은 시행착오 끝에 필자는 파이썬과 C 언어의 결합(자바의 JNI를 떠올리면 된다)이라는 합리적 접근 방법을 찾을 수 있었다. 파이썬, 새로운 프로그래밍 트랜드에도 적합 필자가 발견한 합리적인 접근 방법은 실제 Tcl/Tk와 파이썬이 강조하는 '접합(glue) 언어' 개념과도 일맥상통한다. 70~80년대부터 프로그래밍 형태는 완전히 새로운 솔루션을 만들기보다는 이미 존재하는 구식 솔루션과 컴포넌트 형태로 등장하기 시작한 새로운 써드 파티 솔루션을 '접착'하는 일이 주를 이뤘다. 파이썬은 이들 구성 요소들을 이음새 없이 매끈하게 상호 연결하고 제어하는데 적합해, 구글의 검색 엔진 제어 시스템, 헐리우드의 특수 효과 공정 제어 시스템 등 다양한 '제어 시스템'에 널리 활용돼 왔다. 필자는 국내의 초대형 소프트웨어 프로젝트를 보면서 파이썬과 같은 언어를 결합해 사용하면 어땠을까 하는 아쉬움이 있다. 대기업의 경우 새로운 시스템을 도입할 때 기존 시스템과의 연동을 고려하는데, 이 연동 프로그램을 작성하면서 항상 느끼는 것은 무계획성, 아마추어리즘이 여전하다는 사실이다. 설계는 매우 중요한 행위이지만 이를 구현할 능력과 여유, 보상 등의 조건이 만족되지 않은 상태에서는 무의미한 구호에 불과하다. 흔히 한국 IT의 문제를 얘기할 때 설계나 방법론이 미숙하다고 지적하지만, 문제를 알면서도 해결하지 못하고 있다면 사실 문제가 무엇인지 모른다는 것과 같은 의미다. 사회경제적인 측면인 보상 부문을 제외하고 능력과 여유 관점에서 본다면, 프로그래머, 특히 분석과 설계를 담당하는 프로젝트 매니저들은 기업 주도의 언어 도구뿐 아니라 오픈소스 진영에서 개발되는 언어 도구까지 폭넓게 이해하고 그 가치를 평가할 수 있어야 한다. 기업 주도의 언어 도구는 개발자가 직접 찾아나서지 않아도 문제와 해결책을 알 수 있지만 이 정보는 매우 수동적이며 공개적이기 때문에 나만의 경쟁력에는 거의 기여하지 못한다. 반면 오픈소스 언어는 언뜻 조악해 보이지만 실제로는 불필요한 요소가 없는 현실적인 대안인 경우가 대부분이다. 업계 개별 플랫폼에 대한 편견도 없어 펄, Tcl/Tk, 파이썬 모두 유닉스, 리눅스, 윈도우, MacOS 등 모든 운영체제를 지원한다. 오픈소스 언어가 구성 요소가 복잡하고 신구(新舊) 시스템이 혼재해 있는 경우 큰 힘을 발휘하는 이유도 이 때문이다. 파이썬은 ‘개발자의 여유’ 측면에서도 매우 유용하다. IT 프로젝트에서 시간이 충분히 주어지는 경우란 절대 없다. 개발 경험이 많지 않은 프로젝트 매니저들은 개발이란 시간의 흐름과 함께 직선적으로 성취되는 것으로 여기기 때문에 개발자라면 항상 시간 부족을 호소한다. 그러나 개발이란 하루하루 정해진 만큼 벽돌을 쌓는 일이 아니다. 실제 개발 과정은 예측 불가능한 모험이다. 어느 날은 일이 잘 풀려 하루만에 코드 작성을 마칠 수 있지만 몇 줄 안되는 그러나 가장 핵심적인 코드에서 며칠이고 발이 묶여 있는 경우가 허다하다. 이럴 때 파이썬처럼 프로토타입을 만들기 쉬운 언어를 적극 활용해 보면 어떨까. 현대의 프로그램은 거의 모두 네트워크 지향적이다. 주로 네트워크 프로그램의 문제는 내부 연산 과정이 아니라 통신 과정에서 발생한다. 클라이언트가 만들어지기 전에는 실제 서버를 테스트할 수 없고 그 반대 역시 마찬가지이다. 따라서 개발해야 할 최종 결과물은 C나 자바로 작성하고 그 반대편 테스트 프로그램을 파이썬으로 작성하면 시간을 크게 단축할 수 있을 것이다. 필자 개인적으로는 90%의 파이썬 코드와 10%의 C 코드를 작성한다. C 코드는 특성상 고속 처리를 요하는 부분, 암호화 관련 부분으로 한정하고 있다. 분야마다 구체적인 비율은 차이가 있겠지만 필자의 분석 결과 거의 대부분의 코드는 입력, 출력, 제어에 집중돼 있다. 속도를 요하는 핵심 코드가 아니면서도 입력과 출력부는 프로그래머의 시간을 지겹게 잡아먹는 골칫덩이다. 각 컴포넌트를 조합할 때 발생하는 제어상의 오류도 가장 많은 꼽히는데 이 부분은 접합 언어로서 파이썬이 가장 두각을 나타내는 영역이다. 파이썬을 이용하면 코드 품질을 한 단계 높히는 것도 가능하다. 실행 가능한 1차 프로토타입을 만들었다면 그 이후는 버그를 잡기 위한 수동적 테스트가 아니라 기능이나 성능 향상을 위한 능동적 테스트에 할애할 수 있다. 코드를 다시 한 번 리뷰하면서 문서화하기 좋은 형태로 재구성하는 것도 좋을 것이다. 파이썬에 더 관심이 있다면 파이썬 웹사이트(www.python.org)와 한국 파이썬 사용자 그룹 웹사이트(www.python.or.kr)를 방문해 보기 바란다. @ |
http://www.zdnet.co.kr/anchordesk/todays/mylee/article.jsp?id=66660
'System > Linux' 카테고리의 다른 글
linux - UID, EUID (0) | 2011.07.26 |
---|---|
리눅스 환경에서 C 프로그래밍 (0) | 2011.02.10 |
linux - 정규 표현식 (0) | 2011.02.06 |
리눅스 - usb 마운트 (0) | 2011.02.06 |
TCP wrappers (0) | 2011.01.25 |