アイキャッチ

表面的なテクニックより「基礎基本の重要性」に気付かされた一冊【Node.js 日本ユーザーグループ代表・古川陽介】

プロフェッショナルたちの読書感想文

本連載では、業界の第一線で活躍する著名エンジニアたちが、それぞれの視点で選んだ書籍について語ります。ただのレビューに留まらず、エンジニアリングの深層に迫る洞察や、実際の現場で役立つ知見をシェア!初心者からベテランまで、新たな発見や学びが得られる、エンジニア必読の「読書感想文」です。

著名エンジニアが、独自の視点で「おすすめ書籍」の紹介を行う本連載。

今回の語り手は、Node.js日本ユーザーグループの代表・古川陽介さん(@yosuke_furukawa)。「自分が本当の意味で、ちゃんと頭から最後まで理解しながら読んだ本」と語る、『ハイパフォーマンスブラウザネットワーキング』(オライリー・ジャパン)を紹介いただいた。

古川さんが選ぶ一冊『ハイパフォーマンスブラウザネットワーキング』(オライリー・ジャパン)

発売日:2014年05月
著者:Ilya Grigorik 訳者:和田 祐一郎/株式会社プログラミングシステム社
出版社:オライリー・ジャパン
書籍概要:本書は「ブラウザ」に関連し、インターネットで使用されるさまざまなネットワーク技術をまとめたもの。HTTP/2.0やWebRTC、WebSocketやXMLHttpRequestなどのブラウザAPI、そしてそれらの土台となるTCPやUDPやトランスポート層についてまでを幅広くカバーしている。

本書をピックアップした背景

この企画を聞いたときに、いくつかの候補が思い浮かびました。その中から、考え方やモノの見方が新鮮で、そこそこ実用性が高かったものを選んだ結果、『ハイパフォーマンスブラウザネットワーキング』になりました。

私自身は本書を読んだことで「ブラウザがどう動いているのか」に俄然興味が湧きました。これまでGoogle Chrome Advisory Boardや数社での技術顧問を務めてきましたが、今の自分を形成するきっかけを作った一冊です。2014年の本なので少し古い本ではありますが、今でも勉強になる非常に良い本だと思います。

さまざまな要素を網羅した、まさに「ネットワークの教科書」

通常「ブラウザのネットワーク」というと、HTTPやHTTPSなどのハイレベルな話であったり、そこから来るRESTなどの意味付け、AjaxやfetchといったAPIの話になりがちです。

もちろんそういった話も少し含まれているのですが、この本の中心トピックは違います。

本書は、TCP(Transmission Control Protocol)やIP(Internet Protocol)、3Gや4Gのモバイル回線、Ethernetといった物理層やデータリンク層に来るような内容から話が展開され、HTTPの歴史及びHTTP/2に至るまでの課程が解説されています。HTTP/3はこの時代だとまだ仕様になっていないので記述はありませんが、それまでの内容を振り返るのには非常に役に立ちます。

さらに「無線Wi-Fiはどのようにつながっているのか」「そもそもネットワークはどのようにしてつながっているのか」など、ネットワークの教科書的な位置付けで下から上までをきっちり網羅しています。

テクニックだけではなく、原理原則もしっかり学べる

パフォーマンス系の本は実用的な話が多く、どうしてもテクニックめいた話が多くなります。2008年に発売された『ハイパフォーマンスWebサイト』(オライリー・ジャパン)などは、ブラウザの中がどうなっているかという話よりも、「CDNを使う」「gzipを使う」といったテクニックの話が中心です。

これらの本が悪いわけではありませんが、テクニック部分は古くなる事が多いのと、基礎面が疎かになりがちだと思っています。

それに比較すると、本書は基礎を充実させた上で、応用であるHTTP、HTTPS、WebSocket、WebRTCなどの実用も抑えています。HTTP/2についてここまで解説した本はあまりないんじゃないかと思っています。

ネットワークが張り巡らされているイメージ

本書で得られた学び・教訓

続いて、私がこの本を通して得た学びや気付きについて、特に印象的な二つを紹介します。

技術の「細部」にこそ宿る、面白さがある

ブラウザの仕組みは一見シンプルな構造のように思えます。HTTP、HTML、CSS、JavaScriptという基本的な要素の組み合わせで成り立っているため、これらの技術の基本を理解するのは、それほど難しいものではありません。

一方で、それぞれの技術が内包する構造は非常に複雑です。

例えば、HTTPは「TCP」というプロトコルの上に成り立ち、その下には「IP」やさらに下層の「データリンク層」や「物理層」があります。HTMLやCSSの描画処理では、単に内容を読み込んで画面に表示するだけでなく、「レンダリングエンジン」が各ステップで処理を割り込み、効率的に描画する工夫がされています。またJavaScriptには高速化を目指した「JIT(Just-In-Time)エンジン」が存在し、実行時にコードを効率的に最適化する処理が行われます。

本書を通して、こういった技術の細部に宿る深い面白さに触れることができました。

例えば、TCPの仕組みに関する説明では「3 way handshakeのプロセス」から始まり、接続の高速化を目指した「TCP Fast Open」という仕様まで掘り下げて解説されています。本書を読むと、特にTCPの接続にかかるコストがいかに大きく、なぜ接続を切らしてはダメなのかが分かると思います。

