「退屈な Go」あらため『初めての Go 言語』はよい本

no extension

なんと! この記事で本ブログ1,500本目なのですよ1

🥁 ドンドンドン! パフパフ! 🎺

日記は別として,ブログは SaaS も含めて色々と遍歴してるんだけど,今まで千本も続いたことはなくって。 じゃあ,1,000本超えたところで記念記事を書けばよかったんじゃ? と思われるだろうが,そのときは完全に頭からすっぽ抜けてて,気が付いたら1,200超えてたのだ。 まぁ,でも,7年で1,500って凄くない?

というわけで記念記事だが,『初めての Go 言語』の感想というか紹介を書くことにした2。 パチパチパチ。

photo
初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド
Jon Bodner (著), 武舎 広幸 (翻訳)
オライリージャパン 2022-09-26
単行本(ソフトカバー)
4814400047 (ASIN), 9784814400041 (EAN), 4814400047 (ISBN)
評価     

2021年に出た “Learning Go” の邦訳版。私は版元で PDF 版を購入。 Go 特有の語法(idiom)を切り口として Go の機能やパッケージを解説している。 Go 1.19 対応。

reviewed by Spiegel on 2022-10-11 (powered by PA-APIv5)

実際には紙の本ではなく版元の O’Reilly Japan でデジタル版を購入した。 技術関連本はやっぱ PDF が最善だよな。 いくらでも書き込みできるのもいい。

退屈な Go

この本はまず「まえがき」が面白い。 のっけから

最初に考えたこの本のタイトルは『Boring Go』でした。実のところ Go のコードは退屈なのです

だもん(笑) まぁ Go にネガティブな反応をする人の多くは「Go はつまらない」って言うみたいなので,たぶん間違ってない。 そして

Go 言語の機能は、モダンなプログラミング言語に比べると「だいぶ少ない」と言えるでしょう。Go で書かれたプログラムは、ある意味「単刀直入」で、ときによっては繰り返しが多くなる傾向にあります。継承はありませんし、アスペクト指向プログラミングも、関数の多重定義もありません。ましてや演算子の多重定義なんて以ての外です。

パターンマッチングもありませんし、名前付き引数もありません、例外処理もないのです。一方、多くのプログラマーにとっては恐怖の的かもしれませんが、ポインタは含まれています。並行実行のモデルも他の言語とは違っています。1970 年代のアイデアに基づいているのです(ちなみにガベージコレクションに使われているアイデアも同じく1970年代のものです)。簡単に言ってしまえば Go 言語は「先祖返り」したような言語です。

と続く。 うんうん。

ここから Go のメリットについて記述があるのだが,これは

Go 言語は長持ちするプログラムを作ることを意図して開発されました。何十年にも渡って、何十人もの開発者に修正されることが想定されているのです。

という一文に集約されるだろう。 Go が「退屈な言語」であることには意味があるというわけだ。

まぁ,実際に Go が「何十年にも渡って」使われる言語になるかどうかは分からない。 Go はようやく10代の思春期に入ったばかりだ(笑) でも上の「意図」に共感できるなら Go を選択するのは悪くないと個人的には思う。

今は20世紀の頃のような「変化しない要件を前提に堅牢な設計を組んでから忠実に実装する」時代ではない。 書籍『Clean Architecture』では

アーキテクチャの形状の目的 は、そこに含まれるソフトウェアシステムの開発・デプロイ・運用・保守を容易にすることである。

とし

それらを容易にするための戦略は、できるだけ長い期間、できるだけ多く選択肢を残すことである。

と述べている。 これから数十年後に残っている言語がどんなものかは分からないが,コードを書くにあたって,この「戦略」の実行を容易にする言語がメインストリームに残っていくと私は思っている。

2021年に書いた「Go を褒め殺ししてみる」で,私は Go の特徴を「はやく作って はやく改(なお)す3」と評した。 Go が長期に渡って残っていく言語になることを期待したい。

2022年最新の Go 技術解説書

訳者まえがきでも述べられているが,原著の “Learning Go” が出版されたのは2021年で,いわゆる Generics が登場する Go 1.18 より前である。 このため日本語版『初めての Go 言語』では15章の「ジェネリクス」が全面的に書き直され,他の章でも Generics 関連の記述が調整されているらしい。

あと日本語版の特徴は,なんといっても付録。 特に「実例で学ぶGo言語入門」は多くのサンプルコードが適切なサイズで載っているので「試しにちょっと動かして確認したい」人には便利だと思う。 翻訳者の方の気合の入りようが分かる。 他の言語からやってきた人は付録のコードを動かすところから始めてもいいかもしれない。

なお,日本語版のサンプルコードは以下の GitHub リポジトリから取得できる。

サンプルコードも含めて日本語版は2022年最新の Go 1.19 で動くよう調整されているそうな。 なので,この本は2022年時点で最新の Go 技術参考書と言ってもいいかもしれない(笑)

本文では,特に12章の「コンテキスト」と15章の「ジェネリクス」は分かりやすくてよかった。 Generics についてはネット上では日本語でも既に色々と記事があるけど,書籍の形でまとまった内容になっているのはとても助かる。

「イディオマティック Go 実践ガイド」

副題に「他言語プログラマーのためのイディオマティック Go 実践ガイド4」とあるように『初めての Go 言語』は Go 特有の語法(idiom)にフォーカスを当てている点で,いわゆる「入門書」とは毛色が違っている。 このため

この本の対象読者は、2番目(あるいは5番目あたりかもしれませんが)にマスターするプログラミング言語を選ぼうとしているソフトウェア開発者です。

