본문 바로가기

칼럼

라이브러리의 의미

라이브러리란 것은, 도서관입니다. 네. 도서관이란 다름이 아니라 다른 사람이 써놓은 책을 가서 볼 수 있는 곳이죠. 아시겠지만, 도서관에는 지금까지 출간됐던 적이 있는 책들은 거의 모두 구비하고 있습니다. 제가 다니던 학교 도서관에는 제가 좋아하는 SF는 국내 출판됐던 책은 거의 다 장서목록에 있더군요. 그러한 고로, SF 독자인 저는 SF를 보고 싶으면 도서관에 가서 적당히 보고 싶은 책을 골라다가 보면 됩니다. 이미 출판된 SF로도 제 취향을 만족시켜줄만한 책은 (국내 사정은 좀 열악하지만) 찾아보면 있거든요. 나는 SF를 좋아하니까 내가 좋아하는 SF 소설은 모두 내 손으로 써야 되겠다고 생각하는 사람이 있다면, 글쓰기의 천재일 수도 있지만, 천재는 매우 희귀하므로, 바보일 가능성이 매우 높겠죠. 더군다나 쓰고자 하는 소설의 내용이 장르의 바이블이라고 일컬어지는 작품과 매우 유사한 소재와 주제를 갖고 있다면, 차라리 안쓰느니만 못한 결과가 나올 겁니다.

코드 라이브러리, 즉 흔히들 .lib, .a 파일로 이름붙여지는 컴파일된 코드의 집합체들은 바로 위와 똑같은 개념에서 출발했습니다. 원하는 내용이 있다면, 라이브러리를 뒤져서 적절한 부분을 떼어다가 쓰면 된다는 개념입니다. 프로그래밍의 역사가 비록 50여년밖에 안되지만, 프로그래머들은 인간중에서도 무척 부지런한 쪽에 속하는지 수백종류의 언어로 만들어진 수만가지 라이브러리가 존재합니다. 이 중에서 나의 필요에 적당히 맞는 코드가 한 두개쯤 있으리라는고 기대하는 편이 합리적이죠. 만약 자기가 쓸 코드는 모두 자기 손으로 직접 만들어야 한다고 말하는 사람이 있다면, 그 사람은 다른 사람이 해놓은 일을 자기 시간을 들여서 다시 할 생각인 것이죠.

소설에 습작이 있고, 수학엔 연습문제가 있듯이, 프로그래밍에 있어서도 남들이 다들 한번씩 풀어본 문제를 자기 손으로 한번 풀어서 구현해 보는 것은 매우 중요한 학습방법입니다. 문제는 이것이 학습방법이라는 거죠. 직업 소설가 중에 습작 팔아서 먹고 사는 사람이 있을까요? 있다면 아마 진짜 천재 작가일 겁니다. 직업 수학자들 중에 교재의 연습문제를 풀어서 연구비 받는 사람이 있을까요? 그런 사람이 있다면, 아마 수학 교사이거나 그 비슷한 직업이겠죠. 그런 사람을 수학자라고 하지는 않습니다. 프로그래머들도 남들이 다들 풀어본 문제를 다시 풀어보면서 월급을 받겠다고 한다면, 고용주 입장에서는 매우 달갑지 않은 직원이 될겁니다.

더군다나 '표준라이브러리'라 일컬어지는 것과 동일한 기능을 가진 라이브러리 조차도 자기 손으로 직접 만들겠다는 사람이 있으면, 엄청난 시간낭비일 뿐 아니라 언어를 쓰는 이유조차도 부정하는 셈이죠. 사람의 말로 치자면, 한 언어의 표준 라이브러리는 기본 어휘와 같아서, 모든 사람이 공통으로 알고 있고, 쓸수 있을 것이라고 가정하고 언어의 일부분으로 만드는 구성요소입니다. 결코 언어가 만들어진 다음에 덧붙여진 기능이 아니란 거죠. 애초에 언어의 일부로 설계되고 제작된 것이 표준라이브러리입니다. 표준라이브러리가 괜히 '표준'인 것이 아닙니다.

물론 표준 라이브러리는 만능이 아닙니다. 표준라이브러리를 어휘로 비유한다면, 순 우리말 만으로 논문을 쓰려고 할 때 봉착하게 될 문제점을 생각해 보면 비슷할 겁니다. 특정한 요구사항이 있다면 표준라이브러리만으로는 결코 해결할 수 없을 수도 있습니다. 요구사항이 너무나 특이해서 표준라이브러리뿐 아니라 기존의 어떤 라이브러리로도 꿰어맞출 수 없을 때가 있습니다. 물론 이런 경우가 생긴다면 당연히 해당 기능은 직접 구현해야 합니다. 이럴 경우에 프로그래머의 진짜 능력이 드러나죠. 프로그래밍은 문제 해결과정이며, 다른 사람이 해결해 놓은 문제의 답안을 가져다 쓰는 것과 다른 사람이 해결해 본 적이 없는 문제를 푸는 일은 매우 다른 능력을 요구합니다.

혼자서 공부할 때는 남들이 다 해본 것이라도 직접 구현하는 것은 매우 좋은 공부방법입니다. 공부할 때는 그렇게 밑바닥부터 기초를 다지는 것이 매우 중요하죠. SF에서 '인조인간의 인간성 고찰'이라는 주제로 나온 소설이 만편은 되겠지만, 자기 혼자 습작으로 이런 주제를 다뤄 보는 것은 권장할만 합니다. 'n이 3이상의 양의 정수일 때, xⁿ + yⁿ = zⁿ을 만족하는 0이 아닌 정수 x,y,z는 존재하지 않는다'는 것은 이미 증명되었지만, 연습문제로(?) 증명해 보는 것은 매우 좋은 수학적 훈련이 됩니다. 마찬가지로, '자기 자신에게 드리워지는 경계가 부드러운  그림자 구현' 같은 문제도 이미 다른 사람이 구현해 놓았지만, 공부할 때는 혼자서 구현해 봐야 합니다. '임의의 위치에서의 삭제/삽입에 상수시간이 걸리는 자료구조 구현'이라는 문제도 프로그래밍을 하는 모든 사람들이 한번씩 해 보았고, 심지어는 표준라이브러리에도 있지만, 공부할 때는 항상, 반드시, 누구나 해보아야 하는 문제인 것이죠.
이런 과정, 즉 남들이 해본 것을 자기 손으로 해보는 학습과정을 통해서 결국에는 자기 손으로 남들이 안해본 것을 할 수 있는 능력을 손에 넣는 것입니다.

아마도, 어떤 소설가가 책을 쓴다면, 누군가가 쓴 적이 없는 내용을 쓰는 것일 테고, 당연히 도서관에도 찾아볼 수 없는 내용일 겁니다. 마찬가지죠. 누군가가 직업적으로 코드를 짤때는 어떤 고유한 문제를 풀기 위해서 짜는 것일 겁니다. 대부분의 사람들이 부딪치는 평균적인 문제에 대한 적절한 해법은 거의 모두 누군가가 풀어 놨습니다. 이런 문제에 대한 해법을 제공하는 것이 라이브러리의 존재 이유입니다. 여러분의 귀중한 시간과 능력은 다른 사람들이 풀어본 적이 없는 문제를 해결하는 데에 사용하시기 바랍니다.
이왕이면 인류 발전을 위해 풀어본 결과를 다른 사람들이 볼 수 있게 해주면 좋겠지요 :)