読書感想文「プログラミング言語Go」2021年でも通用する、情報がギュッと詰まった翻訳のGo入門書

リチャード 伊真岡 blog

読書感想文「プログラミング言語Go」2021年でも通用する、情報がギュッと詰まった翻訳のGo入門書

この記事は書籍「プログラミング言語 Go」の紹介記事です。

私の Go 言語の利用頻度は、仕事でバリバリ書いているわけではありませんが、同僚の書いた Go コードを読むことはよくあり、個人開発では半年ほど日常的に書いている程度です。そんなレベルのエンジニアのが書いたレビューとして、本書を買うかどうかの参考になれば嬉しいです。

本書のおすすめポイント

  • 柴田 芳樹さんの翻訳がよい、原著のギュッと情報量の詰まった文章を活かしている
  • Go がわからなくなったとき、いつでも関連する章を読み返せば、ネット記事を探すより時間の節約になる
  • 2021 年現在でも本書の内容は通用するものばかり

本書に何を期待するか?

2009 年の誕生を経て、近年では日本のソフトウェア開発の現場でも Go はすっかり定着した感があります。そのため、別の言語を使いこなしてきたエンジニアが、

  • 「新しい担当プロジェクトが Go で書かれている。今から勉強しないと。」
  • 「Go は自分が使ってきた言語と違うから、Go らしい書き方を学びたい。」

という状況になることは珍しくないでしょう。つまり第 2、第 3 のプログラミング言語として、Go を自分のスキルセットに加える状況です。

他のプログラミング言語にある程度精通している人は、A Tour of GoGo By Exampleを軽く試して、感触をつかもうとすることが多いと思います。書籍「プログラミング言語 Go」は、その次のステップとして Go 言語をより深く理解するのに最適な本で、「Go で書かれたプログラムはどういう仕組みで動くのか?」「Go らしい書き方とはどんなものだろう?」といった質問に答えてくれます。

本書に何を期待してはいけないか?

本書を読んだだけで、Go の実用的なアプリケーションがすぐに書けるわけではありません。本書は実用的なアプリケーションを作りながら学ぶのではなく、Go の言語機能、Go らしい書き方とその背景を解説することに注力しているからです。

もしあなたが Go で Web API サーバーを作りたいとします。本書では http パッケージの使い方や Reader/Writer インターフェースについては紹介されていますが、以下のような疑問には答えてくれません。

  • 買い物かごなど典型的な Web API サーバーのユースケースを実現するには?
  • アプリケーション特有の事情に合わせたディレクトリ、モジュール構成をどうするか?
  • REST などの API 設計原則に従うにはどうすればよいか?

実用的なアプリケーションを作り上げながら Go を学びたい人は、別の書籍をあたるべきです。

また、完全なプログラミング初心者にもおすすめしません。ポインタの話が出てくるなど、プログラミングにある程度馴染みがある人でないと、読みすすめるのに苦労する部分があります。一方で、ある程度の経験者であれば、細かい部分までムダのない記述で明快に説明してくれる本書は、読みやすいと感じるでしょう。

本書のいいところはどこか?より詳細を紹介

本書は英語原著のもつムダのない記述の良さ、何度も推敲して同じ情報量を伝えつつ文章量を削ったであろう表現を、日本語版でも損なうこと無く受け継いでいます。訳者である柴田 芳樹さんのもつ、長年のソフトウェア開発者としての経験、多数の技術書の訳者として活躍された経験が存分に発揮されてるのでしょう。

情報がギュッと詰まった文章が続くにも関わらず、400 ページを超えるボリュームがあるので、全てを読み通すにはかなり時間がかかります。訳者である柴田さん自身が、一年近くにも及ぶ読書会を続けていらっしゃるほどです。じっくり時間をかけて学びたい人は、最初から最後まで読み通してもいいですが、短時間で Go のコードを読み解かなくてはならない忙しいエンジニアは、目の前の課題に関する部分だけを読み、それを繰り返せばストレス無く Go の実力を伸ばせます。

例えば「Go の interface と struct を組み合わせて使う書き方がわからない」という場合は、第 4 章コンポジット型の struct に関する部分と第 7 章インタフェースを読み、「goroutine のコードが読めない」という場合は、第 8 章ごルーチンとチャネルを読む、といった具合です。

