-
-
전문가를 위한 C - 동시성, OOP부터 최신 C, 고급 기능까지! 극한의 C를 마주하려는 여행자를 위한 가이드북
캄란 아미니 지음, 박지윤 옮김 / 한빛미디어 / 2022년 10월
평점 :

프로그래밍 책들을 보면, 많은 책들이 입문자 또는 초보자를 위한 책들이 많다보니, 특정 언어에 어느 정도 익숙해 진 중급자 이상에게 맞는 책들을 쉽게 찾기는 어렵다. 특히 C 언어는 나온지 40년이 넘었었지만 여전히 많이 사용되고 있다. 하지만 깊이 있는 내용들은 여러 분야의 내용들에 내용들이 흩어져 있어 하나의 C 책에 내용들이 집약된 책을 찾아보기는 어렵다. 그래서 “전문가 위한 C”를 보았을 때, 이 책은 어떨까 하는 기대를 가지고 책을 읽기 시작했다.
우선 책 목차를 먼저 보았을 때, 웬지 시스템 프로그래밍과 유사하지만 또 좀 다른 구성으로 되어 있어 어디부터 먼저 읽어볼까 하는 감이 서지 않아 처음부터 정독을 해 나갔다. 책을 다 읽고 나서(900페이지가 넘는 전문 서적을 다 읽어내는 게 쉽지 않았다) 이 책에 대해서 생각이 드는 건 다양한 주제들을 조금씩이나마 하나씩 건드려보는 책 같은 느낌이었다. 그러다보니 책을 읽는 분들의 대상이 좀 애매하다는 느낌이 든다. 책의 내용이 C 언어를 전혀 모르고서는 읽을 수 없는 책이면서, 또 여러 분야를 어느 정도 접해본 독자에게는 한번쯤은 접했을 법한 내용들로 이루어져 있어, 어떤 독자가 대상인지 잘 모르겠다는 것이 솔직한 심정이다.
그렇다고 이 책의 내용이 안 좋거나 번역 수준이 나쁘다는 의미는 아니다. 책을 읽어보면 알겠지만 책의 저자는 다양한 분야에서 많은 경험을 하였다는 느낌이 들었드며, 책 번역 역시 읽는 데 부자연스러운 부분을 찾기 힘들정도로 잘 되어 있다.
C 언어를 처음 배울 때 멋모르고 hello world 부터 출력하면서 감을 익혀나가면서 하나 하나 더 많은 내용을 배운 것처럼 이 책의 내용도 그런 식으로 설명이 되어 있어 꼼꼼히 책을 읽어나가면, 충분히 이해할 수 있도록 설명이 차근차근 되어 있다. 하지만 다양한 내용이 있다보니, 이게 나에게 필요한 건가? 이게 실제 업무에 사용될까? 하는 생각을 책을 읽으면서 하게 된다는 점이다.
우선 책을 읽으면서 좋았다고 생각하는 부분부터 작성해 보겠다. 이 책에서 저자가 설명하는 내용에 대한 예제나 유틸리티는 챕터마다 조금씩 다르지만 유닉스 기반 환경에서 테스트를 해 볼 수 있도록 되어 있는데, 대부분의 개인 개발자가 요즘 쉽게 접할 수 있는 Linux 환경과 MacOS 환경에서 시험할 수 있도록 되어 있다. 직접 Typing을 해 볼 수도 있겠지만, 저자가 이미 github에 올려둔 예제를 다운로드 받아, cmake와 make를 가지고 컴파일해 쉽게 결과를 체크해 볼 수 있다. 보통 특정 환경 하나만을 가정하여 설명을 하지만, 서로 다른 두 시스템에서 동일하게 동작하는 부분, 서로 다르게 동작하는 부분을 각각 설명하고 있는 부분은 이 책의 장점이라는 생각이 든다. 물론 이 때문에 책이 좀 두꺼운 것은 책의 단점? 이라고 생각을 해야할 지 모르겠지만… ^^
특히 책의 앞쪽에서는 OS간 유틸리티의 차이점, 파일 포맷의 차이점 등에서 차이를 보여주는 부분들이 있지만, 책의 중 후반부에 다다르면 library(예: pthread) 에서 지원하는 기능 유무가 달라져, OS 별로 다르게 동작할 수 있는 부분에 대해 직접 코드를 구현해서 설명을 하고 있어, MacOS 환경에서 이 책을 시험해 보는 독자에 대한 배려도 눈에 띈다.


