Review
Effective Modern C++ 후기

나에게 C++은 PS를 공부하면서 자주 사용해본 언어다. 그렇지만 PS에서 언어의 다양한 기능을 활용하는 경우는 거의 없었기 때문에, C++을 사용했다기보다도 STL을 통해 몇몇 자료구조를 사용한 것이라고 보는 게 맞다. 사실상 C의 문법도 아주 익숙한 것도 아니다.
그래픽스 API들에 관심이 생기면서 자연스럽게 C++을 공부해야 할 필요성도 생겼다. 인터넷상의 자료들으로 공부하면서 C++에는 다양한 문법적 기능들과 많은 라이브러리들이 있다는 것을 알게 되었다. 한편으로 C++은 오랜 역사를 거치면서 변화해온 언어이기도 하다. 그렇다 보니 처음 C++을 배우는 입장에서는 이 다양한 기능과 라이브러리를 어떻게 사용해야 할지 감을 잡기 어렵다. 만약 그때그때 필요한 기능들을 찾아서 코드를 만들다 보면, 그 코드는 C 스타일과 ‘옛날’ C++ 스타일과 ‘모던’ C++ 스타일이 규칙 없이 마구 섞여 있는 코드가 되지 않을까? 그런 코드가 아주 나쁜 것인지는 모르겠다. 그리고 나는 그런 걸 신경 쓸 만큼 C++에 익숙한 것도 아니다. 그렇지만 나는 이왕 입문하는 김에 좀 더 일관적인 스타일의 코드를 쓰고 싶었다. 그래서 이 유명한 책이 딱 내가 원하던 공부 자료가 될 수 있을 것이라는 기대로 읽기 시작했다.
이 책에서 다루는 모던 C++이라는 것은 C++11과 C++14에서의 코딩 스타일이다. 42가지의 개별적인 주제(아이템)들을 통해서 모던한 C++ 코드를 작성하는 방법을 알려준다. 이 42가지의 주제들은 순서에 상관없이 내용에서 언급되기는 하지만, 책에 배치된 순서를 신중하게 결정했다는 느낌을 받았다. 앞선 주제들을 읽으면서 드는 의문이나 해결되지 않은 고민들을 뒤에서 자연스럽게 해결해준다. 각각의 주제도 모던 C++에서 굉장히 중요한 고민들로 선택됐다는 생각이 든다. 주제 선정도 좋을 뿐만 아니라, 각각의 내용은 구체적인 예시를 통해서 이해하기 쉽게 설명해주면서도 예외적인 상황까지 놓치지 않고 알려준다. 물론 C++ 자체가 복잡한 경우가 많기 때문에 쉽게 이해하기 어려운 부분도 있다.
결론적으로 이 책은 C++ 입문자를 위한 책은 아니다. 이 책은 옛날 스타일의 C++에 익숙한 독자들이 모던 C++에 익숙해지도록 하는 책이다. 나도 기본적인 문법들은 혼자서 찾아본 적은 있지만 C++으로 개발을 해본 것도 아니었기 때문에, 나 같은 독자의 입장에서는 이 책만으로는 이해할 수 없거나 공감이 안 되는 상황도 있었다. 그렇지만 C++과 클래스에 대한 기초적인 개념이 있다면 충분히 읽어볼 만한 좋은 책이라고 생각한다. 사실 내용을 다 이해하지는 못하더라도 책에서 문법적인 문제 상황을 깔끔하게 해결하는 것도 흥미롭고, 중간중간 나오는 개발자 개그 덕분에 재미있기도 하다.
내용의 퀄리티와는 별개로, 이 책의 번역에는 많은 논란이 있다. 나는 다른 사람의 리뷰나 평가를 많이 참고하는 편이어서 번역에 대한 많은 논란 때문에 구매를 망설였다. 그렇지만 서점에 가서 직접 몇 페이지를 읽어보고 바로 읽어야겠다는 확신을 했다.
번역에 대한 논란은 크게 두 종류이다. 가장 큰 논란은 번역어의 선정이다. 실제로 내가 어디선가 들어서 어느새 익숙해진 내 프로그래밍 용어와 이 책에서 사용하는 용어가 다른 경우가 많았다. 논란이 되는 용어로는 생 포인터(raw pointer), 배정(assignment), 형식(type), 중복적재(overloading), 과제(task), 합류(join), 왼값(lvalue), 오른값(rvalue), 갈무리(capture) 등이 있다. 대부분은 원어 발음 그대로 읽는 것이 익숙한 경우이고, 배정의 경우는 퍼져있는 대입이라는 용어와는 다르게 사용한 경우이다. 이런 용어들이 책을 읽는데 어색하게 느껴지는 것은 사실이다. 그렇지만 이 번역어들도 모두 신중하게 선택된 결과이다. 따지고 보면 이렇게 번역한 합리적인 이유가 있고, 단어 스스로가 의미 파악에 도움이 되기도 한다. 유일한 문제는 이 용어들은 익숙하지 않다는 점이다. 어쨌든 이 책에서 번역어와 원어를 같이 제시하기도 하고, 용어에 있어서는 책 전체에서 일관성을 유지하기 때문에 이해를 크게 방해하지는 않는다.
또다른 논란은 번역의 어투가 너무 기계적이라는 것이다. 이 부분은 내가 원서를 읽어본 것은 아니기 때문에 내가 받은 느낌만을 말할 수 있을 것 같다. 나는 어투가 기계적이라는 것과 번역투라는 것은 전혀 다른 이야기라고 생각한다. 이 책에서 다루는 문제 상황은 단순하지 않다. 오히려, 코드를 직관적으로 작성할 때 생기는 논리적인 문제점을 다루기 때문에 복잡하더라도 정확하게 설명해야 한다. 나는 번역이 이런 복잡함을 조금이라도 해소하려고 공을 들였다고 느꼈다. 실제로 번역본에는 원서에는 없는 부연설명들이 주석으로 많이 달려있다. API 공식 문서의 어투가 딱딱하다고 불만을 가지는 사람은 없을 것이다. 마찬가지로 이 책의 어투는 딱딱하지만 대부분의 C++ 개발자에게는 익숙하지 않을까 싶다.
아마도 번역어의 선택에 있어서 정확한 의미보다도 대중적으로 익숙한 표현을 사용했으면 거의 완벽하다는 평가를 받지 않았을까 싶다. 내가 책을 많이 읽어보지는 않았지만, IT 기술서 중에서는 이 책에 비해서 훨씬 좋지 않은 번역을 많이 봤다. 단어 선택이라는 한 끗 차이의 아쉬움 때문에 너무 박한 평가를 받고 있는 것 같다는 생각을 한다.