[리뷰] Head First Go
한빛미디어
출판사의"Head First Go(제이 맥가브렌 저 / 권민재 역)"
를 읽고 작성한 리뷰입니다.
Go 언어는 구글에서 개발한 언어로 동시성 지원이 가능하기 때문에 클라우드를 위한 언어로 불리기도 하며, 해커랭크(HackerRank)의 올해 설문조사에서 개발자들 사이에 가장 배우고 싶은 언어 1위
를 차지할 만큼 인기있는 언어이다.
처음 Go를 접했을 때만 해도 구글 내부에서만 쓰이는 듯한 느낌, 독특한 기능들 때문에(마치 무림의 세계로 비유하면 사파 혹은 마교 같은 느낌이다.) 썩 내키지 않았는데 앞서 언급한 인기 순위나 트렌드, 그리고 사용자 비율이 계속 증가세를 보이고 있어 본 도서를 시작으로 학습하기로 결정하였고 그 결과를 본 리뷰로 남긴다.
먼저 본 도서를 통해 배운 Go 언어에 대한 특징을 간단히 요약하면 다음과 같다.
- Go 만의 독특한 (구글스러운?)면이 있다.
- 물론 장점일수도 단점일수도 있다.
현대 프로그래밍 언어론과 부합하지 않는
경우가 많다.- 예를 들면 Class가 없다.
- 많이 듣긴 했지만 정체를 몰랐던
Duck Typing(덕 타이핑)
개념이 존재한다.- 덕분에 Class가 아닌 Struct를 통해 객체 지향을 구현한다.
- 개인적으로 C 언어의 Struct와 함수 포인터를 이용해 OOP를 구현하던 시절이 생각나서 반가웠다.
- 함수형 프로그래밍의 직관성과 효율성이 가미된 것 같은 느낌이 들어 만족스러웠다.
Function과 Method가 공존
한다.ㅋㅋㅋ- 메소드 체이닝, 추상화, Interchangeability(교체가능성)의 개념과 밀접하다.
- 대문자로 시작하면 Function과, 소문자로 시작하면 Method이다.
- 개인적으로 효율적이라 좋았다.
GoRoutine(고루틴)
이라는 비동기 매커니즘을 제공한다.- 메시지 채널을 이용하여 동시성 프로그래밍이 가능하다.
- C 언어 등으로 멀티스레드 프로그램을 개발해 본 사람은 동시성 구현을 위해 프로그래머가 이렇게 할 일이 없다는 것에 적잖이 놀란다.
- 클라우드, 서버 사이드 언어로 인기가 많다.
- 분산시스템에 매우 특화되어 있다.
Docker나 Kubernetes
를 모르는 사람은 있어도 못들어 본 사람은 거의 없을 것이다. 바로 이것들을 만드는 언어이다.
Go 언어 컴파일러
는 Go 언어로 만들었다. (덕분에 컴파일이 빨라 인터프리터 언어처럼 쓸 수 있다.)- C 언어와 문법이 유사하다.
- 개발자가 C 언어를 개발했던 사람 중 한명이다.
- 덕분에
포인터
가 등장한다.ㅋㅋㅋ - 그런데 본인처럼 C언어를 좋아하는 사람들은 쌍수를 들고 환영할 일이기도 하다. (개인적으로 Java의 참조포인터, close() 메소드가 마음에 안 들었는데 어차피 포인터 개념이면서 조작이 불가하여 불편했었다.)
- 예약어(keyword)가 25개 밖에 없어 쉽게 배울 수 있다.
이렇듯 Go 언어는 정말 Go 스럽다. 굉장히 우스꽝스러운 모양새가 많아 배우고 구현하면서도 자주 웃었다. 구글의 개발자 문화가 반영된 것일까? 피식피식 웃으면서도 OOP와 비효율성에 대한 깊은 고민과 철학이 담겨있다는 점에서 감탄하는 계기가 되기도 했다.
본 도서에 대한 소개를 이 즈음에서 마무리 하고 수십년 간 입문서로 유명한 Head First 시리즈
에 대해 소개해 볼까 한다. Head First 시리즈는 입문서로 활용할 경우 최고의 선택으로 손색이 없을 정도의 명작이다.
Head First 시리즈의 독특한 구성에 대해 아는 것은 본 도서의 절반인 구성과 체계를 이해하는 것이기에 장점 및 특징 몇 가지를 소개해보려 한다. 먼저, 아래 그림을 보면 이런 Go 언어와 무관해보이는 두뇌를 정복하는 방법이 나온다.
책을 읽을 때마다 중간 중간 이러한 장치들이 나타나는데 머리말에서 알 수 있듯 머리가 휴식을 취한 것 처럼 환기되기도하고 흥미를 불어넣어 가독성을 높여주는 역할을 한다.
예를 들면 Go언어 대한 Block 설명을 들 수 있는데 순차적으로 이루어진 코드를 그냥 읽어나가다 보면 블록 간 뚜렷한 경계선이 보이지 않은 채 지나가는 경우가 있다. 그럴때마다 아래 그림처럼 핵심 개념을 명확히 해주는 시각화 자료
가 등장하여 쉽고 빠른 이해가 가능하다.
프로그래밍을 한 번이라도 배운 분들이 처음 맞닥뜨리는 장애물 중 하나가 for문의 생소한 구조이다. 우리는 순차적으로 코드를 읽어나가기 마련인데 for문의 동작 방식은 그렇지 않아 매끄러운 이해가 어렵다. 역시 아래 그림과 같이 깔끔한 시각화로 개념을 명확하게 하기 위한 경계선
을 긋는다.
하나의 소스를 완성하기 까지 위에서 열거한 방식처럼 부분의 개념을 쪼개 개념을 명확히 한 후 각 개념간의 관계에 집중할 수 있는 구성
이 마음에 들었다. 단원의 마지막 장에는 아래 그림과 같이 완성된 소스코드를 보여주는데 주석이 앞서 설명한 개념 및 관계를 상기
시켜주므로 완벽한 이해를 돕는다.
마지막으로 고루틴을 예로 들어보자. 멀티스레드 프로그래밍을 전혀 접하지 않은 분들은 동시성 처리가 매우 생소하고 어렵게 느껴질 것이다. 미리 접한 이로써 말씀드리자면 동시성 처리가 어려운 이유는 프로그래머가 메모리의 상황을 머리속에서 그려가며 세마포어, 뮤텍스 등을 활용해 각 병렬 모듈을 일일이 제어해야 하기 때문이다.
Go 언어는 그런 세부적인 부분을 알아서 처리하기 때문에 매우 편리하지만 물론 프로그래머가 처리해야 하는 부분도 있다. 순서 등의 제어를 위해 채널을 활용해야 하는 것이다. 아래 그림은 동시성의 개념을 직관적으로 이해
하는데 있어 큰 도움을 준다.
실행 시마다 순서가 뒤죽박죽으로 실행되는 3가지 예시를 통해 동시성의 특성을 직관적으로 이해할 수 있으며 채널
의 필요성 또한 바로 이해가 가능하다. 아래 코드 자석 그림은 처음부터 프로그래밍을 짜는 막막함을 크게 덜어주며, 코드 자석 퀴즈를 풀고 직접 코딩을 해보면 얼마나 쉬운지 느낄 수 있다
. 머리속에서 개념간의 연결 그물이 느껴질 것이다.
Go 언어 초보자라면 혹은 프로그래밍에 대해 아무것도 모른다면 이 책을 첫 단추로 삼으면 절대 후회하지 않을 듯 하다. Go의 재미와 Head First의 재미를 둘 다 느낄 수 있기 때문이다.