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

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

『WEB+DB PRESS Vol.55』の「モダンネットワークプログラミング入門」を読んだ

ネットワークプログラミングの基本的な用語や概念、 I/O 戦略の代表的なパターン、について書かれた特集記事。

15 年前の特集記事で、執筆者は古橋貞之氏。
業務でデータパイプラインのお守りをしている私にとっては「Embulk を作った人」というイメージが強いが、当時はサーバの実装などについてよく発信していたらしい。

ちなみにこの特集の次のページでは伊藤直也氏が Perl の連載をしており、いろいろと時代を感じる。

本特集ではまず TCP や IP や各種システムコール、ファイルディスクリプタなどについて説明し、「ネットワークプログラミング」の概要を示している。
構成として優れているし、説明も簡明で素晴らしいと思った。ただ、紙幅の都合だと思うが、全体的にかなり削ぎ落とした説明になっているので、まったくの初学者には厳しい気がする。
個人的には事前に『ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道』を読んでおいてよかったと思った。システムコールを使ったプログラミングについて何となくイメージを持つことができていたし、listen()accept()についても知っていたから、自分なりに理解しながら読み進めることができた。部分的に分からないことがあっても、「何の話をしているのか」さえ分かれば、調べたり考えたりすることができる。

後半ではサーバプログラムを書く際の I/O 戦略について解説している。
応答速度やリソースの使用効率に優れたサーバを書くためには I/O 、つまりクライアントとのデータ送受信をどのように処理するかが重要になる。
prefork やマルチプロセスやマルチスレッド、イベント駆動モデルなどのアーキテクチャが紹介されている。

最後の第 4 章で、アーキテクチャのひとつである「マルチスレッド+イベント駆動モデル」の実例がコードで示されており、それが特によかった。概念的な説明や擬似コードではなく実際のコードで示されることで、理解が進んだ。私が C 言語に慣れていないこともあり「スラスラ理解できた」とは言い難いが、コードを調べていくことで、どのような仕組みでどのような挙動をするのか、理解することができた。
概念としては何となく分かっているつもりだが具体的なことはイメージできていなかった「マルチスレッド」や「イベントループ」の具体例を知れたのはよかった。「詳細や正確なことはともかく、何の話をしているのかは分かる」という領域が広がったという実感がある。

ネットワークプログラミングなどの「よりコンピュータに近い部分」に取り組んでいると、コンピュータやカーネルの仕組みを理解することの重要性を、より明瞭に感じられる。パフォーマンスをよりよいものにしていくためには、どういう時に多くのリソースを必要とするのか、どういう処理をすると時間が掛かるのか、そしてそれはなぜなのか、といったことを分かっていないといけない。そうでないと、当てずっぽうやどこかで聞きかじった情報で的外れなことを試しては成果を得られない、ということを繰り返し、時間を浪費することになる。自分でゼロから考えるのではなく既存のパターンから選ぶにしても、知識がないと、妥当なものを選べない。そして問題が発生した時に、上手く対処できない。神頼みや運頼みになる。
仕組みや原理を理解していないと状況に応じた的確な思索や推論、判断ができない、というのはもちろん「ネットワークプログラミング」や狭義の「パフォーマンス」に限った話ではなく、プログラミング全般に言える。