5. Haskell을 통해 배운 교훈, '참기술'을 보는 안목을 기르자

 
김재우 kizoo@bluette.com
블루엣 인터내셔널의 기술 이사로 재직중이며 개발 환경과 온라인 교육 시스템을 결합한 소프트웨어를 설계하고 있다. 소프트웨어 공학 기술이나 관련 이론을 실천하도록 만드는 것이 개발자로서의 목표이다.
 
지난 호에 예고했듯이 이번 호는 Haskell.NET에 대한 소개다. 아직 Haskell.NET이 소개할 만큼 완성도를 갖추지 못해 마지막 연재 주제로 제시할 수 없었다. 대신 지금까지 Haskell 연재를 통해 우리가 배워야 할 것이 무엇인지 정리하는 시간을 가져보려는 것으로 연재를 끝맺고자 한다. 독자들의 많은 양해 바란다.
 
Haskell과 같은 언어는 지금까지 일반 프로그래밍의 영역에서 한 걸음 떨어져 있었다. 필자는 그 이유를 크게 다음의 세 가지로 본다.
 
  • 발전해온 길(또는 계보) : 시중의 언어와 많이 달라서 프로그래밍 자체를 바라보는 시각에 대한 근본적인 차이가 있다. 이 차이를 대중은 쉽게 뛰어넘지 못한다(객체지향 패러다임은 거의 비슷한 계보를 따라 발전해왔는데도 지금과 같이 상용 기술로 일반화하는 데 오랜 시간이 걸렸다).
  • 프로그래밍 기법과 프로그래밍 언어 자체의 연구에만 집중하고, 그 연구 가치를 쉽게 인식할 수 있는 응용 연구에 많은 노력을 기울이지는 않아 대중에게 그 가치가 널리 알려지지 못했다.
  • 프로그래밍의 발전에 비해 컴퓨팅 환경을 이루는 다른 분야의 연구가 이를 뒷받침할 만큼 발전하지 못했다. 그래서 하드웨어와 프로그래밍 언어 사이의 의미 수준 격차가 크고 그에 따라 실용성이 의문스럽다.
 
이 세가지 문제 중에서 가장 큰 장애가 되는 것은 역시 첫 번째다. 아마도 나머지 문제가 더 확실하게 개선되지 않는다면 학교와 산업현장에 이런 기술이 더 폭넓게 사용되기까지 상당히 오랜 기간이 필요할 것이다. 모르긴 해도 그 영향을 결코 무시할 수 없는 어떤 대형 소프트웨어 회사가 이런 기술을 적극적으로 상용화하려고 나서지 않는다면 빠른 시간 안에 개선되기는 힘들 것이다. 특히 한국의 경우 다른 나라에 비해 소프트웨어 기술이 시장에서 다양하게 성장하지 못하고 있는데다가, 대학 교육조차 업계와 같이 유행에 민감한 실정이어서 상황이 더 나쁘다고 할 수 있다. 게다가 우리의 성숙하지 않은소프트웨어 기술 문화의 수준으로 볼 때, 자각을 통해 스스로 개선하거나 진보하기를 기대하기는 아직 무리이고, 설사 그런 움직임이 있다고 하더라도 정규 교육과 기술 시장에 큰 영향을 주지 못할 동호회 수준을 벗어나기 힘들 것이다. 첫 번째 문제가 해결되려면 좀 더 추이를 지켜봐야 할 것이다.

응용 분야에 대한 연구 활발

