ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

Linuxプログラミングインターフェースを読んだ(一周目)

読みきった。一周目の所感を書く。

Linuxプログラミングインタフェース

Linuxプログラミングインタフェース

モチベーション

ぼくは、小さい会社でWebサービスの開発もしつつLinuxのサバ管も少ししつつ、という人間だったので、Linuxに開眼して真髄を会得したい、という欲求が長らくあった。例えば青木さんの本であったり、なるほどUnixであったり。

tatsu-zine.com

その後ペパボに入り、同僚としてやたらLinuxに詳しい変な人たち*1と関わり、また他のウェブサービスと比べてもサーバ運用が特殊なホスティング系サービスに関わり、その中でこの本を知る。

読んだ手触り

本書はLinuxの構成要素と機能について一通りの内容と、重要かつ基本的な(それでいて大量の)システムコールの説明と豊富なサンプルコード・課題を掲載し、それらは正確かつ網羅的な表現で淡々と説明され、進んでいく。

読んでいる感覚はどことない懐かしさがあった。それは、子供の時に興味のままに百科事典の項目を読み進めていたような、あの感じである。

この本を読む時の最初のコツとして、子供の頃のその感覚を思い出していくと良いかもしれない。

また、読み進めているうちに、また違った感覚に気づく。UNIXの歴史から始まり、IO、ファイルシステム、シグナル、プロセスとスレッド、そして後半から始まる壮大なIPCシリーズ(パイプ、SysV/POSIX IPC、ソケット、さらには端末まで)、最後に高難度のシステムコール select(2), poll(2), epoll(7) ファミリの解説も控える。羅列的に見えて、考え抜かれた展開、「ストーリー」の存在が見えてくる。このことに気づいた時、百科事典だったTLPIが、あたかも構想の練りこまれた長編歴史小説のように見えてきて、読み進める手が止まらなくなった。

この本は「リファレンス的に使いたいので、とりあえず必要なところだけ読む」という読み方もされるかもしれない。だがこうした理由から、あえて、頭から読んでみるのもまた面白いのではないだろうか。

不満点など

全体として、得るところの非常に大きい本であり、読んでの満足感は測り知れない。とはいえ思うところはあるのでここに残しておく。

まず、どうしても若干は古い本になってしまうので、一部新しい機能に関する解説が不十分または存在しない。この記事を書いている時点での日本語版ではLinux 3.5あたりまでの変更はキャッチアップされているが、それでも特に、Linux namespaceとcgroupに関する言及は一切ない*2など、コンテナ関連の知識の補完も期待していた自分としては物足りなさもある*3

なお、繰り返すが、基本的に今のLinuxでも十二分に活用できる知識が詰め込まれているので、本当に特殊な要望を持った*4自分の感想ということで書き残しておく。

書籍に関係する刊行時点からのカーネルの変更は、公式ページにて補足されてはいるようだ

「読むタイミング」が厳然と存在する本

ふつうのLinuxプログラミング/なるほどUnixプロセスもすでに読んでいたが、『Linuxプログラミングインターフェース』はこのように大きくぼくのエンジニアリング観を変える本であった。書籍の重厚さもあるだろうが、重要なこととして、ぼくにとってはまさにこの本を読むタイミングが来ていたということは言えそうに思う。

この発言をする前後で、 Haconiwa というLinuxの深淵に触れるコンテナランタイムの開発を始め、それから経過すること9ヶ月弱*5、ようやく最後の疑似端末の章を通過し、付録も読み切ることができた。

HaconiwaとLinuxシステムコールラッパとしてのmrubyを触れて、この分野への強い興味とやっていきを持っていなければこのように細く長く読み切ることは難しかったように思う。

本書は、基本的にはLinuxミドルウェア書く側 の観点でシステムコールを説明している。軽量言語とWebフレームワークを用いて開発している分には、リアルタイムシグナル*6であったりPOSIX IPCを活用する機会は少なく、自分でソケットアドレス構造体を直接触れることもないだろう。しかし開発や運用の経験を積み重ね、Linuxのもっと深い機能を使いたい時に、この本はきっと入口となってくれる。

無論、 運用する側 として得られるものも非常に大きいだろうし、そういう観点の記述も多々存在する。とはいえ基本的には書く側、APIを使う側がさらに上の段階に行くための本だと思う。なので、この本を読んで無謀にもLinuxミドルを作りたくなった僕は必ずしも責められるものではないだろう…きっと。

読んだら、書かないともったいない。そういう読後感を持った。

逆に、もっとLinuxの中身を知って運用をする側の本として、近刊の『詳解システムパフォーマンス』への期待も大きい。

詳解 システム・パフォーマンス

詳解 システム・パフォーマンス

どちらも読めば、自分で書いて自分でチューニングできるかもしれない。

強くてニューゲーム

長々と偉そうに書いたが、もちろん、この本を十分に理解したとは思っていない。なのできっと、二周目、三周目の必要があるのだろう……。

明らかに、前半の章を読んでいた時より、後半の方が「百科事典の吸収能力」が高まっているのを感じた。理解の深さも相対的には違っている*7。そういう意味でも、二周目の挑戦には意味がありそう。

まとめ

名著というものは読まれるタイミングを待っているのかもしれない。今の自分の問題意識のタイミングで、待っていたこの本の存在に気づけたのは良かった。

もしかしたら読みきれない人、挫折する人もいるかもしれない本((そもそも1604ページもある、たいていの技術書コーナーで一番分厚い本の一つ)だが、こちらの方向に進んでいる人にとってはいつかまた出会える、そして読み切って何かを得ることができる本なのかもしれないと思う。

*1:I藤さん、M本さん…

*2:2017/04/12追記: cloneシステムコールにおける CLONE_NEWNS フラグの解説と、「コンテナ対応のフラグ」としての章立ては存在するが、非常に短く発展的な知識の欲しい読者には不十分と思われる

*3:基本であるLinuxプロセスモデル、fork/exec/wait/exit/kill、またカーネルケイパビリティの十分な説明は存在する

*4:The Linux Programming Interface 4th edition への期待がある…

*5:一年かからなくてよかった

*6:ほとんどの軽量言語でラッパがない

*7:Hacoinwaをずっと書きながら読んでいたので、そういう書いていての成長もありそう