「プログラミング言語Go」 書評
お久しぶりです、kuwana-kbです。
この10日間ほど、ずっと「プログラミング言語Go」という本を読んでいました。 これまで読んできた技術書の中では一番が時間をかけたと思います。 そしてそれだけの価値がある本でした。 例のごとく書評を記していきたいと思います。
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者: Alan A.A. Donovan,Brian W. Kernighan,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2016/06/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
ざっくりと3行でいうと
- Goの仕様をより深く理解できる本
- Goのベタープラクティスについて触れらている
- 練習問題が難しい…けどためになる
この本の紹介
この本は、Goの言語仕様について書かれた解説書です。 著者はGoチームのメンバーである Alan A.A. Donovan氏 と 「プログラミング言語C」の著書である Brian W. Kernighan氏で、 翻訳は柴田芳樹氏(@yoshiki_shibata)によるものです。 本書はGoプログラマにおけるバイブルのような位置づけのようです。
構成としてはチュートリアルから始まり、構造体やインターフェースなどの主要な仕様について解説されていて、他のGoの書籍と似たような形になっています。 しかし、その説明は(少なくとも私がこれまで読んだGoの書籍と比べると)とても深い部分にまで言及されています。
Goを始めたばかりの方には少し敷居が高いかもしれません。それは、練習問題を解くには初っ端から様々なGoの知識が要求されるからです。 一応「interfaceについては第7章を見てください」といった感じで注意書きがあるのですが、それに従っていると章を度々またぐことになるのでおすすめしません。 したがって、Goの入門書を一通り終えてから手にするのが良いでしょう。
参考までに、各章の表題を載せておきます。
- 第1章 チュートリアル
- 第2章 プログラム構造
- 第3章 基本データ型
- 第4章 コンポジット型
- 第5章 関数
- 第6章 メソッド
- 第7章 インタフェース
- 第8章 ゴルーチンとチャネル
- 第9章 共有された変数による並行性
- 第10章 パッケージとGoツール
- 第11章 テスト
- 第12章 リフレクション
- 第13章 低レベルプログラミング
この本のポイント
Goの仕様をより深く理解できる
本書では、言語仕様の説明において、標準パッケージを例にした解説が度々登場します。 例を挙げると、fmtパッケージのPrint関数やerrorパッケージのerrorインターフェースです。 普段よく使う機能の中身を覗いて、どういった仕組みで動いているか解説がなされているのです。
この解説にはとても納得感がありました。 特にインターフェースは、Goの初学者がつまづくポイントとして有名ですが、 普段よく使うfmtやerrorパッケージからインターフェースの仕組みを解説することで、 言語仕様への理解だけでなく、標準パッケージへの理解も深めてくれています。
また、本書を通じて標準パッケージを度々参照していると、 「めっちゃ勉強になるコードがこんな身近にあったなんて…」という風にも思わされました。
↓読者の喜びの声
fmtパッケージのPrint系関数は、インターフェースを用いることでfmt.Fprintfに対するラッパーを実現している。だから複雑な実装を複製する必要がない。
— kuwana-kb (@kuwana_kb_) 2019年3月27日
またひとつ謎がとけた…#プログラミング言語Go
interfaceの説明がこれまで読んだGoの技術書の中で一番充実してる(大した数読んだわけじゃないけど)
— kuwana-kb (@kuwana_kb_) 2019年3月28日
標準パッケージを用いてのインターフェースの解説がすばらC#プログラミング言語Go
Goのベタープラクティスについて触れている
本書の特徴として、Goのより良い書き方に触れられている点が挙げられます。 「○○を実現したい場合、☓☓のように書くのがよいだろう」といった具合です。
プログラミングは書き手によって様々な表現方法を選択することができますが、私のようなひよっこからするとどの選択肢を選べばいいか悩ましく感じることが多いです。 技術書の中には選択肢だけを提示して、その使い分け方はあまり解説してくれない本もありますが、本書は違いました。
本書では、シンプルさや可読性の観点から場面に応じた書き方の指南が記されています。 例えば、「Goの関数では空リターンによって結果を返すことができますが、コードの理解を容易にしてくれるわけではないため、空リターンは控えめに使うのが最善でしょう」など。
上述した例のように、本書には実践的で役立つプラクティスが詰まっています。 実際、私は本書で得た知識のおかげでチームのコードレビューにコメントする回数が増えました。 本で得た知識が実践で役立つと身につくのも早くていいですね。
練習問題が難しい…けどためになる
本書には各章に練習問題が付属しています。 問題文は2,3行でその章で習った内容を駆使してコードを書いてみる、といった具合です。 私の場合は、「各章で内容を理解→練習問題で実践→次の章へ」というサイクルでやりました。 実際に問題を説いてコードを書いてみると思わぬところでつまづいて時間がかかってしまうことがあるのですが、そういったつまづきは読むだけでは得られない知見です。
ということで是非練習問題も解きましょう!
...と言いたいところなのですが、本書の練習問題は量が多いことに加えていろいろと難易度が高いように思います。 難易度が高いというのは、コンピュータ・サイエンスの知識を必要とするものがあったり、 問題の要求が立派な1つのアプリケーションレベルのものを作れという規模感だったり… 要するに必要とする知識のレベルと作業の工数がやけに高い問題がちらほらあるのです (特にコンピュータ・サイエンス系の問題は私文卒の私には意味がわかりませんでした…)
↓問題の意味がよくわからず逃避する私
マンデルブロ集合って初めて知ったけどきれい
— kuwana-kb (@kuwana_kb_) 2019年3月24日
なお複素数は全然わからない模様…https://t.co/1poJ8fe7zh#プログラミング言語Go pic.twitter.com/cellxYRRqc
多分問題文を全部真面目にやろうとすると1ヶ月以上はかかりそうな規模感だと思います。 なので、それぞれの目的に応じて「本を読むことを優先して各章数問だけやってみる」や「本を読むことに徹する」という方針でも良いと思います。
文章が理解しづらい一面も
原書は英語で書かれており、本書はその日本語訳版です。 そのせいか頭に入りづらい言い回しが多い気がします。 原文に忠実な訳なのかもしれませんが、個人的にはもうすこし平易な日本語訳にして頂けたらと思いました。
まとめ
本書は、文章の分かりづらさを除けばとても満足度の高い書籍でした。 「プログラミング言語Go」はまさにGopherにとってのバイブルといえるでしょう。 まだ読んでいない方は是非手にとってみてください。きっとGoの世界の視野が広がります。
追記
Twitterにて、訳者である柴田さんより練習問題に関して補足を頂きました。 ありがとうございます。 私も他の方の解答例もいくつか拝見しましたが人によって書き方が全然違ったりするので、これから挑戦する方は比べてみるのも面白いかもしれません。
練習問題の私の解答は、https://t.co/kX2ZMPZsEr にあります。他にもGithub上にはいろいろな人達の解答例があります。
— Yoshiki Shibata/柴田芳樹 (@yoshiki_shibata) 2019年4月2日