としている。 といっても1章でコンパイラのセットアップから linter の使い方までかなり細かく紹介しているので,全くのプログラミング初心者がどうしていいか分からなくて途方に暮れる,ということもないだろう。 なお,開発環境として VS Code と GoLand は紹介されているが Vim への言及はなかったので vimmer には不満かもしれない(笑)

この linter にまでちゃんと言及してるってのは個人的にポイントが高い。 Go に限らず,ある言語に於いてよく知られた idiom に沿ってコードを書くことで,うっかりミスやセキュリティ脆弱性が紛れ込む可能性を減らすことができる。 Idiom に気を配ってコードを書くのであれば linter は必須の道具と言えるだろう。

閑話休題 (それはさておき)

この本で言うところの「イディオマティック実践ガイド」な本というと「Effective ◯◯」みたいなタイトルを冠していることが多い。 『Effective Java』とか。 ただ,この手の本は大抵の場合,入門レベルを終えた人が次のステップに上がるための参考書に位置づけられる。 そういう意味でも『初めての Go 言語』はだいぶ変わった本という印象を受ける。

なお Go の公式ドキュメントとして “Effective Go” というコンテンツは存在する。 入門レベルの最終ドキュメントという感じだろうか。 これがあるせいで “Learning Go” にせざるを得なかったとか(笑)

Go の2番目の教科書

私は Go の教科書として普段は『プログラミング言語 Go』を推している。 入門書はとかく「使い方」に偏りがちで,言語仕様に踏み込んだ「何故そのようになるのか」に関してはどうしても薄くなってしまう。 私が『プログラミング言語 Go』を教科書として推す理由は,この本が真面目に言語仕様に踏み込んだ内容になっている点である。

とはいえ,言語仕様を(ある程度)理解できればスラスラとコードが書けるのかと言うと,そうもいかなかったりする。 たとえば『プログラミング言語 Go』を読めば reflectunsafe といったパッケージの機能や使い方は分かるが,実際のプログラミングにおける使いどころや注意点は分からない。 また,前節で述べたように,どんな言語でもバグを引き起こしやすい書き方ってのはあって,これを避けるコーディングは言語仕様を見ただけでは分からないものである。

したがって「プログラミング言語を習得したければ大量のコードを読むことと大量のコードを書くことだ」という話になりがちである5。 また「プログラミングを独習するには10年かかる」というのも,まぁ仕方ないかなとは思う。

そんな『プログラミング言語 Go』に足りない部分を多少なりとも補ってくれるのが『初めての Go 言語』ではないかと思う。 なので,私としては『初めての Go 言語』を Go の2番目の教科書として推したい。 どちらを最初に読むかは難しいところだが, Go に近づく最初の1フィートとして読むなら『初めての Go 言語』を,ある程度 Go に慣れたところで「そろそろちゃんとやろう」というのであれば『プログラミング言語 Go』がいいのではないだろうか。

その上で更に『Goならわかるシステムプログラミング』や『Go言語による並行処理』や『Go言語による分散サービス』といった本に手を付けていくのが順当だろう。

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)

photo
Go言語による並行処理
Katherine Cox-Buday (著), 山口 能迪 (翻訳)
オライリージャパン 2018-10-26
単行本(ソフトカバー)
4873118468 (ASIN), 9784873118468 (EAN), 4873118468 (ISBN)
評価     

Eブック版もある。感想はこちら。 Go 言語で並行処理を書くならこの本は必読書になるだろう。

reviewed by Spiegel on 2020-01-13 (powered by PA-APIv5)

photo
Goならわかるシステムプログラミング 第2版
渋川よしき (著), ごっちん (イラスト)
ラムダノート 2022-03-23
単行本(ソフトカバー)
4908686122 (ASIN), 9784908686122 (EAN), 4908686122 (ISBN)
評価     

第1版はとてもためになる内容だったので第2版も PDF 版で確保しておく。

reviewed by Spiegel on 2022-10-08 (powered by PA-APIv5)

photo
Go言語による分散サービス ―信頼性、拡張性、保守性の高いシステムの構築
Travis Jeffery (著), 柴田 芳樹 (翻訳)
オライリージャパン 2022-08-03
単行本(ソフトカバー)
4873119979 (ASIN), 9784873119977 (EAN), 4873119979 (ISBN)
評価     

版元でデジタル版を購入。読書会の課題図書。ハンズオンぽい構成でコードがたくさん書かれているのがよい。

reviewed by Spiegel on 2022-08-03 (powered by PA-APIv5)

photo
Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)
Robert C.Martin (著), 角 征典 (著), 高木 正弘 (著)
ドワンゴ 2018-08-01 (Release 2018-08-01)
Kindle版
B07FSBHS2V (ASIN)
評価     

実務に即効性のある技術解説書というわけではないが,ものの「考え方」を示す本としてはよく出来ている。ソフトウェア技術史の読み物としても面白い。

reviewed by Spiegel on 2021-04-03 (powered by PA-APIv5)


  1. 厳密には削除したり移動したりして obsolete な記事があるので,それを含めた延べ数ならとっくに1,500超えてたんだけど。 ↩︎

  2. どうも「はじめての〇〇」ってタイトルを見ると一歩引いちゃうんだよなぁ。昔「はじめての C」ていう本があって「エロ本か思うた」とかいうジョークがあったが(ABC の古い隠語を知らない若い人にはごめんなさい),そういう時代を連想してしまう(笑) ↩︎

  3. 「改す」を「なおす」と読むのは辞書的に正しい日本語ではありません。念のため(笑) ↩︎

  4. 原著では An Idiomatic Approach to Real-World Go Programming となっている。 ↩︎

  5. Go は標準パッケージのソースコードが読みやすく,あれを読むだけでとても勉強になる。 ↩︎