아래의 글은, 마이크로 소프트웨어 1997년 7월호 168-169에 걸쳐 게제된 글로, 서울대학교 대학원을 졸업하고, 휴먼컴퓨터를 거쳐 현재 아이큐브의 개발 실장으로 방송용 디지털 비디오 시스템을 개발중인 이준희님의 글입니다.

"다시 한 번 말하노니, 당신에게 프로그래밍을 향한 정열이 있다면 먼저 그 기초를 튼튼히 하라. 그러지 않으면 그 정열은 허무한 추억만을 남길 것이다. 기초를 튼튼히 하라. 그러지 않으면 그 정열은 허무한 추억만을 남길 것이다. 그러지 않으면 그 정열은 허무한 추억만을 남길 것이다. 허무한 추억만을 남길 것이다."

여기서 부터 시작입니다.

★ 정열은 있다, 그러나 기본이 없다 ★

위말은 하이든이 작곡을 배우기 위해 찾아온 베토벤을 보고 한 말. 베토벤의 아버지는 아들을 모짜르트 같은 신동을 만들어 일확천금을 벌겠다는 욕심에 어린 베토벤에게 하루도 거르지 않고 피아노 연습을 시켰다. 덕분에 베토벤은 12살의 나이에 피아노 작품을 출판할 수준에 이르렀지만 모차르트 같은 선풍적인 인기몰이에는 실패했다. 귀를 솔깃하게 할 기교만 익혔지 음악을 학문적으로 제대로 배우지 못했기 때문이다.

★ 기초없는 프로그램은 빛 좋은 개살구에 불과하다 ★

필자는 오늘날의 컴퓨터 프로그래머에게도 이러한 문구가 꼭 들어맞는다고 생각한다. 프로그래머를 꿈꾸는 젊은이도 많고, 프로그래머를 위한 개발툴도 우후죽순처럼 쏟아지고 있다. 프로그래밍을 가르치는 학원도 성업중이고, 책과 잡지, CD-ROM도 지천에 깔려있다. 주위를 둘러보면 열성적으로 프로그래밍에 몰두하는 사람들을 쉽게 찾을 수 있다. 그럼에도 불구하고 왜 우리 나라 정보 산업계는 심각한 인력난을 겪고 있을까.

필자가 다니는 회사는 작은 규모지만 우수한 개발 인력을 뽑기위해 부심하고 있다. 그래서 프로그래머로 지원하는 사람에게 간단한 프로그래밍 과제를 내주고 결과를 평가하는 절차를 거치고 있다. 과제는 fgets나 printf등의 표준 입출력만 사용하는 C프로그램으로 200줄 안팎에서 충분히 끝낼 수 있는 크기이다. 그런데 지금까지 접한 지원자중 과제를 제대로 짜는 사람은 열 명중 다섯 명이 채 못됐다.

프로그램을 짠 사람중에서도 버그없이, 각종 경계 조건에서 문제없이 잘 돌아가는 프로그램을 짜는 사람은 열에 두셋이고, 프로그램 소스 코드도 잘 정리하고 함수 구조를 탄탄하고 확장성 있게 만들고, 변수 이름도 의미있게 붙이고 주석도 잘 다는 사람은 스무 명에 한두 명 꼴이었다.

왜 실력있는 프로그래머의 품귀현상이 두드러지는 것일까. 이력서를 받은 지원자중 많은 사람들이 C++와 윈도우 프로그래밍이나 MFC에 경험이 있었다. 유닉스에서 X윈도우나 모티프 프로그램을 해본사람도 있었도 C/S환경에서 DB프로그램을 만들어 본 사람도 있었다. 다소 개인차가 있었지만 대개 수천 줄에서 만줄이상의 프로그램 경험을 가진 사람들이었다.

그런데 어째서 200줄짜리 간단한 C 프로그램에서 헤맨단 말인가. 이유는 간단했다. 그 과정을 거쳐서 입사한 신입사원 한 사람이 윈도우 SDK를 공부하면서 연습삼아 과제와 비슷한 기능을 하는 프로그램을 윈도우용으로 만들었다. 그러자 라인 수가 200라인이 아니라 1,000라인으로 불어났다. 프로그램의 알고리즘이나 데이터 구조는 본질적으로 달라진 것이 없건만, 윈도우 생성이며 다이얼로그 박스며 프린터 제어 같은 부분이 들어가자 코드량이 눈덩이 처럼 불어난 것이다. 앞서 말한 지원자들이 짜봤다는 수천이나 수만라인짜리 프로그램도 그 뼈대가 되는 알고리즘과 데이터 구조 부분만을 따지면 1,000줄 안쪽의 코드만 남을지도 모를 일이다.

★ 샘이 깊은 물은 가뭄에 아니 마를 새 ★

프로그래밍이란 결국 설계와 구현으로 집약된다. 기능을 정하고, 모듈 스펙을 정의하고, 함수구조를 결정하고, 데이터 구조를 작성하고 알고리즘을 구현하는 것이 프로그래밍의 주된 작업이다. 이런 것을 연습하기 위해서는 군더더기를 뺀 알짜 프로그램을 짜보는 것이 필요하다.

커니건과 리치의 명저인 "The C Programming Language"에 나오는 연습문제는 매우 오래되었지만, 분산객체와 자바가 출현한 지금에도 변함없이 유용한 과제다. 이런 프로그램을 짜는데는 윈도우 API도, MFC도, OLE도 액티브X도 필요없다. 오직 관심이 되는 문제의 해결에만 집중하면 된다. 필자의 생각에는 사용자 인터페이스 부분을 제외한 엔진 부분이 1만라인 이상되는 프로그램을 짜본 사람이라면, 어떠한 프로그래밍 과제도 스스로 해결할 수 있는 능력을 갖추었다고 본다.

