dlwnsqud***
2019-07-30

이 책은 파이썬을 십분 활용해 필수적인 자료구조와 알고리즘을 두루 살펴본다. 스택, 큐, 연결 리스트 등 추상 데이터 타입과 정렬, 검색, 동적 계획법, 그래프, 트리 등 개발자가 꼭 알아야 할 알고리즘 핵심을 짚는다. 모든 알고리즘은 파이써닉한 코드로 전체를 구현했고 일부 장은 연습문제도 제공한다.
#이 책은 한빛미디어의 '나는 리뷰어다' 이벤트를 통해서 수령한 책입니다. 프로그래밍에 관한 책은 선구안이 생길 정도로 많은 책을 본 것도 아니고, 프로그래밍에 대해서 깊은 이해를 하고 있는 것도 아니라서 기회가 될 때마다 최대한 많은 책을 보려고 노력하고 있습니다. 이런 관점에서, 어느정도 검증된 출판사라고 할 수 있는 한빛미디어에서 출간한 서적을 접해볼 수 있는 '나는 리뷰어다'라는 이벤트가 퍽 유익한 이벤트라고 생각합니다. 관심 있는 분들은 응모해보시길 추천드립니다. 책을 무료로 받았다고 해서 제 서평에 영향을 미치지는 않습니다.
이 책은 제목에도 들어있는 바와 같이 자료구조와 알고리즘에 대한 책입니다. 컴퓨터 과학을 이루는 중요한 축 중 하나인 개념들이라서, 프로그래밍 공부를 하는 입장에서 아주 중요한 개념들이라고 할 수 있습니다. 하지만 중요한 개념들은 대체로 비슷한 특징을 가지고 있습니다. 이는 재미가 없다는 것입니다. 자료구조와 알고리즘도 마찬가지입니다. 분명 중요한 개념이라는 것을 인지하고 있고, 제대로 공부할 경우 큰 도움이 될만한 도구라는 것은 알겠는데, 막상 책을 펼치면 참 재미가 없습니다. 특히 알고리즘을 다룬 책들은 보통 수학 공식처럼 보이는 의사코드(수도코드, Pseudo-code)로 되어 있는 경우가 많아서 책을 읽는 과정 자체가 쉽지 않고, 자료구조는 지루하다는 점이 치명적입니다. 그리고 이 책도 큰 틀에서 보면, 재미가 없었습니다. 다만, 그 중에서는 조금 나았습니다.
책의 소개 중에 이런 문구가 있습니다. '파이써닉한 코딩으로 배우는 핵심 알고리즘'. 책을 읽고 난 후에 느낀 감상도 비슷합니다. 알고리즘 파트나 자료구조 파트가 대부분 설명보다는 파이썬 코드의 분량이 상당합니다. 그래서 지루함이 조금 덜 합니다. 일단 코드는 설명과 달리 짧고 돌려볼 수 있기 때문입니다. 다만 코드 베이스로 쓰여진 책이기 때문에, 그냥 책을 주욱 읽는다고 경험치가 쌓이는 느낌이 들지는 않습니다. 특히 책의 코드에 아주 친절한 주석이 달려있다던지, 설명 파트가 충실한 느낌(분량이 분량인지라)이 드는 편은 아니라서 코드를 직접 보면서 꼭꼭 씹어먹어야 소화가 되고, 내 경험치가 쌓이는 느낌을 받을 수 있을 것 같습니다.
책의 물리적인 사이즈가 작고 각 개념이 연결성을 갖는 것이 아니라 개별적으로 구성되어 있다는 점은 위에서 언급한 특징을 한층 심화시키면서 동시에 유용합니다. 우선 책의 사이즈가 작은 만큼 설명이 충실한 편은 아니라서 소화시키는데 노력이 퍽 요구됩니다. 그리고 각 개념들이 개별적으로 구성되어 있어서 하나를 소화시켰다고 다음 개념의 이해가 쉬워지는 편도 아닙니다. 하지만 다시 생각해보면, 어차피 알고리즘이나 자료구조라는 이름으로 묶인 개념들이 유기적으로 연계되어 하나의 큰 개념을 구성하는 것이 아니라, 카테고리화 해놓은 것에 불과하기 때문에 개별적으로 구성되는 것이 정상이긴 합니다.
이런 특징은 실용적인 면에서 장점이 될 수 있다고 생각합니다. 어차피 각 개념이 연결된 것이 아니기 때문에, 자료구조나 알고리즘이나 읽다가 지루하거나 재미가 없으면 그냥 다음 개념으로 바로바로 넘어가면 됩니다. 저 같은 경우, 그냥 2~3번 읽을 생각을 하고 힘 빼지 않으면서 잡지 보듯이 보다가 관심이 있는 주제에 대한 부분에서 멈춰서 설명 보고 코드 보고, 코드 한번 손코딩으로 써보고 다시 잡지 보듯이 넘기면서 읽었습니다. 그렇게 4번 정도 보니, 막상 크게 힘을 들이지는 않았는데 대부분의 개념을 1회 이상은 본 것 같습니다. 그리고 작은 책의 사이즈는 그냥 주머니에 책을 넣고 다니면서 읽는데 도움이 되었습니다. 앞서 말한 바와 같이 가볍게 잡지 보듯이 본 까닭에 시간을 잡고 한 자리에서 책을 읽은 시간이 얼마 안됩니다. 책을 읽은 대부분의 시간이 잠깐잠깐 시간이 날 때 가볍게 한 두개의 주제를 읽는 식으로 채워졌습니다.
그런데 별거 아니라고 생각한 이런 특징들이 생각보다 별거였습니다. 그동안 자료구조와 알고리즘에 대한 책을 사놓고 중간에 접어버리거나, 스트레스 왕창 받다가 숙제 해치우듯이 1~2시간쯤 잡고 후르륵 넘겨버린 적이 대부분이었는데, 이 책은 '프로그래밍 잡지 보듯이 보자'라는 마음을 먹어서 그런지, 되게 가볍게 스트레스 안받으면서, 각 주제에 나름대로 몰입을 해가면서 책을 볼 수 있었습니다. 이 점이 별거 아닌 것 같은 이 책이 가진 장점이 생각보다 별거가 되게 만들었습니다. 물론 지금도 주요 알고리즘에 대해서 아주 명확하게 설명을 해보라고 하면, '어… 음…' 이라고 할 것 같기는 한데, 대충 이름을 들었을 때, '대충 ~이랬던 것 같은데…'라는 생각이 들긴 합니다. 사실 이렇게 짧은 단상만 떠오르면 필요할 때 그냥 구글링을 해서 찾아보면 되니까 확실히 아예 몰랐을 때보다는 경험치가 쌓였다고 생각합니다. 그리고 코드가 의사코드나 수학적 코드가 아니라 파이썬으로 되어 있어서 큐를 직접 파이썬으로 구현해보라고 하면, 꾸역꾸역 구현을 할 수는 있게 되었습니다. (물론 아름답고 효율적인 파이써닉한 코드일지는 모르겠습니다.)
사실 이 책을 읽으면서 배운 점이 별 것은 아닙니다. 지금도 스택오버플로우나 깃헙에 가면 좋은 코드를 바로바로 만날 수 있습니다. 다만 책을 읽기 전과 후의 차이라면, 예전에는 위와 같은 사이트에서 코드를 봤을 때, '어…' 하면서 겁이 나거나 멍을 때렸다면, 이젠 대충 이런 구성으로 되어 있구나라고 읽을 수는 있게 되었습니다. 사실 큰 변화가 아니라면 아닐 수 있지만, 제 입장에서는 나름 책 한 권 읽은 것치고는 많이 배웠다는 생각이 들어서 참 유익했다고 생각합니다.
추가적으로 사실 이벤트에 참여하면서 더 읽어보고 싶었던 책은 '파이썬 날코딩으로 알고 짜는 딥러닝'이라는 책이었습니다. 유용한 라이브러리를 활용하는 것도 물론 좋지만, 날코딩을 통해 머신러닝/딥러닝의 원리를 습득하는 것도 의미가 있다고 생각했기 때문입니다. 그런데 어쩌다보니 읽게 된 이 책도, '파이썬 날코딩으로 알고 짜는 자료구조와 알고리즘' 정도는 되는 것 같아서 애초에 희망했던 학습 방법은 충족이 된 것 같습니다. 목적으로 했던 대상은 아니지만요. :)