私も全部を読んではいませんが、比較的 Go 歴の浅い人に参考になりそうな部分を紹介します。まずは 4 章のうち、可変長配列のように使う slice を解説した箇所です。Go では配列をそのまま使うことは少なく、slice を通して使う事が多いのですが、4 章では append 関数との組み合わせなどの頻出例に加え、slice の内部構造やメモリの使い方も解説しているので、今後見たことのない slice 利用のテクニックに遭遇しても、対応しやすい知識を得られます。

第 5 章エラーも Go 入門者必読と言えます。Go のエラー処理パターンは入門者たちの間でたびたび話題になるのですが、本書ではただ書き方のパターンを伝えるだけで終わらず、「エラーメッセージは頻繁に連鎖するため、メッセージの文字列は大文字にすべきではありませんし、改行は避けるべきです」などと、細かな利用の手引や理由も含め 5 ページ程に渡って説明してくれるので、5 章を読めば Go のエラー処理パターンを自信を持って使いこなせることでしょう。

また 5 章には defer の紹介があり、これも Go 必須のテクニックです。他の言語では個別のライブラリが定義する、XxxDatabaseResource クラスなどのリソース開放ルールをひとつひとつ学ばなければならないところ、Go ではその必要がありません。「みんなが慣れている defer イディオムでリソース開放手段を提供する」という慣習があるため、馴染みのあるコードの記述パターンが良く出てくることになります。

7 章インターフェースは、Go で Web API サーバーなどを書く際に欠かせない、io.Writer、io.Reader インターフェースに加え、 bytes.Buffer 型や[]bytes と string の相互利用などが載っているので、7 章を読みこなせば多くの Go の Web アプリケーションのコードを読み解くのが、非常にスムーズになることでしょう。

8 章ゴルーチンとチャネル、9 章共有された変数による並行性の 2 つは、並行処理が大好きな私が個人的に最もおすすめしたい章です。Go を使いたくなる理由の筆頭には並行処理の記述のしやすさが挙げられ、これを解説した「Go 言語による並行処理」という別の書籍があります。

そちらも非常に優れた本であるものの、本書に比べるとやや要求される「Go の基礎知識レベル」「並行処理の基礎知識レベル」が高く、また口語的な表現や話の脱線が見られます。本書「プログラミング言語 Go」の方がムダなくギュッと情報量が詰まっていて、それでいて読みやすい表現になっています。そこで、本書第 8 章と 9 章を読んだ上で、「Go 言語による並行処理」に進めば、Go の並行処理を何段階も上のレベルで使いこなせます。

本書を読んだ先で学ぶとよいもの

2015 年に原著が出版された本書で紹介されるのは、2021 年の今でも通用する確立された Go 言語の基本ばかりです。本書から得た知識が役に立たなくなる心配はほとんどありませんが、本書だけでは足りない部分、別の書籍や最新のブログ記事などで補足が必要なものもあります。

例えば Go の並行処理では必須といってもいい context.Context ですが、本書では紹介されていません。その代わり、先ほど紹介した別書籍「Go 言語による並行処理」やGo の公式ブログやなどで学べます。

Go 公式のブログは context.Context に限らず、非常に優れた記事が多いのですが、ブログだけを読んで理解するには背景知識のハードルが高いものもあります。そんな時に本書を副読本として利用すれば、Go らしい書き方が身につき、その技術的背景までしっかり理解できます。公式ブログを始めとした断片的な知識を自分でつなぎ合わせ、一人前の Go プログラマへと近づく道がひらけます。

他に比較的大きな部分としては、Go のモジュール・システムの最新の内容を取り込んではいないので、こちらも Go 公式ブログなどで知識を補いましょう。

Go のおすすめ本としては、他にも以下のようなものがありますが、本書で得た知識があればどれも読みこなしやすいでしょう。反対に、読みづらい書籍があればいつでも本書に戻ってきて、関連部分を読み返して見てください。

本書は Go プログラミング入門者にとって、普段の開発で助けてくれるだけでなく、システム・プログラミングなど、あるいは Docker、Kubernetes といったクラウド・ネイティブ系 OSS の実装の読解といった、幅広い Go プログラミングの世界へと飛び込む基礎力を与えてくれる一冊だと思います。