熱いうちになかなか鉄が打てないタイプの人間です。

「Goならわかるシステムプログラミング」を読破した。購入したのはだいぶ前だが、途中まで読み進めて放置していたので、改めて最初から読み直し&勉強し直してみた。

購入したときは Go を知ってすぐだったような気がする。放置していたのも、そのときの Go の知識レベルが追いついていなかったために、読み進めるのがつらくなったからだろう。 現在も業務では Go を触っているわけではない。だが、昨年は Gophere Dojo に参加して Go の基本的な知識を習得し、個人的にいくつか小さいツールを Go で書き、最近は Go で書かれた小規模の OSS に PR 送ったりした。それなりに知識は習得できていると思う。案の定、前回読んだときよりも今回はスムーズに読み進めることができた。

この本は、システムプログラミングのハードコアなところからいきなり始めるのではなく、 interface や goroutine や channel など Go 自体の紹介も兼ねられているのが良いところの一つだ。 例えば第2章、第3章はそれぞれ io.Writer、 io.Reader の紹介から入り、 OS が担う抽象化の役割を説明しつつ前段階で紹介した interface との関連性を明らかにしていく。第4章は goroutine、 channel の紹介で、最小限の goroutine パターンを挙げながら説明している。第5章以降は、それまで説明した Go の機能を用いつつ、システムコールやネットワーク、ファイルシステム、プロセス、シグナル、メモリなどを解説し、最終的にはコンテナまで対象に含んでいる。 Go 自体を紹介する章では章末に問題が用意されているのも良い。解説された Go の機能に対する理解をすぐ確認できるし、それが確認できれば後半のシステムプログラミングの解説もスムーズに入ってくる。

もともとはASCII で連載していた記事を書籍にまとめたものなので、購入前に記事を流し読みして確認しておくと良い。

システムプログラミングはある種泥臭い領域だと思う。少しずつステップを踏めばそこまで難しいことをやっているところは多くない印象で、地道さが要求されると感じる。(システムプログラミングの90%も知らないで言っています) 進歩のペースが速いこの業界でも、数十年前との差が比較的広がっていない領域で、今後もそこまで広がらないだろう。今のうちにこの部分の知識をつけておくとのちのち役に立つかも、という思いで読破したが、内容も面白いしもっと詳細な部分を知りたい!という気持ちになってくる。 今はRui さんのコンパイラ本を読んで C Compiler を自作しているので、それが終わったら「30日OS本」にもチャレンジしたい。

Go も引き続き書き続けたい。同じ著者のReal World HTTP の第2版が最近出たので読んでみたい。 読みたい本がどんどん溜まって大変だ。

メモや問題の回答、勉強中に書いたコードは以下のリポジトリに置いている。

勉強用リポジトリ