TCP接続が一度切れると、再接続の際に最初からやり直す必要があり、これまでの送受信パケットによる「ウィンドウサイズ」の計算も無駄になります。HTTP/1.0の時代には、リクエストとレスポンスのやり取りのたびに接続を切断していたため、効率が悪かったことがよく分かります。接続を維持する戦略が重要であることは言うまでもありません。さらに、複数のTCP接続を持つこと自体もコストが高いため、少ない接続数でリクエストを効率的に処理する方法が必要不可欠なのです。

こうした「細部に隠された工夫」を知ることで、技術の面白さがさらに深く感じられるようになりました。

名だたるOSSやブラウザの開発裏に隠された「人間ドラマ」

『ハイパフォーマンスブラウザネットワーキング』では、その技術に関する歴史が詳しく語られています。

HTTPの歴史やHTTPSが必要になった背景、最初期のHTTPが生まれるまでの話、HTTP上でのブロッキングの限界の話、そしてHTTP/2に至るまでの経緯など、今の自分達の使っているものがどういう経緯で生まれたのかが分かるようになっています。

中には現代から振り返ると、うまくいかなかった試みももちろんあります。

TCP Fast Openなどは実装にも問題があり、仕様と実装の両面でトライアンドエラーを繰り返している事が伺えます。当たり前ですが、開発者も仕様策定者も同じ人間で、これだったらうまくいくだろうと思っても想定外のことでうまくいかなかったり、作ってみたけどダメだったりすることは多いです。

私はその歴史や振り返りに、ドラマがあるように感じます。技術者の間で繰り広げられてきた仮説検証に、開発者や仕様策定者の人間らしさを感じるのです。

実際に自分はNode.jsのコラボレーターを長い間やっていましたが、そこでも人間らしい様子を垣間見ました。

一度言ったことでもコロコロ意見が変わったり、認識の齟齬が生まれたまま実装されたものがあったり、専門家の間でも色々変わることがあります。こういった著名なOSSやブラウザの開発者がやってることは、実は僕らが日頃からやってる開発と案外大差はないのだと思わされます。

おそらくそれは、ウェブという大きなエコシステムの中でも一緒なのでしょう。

開発で試行錯誤しているイメージ

実務での活用方法

「HTTPの下にTCPがあり、そのさらに下に…」といった多層の構造、特に先ほど「細部の面白さ」で触れた観点に関しては、パフォーマンスチューニングやデバッグを効率よく実行する際に有用です。

もちろんそれらを理解せずとも、「lighthouse」や「page speed insight」といったツールを使うことで、チューニングのヒントは得られます。一方でこれらのツールが何を基準にチューニングのヒントを出しているのかは、本書で解説されている基礎を知ることでその一部(*)を理解できます。基礎知識があることで、より幅広い解決策を提供できるのです。

例えば「CDN」は、単にキャッシュ機能を提供するだけではなく、経路の最適化も行ってくれます。

仮にロンドンから東京までのアクセスを考えた場合、複数のルートが考えられますが「ロンドンからアメリカ大陸を横断して東京までアクセスするのか」「ユーラシア大陸を横断して東京までアクセスするのか」は、その内部の通信状況に依存します。これを状況に合わせてより高速な方を選択してくれる機能が、CDNには存在します。

逆に言えば、クライアントもサーバも東京にあるのであれば、経路の最適化機能はなくても良いといえます。必ずしもCDNが利用できる環境ばかりではないため、自前でキャッシュを設置するといった他の対策を講じることも有効でしょう。

また他にも、デバッグで役に立った経験もあります。

アプリ内部でネットワークの接続に失敗してしまったケースが、いきなり私のもとに寄せられたときのことです。サーバー間での接続では問題ない一方で、ブラウザを経由すると接続に失敗するというケースでした。

この問題を解決する際、『ハイパフォーマンスブラウザネットワーキング』のTLSの章に書かれていた「証明書の失効に関する解説」が大いに役立ちました。

蓋を開いてしまえばなんてことはなかったのですが、特定の証明書がブラウザから信頼されなくなったというだけのことでした。今までつながっていたものが急につながらなくなると、つい直近のアプリケーションの修正内容を疑いそうになりますが、これはブラウザ内部の変更によって生じた障害だったのです。

(*)あえて一部という表現をしました。本書に書いてあるのはネットワークがメインであり、レンダリングやJavaScriptについては付属的に記述されているため、そういった問題の解決は本書のカバー範囲外という意味です。

まとめ

古い本ではありますが、「面白かったな」「自分のキャリアの礎になったな」と思った本を紹介しました。これから『ハイパフォーマンスブラウザネットワーキング』を読む方に伝えたいのは、下記の三つです。

●ネットワークという一つのトピックを取っても、細かいところに沢山の技術がある

●作る人の数だけ、人間ドラマがある。その過程にあったトライアンドエラーは、実は自分のやっていることとあまり変わらない

●基礎をとことん理解すると、応用問題の解決にも取り組みやすい

プロフィール画像

株式会社ニジボックス
デベロップメント室 室長
古川陽介さん(@yosuke_furukawa

複合機メーカーやゲーム会社を経て2016年にリクルートへ入社し、プロダクト開発室でアプリ基盤の改善や運用、各種開発支援ツールの開発、エンジニアの支援や育成までを行い、現在ニジボックスのデベロップメント室で室長を兼務。Node.js日本ユーザーグループの代表。

文/古川陽介 編集/今中康達(編集部)

Xをフォローしよう

この記事をシェア

RELATED関連記事

RANKING人気記事ランキング

JOB BOARD編集部オススメ求人特集





サイトマップ