2020년 7월 23일 11시 15분
아래 내용은 인사이트 출판사의 제안으로 작성 중인 책의 초고입니다. 실제 출판 시에는 내용이 달라질 수 있습니다. 많은 의견 부탁드립니다.
중학생 시절 처음 프로그래밍을 시작하던 때가 생각난다. 주변에 프로그래머가 있지도 않았고 학원 같은 곳에 가서 배우겠다는 생각은 해보지도 않았으니 배울 방법은 독학뿐이었다. 듣자 하니 처음에는 C 언어를 배워야 한다는 것 같아 동네 서점에서 C 언어 책을 하나 집어 들었다. 무작정 책 시작부터 끝까지 따라 해 보았다. 지금 되돌아보면 C의 알파이자 오메가인 포인터는 하나도 이해하지 못했던 것 같다. 물론 그때는 내가 책에서 뭘 이해했고 뭘 놓쳤는지 제대로 알 리가 없었다. 그래서 C 다음은 C++이겠지 하면서 서점에서 C++ 책을 하나 사서 읽기 시작했다. 또 C++ 다음에는 자바를 공부했다.
왜 무작정 여러 언어를 공부하기만 했던 것일까? 그 이유는 단순하다. 여러 언어를 잘 쓸 줄 아는 사람이 좋은 프로그래머일 것이라는 순진한 생각에서 비롯된 결정이었다. 전산학에 수많은 이론이 있다는 것을, 또 그저 여러 언어를 다룰 줄 알기만 하면 되는 것이 아니라는 것을 이야기해 줄 사람이 없었던 것이다. 프로그래머는 프로그래밍 언어를 사용해서 일하는 직업이니 다양한 프로그래밍 언어를 아는 것이 제일이라고 착각했을 뿐이다. 온갖 연장을 사용해 본 목수가 세계 최고의 목수인 것은 아니듯, 온갖 언어를 사용해 본 것 사람이 최고의 프로그래머가 아니라는 사실을 미처 깨닫지 못했다.
물론 지금은 다양한 언어를 공부하는 것보다 중요한 다른 것들이 많다는 것을 잘 알고 있다. 고등학교와 대학교에서 전산학에 얼마나 많은 분야와 이론이 있는지 배웠다. 수많은 시간을 프로그래밍하는 데 썼고, 단순히 여러 언어를 잘 알고 있다고 좋은 코드를 작성할 수 있는 것이 아니라는 것도 느꼈다. 알아야 할 지식이 세상에 널리고 널렸는데 미래에 쓸 일이 있을지 없을지 알 수 없는 새로운 언어를 배우기 위해 소중한 시간을 투자할 수는 없는 일이다.
그렇지만 프로그래밍 언어는 여전히 내게 흥미로운 대상이다. 아니었다면 프로그래밍 언어를 연구하기 위해 대학원에 오지도 않았을 것이다. 언어를 설계하고 그 설계를 통해 얻을 수 있는 성질을 탐구하는 일은 언제나 설레는 일이다. 오해를 막기 위해 덧붙이자면, 모든 프로그래밍 언어 연구자가 언어 설계에 관심 있는 것은 아니다. 오히려 소수의 관심사에 더 가까울 것이다. 여기서 연구자들의 관심사를 설명하려 했다가는 글이 끝나지 않을 테니 내 관심 주제는 언어 설계라고만 정리하고 넘어가자. 그러면 지금도 계속 새로운 언어를 공부하고 있냐고? 대답은 “아니요”다. 아, 물론 계속 새로운 언어를 접하기는 한다. 수업을 듣느라 새로운 언어를 써 보기도 하고, 그냥 궁금해서 새로운 언어를 써 볼 때도 있다. 하지만 예전처럼 “이 언어 공부해 봐야지”하는 생각으로 작정하고 새로운 언어를 공부하는 일이 없을 뿐이다. 새로운 언어를 사용해서 그럭저럭 복잡한 프로그램을 만들 수준까지 익히는 데는 큰 노력이 들지 않는다. 그 언어의 특징 몇 개만 찾아보면 충분할 일이다. 굳이 단단히 마음먹고 책 사서 언어를 배우지 않아도 되는 것이다. 내가 그 언어를 “잘” 알고 있다고 말할 정도의 전문가가 되려면 시간이 꽤 걸리기는 하겠지만.
이 이야기를 꺼낸 것은 내 자랑을 하려는 의도가 아니다. 자랑할 거리조차 아니다. 내가 하고 싶은 말은 누구나 새로운 언어를 쉽게 익힐 수 있다는 것이다. 대부분의 언어는 비슷한 원리와 비슷한 설계를 공유한다. 겉보기에는 전혀 달라 보이는 언어들도 그 속을 자세히 살펴보면 거기서 거기인 경우가 많다. 따라서 여러 언어를 관통하는 기본적인 원리만 파악한다면 새로운 언어를 익히는 것은 쉬운 일이다. 기본 원리는 이미 다 알고 있으니 새로운 언어가 제공하는 특별한 기능 몇 가지만 이해하면 별 무리 없이 그 언어를 사용할 수 있는 것이다.
이 책을 쓴 이유는 거의 모든 언어 속에서 찾을 수 있는 기본 원리를 소개하고 싶어서다. 모든 개발자가 프로그래밍 언어 전문가가 될 필요는 전혀 없다. 하지만 평생 하나의 언어만 사용하는 개발자는 거의 없을 것이다. 그동안 사용하지 않았던 새로운 언어를 만나는 순간에, 프로그래밍 언어의 원리를 이해하고 있는 사람은 어려움을 느끼지 않는다. 원래 사용하던 언어와 새 언어가 얼핏 보기에는 전혀 달라 보여도 실상은 그렇지 않기 때문이다. 오직 중요한 차이점 몇 개만 새로 배우면 충분하다. 반면 그 원리를 이해하고 있지 못한 사람은 새로운 언어를 처음부터 끝까지 새롭게 배우려고 시도할 것이다. 사실 본인이 그 내용의 대부분을 이미 알고 있다는 사실을 깨닫지 못한 채로 말이다.
언어의 원리를 소개하는 책인 만큼 이 책은 어떻게 코드를 짜야 하는지 알려 주지 않는다. 특정 언어에 초점을 맞춰 그 언어를 잘 사용하게끔 도와주지도 않는다. 또, 프로그래밍 언어의 역사를 설명하거나 다양한 언어를 소개하고 추천해 주는 책도 아니다. 이 책은 새로운 언어를 쉽게 익힐 수 있도록 여러 언어의 밑바탕에 있는 공통된 원리를 설명하는 책이다. 이 책의 목표는 끝까지 읽은 사람이라면 누구나 새로운 언어를 쉽게 배울 수 있게 하는 것이다. 물론 그 목표가 이루어지기 어렵다는 사실은 잘 알고 있다. 누군가에게는 이미 다 알고 있는 이야기를 주저리주저리 늘어놓는 지루한 책일 것이고, 또 누군가에게는 쓸데없이 수학적으로 설명하는 현실과 동떨어진 책일 수 있다. 그렇게 느낀 사람들에게는 미리 사과의 말을 건넨다. 그렇지 않은 다른 사람들에게는, 단 몇 명에게 만이라도, 이 책이 앞으로 개발자로 살아가는 데 도움이 될 수 있으면 좋겠다.
이 자리를 빌려, 이 책을 쓰는 데, 그리고 이 책을 쓸 수 있을 만큼 알게 되는 데 많은 도움을 준 류석영 교수님과 카이스트 프로그래밍 언어 연구실의 모든 사람에게 감사의 말을 올린다. 그들이 아니었다면 절대로 쓸 수 없었을 책이다. 인사이트의 한기성 대표님과 송우일 편집자님께도 감사를 드린다. 언젠가 내가 아는 것들을 책으로 쓸 수 있으면 좋겠다고 막연히 생각만 하고 있었는데 그 기회가 이렇게 빨리 오게 될 줄은 상상도 하지 못했다. 이렇게 좋은 기회를 제공해 주신 데 정말 감사하다. 마지막으로, 내 웹 사이트에 방문해 글에 의견을 주고 다른 사람들에게 웹 사이트를 소개해 준 모든 사람에게 감사를 전하고 싶다. 이 책은 나 혼자의 힘으로 쓴 책이 아니라 읽어 주고 의견을 준 모든 사람의 힘으로 다 같이 쓴 책이라 말해야 할 것이다. 그 밖에, 비록 한 명 한 명 다 말할 수는 없지만, 그동안 내가 살아오는 데, 또 이 책을 쓰는 데 도움을 준 모든 사람에게도 감사를 드린다.
202x년 x월 x일 홍재민