作るプログラムの機能や性能で勝負したい。そうだ、データベースを勉強しよう

さて、アルゴリズムの勉強のしかたと、ラムダ計算の勉強のしかたの目星をつけました。
アルゴリズムの勉強のしかた - きしだのはてな
ラムダ計算の勉強のしかた、プログラム意味論 - きしだのはてな


これでここで書いたプログラムの理論の基礎は勉強できたことになるんじゃないかと思います。
プログラムの理論とはなにか - きしだのはてな


ところで、プログラムの勉強地図としてこういう図を書きました。

で、ハードウェアまわりについても、プロセッサを支える技術ネットワークはなぜつながるのかでひととおり勉強したとしましょう。


じゃあ次は、アジャイルか?テストか?UIデザインか?となるわけですが、やはりプログラマなら、プログラムの作り方や使いやすさの前に、作るプログラムの機能や性能で勝負したいじゃないですか。


いい感じに関数が分割できるよとか、読みやすい名前がつけれるよとか、効率よく仕事して定時に帰れるよとか、そういうのではなく、ぼくの作ったプログラムは3倍速いよとか、3倍のデータさばけるよとか、3倍のサーバで分散できるよとかいいたい。
そういう地味なんじゃなくて具体的に画像認識とか自動翻訳とかできたほうがかっこよくね?と言いたくなるかもしれませんが、そういうのは、3倍速くて3倍のデータ扱えれば9倍の認識率とか*1、そういう世界なんです。どんな分野のプログラムも、速くてたくさんデータがさばけてたくさん分散できれば、それだけで出来ることは増えるのです。使いやすくなるのです。
まあ、UIデザインは、ノーマンさんの誰のためのデザイン?は読んでおくとして。ついでにあげとくと、テストは継続的インテグレーション入門がノウハウ満載でいいです。


さて、機能や性能で勝負できるプログラムを組みたいとして、ひととおりの勉強ができたとすれば、つぎは実用的なプログラムを組むか、まあ実際に組むとこまでいかないにしても、組むための知識を得ておきたいです。
では何を組もうかと考えてみると、プログラマが作りたいソフトウェアトップ3の、プログラミング言語、OS、データベースが挙げられるわけです*2
この中で、OSはちょっとハードウェアに寄りすぎに思います。そして、ちょっと大きすぎる気がします。プログラミング言語は逆にハードウェアから遠すぎです。そして、練習に作る規模だとちょっと小さい。最新コンパイラ構成技法とか1冊読んで適当に作ればいい。


ということで、データベースの勉強をしてみるのがいいんじゃないかなと思うわけです。世の中NoSQL、NoSQLといいますが、基本はリレーショナルデータベースです。なので、RDBMSの仕組みを勉強してみましょう。
と、3年前にこういうエントリ書いた本人がいう。
RDBMSの時代の終わりが見えてきた 2008-12-12 - きしだのはてな
このエントリそれほど間違ってなくて、「最初に消えるのは組み込みRDBMS」というのも、消えてこそいませんが、AndroidなどでJSONで保存するからSQLite使わなくていいという話はよく聞きます。というか、コメントとかブクマコメント見ると、絶対あのAAが思い浮かんでしまう。


それはともかく、RDBMSSQLという言語を持つので、言語処理系の勉強にもなります。他にも、ファイルを扱ったり、データベース接続のプロトコルを扱ったり、データ構造を扱ったり、もちろんアルゴリズムを扱ったり、それから、データの信頼性を扱ったり、プログラムを組むときに必要になる技術が、かなり網羅されるわけです。
そのうえ、思いのほか小さい。


ということで、これからデータベースを勉強するための読書計画をたててみます。

準備

まずはリレーショナルデータベースがなにかを知っておきましょう。
ぼくはこの本の薄いころの版を持っていますが、リレーショナルデータベースがなにかを勉強するにはいいんじゃないでしょうか。

