antipop

2009-05-23

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

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

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

たとえば『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. その他

なまえなまえ 2009/05/24 21:41 そこで書かれていることを体系的に学ぶ場所がコンピューターサイエンスなので結局は大学に入り直すことが最前なのでは?と思いますが。

antipopantipop 2009/05/24 22:56 それが実現できるならその通りだと思います。

たびたび 2009/05/24 22:58 新しい開発言語を学ぶ時とか新しい技術に挑戦する時とか、分からない部分を事前に把握して計画的に学習できるからいいかもしれませんね|’−’)b

でもその分野のずぶの素人なら前者の方の言う通り教育機関に行ったほうがいいかもですね。

antipopantipop 2009/05/24 23:03 ずぶの素人ならば、実現できるならその通りにしたほうがいいと思います。

通りすがり通りすがり 2009/05/25 00:17 大学のコンピュータサイエンスのカリキュラムを入手し、それを踏襲してみるというのはいかがでしょうか?

二回生あるいは三回生あたりから、学部や学科によってさまざまに異なる専門的な知識のうち、当該の領域で「これは学んでおかないと後々もったいない」という感じに体系的に整備された過去の知識を学び始めると思うのですが、「その部分だけ」を後追いで学習してみるのです。
(初頭力学、電磁気学、解析学、線形代数、地学、心理学、政治学、ドイツ語、生物学、体育! etc.の、一般教養の部分まで必要はなさそうですので、省略できて、大学に入り直すよりずっと時間が少なくて済みます)

私はコンピュータのことを"体系的"に学んだことはないのですが、化学については体系的に教育を受けたことがあります。
ふりかえってみると、基礎知識を得たのは学部の二回生、三回生の授業(ないし教科書)からであったと思います。
(化学に関して言えば、四回生からは「午後から実験」という日が週の半分ほどになり、頭よりも手指で覚えることのほうが多くなり、その意味でも「知識」の学習は二、三回生が主だったと思います。)
また、四回生で研究室に配属されてから院を出るまでは、より専門化した知識をある程度体系的に学ぶと同時に、なんらかの新しい知見なり成果物を生み出すための「方法論」を学ぶほうが多くなるため、やはり体系的に整備された基礎知識の習得は大学の二回生、三回生の頃であったように思われます。

ですので、コンピュータサイエンスにまつわる学部・学科の二回生から四回生前半あたりのカリキュラムを見ながら、そこを自習してしまうのです。

理系の学生はそこそこ熱心に勉強していますが、ここは大人パワーでググッと時間を投入して頑張れば、1年ほどでかなりの知識が得られるのではないでしょうか?

antipopさんが上にお書きになっている『TokyoTyrantみたいなのを作ってみよう』の成果物にはとても興味があり、読んでみたいと思う一方で、
それは「ハウツー本」に近く、体系的な知識を身につける場合と同じものが得られるかどうか微妙に感じたので…。

例えば、「フェロセン(というもの)を合成する」という実験課題が有ったとして、実際にそれを実施するために知っておくべき知識(現状では知らないとする)を洗い出し、それを学んで作成することもでき、充分に事足りるわけですが、これはハウツーです。やはり微妙に自分に不満を感じます。

年をとって(antipopさんより結構年上のオヤジです)思うに、ハウツーではない体系的な学習とは、実際の作業には不要かもしれない知識を貯め込んでおくことで、それのおかげで、何か新しいことや、普段はやらないことを行おうとしたときに応用が利いたり、安心して事に臨めたりさせてくれるもののように感じます。

化学(またもCSのことでなくてご免なさい)について言えば、近代の約200年ほどに集成された知識が、メジャーな厚めの教科書10冊ぐらいで学べます。

どこの分野にも「これがメジャー。知らないとモグリ」といった感じの古典的教科書があると思いますので、そこから攻めていくのはどうでしょうか?

ラッキーなことに、はてなには学生のアルバイトの方が多数いらっしゃると思いますので、カリキュラムを知るのも、教科書を知るのもそれほど難しくなさそうです。

あるいは、id:naoyaさんのスタイルの勉強法を取り入れるのはいかがでしょうか?

あくまでid:naoyaさんのブログを多少読ませていただいての感想なのですが、naoyaさんは、領域を絞って、原典的なところまで掘って勉強されているように見えます。
数学のところまで戻らないといけないようなので、例えば「
Programming Collective Intelligence」のコードをRubyで書き直した、等とは質がかなり違いそうで、ハタから見ていてリスペクトするところ大です。

長文失礼。

ゲスト