컴퓨터 공학을 전공하고 있거나, 컴퓨터 공학 전공을 고려하고 있나요? 전공 과정에서 무엇을 배우고 싶나요? “유용한 소프트웨어를 만들고 싶어요”라는 생각을 하고 있다면 이 글을 읽어보시기 바랍니다. 저처럼 학부 컴퓨터 공학에 대해 오해해서 전공 과정에서 스트레스를 받지 않기를 바라며 쓴 글입니다.

10살에 곰을 잡은… 아니 10살에 첫 프로그램을 작성한 그런 인재는 아니었지만 저도 어릴 때부터 컴퓨터를 매우 편하게 일상적으로 사용했습니다. 초등학교 때부터 이미 하이텔, 천리안 등 PC통신 서비스를 사용해서 게임 세이브 데이터를 헥스 에디팅 하는 방법을 검색하곤 했죠. 컴퓨터 조립도 어릴 때부터 해왔습니다. 따라서 제가 대학에서 컴퓨터 공학을 배워보려 한 것은 의외의 일은 아니었습니다. 게다가 컴퓨터를 좋아하니 컴퓨터 공학도 적성에 맞겠죠? 절대 아니었습니다. 경제학 수업만큼은 아니었지만 컴퓨터 공학 수업도 매우 싫어했습니다. 세세한 수업 내용은 오히려 흥미롭고 재미있었습니다. 문제는 이 수업에서 배운 내용을 어디에 사용할 수 있을지 보이지 않았던 것이죠. 그러다보니 컴퓨터 공학 수업은 모두 의미 없게 느껴지기 시작했고, 공부해봐야 뭐하나 하고 삐딱하게 보다보니 컴퓨터 공학 수업을 들을 때마다 엄청난 스트레스를 받게 되었습니다. 그러다보니 결국 다른 과목을 전공하게 되었죠. 그리고 졸업하면서 다짐했습니다. 소프트웨어 개발하는 일은 절대 하지 말아야지!

그리고 저는 대학 졸업하고 처음 한 일에서 소프트웨어 개발 업무도 맡게 됩니다. 졸업하고 시작한 스타트업에서 소프트웨어를 개발할 필요가 생겼고, 저도 소프트웨어 개발 전선에 뛰어들게 됩니다.

앞서 다른 전공을 선택했다고 이야기했는데, 저는 심리학과 정보과학을 전공했습니다. 이 중 정보과학은 사회에서 정보를 다루는 활동과 체계에 대한 것을 공부하는 학과입니다. 제가 좋아하는 컴퓨터와 어느정도 연관성을 유지하면서도 컴퓨터 공학처럼 기술 자체를 다루지는 않아서 제 마음에 쏙 드는 전공이었는데, 물론 정보 기술을 다루는 만큼 1, 2학년 수준의 컴퓨터 공학 수업을 일부 포함합니다. 그리고 이 과정에서 보조적으로 습득한 기술적인 배경지식 때문에 저도 소프트웨어 개발을 시작한거죠. 대학에서 컴공에 관해 워낙 안 좋은 경험을 했기 때문에 이번 일도 마찬가지로 끔찍한 경험이 될 것이라는 걱정부터 앞섰습니다.

그리고 또다시 예상치 못한 일이 일어납니다. 소프트웨어 개발이… 재밌네요? 당연히 쉽지는 않았습니다. 돈도 시간도 없는 상황에서 익숙하지도 않은 일을 사수도 없이 독학해가면서 해내야 했으니까요. 이 때 제 심경은 매우 복잡미묘했습니다. 일단 자는 시간을 제외하면 계속 일을 하다보니 매우 피곤하고 스트레스가 쌓였고, 개발 자체는 재미있어서 정말 즐거웠고, 이런 재밌는 일을 대학에서는 왜 그렇게 재미없게 가르쳐서 내가 소프트웨어 개발에 대해 오해하게 만들었는지 하는 생각에 화가 치밀어올랐습니다.

하지만 곧 마음을 가라앉히고 곰곰히 생각하기 시작했습니다. 왜 이렇게 재미있는 일을 학교에서는 그렇게 무의미하고 지루하게 생각했을까? 꽤나 오랫동안 고민을 했지만 Paul Graham이 쓴 해커와 화가라는 수필을 읽은 뒤에야 그에 대한 답을 낼 수 있었습니다. 수필에는 작가가 “컴퓨터 공학”이라는 단어를 싫어하는 이유를 설명하는 문단이 있습니다.