リレーショナルデータベース入門―データモデル・SQL・管理システム (Information&Computing)

リレーショナルデータベース入門―データモデル・SQL・管理システム (Information&Computing)

RDBMSでデータ操作を一通りできるのは前提で。

SQL再確認

ちょっとSQLをちゃんと見ておきましょう。
SQLでの木構造やらグラフの扱い方は、ひととおり知っておいたほうがよさそうです。

プログラマのためのSQL 第2版

プログラマのためのSQL 第2版

とっかかり

で、いきなりこの本を。すでに上巻絶版ですが日本語では、データベースの構造を扱うような本は他にないのです。
アルゴリズムデザインやエージェントアプローチ人工知能と並んでプログラミング関連書3大鈍器に数えられる本ですが、データベースでもっとも重要な、トランザクションについて、概念から実際の処理、ファイル構造などまで扱った本です。前述のとおり上巻絶版っぽいけど、下巻のほうが実装に近いことを扱うので、下巻だけでもいいかも。

トランザクション処理 上

トランザクション処理 上

トランザクション処理 下

トランザクション処理 下

以前300ページほど読んでましたが、あと合計900ページくらいあります。大判で字が小さくページ端ぎりぎりまで字があるので、ふつうの900ページよりはかなりの文字数があります。
ほんとは、次のDatabase Management Systemsだけでいい気もするのだけど、いきなり英語の本を読むより日本語で概念しっておくほうが早かろうと。

気晴らし

データベースで検索してたら出てきました。

クリエイターのためのおんなのこデータベース?学園編?

クリエイターのためのおんなのこデータベース?学園編?

データベースの勉強

さて、データベースの勉強です。
そこでデータベースの本としてよく紹介されているこの本。
SQLの最適化などの章もあるので、よさそうです。でもほんと、こういう本は日本語ではないので困る。
あったら教えてください。

Database Management Systems

Database Management Systems

読書メモがありました。
Database Management Systems 読書メモ - 壊れた計算機


追記(9/29)
データベースの実装には こちらのほうが詳しそう
Database Systems: The Complete Book

ソースも読みましょう

実際のデータベースのソースも読みましょう。おすすめはH2というJava製データベースです。
一般的な勉強のためにソースを読むときは、CでかかれたMySQLPostgreSQLだと、Javaでは標準ライブラリにあるような低レイヤのライブラリも含まれていたり、ポインタが見づらかったりで、あまりおすすめしません。なにより、H2は小さくていいです。
H2 Database Engine

分散データベースへ

で、データベース一通り勉強できたら、分散データベースも勉強したい。
ということで、まずは分散システムの基本になるP2P通信のおさらいを。4章5章で分散システムのネットワーク構造について説明されています。

P2P教科書 (インプレス標準教科書シリーズ)

P2P教科書 (インプレス標準教科書シリーズ)


あとは分散ストレージの基本になる分散ハッシュテーブルを実装するためのChordとかSkipGraphとかも勉強しといたほうがいいかなーと思うのだけど、書籍みあたらないので、とりあえずはネットでこういうのを読もうかと。
http://did2.blog64.fc2.com/blog-entry-347.html
homepage3.nifty.com/toremoro/study/DHTkansai/DHTkonishi.ppt
書籍あったら教えてください。


分散データベースの解説みたいなのは、この本とかでしょうか。いい本あったら教えてください。

Grid and Cloud Database Management

Grid and Cloud Database Management


追記(9/29)
この本がよさそう。
Distributed Database Management Systems: A Practical Approach

まとめ

まあ、情報系学部でもなく独学でやるのは、このあたりが限界かなーとか思うので、とりあえずここが目標ということで。
このくらいやれば、ほどほどに優秀な情報系学部の3年生くらいとは張り合えるかなーと思います。
しかし、最近の若いもんは優秀すぎて困る。

*1:うそ。実際はよくて認識率が9%あがるとか

*2:妄想調べ