제가 몇 년 전에 그랬던 것처럼 어느 날 갑자기 눈을 뜨니 팀장이 되는 분들도 있을 겁니다. 천부적인 재능을 갖춘 관리자라면 처음부터 판타스틱하게 모든 사람을 만족시키겠지만, 개발에만 전념했던 분은 8할의 시행착오와 2할의 행운에 기대어 제대로 끝내는 것만으로도 다행이라고 여길지 모릅니다.
프로젝트 관리라는 게 그렇게 복잡한 것이 아닌데 관리자에 따라서 결과가 달라지는 것을 보면, 프로젝트 관리는 일종의 기술(Art)인 듯합니다. 그렇기에 아무리 프로젝트 관리 지식이 뛰어나도 관리자로서 역할을 수행해 머릿속에 알고 있던 지식들이 뼛속까지 내 것이 되지 않는 한, 알기만 많이 아는 헛똑똑이 초보 관리자를 벗어나지 못할 겁니다.
지금 생각해 보면 초보 PM이었을 때 제가 습득하고 있던 프로젝트 관리 지식은 완벽하지는 않았지만, 프로젝트 관리를 하는 데 그다지 부족하지 않았습니다. 그럼에도 프로젝트 관리에 어려움을 겪었던 것은, 앞서 말씀 드렸듯이 머릿속에만 있던 지식들이 온전히 내 것이 되지 않았기 때문입니다. 과거에 '만약'이라는 가정법을 들이대는 것은 덧없는 행위죠. 그래도 '저에게 모자랐던 경험을 채워줄 선배 팀장이 곁에 있었더라면,' 첫 번째 프로젝트의 결과는 어떻게 됐을까요? 든든한 멘토가 있었더라도 스스로 헤쳐 나아가야 한다는 사실은 변함없겠지만, 혼자일 때보다 그렇게 외롭지도 그렇게 두렵지도 않았을 겁니다.
물론 책은 단방향의 커뮤니케이션이기 때문에 질문을 던질 수 없다는 한계가 있습니다. 즉, 진짜 사람이 들려주는 충고와 책 속에 적힌 이야기를 비교할 수 없습니다. 하지만 기존 프로젝트 관리서적이 지식의 나열에 그쳐, 프로젝트의 경험적인 혹은 기술(Art)적인 측면에 소홀한 듯합니다. 물론 이 책도 활자화된 텍스트이기에 분명 한계는 존재하지만, 소설의 형식이 이런 경험적인 부분을 보완할 수 있다는 생각입니다. 이런 이유로 PM으로서 간접 경험을 초보 팀장이나 관리에 관심을 두신 개발자 여러분께 전해드리고자 소설의 형식을 빌린 이 책을 썼습니다.
지금으로부터 11년 전, 난 처음으로 직장생활을 시작했다. 처음 입사했을 때 난 성공을 향한 고속도로에 있다고 생각했다. 일만 열심히 한다면, 그리고 내가 좋아하는 개발만 잘한다면 성공을 향해 쾌속 질주할 것이라고 생각했다.
꿈 많은 신입사원의 커리어는 소프트웨어 개발자에서 시작됐다. 프로젝트 경험이 쌓이자 프로젝트 리더도 맡았다. 입사하고 나서 지금은 알 수 없는 무언가에 이끌려 한동안 미친 듯이 개발했다. 하지만 신입사원의 열정이 사그라질 무렵, 불행한 일이 생기기 시작했다. 몸 담은 부서에서 소프트웨어 개발 업무가 줄어든 것이다. 소프트웨어를 개발하고 싶었지만 어쩔 수 없이 전공과 경험을 살려서 전자 제품 개발 컨설턴트로 한동안 일해야 했다. 천직이라고 생각한 개발에서 멀어져야 한다는 사실에 적잖이 방황했다.
꿈을 찾기 위해 어렵사리 이직을 하고 나서 다시 소프트웨어 세계로 넘어왔다. 새로운 곳에서 프로젝트 관리자로서 새로운 커리어를 시작했다. 사실 이직을 한 가장 큰 이유는 임베디드 소프트웨어를 개발하기 위해서였다. 하지만 직면한 현실 때문에 난 관리자 역할을 맡아야 했다. 옮기기 전 회사에서도 PM을 했기 때문에 관리에 대한 부담은 없었다. 다만 새로운 일에 대한 큰 꿈을 품고 감행한 이직이 기대에 미치지 못했기에 난 새로운 고민에 빠졌다.
이직 후 늦은 밤, 일을 끝마치고 돌아오는 길이면 시지프스가 생각났다. 자신보다 큰 돌을 힘겹게 산꼭대기에 굴려서 올려 놓지만, 곧 돌은 산 아래로 눈 깜짝한 사이에 굴러가 버린다. 이마의 땀이 채 마르기도 전에 다시 산 아래로 돌을 올리려 내려 가는, 그런 시지프스 말이다.
시지프스 생각이 자주 나던 무렵, 고객을 포함한 프로젝트 팀원들과 회식을 했다. 이런 저런 이유로 팀원들에게 술잔을 돌리기도 하고 받기도 한 탓에 과음을 했다. 다음 날 아침 잠에서 깨니 머리가 지끈거렸다. 몸은 천근만근이었지만 중요한 일이 있어서 반드시 출근해야 했다.
"다 먹고 살자면 어쩔 수 없지."라는 말로 스스로를 위로하고 화장실에서 찬물로 세수했다. 손으로 얼굴에 묻은 물을 대충 닦아내고 거울을 쳐다봤다. 거울 속에는 늘 보던 내 얼굴이 어디론가 사라져 버리고, 초췌한 시지프스의 얼굴이 보였다. 그러고 보니 성공을 향한 고속도로라고 생각한 회사는 어느 순간 밥벌이를 해결하는, 고된 노동이 기다리는 시지프스의 산이 되어 버렸다. 그날도 내키지 않는 걸음을 떼며 또 한 번의 돌을 굴리기 위해 통근 버스에 몸을 실었다.
퇴근 무렵이 되자 몸은 지칠 대로 지쳤다. 버스 창문에 간간히 비추는 시지프스의 모습을 보면서 어디서부터 잘못됐는지 생각했다. 이직을 결심한 순간인지, 어쩔 수 없이 컨설턴트로서 커리어를 쌓게 된 시점인지, 아니면 첫 출근하는 그날인지. 성실하게 산 것밖에 없는데 어느 순간 신에게 불경스런 죄를 지은 시지프스의 인생이 되어버린 사실에 화가 났다. 아무런 의미 없이 날마다 돌을 굴려야 한다는 사실에 숨이 막혔다.
난 무언가 결정을 해야 한다고 생각했다. 그리고 과감히 시지프스의 삶에서 탈출하기로 결심했다. 몇 달 동안, 난 돌을 굴리지 않는 일상의 파업을 자행하기로 했다. 신보다 더 혹독한 현실이 내게 더 심한 형벌을 내릴지라도, 난 더 이상 돌을 굴리지 않기로 결심한 것이다.
그리고 이 책은 자발적인 파업의 순간부터 다시 일을 시작하기까지의 내 고민과 생각을 기록한 것이다. 즉, 내 인생에서 큰 쉼표였던 휴직의 시간을 기록한 것이다. 나처럼 무의미한 것처럼 보이는 노동에서, 혹은 시지프스의 삶에서 탈출하고 싶어하는 사람들과 내 경험을 공유하고 싶어서 이 책을 썼다.
혼자만이 그런 고민을 하는 게 아니라 동시대의 누군가도 같은 고민을 하고 있다는 걸 알려주고 싶었다. 아무쪼록 이 책이 조금 더 나은 미래를 고민하는 당신에게 힘이 되길 바란다.
최근에 개봉하는 굵직한 SF 영화를 보면 두드러지는 소재가 있는데, 바로 인공지능이다. 영화 속에서는 인공지능, 즉 스스로 판단하고 그에 따라서 행동하는 기계를 다양하게 표현하는데, 대체적으로 인공지능은 사람에게 위협이 될 것이라고 묘사된다. 영화에서 인공지능이 묘사되는 모습을 볼 때마다, 영화의 흐름과 관계없이 직업적인 호기심이 발동된다. 과연 영화에서 표현되는 인공지능은 어떤 프로그래밍 언어로 개발되었을까? C로 개발됐을까? 아니면 스크립트 언어가 비약적으로 발전해 자바스크립트 같은 스크립트 언어로 만들어졌을까? 하는 궁금증이다.
사실 이 책은 장난 같은 이 질문에 대한 답을 찾는 과정에서 만들어졌다. 인공지능에 적합한 프로그래밍 언어를 인터넷으로 검색하다가 우연히 '확률적 프로그래밍'이라는 단어를 찾게 되었다. 처음에 확률적 프로그램이라는 단어를 들었을 때는 확률과 프로그래밍이 어떤 연관이 있는지 도무지 감이 잡히지 않았다. 사실 확률적 프로그래밍을 이해하려면 프로그래밍 지식 외에 다양한 지식이 필요했다.
특히 일반 교육 과정에서 많이 들었던 확률이나 명제를 다시 공부해야 했고 처음 접하는 베이지안 확률, 베이지안 네트워크, 추정 알고리즘 등을 처음부터 살펴봐야 했다. 이런 것들을 알게 된 지금 확률적 프로그래밍을 처음 접하는 사람에게 확률적 프로그래밍이란 무엇인지 설명해야 한다면, 아마도 본문에서 설명하는 아래 사례가 가장 적합할 것 같다.
확률적 프로그래밍을 간단히 소개하려면 우선 명제에 대해 이야기해야 한다. 명제란 참과 거짓을 구분할 수 있는 문장을 말한다. 명제는 인공지능을 구성하는 논리의 기본 단위다. 말하자면 '당신 앞에 있는 건 자동차다'는 명제다. 그것이 자동차라면 명제가 참일 것이고 자동차가 아니라면 거짓일 것이기 때문이다. 아울러 '자동차는 달릴 수 있다'도 명제다. 자동차가 달리는 건 분명한 사실이고, 따라서 이 명제는 참과 거짓을 구분할 수 있기 때문이다. '당신 앞에 … 수 있다'는 문장은 가정도 참이기 때문에 결론도 참일 것이란 추론을 할 수 있다. 하지만 그 자동차의 엔진이 고장 날 가능성이 반반이라는 사실을 알게 된다면, 당신이 보고 있는 '그것'은 과연 달릴 수 있다/없다로, 말하자면 참과 거짓으로 판단을 내릴 수 있을까?
이야기하고 싶은 바는 명제와 명제를 사용한 논리적 추론만으로 사람들의 사고방식을 모델링하는 데 한계가 있다는 것이다. 명제를 프로그래밍 관점에서 해석하자면, 명제를 참이나 거짓을 뜻하는 불리언(boolean) 변수로 생각하거나 참이나 거짓을 돌려주는 논리식으로 생각할 수 있다. 프로그래밍 관점에서 해석해도 앞의 문장에 아직 동의하지 못하거나 그 의미가 명확하지 않은 독자를 위해 다른 예를 한 가지 들겠다. 우선 아래에 있는 명제를 살펴보자.
채식주의자는 평화주의자다.
군인은 평화주의자가 아니다.
위의 명제가 모두 참이라고 가정해보자. 만약 철수가 채식주의자라고 한다면, 위의 명제에서 철수는 평화주의자란 결론을 얻을 수 있다. 앞에서 예를 든 철수가 군인이라고 해보자. 그렇다면 철수는 평화주의자가 아니라는 결론도 얻을 수 있다. 즉 단순히 참과 거짓을 가지고 판단하는 명제를 사용한다면, 채식주의자면서 군인인 철수는 평화주의자인지 평화주의자가 아닌지 판단할 수 없게 된다.
현실에서는 이런 모순적인 상황이 매일같이 일어난다. 즉 채식주의자면서 군인인 철수가 평화주의자일 수도 있고, 평화주의자가 아닐 수도 있는 상황 말이다. 이걸 참과 거짓의 잣대로만 판단하려면 절대 판단할 수 없는 사태가 일어난다는 뜻이다. 이런 이유로 확률이 인공지능 개발에 개입하게 됐다. 특히 주관적 확률의 경우 자연현상을 포함하여 믿음을 표현할 수 있는 수단이다.
즉 참과 거짓이 아닌 0과 1 사이에 있는 값으로 어떤 상황을 표현한다. 채식주의자면서 군인인 철수가 평화주의자일 수 있는 확률이 0.5보다 크다면, 우리는 잠정적으로 철수는 평화주의자라 가정할 수 있다. 말하자면 참과 거짓이라는 양극단의 세계에 빠지지 않고, 그런대로 현실을 판단하고 행동할 수 있는 기준을 얻을 수 있다는 뜻이다. 물론 평화주의자라고 잠정적으로 생각했던 철수가 전쟁 지지 집회를 연다면, 우리는 이 사실을 기반으로 철수가 평화주의자일 확률을 다시 조정할 수도 있다. 이런 이유로 명확한 논리로 무장해야 하는 인공지능 세계에 불확실한 확률이 등장했다.
나는 이 책을 쓰게 된 질문, "인공지능을 개발하는 프로그래밍 언어는 무엇일까?"라는 질문에 대한 답을 찾았을까? 완전한 답은 아니지만 그 실마리를 찾았다고 생각한다. "새 술은 새 부대에"라는 속담이 있다. 아울러 나무와 못을 들고 있다면 최적의 도구는 드라이버가 아닌 망치일 것이다. 프로그래밍 세계에서 모든 분야에 해결책을 주는 프로그래밍 언어는 없다. 즉 해결하려는 문제가 지금까지의 프로그래밍 언어로 풀 수 없다면, 새로운 프로그래밍 언어가 필요한 시점이라고 생각한다. 아마도 그 변화의 시점에 확률적 프로그래밍이 적절한 해답을 줄 수 있을 것이라 믿는다.