반면 코딩없이 프로그래밍을 할 수 있는 시대가 멀지 않았다는 주장도 있다. 델파이나 비주얼 베이직 등의 RAD툴을 사용하면 마우스 클릭 몇 번으로 그럴듯한 고객관리 프로그램을 만들기란 어렵지 않다. OCX와 VCL로 대표되는 컴포넌트 제품은 컨트롤을 드래그해서 폼에다 집어넣기만 하면 워드프로세서며 스프레드시트며 그래프 기능을 순식간에 구현할 수 있다고 선전한다.

컴포넌트를 사용하는 RAD툴은 확실히 DB가 관련된 업무용 프로그램을 만드는 데 대단한 위력을 발휘한다. 또한 프로그래밍 초보자가 예쁜 달력이나 CD플레이어 프로그램을 만드는데도 적합할 뿐 아니라, 어떤 프로그램이라도 컴포넌트만 있다면 만들 수 있다. 그러나 한 번 생각해보자. 컴포넌트만 있으면 "누구나" 만들수 있다. 그렇다면 프로그래머로서의 가치는 과연 어디에 잠재돼 있는 것일까.

컴포넌트를 적당히 조합해서 이런 저런 프로그램을 만들어 내는 것도 분명 프로그래밍이라 할 수 있다. 미래에는 지금 우리가 생각하는 개발자의 개념도 바뀌어서 일반 사용자가 워드프로세서나 스프레드시트를 사용하는 개념으로 '프로그래밍'을 하게 되는 엔드유저시대가 도래할 지 모른다. 그러나 이런 종류의 '프로그래밍'은 이 글을 읽는 독자가 원하는 바가 아니라고 믿는다. 누구든지 할 수 있는 일을 단순 반복하는 사람이라면 타이피스트나 다를바가 없기 때문이다.

이 말은 컴포넌트를 사용하는 것이 잘못된 일이라는 말은 아니다. 어차피 프로그램에는 여러가지 기능이 필요하고 어설프게 구현하는 것보다는 잘 만들어진 컴포넌트를 가져와서 쓰는 것이 훨씬 현명한 방법이다. 요는 단순한 컴포넌트의 집합이 아니라 독자적인 개념과 사용법을 가진 프로그램이 되어야 한다는 것이다. 그래서 프로그래머는 컴포넌트에 모든 것을 맡길 것이 아니라 자신의 프로그램 안에서 컴포넌트를 적절히 배치하고, 서로를 유기적으로 연결하며, 혹 모자라는 부분이 있다면 직접 그 부분을 보충할 능력이 있어야 한다.

자신이 짠 프로그램을 한치 떨어져서 평가해보라. 비주얼툴이 생성해 준 코드 말고, 컴포넌트의 메쏘드를 호출하는 코드 빼고, 다이얼로그박스나 메뉴를 처리하는 코드를 제외하고 자기가 직접 짠 코드의 양이 얼마나 되는가. 스스로 고민해서 데이터 구조를 만들고 그것을 다루는 함수를 짠 적이 있는가. 더 나아가서 그런 함수들을 모듈화한 것이 있는가. 그 모듈은 범용으로 사용할 수 있도록 자기 완결적으로 설계되었는가. 각함수의 내부는 최적화돼 있는가. 디버깅에 도움이 되는 여러 가지 요소(ASSERT등)를 포함하고 있는가. 그 모듈의 헤더 파일은 모듈의 기능을 충분히 활용할 수 있도록 잘 문서화 되어 있는가. 함수 이름이나 데이터 구조체의 이름은 그 의미를 잘 나타내고 있는가. 열거하자면 끝이 없다.

★ 정열의 가치 여부는 기초에 달려있다 ★

물론 코딩 실력은 하루 아침에 이루어지지 않는다. C나 파스칼 문법을 알고 라이브러리함수를 많이 안다고 해서 코딩을 잘 하게 되는 것은 아니다. 여러가지 다양한 프로그램을 많이 만들어보는 것이 최선이다. 한편 남이 짠 좋은 코드를 보는 것도 도움이 된다. 요즘 개발퉁에는 대부분 클래스 라이브러리 소스가 포함되어 있으므로 좋은 참고가 될 것이다.

많은 프로그래머 지망생들이 전산학의 기본 개념에 무지한데, 그것은 좋지 않은 경향이다. 학교 숙제로 주어지는 자료구조와 알고리즘에 대한 연습이 따분하게 느껴지겠지만 그것은 코딩 실력을 키우는 데 좋은 방편이다. 아울러 이진 트리나 일반화된 리스트(generalized list), 재귀적 호출(recursive call), 해시 테이블(hash table) 같은 방법들은 현장에서 부닥치는 문제 해결에도 도움이 된다.

자신이 지금까지 짜왔던 프로그램들을 돌이켜 보라. 가장 큰 프로그램은 몇 줄짜리였지, 그 중에서 자기가 직접 짠 코드는 몇 줄이었지, 스스로 판단하기에 코딩의 기초가 돼 있다고 생각하는가.

다시 한 번 말하노니, 당신에게 프로그래밍을 향한 정열이 있다면 먼저 그 기초를 튼튼히 하라. 그러지 않으면 그 정열은 허무한 추억만을 남길 것이다.


누구나 할 수 있는 일은 다른 사람에게 맡겨라. 자신만이 할 수 있는 일을 할때 프로는 더욱 아름다운 것이다. 프로그래머를 꿈꾸는 젊은이여, 진정 필요한 것은 기교나 고난도 테크닉이 아니라, 프로그래밍의 밑바탕을 차곡차고 다지는 기초이다.

http://miro.knu.ac.kr/drupal/node/1640