알고리즘을 말할 때 반사적으로 코딩이나 컴퓨터 프로그래밍을 떠올리는 사람이 많다. 하지만 알고리즘은 코딩이나 컴퓨터 프로그래밍과 완전히 분리할 수 있는 개념이다. 이 책은 각종 퍼즐을 모아놓은 책이다. 그중에서도 문제해결을 위한 분명하게 정의된 절차, 즉 “알고리즘”을 써서 풀 수 있는 퍼즐을 공부하기 위한 책이다.
이 책의 1장은 튜토리얼로, 알고리즘을 설계하고 적용하는 데 필요한 일반적인 전략을 담고 있다. 알고리즘 교과서 수준의 심화 내용을 제공하지는 않지만 비전공자에게는 “아, 이런 게 있구나!”라고 알려주는 수준으로, 전공자에게는 “아, 이런 걸 배웠었지!”라고 되새겨 볼 기회를 주는 수준으로 몇 가지 예제와 함께 핵심을 빠르게 짚어주는 부분이다.
2장에는 초급 퍼즐 50개, 중급 퍼즐 60개, 고급 퍼즐 40개, 총 150개 퍼즐이 담겨 있다. 영문판에는 문제, 힌트, 풀이와 참고사항이 서로 다른 장으로 나뉘어 편집되어 있지만 한국어판에서는 앞뒤로 오가는 번거로움을 없애기 위해 문제, 힌트, 풀이, 참고사항을 연속적으로 배치했다.
생각하는 힘과 문제해결 능력을 키우려면 많이 생각하고 많은 문제를 해결해봐야 한다. 이 책은 그런 연습을 원하는 이들에게 훌륭한 운동장과 도전과제 역할을 해준다. 프로그래밍 면접을 준비 중이라면 여기에 실린 문제를 풀어보면서 문제를 제대로 분석하고 논리적으로 올바르고 효과적인 알고리즘을 구상하는 능력을 기를 수 있을 것이다. 코딩과는 별개로 논리적 기반 마련을 위한 훈련을 할 수 있어 기본기를 다듬을 좋은 기회가 될 것이다. 퍼즐 덕후라면 여러 가지 퍼즐을 푸는 것 자체에서도 큰 즐거움을 느낄 뿐만 아니라 퍼즐의 뿌리를 찾아가는 여러 참고문헌으로부터 또 다른 덕질의 기쁨을 만끽할 수 있을 것이다.
좋은 책을 발굴하고 한국어판 출판을 결정해주신 길벗출판사 식구들, 그중에도 특히 한동훈 부장님께 감사드린다. 한동훈 부장님의 인내와 관심이야말로 이 한국어판을 만들어낸 자양분이다.
소프트웨어 업계에서는 다른 업계에 비해 기술적인 역량이 유난히 강조된다. 몇몇 프로 스포츠 분야에서처럼 스타급이라고 할 수 있는 특출난 개인의 위력이 조명을 받는 일이 잦고, 그러다 보니 여럿이 힘을 합쳐 조직력을 발휘하는 쪽에는 다들 상대적으로 관심을 덜 쏟는 편이다. 하지만 어떤 소프트웨어 프로젝트든 덩치가 커지면 결국은 여럿이 힘을 합쳐야만 하고, 어떤 형태로든 조직을 이뤄서 일해야 하기 마련이다. 그런데 소프트웨어 분야는 프로젝트의 계획이나 실행 등이 다른 분야에 비해 훨씬 까다로운 것으로 악명이 높기도 하다. 시중에 소프트웨어 분야의 프로젝트 관리법, 개발 방법론에 대한 책이 수도 없이 많이 나와 있고, 다른 제조업 분야와는 별개로 고도로 전문화된 소프트웨어 공학 분야에서 수많은 연구가 진행되고 있는데도 일이 쉽지가 않다. 그만큼 소프트웨어 업계는 조직을 이뤄서 목표를 달성하기 어려운 분야다.
이 책은 툭 까놓고 얘기하자면 소프트웨어 업계에서 성공하는 방법에 관한 책이다. 직장에서 성공하는 방법에 대한 책이 수없이 많이 나와 있지만, 소프트웨어 업계 종사자들을 위한 책은 그리 많지 않다. 이는 소프트웨어 업계에서는 유난히 개인의 전문적인 역량이 강조되기 때문이기도 하고, 소프트웨어 업계 종사자들이 평균적으로 조직에 얽매이지 않으려는 성향이 매우 강하기 때문이기도 할 것이다. 소프트웨어 분야에서의 전문가로서의 역량은 두말할 필요 없이 중요하다. 그러나 전문성 외에 팀을 이뤄서 일하는 역량도 매우 중요하며, 위로 올라갈수록 리더십이 점점 중요해진다. 이 책은 다른 수많은 전문서적에서는 잘 다루지 않는, 조직생활에 필요한 기술을 소개하는 책이다.
이 책에는 사회 초년병이 알아야 할 내용부터 대가로 성장하는 데 필요한 내용까지가 순서대로 수록되어 있다. 1부에서는 사회 초년병이 궁금해할 만한 회사와 학교의 차이점, 좋은 소프트웨어 회사를 찾아내고 입사하는 방법, 초급 개발자로서 효과적으로 경력을 쌓는 방법 등을 주로 다루고 있다. 2부에서는 리더십 역량을 쌓는 방법, 시간 관리 및 프로젝트 관리 방법, 업무와 개인의 삶 사이의 균형에 관한 내용 등을 다룬다. 3부에서는 대가급으로 올라가는 데 필요한 것들, 자기만의 스타트업을 만드는 것과 관련된 내용 등을 다룬다.
이 책에서 본문 내용 못지않게 중요한 부분이 바로 인터뷰 내용이다. 소프트웨어 분야에서 슈퍼스타라고 할 만한 인물들의 인터뷰가 수록되어 있는데, 대가로 인정받은 사람들의 삶을 엿보고 그들의 소중한 경험으로부터 우러나오는 조언은 분명 눈여겨볼 만하다.
오랫동안 학교에 다니다가 뒤늦게 회사 생활을 시작한 나도 이 책을 우리말로 옮기면서 많은 것을 배웠다. 책에 나온 내용과 내가 예전에 했던 어처구니 없었던 행동을 비교해 보면서 "내가 왜 그랬을까?"하는 생각이 들기도 했고, "참 간단한 건데 왜 실천을 못 할까?"하는 생각이 드는 대목도 있었다. 어떤 일이든 결국은 사람 사이의 일로 귀결된다. 내가 한 일을 남들에게 알리는 것도 소통이고, 남이 한 일을 내가 받아들이는 것도 소통이다. 열심히 배우고, 열심히 일하는 데서 멈추지 않고, 열심히 소통하고 효과적으로 소통하는 데 더 많은 노력을 기울일 수 있다면 성공하기가 조금은 더 수월하지 않을까 생각한다.
마지막으로 이 책의 한국어판이 완성되기까지 초인적인 인내심을 보여주신 한동훈 님께 감사의 마음을 전하고 싶다.
한국에서 초o중o고등학교를 다녔다면 대부분 치열한 입시경쟁을 거쳤을 것이다. 시험에서 좋은 성적을 받으려면 일단 기본기가 충실해야 하듯이 입사 면접도 일종의 시험이기 때문에 기본기가 충실하지 않고서는 좋은 결과를 얻기가 힘들다.
하지만 그렇다고 해서 기본기가 충실한 것만으로 컴퓨터 관련 분야에서 괜찮은 직장에 들어갈 수 있는 것은 아니다. 학교에서 배우는, 또는 책에 나와 있는 내용을 얼마나 잘 알고 있는가 하는 것뿐만 아니라 그 사람이 그동안 해온 경험이라든가 상황에 따른 대처법, 커뮤니케이션 스킬 같은 것이 모두 실력에 포함되기 때문이다. 어떤 직업에 종사하든 문제 해결 능력은 상당히 중요하다. 컴퓨터 분야는 그중에서도 문제 해결능력이 특히 강조되는 분야 가운데 하나다. 여기에서 문제 해결 능력이란 책에 나와있는 연습문제 같은 것을 푸는 능력이 아니라 주어진 상황에서 여러 제약 조건 등을 감안하여 해결해야 할 현안을 처리하는 능력을 뜻한다. 따라서 문제 해결 능력을 보이기 위해서는 지식 외에도 경험, 각종 기술, 사고력 등을 총체적으로 갖춰야 한다. 아울러 세상을 혼자 살아갈 수는 없는 노릇이고, 어디에서든지 다른 사람들과 함께 일을 해야 하기 때문에 자신의 생각을 남에게 잘 펼쳐낼 수 있는 능력, 남의 생각을 잘 이해하는 능력도 매우 중요하다. 팀워크도 정말 중요하다. 50인분의 일을 할 수 있는 수퍼 개발자라면 몰라도, 1~2인분의 일을 할 수 있는 중~중상 수준의 사람이라면 그 사람 때문에 5명짜리 팀의 업무 효율이 저하되는 것보다는 그 사람을 포기하는 쪽이 팀 전체의 능력을 극대화하는 데 있어서 더 효과적이다.
이 책은 컴퓨터 관련 분야로 취업하려는 사람들을 위한 책이며, 대학에서 컴퓨터 관련학과를 졸업했거나 그에 상응하는 지식/경험을 가진 사람들을 대상으로 하는 입사시험 수험서 성격을 띤 책이다. 컴퓨터 관련 업체의 입사 면접에 나올 만한 문제들을 여러 예제를 통해 풀어보면서 입사시험에 준비할 수 있게 해 주는 책이다. 이미 대부분의 독자가 경험했겠지만, 시험에서 탄탄한 기본기 못지않게 중요한 것이 바로 문제를 푸는 기술이다. 교과서를 달달 외운다고 해서 모든 문제를 수월하게 풀 수 있는 것은 아닌 것처럼, 아는 것이 많다고 해서 반드시 면접에서 좋은 결과를 얻을 수 있는 것은 아니다. 이 책은 학교에서, 또는 교과서에서 배운 내용과 실제 면접 사이의 간극을 메워 줄 만한 책이다.
이 책의 2판 번역본이 나온 지도 벌써 7년이나 지났다. 그동안 시간이 많이 지나 역자도 학위를 마치고 (프로그래밍 면접은 아니지만) 면접을 거쳐서 직장을 잡았고, 면접관으로 지원자를 평가하는 등의 경험을 한 상태에서 3판 개정판 작업을 하면서 다시 꼼꼼히 이 책을 보니 면접 준비가 기본기 못지않게 얼마나 중요한 것인지 새삼 깨닫게 된다. 개정판 작업 동안 고생해 주신 한동훈 씨, 박민아 씨에게 다시금 감사의 마음을 전한다. 그리고 나의 존재의 이유인 아내 혜선, 아들 정언, 정인에게도 사랑과 감사의 마음을 전한다.