Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

体系的な知識・技術を身につけるための学習法について

体系的な知識や技術を身につけたいと思っています。たとえばプログラミングに関していえば、これまでたまたま興味を抱いたところをつまみ食いしていて、小手先の技術が少しは身についたものの、もうちょっとなにか深いことをやろうとしても、それだけではなかなか難しい。とはいえ、教育機関のようなところでやり直すわけにもいきませんし、かといって、なにかをただ作ったりしているうちにいつの間にか体系的な知識や技術が身につくというのも、そういうひともいるかもしれませんが、あまり考えられないことです。ではどうすればいいか……?と考えていたのですが、先日ちょっと思いついたので、とりあえずまずは実践してみたいと思いました。

というのはつまり、学習したいと考えている、なにかそれなりに大きな規模の分野について、自分で本を書くつもりで、あるいは、こういう本があったら体系的な知識を得られるだろうなあという本の目次を自分なりに書き出していって、あとはその内容を埋めるつもりで学習を行っていけば、自ずと体系的な学習になってしまうのではないかという方法です。それがうまくいくかどうかはわかりません。しかし、まあやってみる価値はあるんじゃないかという気もしています。

たとえば『Tokyo Tyrantのようなものを作ってみよう』みたいな本があったとして、それがもろもろの必要な知識、技術を解説し、学んだことを活かしながら実際に少しづつ実装を進めていくというようなものであったら、それを読むことにより、様々な知識が身につくのではないかと思います。これはなにもプログラミングに関することのみならず、色々な分野に適用可能な方法なのではないかという気がしています。たとえば音楽理論を体系的に学びたいなら好きな交響曲を分析するための知識を洗い出してみる、とか、建築について学びたいならコールハースのある建築を実現するために必要な各種工法、素材、歴史、法規、デザイン等についてとか、ともかくそれらの入門書のようなものを書いてみるつもりで、まずは目次を作ってみるわけです。そして、その目次に沿った内容を、実際に書くかどうかは別として、埋めていく要領で学習を行っていきます。

そこで、まずは以下のような架空の目次を作成してみました。今後は、もちろん目次を作成する際の知識不足により、検討外れであったり不十分であったりする項目もあるので、目次そのもののブラッシュアップを図りつつ(そのこと自体も学習の役に立つでしょう)、基本的にはそれに沿って学習を行い、まとめていく作業を行うことで、なにかしら「体系的な学習」に近いことを実践できるのではないかと期待しています。もちろん、誰かよくご存知の方が実際にそういう本を書いてくださるのが一番早いわけですが。

TokyoTyrantみたいなのを作ってみよう』という架空の書籍の目次(暫定版)

  1. データベースを作ろう
    1. データベースとは?
    2. データベースへの各種操作
      1. 検索
      2. 更新
      3. 削除
    3. ストレージ
      1. 各種ストレージの特性
      2. キャッシュ
      3. メモリ
      4. HDD
      5. SSD
    4. ページ管理
    5. バッファ管理
    6. メモリ管理
    7. アルゴリズムとデータ構造
      1. ハッシュ法
      2. B+-tree
  2. ネットワークインタフェイスを作ろう
    1. ネットワークの概略
    2. ネットワークプログラミングの基礎
      1. システムコール
      2. 各種ライブラリ
    3. 可用性を高める
      1. ログ管理
      2. バックアップとリカバリ
      3. 同時実行制御
      4. レプリケーション
        1. マスタ/スレーブ
        2. デュアルマスタ
      5. 対障害性
        1. フェイルオーヴァ
  3. 各実装の検討
    1. memcached
    2. TokyoCabinet + TokyoTyrant
    3. その他