読んだ

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)


書評とは関係のないことから書き始めますが、後でつながります。


知らないことはもったいないことだと思っているので読みます。本。


直感が大事だとか安易なことを平気で言う人間はどの業界でもいますが、あなたは何様なのだと?あなたの知る直感の出自はどこなんだい?というのはある。僕はたいがい知識だと思っています。大多数の人間にとっては。


当たり前だけれど直感とかそういった類いはたしかに存在します。でも、その直感を発生させる確率を上げるのは本当に大部分は「知っている」ということの多寡です。
”とあること”を知っていて、別の”あること”を知っていた。で、生まれたね直感。つまり弁証法です。凡人なのだから大体の人々は。天才だってほぼこれだろう(と信じたい)。


例えばJavaでプログラミングをはじめようと書籍等にあたると、public static void mainとかなんとか書いて、Hello World!とコンソールに出力できました。と書いてある。ただおそらく今Javaの開発をやっている人間は大体webアプリを作っている人が多いと思われる訳で、そうなるといきなり次はdoPost()doGet()から始まったりする訳です。さらにいきなりstrutsとかあると抽象性の度合いはさらに高まっちゃう訳です。この間のブリッジをどの程度理解するべきなのか?悩みどころではあると思いますが、僕はボンヤリは嫌いだし、何よりも気持ちが悪いので時間はかかっても徹底的にやろうと思っています。


はじめは僕の体験で言うと、「なんだよdoPost()って? 昨日まで、main()だったろーがよ!」とかそんなレベルからでした。サーバというのが何なのかもよくわからない。


そんな中、大雑把にでも次のようなことを知ったとします。Tomcaにはちゃんとmain()がある (org.apache.catalina.startup.Bootstrapにあります)。で、なんだかんだあって、スレッドをたくさん作って、 Httpリクエストを待ち構えて、ブロック状態、で、リクエストがあがると、そのリクエストPathにそって、web.xmlから、シングルインスタンスであるところの対象servletのdoPost()が呼ばれる。だから整合性はとれている。うん分かった。これは「知っている」獲得の一つの例です。これを知っただけで当時どれだけ助かったことか。


ただ、この中にも細かく見ればまだまだ「?」が含まれているわけです。xmlってどうやって読み込むんだとか?(SAX,DOM)、 Threadってナンなんだ?とか、シングルインスタンスとマルチプロセスって何が違うんだ?とか。doPost()が呼ばれるまでの軌跡はどうなっているんだ?とか。いくらでも出てきます。それを一つ一つつぶすしかない。それでやっと上記の文章の意味はなんとなく分かるようになる。

知っていることにより直感が発生しやすくなるんじゃないかと仮定しましたが、それだけでなく、想像力の範囲が明らかに広くなります。例えば、「知らない」ばっかりに、想像力の及ぶ範囲が制限され、結果、面倒で冗長で汚いコードを書いてしまいます。けどこつこつ「知る」を積み重ねれば知識と直感のコラボで、早くスマートなコードが書けるようになったりもします。きっと。そう思わないとやってられない。こんな本読んでいられない。

そんなこんなで少しずつですが、オープンソースフレームワークソースコードを見てきて、少しずつインフラ系も見ていきたいと思って買いました。話がつながりましたね。


で、この本は尋常じゃなく売れてるみたいです。
しかし、この本を読んでもサーバを構築できるようになったりはしません。でも全く知識のない人間にもサーバ運用のテクニック(冗長化可用化等)の概要がある部分ではとても分かりやすく、面白く読めるのではないかと思います。そして何より新しい知識というのは僕に取ってはうれしいものなので、うれしいのです


こんな文章を引用してみる。153ページ

例えばlsコマンドを実行すると、lsのバイナリファイルから機会語命令がメモリに展開されて、CPUがメモリから命令をフェッチし実行していきます。命令を実行するにはlsコマンドが使用する各種メモリ領域のアドレス、実行中の命令の位置(プログラムカウンタ、Program Counter)、lsコマンドがオープンしたファイル一覧などさまざまな情報が必要になります。これらの情報はばらばらになっているより、実行中のプログラムごとにひとまとめにして扱う方が都合が良いのは明らかです。プロセスとはこの「プログラムの命令」と「実行時に必要な情報」がひとまとめになったオブジェクトのことです。


これを知って、lsたたくのと、知らないでたたくのではコンソールの結果は同じだけれども、世界秩序全体での結果は絶対に違っているよね。