저는 “컴퓨터 사이언스”라는 용어를 좋아해본 적이 한번도 없습니다. 이 용어를 싫어하는 가장 큰 이유는 컴퓨터 사이언스라는 것이 실제로 존재하지 않기 때문입니다. 컴퓨터 사이언스는 관련성이 희박한 분야들이 역사적 우연에 의해서 한 바구니에 같이 담겨져 있는 꼴입니다. 마치 유고슬라비아처럼 말이죠. 먼저 한쪽에는 실질적으로는 수학자이지만 DARPA (미국 국방고등연구계획국) 에서 지원금을 따내기 위해서 지금 하고 있는 일을 컴퓨터 사이언스라고 부르는 사람들이 있습니다. 그리고 중간에는 컴퓨터의 역사 같은 것을 연구하는 사람들이 있습니다. 예를 들어 네트워크를 통해 데이터를 전송하는 알고리즘의 형태에 대한 연구 등을 하죠. 반대쪽 끝에는 재미있는 소프트웨어를 작성하고자 하는 해커들이 있습니다. 이들에게 있어 컴퓨터는 표현의 수단일 뿐입니다. 건축가와 콘크리트, 화가와 물감의 관계와 비슷하죠. 결국 수학자, 물리학자, 건축가가 같은 학과에 모여있는 것이나 마찬가지인 모습입니다.

눈이 확 뜨이는 느낌을 받았습니다. 저는 해커 쪽에 속한 것이 분명했습니다. “컴퓨터는 표현의 수단이다”라는 말에는 거의 감동을 받았죠. 제 생각과 너무나 비슷했거든요. 제가 만들고 싶은 것을 구현하기 위해서 소프트웨어 개발을 배우는 것은 너무나 즐거웠습니다. 하지만 학부의 컴퓨터 공학 전공과정은 제가 만들고 싶은 것과 전혀 상관이 없을 뿐 아니라, 무엇인가 만드는 것보다는 컴퓨터 자체에 대한 공부에 더 중점을 두고 있었습니다. 해커가 아니라 나머지 두 부류의 사람들에게 더 중점을 둔 교육과정이었던거죠. 결국 제가 배우고 싶었던 것을 거의 가르치지 않은 셈입니다.

이렇게 불필요한 오해와 감정 소모가 발생한 것은 누구의 잘못일까요? 제 자신입니다. 컴퓨터 공학이 무슨 전공인지는 제 스스로가 좀 더 잘 이해했어야 했죠. 하지만 제 학부 컴퓨터 공학과도 교육과정의 목표를 명료하게 표현하지 못했다는 책임에서 벗어날 수는 없다고 봅니다. 제가 전공한 다른 두 학과는 전공과정의 목표가 무엇인지 그리고 전공과정을 수료했을 때 학생이 무엇을 배우게 될 지를 훨씬 명확하게 제시했습니다. 또한 학생이 학과 내에 공존하는 다양한 소속분야를 쉽게 이해할 수 있도록 학과 수업을 분류해 두었습니다. 컴퓨터 공학부는 이런 부분에서 엉망이었구요. 이번에 학부 컴퓨터 공학과 웹사이트를 다시 살펴보니 학과에서도 그런 내용을 안내하려고 나름 시도는 했다는 것을 알 수 있었습니다. 워낙 엉망이라 지금도 그러한 시도를 알아차리기 힘들고, 막상 그런 내용이 필요한 학부생이라면 절대 알아차릴 수 없을 거라는 심각한 문제가 있지만 말입니다.

다른 대학의 컴퓨터 공학과에서는 학생에게 잘 정리된 정보를 제공하고 있기를 바라지만, 저와 비슷한 경험을 하는 경우가 더 많은 것 같습니다. 학부생은 자신이 무엇을 배우게 될지를 전반적으로 이해하지 못하고, 학과에서는 교육과정의 목표와 학과의 의도를 명확히 전달하지 못합니다. 양쪽 모두가 각자의 시간과 자원을 의미없이 소모하고 있는 거죠.

