30歳からのプログラミング

30歳無職から独学でプログラミングを開始した人間の記録。

『ハイパフォーマンス ブラウザネットワーキング』を読んだ

ウェブに関するネットワーク技術について網羅的に扱った書籍。
TCP や UDP のようなトランスポートプロトコルの話から、WebSocket や WebRTC のようなブラウザで使える API まで、幅広く扱っている。

www.oreilly.co.jp

読書メモは Gist に置いた。

『ハイパフォーマンス ブラウザネットワーキング』のメモ。 · GitHub

本書は、2017年に voluntas さんから「お勧めの書籍」として頂いた。それをようやく読んだ。
ずっと頭の片隅にはあったのだが、最初に読もうとしたときに挫折してしまい、それから遠のいてしまっていた。
その後、ネットワークの入門書をいくつか読んでから本書を開いたところ、読めそうな気がしたのでそのまま読み進めた。

私の場合はネットワークの議論に対する「土地勘」のようなものがないから苦労したが、ある程度の知識がある人なら、それほど苦労せずに読めると思う。
淡々とプロトコルを紹介するのではなくパフォーマンスという文脈で解説を行っており、それによって本書が読みやすいものになっている。

私のような初心者にとって、ネットワークは興味を維持しにくい。
関心がないわけではないのだが、目に見える成果につなげにくいため、継続的な学習が難しい。日々の開発においても、一般的なウェブアプリを作り、機能要件しか気にしないのであれば、HTTP より下のレイヤーを意識することはあまりない。そうなるとネットワークを学ぶ必要性が生まれず、モチベーションを維持しにくい。
本書は、パフォーマンスという文脈でネットワーク技術を紹介することで、モチベーションを維持しやすい仕組みになっている。
本書のなかに

一度 TCP の輻輳制御を理解すると、キープアライブ、パイプライン化(pipelining)、多重化(multiplexing)などの最適化をすぐにでも始めたいと思うことでしょう。

という文章があるのだが、まさにそのような感じだ。本書で得られるネットワークの知識と日々の開発の間につながりがあることを感じられ、すぐにでも試したいと思わせてくれる。
パフォーマンスという分かりやすい目標や便益があることが、モチベーションになる。
例えば、TLS の説明で「TLS レコードプロトコル」というものが出てきたとき、あまり強い興味は持てなかった。だがこれがパフォーマンスに影響を与える可能性があると知り、俄然興味が出てきた。知っておくべきだと、自然に思うことが出来た。

だが本書はあくまでもネットワーク技術の解説書であり、パフォーマンス改善のための単なるハウツー本やテクニック集ではない。
そのため、まずネットワークの基本的な仕組みや考え方を説明した上で、それに基づいて、最適化の説明に入る。
「はじめに」に

「どのように」と「なぜ」が離れることはありません

とあるが、まさにそのような内容になっている。
冒頭に、「ウェブサイトのパフォーマンスにおいては帯域幅よりもレイテンシが重要だ」と書かれているが、本書を読み進めることで、なぜそうなのかが分かるようになっている。

そのような内容であるため、本書の内容は陳腐化しにくい。
邦訳である本書の出版は 2014 年であり、原文の公開はさらに古い。
しかし、基本的な仕組みや考え方は、陳腐化しない。
HTTP より上のレイヤーについては変化が激しいが、それでも、新しい技術は既存の技術の延長線上にあることが多い。また、既存の技術が抱える課題への対応として、新しい技術は出てくる。そのため、既存の技術について知っておくことで、新しい技術にもキャッチアップしやすくなる。

HTTP 1.x や 2.0 の話などは、『Real World HTTP』と重複している(ちなみにこの書籍も voluntas さんに頂いた)。
だがこの書籍を読んだときよりも、今回のほうが頭に入ってきた。
それは恐らく、自分自身が少しは非機能要件にも興味を持てるようになってきたからだと思う。以前は、機能要件を満たすことで頭がいっぱいで、他のことを気にする余裕がなかった。そういう人間にとってはライブラリの API を覚えていくことが何より重要であり、HTTP 通信のパイプライン化や多重化といった話題は、興味を持ちにくかった。自分には関係のない話のように思えてしまった。

本書や『基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版』を読むことで、ネットワークの話題について多少は文脈を掴めるようになった、というのも大きいと思う。
自分なりの全体像が少しずつ出来てきて、何が分からないのかすら分からない、という状態からは脱しつつある気がする。