디자인 패턴은 일상적인 코딩 문제들의 해법을 일반화한 코딩 노하우의 모음입니다. 프로그래머라면 절대 놓쳐서는 안될 지식입니다. 프로그래머로서 역량을 키우는데 디자인 패턴만큼 배우기 쉬우면서도 효과가 큰 지식은 대단히 드뭅니다.
당연하게도 코딩 문제의 해법은 사용하는 프로그래밍 언어의 특성에 큰 영향을 받습니다. C++는 난해하기로 악명이 높고 오랜 기간 정체되어 있었습니다. 하지만 C++11 표준을 시작으로 "모던 C++"라는 애칭을 부여받으며 잠에서 깨어나고 있습니다. 모던 C++는 C++만이 제공하는 끝판왕급 최적화 기능과 하드웨어 제어 자유도를 고스란히 간직하고 있습니다. 여기에 부러워하며 쳐다보기만 했던 신생 언어들의 멋진 기능들을 품으며 새롭게 태어났습니다.
디자인 패턴을 모던 C++ 버전으로 누가 좀 정리해줬으면 좋겠다는 생각을 하던 차에 이 책을 만났습니다. 딱 생각하던 바로 그 책이었습니다.
이 책은 최신 C++ 표준은 물론 아직 표준화가 진행 중인 따끈따끈한 기능까지 활용하고 있습니다. 모던 C++의 새로운 기능들로 인해 코드가 얼마나 간결하고 아름다워질 수 있는지 보여줍니다. 뿐만 아니라 전통적인 디자인 패턴에 대한 비판과 대안도 제시하고 있으며 함수형 언어에서 활용되는 모나드 개념까지 소개하고 있습니다.
모니터 바로 옆에 두고 애용될 책이라 믿어 의심치 않습니다.
스레드, 뮤텍스, 락… 프로그래밍 분야에서 일한 지 십 년이 넘었지만 병렬 프로그래밍은 여전히 까다롭고 어렵습니다. 자칫하면 데드락에 빠지거나 의도한대로 동작하지 않는데, 문제를 발견하는 것도 어렵고 발견하더라도 해결책이 쉽게 나오지 않을 때가 많습니다.
병렬 프로그래밍을 처음 접할 때는 단순히 스레드 라이브러리를 사용하는 것 정도로 대수롭지 않게 생각하기 쉽지만, 아주 근원적인 차이가 있습니다. 비유를 하자면 사람 한 명이 자기 할 일을 계획하는 것과 수 명 이상의 팀원으로 할 일을 계획하는 것의 차이입니다. 혼자 하는 일이야 내가 모든 걸 꽉 쥐고 있고, 내가 나를 잘 아니 내 일정만 챙기면 되지만, 여러 사람이 팀워크를 발휘하게 하려면 각 팀원의 성향은 물론 누가 누구와 장단이 맞는지도 알아야 하고 일들이 서로 원활하게 연계될 수 있게 팀원별 역할과 일정을 세심하게 계획해야 합니다. 선형 프로그래밍과 병렬 프로그래밍은 딱 이 정도의 차이가 있습니다.
저를 포함해서 주변의 여러 개발자가 "어디 속 시원하게 알려주는 자료가 없나?" 찾아보았지만 단편적인 API 사용법 설명에서 크게 벗어나지 않는 자료가 대부분이었습니다. 병렬 프로그래밍을 제대로 하려면 광범위하면서도 심도 있는 지식이 필요합니다. 저수준 하드웨어에서 스레드를 어떻게 지원하는지, 메모리 접근이 어떤 영향을 미치는지도 알아야 하고, 고수준의 병렬 작업 설계 방법도 알아야 합니다. CPU 인스트럭션에서부터 소프트웨어 아키텍처까지 전체 스택에 대한 지식이 필요한데, 적합한 교과 과정을 거칠 기회가 없었거나 실무에 바쁜 개발자가 스스로 공부하기는 참으로 어려운 일입니다.
이 책은 그러한 점에서 유일무이합니다. 오라클의 베테랑 개발자인 저자는 아주 광범위한 내용을 일맥상통하는 줄거리로 차근차근 설명해주고 있습니다. 병렬 소프트웨어가 있을 수 있는 하드웨어 기반이 무엇이고 그 특성이 어떠한지부터 시작해서 병렬 소프트웨어를 설계하고 구현 방법과 그때 빠지기 쉬운 함정까지 다루고 있습니다.
꼭 병렬 프로그래밍을 하고자 하는 개발자가 아니더라도 이 책을 통해 컴퓨팅 시스템 전반에 대한 이해를 한 단계 크게 발전시킬 수 있으리라 생각합니다. _2012. 6. 30 권오인