8delp***
2022-03-31

개발 숙련도와는 상관없이 누구나 Go 언어 개발자처럼 생각할 수 있다. 더 나아가 경험이 풍부한 Go 개발자들이 채용한 디자인 패턴과 선택한 이유를 소개한다. Go 언어를 이용해 명확하고 관용적으로 개발할 수 있도록 기초 지식을 전달하는 실용적인 가이드다.
■ 관용성, 확장성 있는 웹 서비스를 만들기 위한 Go 언어의 친절한 안내서
본 책은 웹 서비스 개발 분야에서 도입이 늘어나고 있고 구글이 개발한 프로그래밍 언어인 Go 학습을 위한 책이다. Go는 2010년 대에 태어난 비교적 최근에 개발된 프로그래밍 언어이다. 요즘 엄청난 인기와 함께 웹 개발, 통계, 머신러닝, 수학 계산 등 다방면에서 사용되는 파이썬 조차 태어난지 30년이나 되는 젊지 않은(?) 언어인 것을 보면 Go가 얼마나 최근의 기술 변화와 요구사항을 반영하여 빠른 속도로 발전해왔는가를 알 수 있다(최신 멀티코어 아키텍처를 제대로 활용할 수 있도록 고안되었다고 한다.).
이 책의 대상 독자는 다소 넓은 편이다. 그렇다고 해서 결코 내용의 수준을 만만하게도 볼 수 없다. Go에 입문하는 사람에게는 Go 프로그래밍을 위한 탄탄한 기초를, Go를 잘 알고 익숙한 개발자에게는 기존과 다른 방식이 있다는 것과 세부적으로 알아두면 좋을 것들을 알려준다. 그렇기 때문에 Go 언어에 관심이 있는 사람에게는 도전해도 좋을 만한 책이라고 생각한다. 저자에 의하면 2번째 언어를 찾고 있는 사람에게도 도움이 될 것이라고 한다.
내가 이 책을 Go 언어를 공부하기에 적합하다고 생각하는 이유는 다른 고전 프로그래밍 언어를 위한 책들만큼이나 두껍지는 않으면서 Go 개발자가 개발하는 방식으로 Go를 배울 수 있도록 구성되었기 때문이다. 그래서 표지 부제에 표기된 것과 같이 'Go 개발자처럼 생각하는 방법'으로 프로그래밍 할 수 있도록 도와준다.
평소 업무상 스크립트 언어를 주로 사용하는 본인으로서는 처음에 이책을 가지고 실습을 시작했는데 보통의 스크립트 언어와 매우 다른 방식으로 문법이 쓰여져있어서 진도를 빨리 뺄 수는 없었다. 어떤 부분에서는 마치 암호문을 보는 것 같은 느낌이었다. 또, 패턴 매칭이 없다는 사실도 매우 놀랐다. 어쨌든 하나씩 천천히 따라하다보니 나의 주 언어와 다른 방식으로 동작하는 것이 신기하고 호기심이 생겨서 점점 Go에 대한 매력을 느끼게 되었다.
이 책의 독특한 특징은 일반적인 프로그래밍 안내서와 유사한 방식으로 목차는 구성되어 있는데 각 장별 Go에 대한 설명을 전개하는 방식이 매우 달랐다. 다른 입문서에서는 문법을 위주로 각 키워드별로 예제 코드가 담겨있는데 이 책은 프로그래밍의 동작방식을 설명하면서 정형적이지는 않은 방식으로, 즉 짤막짤막한 예제와 왜 이렇게 해야하는지, Go가 다른 프로그래밍에서와 다른 점은 무엇인지, 어떤 방식으로 써야 가장 효율적인지를 알 수 있도록 알게 해주는 방향으로 전개가 된다. 그래서 다른 책들은 중간 중간에 사례를 곁들여 예제 코드를 페이지 단위로 할애하거나, 짧은 예제가 단계적으로 부분부분마다 더해져 마지막에 코드가 완성되는 방식으로 설명하는 곳들이 많은데 여기서는 그렇지 않다. 짧은 호흡으로 설명 흐름을 가져가고 구체적 사례라기 보다는 단락 정도로 코드가 등장하여 어떤 식으로 동작하고 왜 그럴 수 밖에 없는지를 이해시키는 데에 주안점을 둔 듯하다.
그렇기 때문에 공부해나가는 과정이 다소 지루해보일 수도 있다. 현재 Go에서 네트워크 구현을 주제로 한 학습서가 시중에 나와 있는데 바로 그러한 구체적인 사례나 분야로 들어가기 전에 Go의 이해도를 높이고자 한 것으로 느꼈다. 그래서 원 저자가 이 책의 이름을 원래 'Boring Go(지루한 Go)'라고 지으려 했다는데 그 말이 이해가 되었다.
유용했던 부분을 꼽자면 '포인터', '동시성', '테스트 방법'을 다룬 챕터들이 있겠다. 공포의 포인터와 동시성은 꼭 넘어야 할 산이라고 느껴졌다. Go의 동시성 부분을 설명하는 곳에서는 아주 오래전에 '운영체제'를 공부했던 것이 많은 도움이 되었다. 동시성을 제어하여 Deadlock을 막고 빠른 시간 내에 효율적으로 프로그래밍 하는 방법을 설명했는데 여기서 '고루틴', '채널', 'select문(SQL과 관련 없음)' 등의 개념을 새로이 알게 되었다. '동시성'은 '병렬성'이지 않다는 것과 동시성이 항상 빠른 것은 아니고 빠름에 대한 판단은 벤치마킹을 통해서 해야된다라는 구절들이 가장 인상적이었다. 그리고 근래에 들어 TDD, 테스트 주도의 방법론이 강조되고 있는데 테스트를 위해 Go의 고유 테스팅 프레임워크를 소개하여 설명한 점 또한 좋았다.