오랜만에 자료구조 책을 본 것 같다. 다 보는데 풀타임으로 잡으면 20시간 정도 걸린듯 하다. C로 쓰여지긴 했지만 왠지모르게 책이 소설읽듯이 술술 읽혀나갔다. 아 나도 확실히 자료구조에 대한 감각이 쌓이긴 했구나.
일단 C로 쓰여있으니 대학시절 느낌이 났다. 자구는 학부 2학년때 배웠는데 난 1학년 마치고 5년이나 휴학을 해서 ㅎㅎ 2012년에서야 다시 복학을 했으니 8년밖에(?) 안됬다. 그때는 한국에서 교재로 아주아주 많이 쓰이는 Horowitz 의 책으로 했는데 그때야 영어 읽는 실력이 지금의 1/100도 안될테니 원서가 읽힌다는건 말도 안되고.. 그래서 그 책을 미국에까지 가져왔는데 이제서야 좀 읽힌다. (이건 차차 읽도록 하고.. )
일단 열혈강의 시리즈는 컴공의 대학 자습서로 많이 쓰인다. 열혈강의 C라던가 자료구조라던가.. 아니 딱 두개밖에 없던가? 내 기억엔 C++ Prime도 유명했고, 알고리즘은 C로쓴 알고리즘도 유명했던것 같은데. 저 책을 봤던게 벌써 20년 전이다. 당연히 이해는 커녕 관심도 별로 없었다. 지금와서 생각해보면 난 C언어를 그리 좋아하지 않았던 것 같다. MFC 나 Win32 API가 제공하는 각종 라이브러리 가져다 써서 윈도우 앱 만드는거 다 좋았는데 단순 어플리케이션보다는 웹개발이 좋아서 자바로 넘어왔고, 지금은 자바, 자바스크립트, 스칼라, 파이선 정도가 주된 언어가 된 것 같다.
좌우간 이 책을 보면서 느꼈다. 일단 잘 쓰여지긴 했다. 내가 만약 블로그에 관련 자료구조에 대한 것을 쓰더라도 이렇게 쓸 것 같다. 설명을 조금은 올드하지만 워낙 오래된 책이니 그려려니 하고, 코드 스타일은 C의 전형적인 스타일. 깔끔하긴 하다. 설명은 초-중급 정도의 난이도로 독자를 바라보고 설명하는 스타일이라 딱히 증명같은건 없지만 그래도 기본적인 Big-O정도는 알려주고 유도하는 방식을 설명해준다. Interpolation Search같은 경우는 개인적으로 별로 생각도 안해봤는데 쉽고 자세하게 설명해줘서 처음으로 이해하고 넘어갔다.
사실 자료구조라는게 크게보면 배열, 스택, 큐, 리스트, 트리, 해시 정도가 아닐까. 여기서 백터나 힙 등이 확장되고 그래프도 이런 자료구조를 통해 만드는 하나의 확장형 구조이고. 그런 면에서 이책에서는 두루 다뤄준 것 같긴 하다. 그래서 일차적으로 이 책을 보면서 아 그래도 조금은 자료구조의 high level에 대해서는 이해를 했구나 싶더라.
그런데 이 책을 보니 솔직히 좀 흔쾌히 자료구조에 대해서 충분히 내가 습득했는지는 모르겠다. Horowitz의 책과 비교하면 안되겠지만, 여러 응용사례가 빠져있는게 조금 아쉽다. 하기사 독자 레벨상 굳이 넣을 필요는 없겠지만, 이로써 나는 왜 좀 더 깊이있는 자료구조를 습득해야 하는지 이유를 알 것 같은 느낌이 들었다 ㅎㅎㅎ
사실 예전부터 STL부터 해서 C#, Java, Python등 왠만한 언어에는 수 많은 자료구조가 들어가 있어서 우리가 구현할 필요는 없겠지만 적어도 내부적으로 어떻게 돌아가는지 알아야지 적정 장소에 써먹을 수 있다는 게 이제서야 이해갔다. 하.. 개발을 시작한지 십수년이 지났건만, 난 아직도 배열, 리스트, 맵 이게 거의 전부이다. ES6나 Java Stream API, 스칼라 같은데에 보면 filter, map, sort, flatten등 자료 처리용 유틸이 워낙 많아서 그냥 그런거 써서 자료를 이리저리 핸들링 하곤 했는데, 딱히 internally하게 들여다 볼 생각은 정말 ‘전혀’ 안했던 것 같다.
아마추어지만 수학을 조금(2년정도) 배우고, 여러 증명법을 알게 되니 자료구조에 쓰인 그 방법들에 대해 ‘증명’이 보이더라. 사실 Horowitz책이 그렇게 쓰여있다. 그래서 난 왠지모르게 배워야 할 필요성을 느꼈다. 어차피 언어는 지금 이상으로 가져가고 싶지도 않다. Java, Scala, Python, JS.. 이것도 사실 많지만 먹고 살려면(?) 가져야 하는 최소한의 스킬이긴 하다. 그리고 솔직히 지금까지 자료구조 자체도 이해하지 못하고 개발했다면, 내 손을 거쳐간 수 많은 프로그램들이 하나같이 다 성능 자체가 전혀 보장되지 않고 시중에 돌아다니면서 나오는 퍼포먼스는 결국 내 이름만 망가뜨리는게 아닐까.
하지만 한편으로는 지금같은 클라우드 시대에 성능이란게 굳이 보장이 되어야 하는지에 대한 의문도 들긴 했다. 근데 그건 과거의 얘기고, 지금 생가해보면 성능 최적화는 곧 돈과 직결된다. 고객을 만족시키고, pay-as-you-go 인 클라우드 시스템 상 최적의 성능을 내는게 곧 비용절감으로 이어진다. 이건 내 욕심일까? 사실 최적화 생각하면 그냥 C사용하거나 뭐 어셈블리.. 이런거 써서 개발을 하면 될텐데. 그래도 내 생각에는 소프트웨어란 것은 보이지 않는 것을 만드는데 무수히 많은 재료들을 사용해서 만들고, 그 재료들이 정말 성능이 검증되어 있다면 그걸가지고 만드는 것은 최소한의 성능은 보장할 것이라고 본다. 게다가 자료구조는 수학적으로도 그 진가가 보장되어 있으면, 나중에는 내가 개발한 프로그램에 대한 성능 최적화에서 어떤 부분이 bottleneck인지 쉽게 추정할 수 있을 것 같다.
==
번외로, 이 책을 보면서 다시금 개발에 대한 욕심(?)을 찾기에는 충분했다. 응용하고 싶다 내지는 더 확장된 것을 배우고싶다는 생각이 여러모로 들었다. 대규모 서비스와 데이터 엔지니어링에 관심이 있는 나로써는 한걸음씩 차근차근 나아가는게 중요하다고 본다. 그래서 내가 생각한 다음 단계는 일단 Horowitz의 자료구조 책이고, 더불어서 하다가 포기했던 MIT Algorithms이다. 이것만 해도 올해가 다 갈것 같은 느낌이 엄청나게 들지만.. 그래도 2년전에 했을때랑 비교해보면 재미는 있다!! mid-senior레벨에서 쉬어가는 지금, 난 더 기초를 가다듬을 필요가 있으니깐. 아직도 나는, 많이 부족한가보다.