두 번째 문제는 비교적 많이 해결돼가고 있다. 순수하게 언어의 프로그래밍 기법만을 다루는 연구가 다음 단계로 접어듦에 따라, 응용에 관한 연구가 전에 없이 활발해 실용성이 뛰어난 산출물도 많이 쏟아져 나오고 있다(http://www.research. avayalabs.com/user/wadler/realworld/). 데이터베이스, 멀티미디어 하드웨어 설계 등 다양한 응용 분야에 이와 같은 프로그래밍 기법을 적용한 사례를 보여주는 논문도 많고, 그 산출물의 장점과 발전 가능성도 상당히 밝다. VRML2의 표준안을 채택하던 당시에 마이크로소프트의 ActiveVRML에 사용된 FRAN(Functional Reactive Animation, http://www.research.microsoft.com/~conal/Fran/) 모델(Conal Elliot 등이 연구해 발표)이나, 마이크로프로세서를 설계하고 검증하기 위해 개발됐던 Hawk(http://www.cse.ogi.edu/PacSoft/projects/Hawk/) 등이 그 좋은 예다.
특히 Hawk는 하드웨어 설계와 검증, 시뮬레이션을 한 번의 코드 개발로 해결하고자 하는 노력으로(다른 프로그래밍 기법으로는이와 같은 접근 방식을 상상하기조차 어렵다) 장차 이 분야의 연구가 타 응용 분야에 어떤 영향을 주게 될 지 기대가 된다. 이에 더해 기존의 프로그래밍 자원(그래픽스 라이브러리, 데이터베이스 인터페이스 등)을 재구성해 연계 활용하는 연구도 많아지고 있기 때문에 조만간 그 범용성을 크게 염려하지 않아도 될 수준에 이르리라 본다.

바탕이 튼튼한 기술 필요

마지막 문제는 컴퓨터의 끊임없는 성능 개선과 함께 소프트웨어 규모가 커짐에 따라 자연스럽게 해결의 실마리를 찾아가고 있다. 10여 년 전에는 상상하기도 어려웠을 만큼 무겁고 덩치 큰 소프트웨어가 개인용 컴퓨터에서도 잘 돌아갈 만큼 좋아졌다. 자바나 닷넷 등과 같은 바이트코드 방식의 소프트웨어 실행 환경을 산업 전반에서 채택하게 될 만큼 여유가 생겼기 때문에 Haskell과 같은 언어의 성능에 대해 물고 늘어질 핑계거리도 없다. 더구나 하드웨어와 소프트웨어는 성능과 특성을 고려하여 공동설계(Codesign)를 하는 것이 점차 일반화되었으며 독립된 연구 분야로 자리매김했다. 예를 들어 RISC 아키텍처와 같이 애초에 컴파일러와의 연계성을 염두에 두고 프로세서를 설계하는 차원에서부터, 그래픽스나 멀티미디어 자원의 처리 성능을 위해 특수 기능까지 제공한다. 컴퓨터 성능에 탄력성(scalability)을 갖도록 아예 하드웨어와 소프트웨어를 하나의 서비스 층으로 묶어서 추상화하는 방식을 따르는 것도 일반화돼 있다. 간단히 말해 프로그래밍 언어와 하드웨어 사이의 의미 수준의 차이가 점차 좁아지고 있기 때문에 폰 노이만 병목으로 대변할 수 있는 이 분야의‘유전병’이 근원으로부터 해결될 가능성을 보이고 있다.
이와 같은 하드웨어의 성능 개선은 소프트웨어의 규모 증가와 밀접한 관계가 있다. 지금의 소프트웨어는 초창기 컴퓨팅 시절의 간단하고 무뚝뚝한 프로그램이 아니다. 프로그래머나 고급 사용자 혼자서 관리하기 이미 불가능할 정도의 수많은 부품이 맞물려 돌아가고, 프로세서의 빠르기를 무색하게 만드는 화려한 인터페이스로 치장하고 있다. 또한 일반 사용자 프로그램도 복잡한 기능이 수 없이 많이 내장되어 있다. 그에 따라 소프트웨어의 개발 복잡도도 놀랄 만큼 증가했다. 이런 추세는 컴퓨팅 환경의 변화에 따라 앞으로 더 가속화될 것으로 예상된다. 지금보다 응용분야는 더 늘어나게 될 것이고, 좀 더 사용자 위주의 계산 환경이 갖추어질 것이며, 소프트웨어 간의 상호 연결성은 네트워크를 가로질러 강화될 것이 분명하기 때문이다.
이쯤 되면 지금의 소프트웨어 개발 방식으로는 그 복잡도를 감당하기 힘들다. 복잡한 하드웨어의 결함을 찾아내기 위해 HOL(Higher-Order Logic)과 같은 기술을 쓰는 것과 마찬가지로, 소프트웨어서도 보다 수준 높고 체계 있는 버그 검출 방법, 소프트웨어 품질 관리 기법, 생산성 향상 방법이 필요하다. 소프트웨어 부품 기술과 체계 있는 재사용 기법으로 그 구현의 생산성은 높아지고 있지만, 설계의 복잡도와 품질 검증은 훨씬 복잡해질 것이 자명하기 때문에 지금의 기술로는 역부족이다. 좀더 많은 작업이 일정한 체계에 따라 자동화되어야 한다. 그러기 위해서는 무엇보다 근본이 되는 프로그래밍에 대한 생각부터 다시 해야 하고 자연스레 바탕이 더 튼튼한 프로그래밍 기술을 사용하지 않을 수 없다는 결론을 내리게 된다. 경험이 곧바로 검증되고 빠르게 재사용 될수있는기술이없다면, 소프트웨어의 품질 개선과 개발 생산성의 진보를 설계 수준에서 기대하기 어렵기 때문이다. 즉, 소프트웨어 기술이 진보하면 할수록 이전의 덜 정리된 기술을 조금씩 걸러내고, 바탕이 더 튼튼한 기술을 받아들이는 것이 현실에 적응 하는 방법일 수도 있다.

순수 기술과 상용 기술의 만남

필자가 Haskell과 같은 기술에 기대를 거는 이유가 바로 이 때문이다. 이 연재를 하게 된 이유가 Haskell 자체의 우아함에 감동을 받아 엔지니어로서의 본능(?)에 가까운 욕구를 분출하고 싶었기 때문 만은 아니다. 작은 힘이나마 다음에 다가올 기술 세상을 미리 바라보고 준비하자는 취지가 있었다. 또한 요즘 유행하는 프로그래밍 기술의 성향이나 소프트웨어 기술 문화가 너무 근시안적인 기술에 치우쳐 있다는 점을 Haskell을 빌어 말하고 싶었다.
notion imagenotion image
지금까지 설명한 여러 가지 이유로 이번 호 기사는 이 기술과 상업성의 만남을 다루고 싶었다. 세상에서 유행하는 기술의 접목을 보여주는 게 동기 유발에 도움이 될 것이라는 생각으로 최근에 진행 중인 몬드리안(Mondrian, http://www.mondrian-script.org/)을 소개하려고 했다. 몬드리안이 아니더라도 본래 기획 대로라면 이번 호에는 닷넷을 위한 Haskell의 실현을 어떻게든 보여줘야 했다. 그런데 일단 소개하기로 마음먹었던 몬드리안은 말 그대로 Haskell.NET과는 거리가 멀었다. 이 기술을 보니 본래 바람과는 많이 다른 방향으로 접근하고 있었다. 순수하게 함수만을 사용하는 언어의 장점을 채용하고 있다는 점을 제외하면 Pizza(http://pizzacompiler.sourceforge.net/) 방식에 더 가까운 연구였으며, Haskell을 과감하게 수용하는 대신에 ASP.NET의 스크립팅을 위해 ‘섞어놓기’식 언어(Hybrid Language)를 새롭게 제안하고 있었다. 다시 말해 이는 상용 개발 환경에서 Haskell 프로그래밍 지원을 강화하는 것과는 차원이 다르다. 더구나 기사를 쓰기로 한 시점에서 볼 때 그 완성도가 오히려 Pizza나 GJ보다 못했다. 이번 호에 몬드리안의 소개를 빼먹고 Haskell 연재를 이 정도에서 끝내는 것은 바로 이 때문이다(머지않아 몬드 리안보다 더 나은 연구가 있어, 자랑스레 소개할 기회가 있기를 바란다).

이론과 실제의 만남

마이크로소프트의 닷넷과의 결합을 위한 시도보다는 훨씬 이전부터 진행된 HaskellScript(http://haskell.org/haskellscript/) 연구가 더 볼만하다. 닷넷이 나오지 않았다면 이 기술과 연구를 소개하는 편이 훨씬 유익했을 것이다. 다만 1999년 말 이후부터 연구가 그리 활발하지 못해서 닷넷이 나온 마당에 연구 방향도 선회했을 가능성이 높다. 연구의 범위도 이번 연재에 포함하기에는 너무 방대했다. 그러나 이 연구의 핵심인‘Functional Components’는 하부 기술의 변화와 무관하게 눈여겨 볼만한 가치가 있으므로 용감한 독자라면 도전해 보기를 바란다.
외국에서는 상용화 연구가 비교적 활발하게 진행되고 있다. Simon Peyton Jones나 Phlip Wadler(http://www. research.avayalabs.com/user/wadler/)와 같은 저명한 학자들도 마이크로소프트 연구소나 루슨트 테크놀로지 등의 연구소에 근무하면서도 실세계 응용에 이 기술의 혜택을 나눠 주기 위해 끊임없이 노력하고 있다. Haskell 관련 프로그래밍 기술의 가치는 더 이상 재론의 여지가 없기 때문이다. 이런 새로움에 대한 적극적인 시도에 비해 국내 환경은 너무 현실에 얽매이고 있는 모습이다. 기반 기술을 연구하는 연구단체는 논외로 치더라도 대학에서조차 당장 써먹을 수 있는 것으로부터 자유스럽지 못한 것 같다. 이론과 실무 적용의 간격이 좁혀지는 IT가의 추세를 보면 우리의‘기술독립’이라는 구호가 허무한 외침처럼 느껴진다. 이런 척박한 환경에서 그나마 다행스런 것은 KAIST의 ROPAS(http://ropas.kaist.ac.kr/)에서 진행하는 nML 연구가 차분하게 진행되고 있다는 사실이다.
notion imagenotion image

'제대로 프로그래밍하는 재미'

ROPAS에서 연구 결과를 실현하는 매체로 개발하고 있는 언어는 nML이라는 ML 류의 언어다. ML은 Haskell과 달리 적극 계산법(strict evaluation)을 채택해 프로그래밍 기법이 사뭇 다르지만, 역사가 깊어 고급 기술 분야에 이미 적극 응용되고 있는 프로그래밍 언어로 사투리나 변형도 많다. 지난 기사에서 언급했듯이 필자가 처음 함수 프로그래밍을 공부한 것도 CAML이라 불리는 ML 류의 언어인데, Standard ML보다도 작고 가벼워서 빨리 익히기에 좋다(Haskell은 ML이나 Miranda로부터 크게 영향을 받은 언어다). ROPAS의 언어, nML은 바로 이 CAML에다 객체지 향 표현을 더한, OCAML(Objective CAML) 시스템에서 실현되고 있다. 아무튼 이렇게 알찬 연구가 다음 호부터 일반 프로그래머를 위해 소개된다는 점은 정말 뜻 깊은 일이다.
다음 호부터 이어지는 연재는 올해 필자의 연재를 기점으로 소개되는 ‘제대로 프로그래밍하는 재미(이광근 교수의 글귀를 빌어) ’를 한 단계 끌어올릴 것이다 . 무엇보다 앞으로 진행되는 기사는 지난 연재를 돌아보며 독자들에게 미안한 마음을 곱씹고 있던 필자에게는 큰 위안이다. 첫 연재를 시작할 적에 가진 생각과 달리 Haskell 언어 그 자체의 특징을 요약하는 수준을 크게 벗어나지 못했기 때문에 실천없이 의욕만 앞선 것 같아 마음이 편치 않았다. 지난해 한 대학에서 영재 교육 차원에서 초중고생을 대상으로 자바와 C언어로 프로그래밍 교육을 한다는 얘기를 듣고 이 분야에 종사하는 한 사람으로서 우려가 앞섰던 기억이 새롭다. Haskell 연재는 이런 근시안적인 정책이 과연 올바른지 함께 생각해보자는 차원에서도 읽어 주었기를 바란다.
 
정리 : 강경수 elegy@sbmedia.co.kr
 
Copyright (c) 2002 김재우. All rights reserved.