Paul Graham은 컴퓨터 공학과를 수학자, 컴퓨터 역사학자, 해커가 컴퓨터를 중심으로 느슨하게 엮여있는 기묘한 학과라고 불렀습니다. 컴퓨터 공학 전공과정도 비슷합니다. 수학, 컴퓨터 역사, 소프트웨어 개발을 묘하게 섞어놓은 교육과정을 배우게 됩니다. 이 중에서 가장 취약한 부분은 소프트웨어 개발입니다. 왜 그럴까요? 컴퓨터 공학 교수는 일단 연구원이지 소프트웨어 개발자가 아니기 때문입니다. 이 사람들이 박사논문을 쓴 분야는 알고리즘의 수학적 증명이나 네트워크 이론같은 분야입니다. 즉, 수학자나 컴퓨터 역사학자 쪽에 훨씬 가깝다는 말이죠. 컴퓨터 공학 교수 중에 업계에서 오랜 경력을 가진 사람은 몇 되지 않습니다. 그러니 실제 생활에서 사용되는 소프트웨어를 바로 만들고 싶다면 컴공 전공은 별로 유용하지 않습니다. 학부 컴퓨터 공학 전공의 목표는 그게 아니거든요.

하지만 대신 학부에서는 컴퓨터 공학 전반에 대한 넓고 튼튼한 기초를 다질 수 있습니다. 컴퓨터 공학 전공보다 이를 더 잘 가르치는 교육방식은 없습니다. 단, 전공과정에서 배운 것을 모두 활용할 일은 없을 것입니다. 사실 현업 소프트웨어 개발의 90%는 알고리즘과 같은 고급 컴퓨터 공학 개념과 무관합니다. 하지만 어차피 고급 개발자가 되기 위해서는 고급 개념과 지식을 배워야 하는데 전공 과정에서 배운 기초 지식과 개념이 있으면 배우기 훨씬 수월한 것이 사실입니다.

이 길은 느리지만 안정적이고, 비효율적이지만 포괄적인 길입니다. 인내심과 장기적 계획이 필요할 겁니다.

다른 방법은 스스로 배우는 것입니다. 인터넷을 찾아보면 프로그래밍을 배울 수 있는 훌륭한 자료가 무료로 많이 공개되어 있습니다. 열정을 가지고 배운다면 대학교 4년 과정을 마치는 것보다 훨씬 빠르게 자신만의 소프트웨어를 만들 수 있을 겁니다. 고급 개념도 4년 동안 몰아서 배우지 않고 소프트웨어를 개발하면서 필요에 따라 그때그때 배우게 됩니다. 그리고 그런 지식을 배워서 실제 소프트웨어에 적용해보는 만큼 학교에서 배운 것보다 훨씬 깊이 있게 이해할 수 있겠죠. 반면에 이런 방식으로 배울 경우 지식이 들쑥날쑥하게 됩니다. 특정 분야는 매우 잘 아는데, 어떤 분야는 몰라도 너무 모르는 경우가 생기게 되죠. 또한 말그대로 혼자서 공부한다면 무엇을 배워야 할지 판단하기 어렵기 때문에 길을 잃어버릴 수도 있습니다. 멘토를 찾거나 개발자 커뮤니티의 도움을 받으세요. 그리고 대학 학위가 없는 만큼 능력을 증명하기 위해서 포트폴리오를 만들고 유지해야 합니다.

이 길은 빠르지만 불안정하고, 실용적이지만 포장되지 않은 길입니다. 근성과 신념이 필요할 겁니다.

결국 어떤 길을 걷든 종착지는 같다고 봅니다. 무엇을 먼저 배우는지가 다를 뿐이죠. 튼튼한 컴퓨터 공학 기초를 쌓고 이를 실제 소프트웨어 개발에 응용하는 법을 배우든 아니면 소프트웨어 개발부터 시작하고 다른 컴퓨터 공학 개념을 점점 습득해 나가든 말입니다. 결국 두 가지를 다 할 수 있어야 고급 소프트웨어 개발자가 될 수 있으니까요.

독자 분의 목표에 어떠한 길이 적합할 지는 모르지만, 각 선택지가 어떠한 의미를 가지는지는 잘 이해하고 선택하셨으면 합니다. 저는 제가 어떤 길을 선택했고 무엇을 배우는지도 몰랐기 때문에 불필요하게 괴로워하고 스트레스를 받았었습니다. 그래도 결국에는 제가 원하는 대로 된 셈입니다. 어차피 저는 컴퓨터 공학에서 뭘 배우는지 명확히 이해했었어도 컴퓨터 공학을 전공하지는 않았을 테니까요. 제 목표는 컴퓨터를 활용해서 인간 및 사회 문제를 해결하는 것이지, 컴퓨터 자체에 대하여 배우는 것은 아니니까요. 저는 제 길에 만족합니다.