또 책의 처음 시작부터 전처리 과정, compile 단계 및 link 처리 과정에 대한 내용을 단계 별로 설명해 둔 부분이 있어, 단순히 언어를 배우고 이용하는 단계에서 잘 들여다볼 일이 없는 부분에 대해서도 다루고 있어, 언어에 대해 조금 더 깊은 이해를 할 수 있다는 점이 마음에 들었다. 단 해당 부분의 내용이 좀 더 깊었으면 했지만 그렇지 못한 부분이 아쉽기는 하다.
다른 책에서 찾아보기 힘든 부분 중 하나로 책 후반부에 있는 “다른 언어와의 통합” 부분은 개발자가 C로 모든 프로젝트를 진행하거나 C로 기술된 라이브러리만 사용하는 경우가 아니라면 한번쯤은 마주치는 이슈이다. 특히나 C++과의 통합은 생각보다 많이 이루어진다. 경험이 없는 경우, 컴파일 단계를 넘어가더라도 link 시 문제가 많이 발생하고 또 디버깅 시 C++의 맹글링 특성으로 인해 애를 먹는 경우도 자주 발생하게 된다. 그래서 이러한 일을 해야하는 개발자들에게 많은 도움이 되는 부분인데, C++말고도 다른 언어를 다루어주는 부분이 사실 더 반갑게 여겨졌다. Java나 Python 그리고 Go와 같은 C나 C++의 통합보다 더 많은 작업을 해야하는 언어들에 대해서 쉬운 tutorial 형식으로 내용을 알려주기 때문에 이를 응용해 더 복잡한 내용도 응용할 수 있어 업무에도 도움이 될 것이라 생각한다.
많은 내용은 아니지만 꼭 필요한 유닛 테스트와 많이 사용되는 일부 framework을 이용한 예제는 개발 시 사용해보지 않은 분들에게는 좋은 도입부가 될 수 있을 것이라 생각한다. 이 책을 읽는 분들의 실력이라면 이미 다 사용하고 계시겠지만, 만약 그렇지 않은 분들이라면 많은 도움이 될 것이라 생각된다. 이 책에서는 분량이 너무 적게 나와있기 때문에 필요시 책에서 소개한 framework site를 참고하면 더 많은 내용을 익힐 수 있을 것이라 생각한다.
책 마지막에 단순한 부록이 아닌 빌드시스템이 한 챕터로 할당되어 기술되어 있는 부분도 이 책의 장점이라 생각한다 특히 make나 cmake 뿐만이 아닌 ninja나 Bazel도 간단하지만 사용법이 기술되어 있어, 필요한 분들이 쉽게 접근하기에 알맞을 것으로 생각된다.
다음은 개인적으로 아쉽다고 생각한 부분을 한 두가지 뽑아본 것으로 이 부분은 책을 읽으신 분들에 따라 생각이 다를 수 있을 것 같다.
1. OOS
C와 같은 절차적 언어를 이용해 OOP에 대해 다루는 부분은 다른 책들에서는 많이 다루지 않는 부분이라 신선한 부분이라 생각했다. OOP가 가지는 개념적인 부분을 구현하면서 개념을 C를 이용해 구현을 하고, 이를 눈으로 확인함으로써 어떻게 동작하는지 확인을 하는 것은 한번쯤은 배워볼만한 내용이라고 생각이 든다. 하지만 실제 C로 코딩 시 이렇게 사용을 하게 될까? 라는 생각이 관련 챕터를 읽는 동안 든 생각이다. 현재 C로만 코딩을 해야하는 시스템에서는 유용할 수도 있겠지만, 반드시 그런 제약이 아니라면, 굳이 C++을 두고 힘들게 C로 코딩하지는 않을 것 같다. 단순히 이렇게 동작하는구나 정도만 보고 넘어가면 될 것 같다는 생각이 드는 부분인데 생각보다 많은 챕터를 할애할 필요가 있었을까? 하는 생각이 들었다.
2. 유닉스
리눅스 시스템 프로그래밍 관련 서적들이나 특정 분야에 대해 작성된 책들이 가지고 있는 깊이 있는 주제들과 중복되는 내용이다. 유닉스 시스템의 역사와 C 언어가 무관하지 않으니 이 내용을 다루고 있기는 하지만 굳이 여기서 다루어야 했을까? 라는 생각이 계속 들었다. CPU protection ring, syscall 작성 및 커널 빌드, 커널의 아키텍쳐 구분, kernel module 작성 등은 C 언어 책 보다는 OS 책 특히나 Linux OS 책에서 다루어야 할 부분이라고 생각한다.
가능한한 많은 내용을 독자에게 전달하려고 쓰여진 이 방대한 책에 대해 개인적으로 생각하는 장점 및 단점을 기술했지만, 이 책은 C언어로 많은 내용을 경험해 보지 못한 분들은 반드시 한 번은 읽어볼 내용이라 생각이 든다. 이 책을 읽고나서 정말로 Extream한 내용을 살펴보기 원하는 독자라면 개인적으로 국내서에만 매달리지 말고 해외 원서도 찾아보는 것을 추천하고 싶다.
리뷰 초반에도 언급했지만, 전에는 이러한 책이 별로 없다보니, 각 분야별로 책을 각각 여러 권 사서 읽어야 했고, 그러면서도 설명이 부족한 부분에 많은 시간을 할애해야했지만, 이 책은 그러한 간격을 줄여주는 역할을 충분히 할 수 있다고 생각한다.
본 리뷰는 한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.