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

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

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

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

12 Comments

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

  2. それが実現できるならその通りだと思います。

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

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

  4. ずぶの素人ならば、実現できるならその通りにしたほうがいいと思います。

  5. 通りすがり

    2009-05-25 at 00:17

    大学のコンピュータサイエンスのカリキュラムを入手し、それを踏襲してみるというのはいかがでしょうか?

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

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

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

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

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

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

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

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

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

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

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

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

    長文失礼。

  6. > 体系的な知識や技術を身につけたいと思っています。

    私も。自分が知りたいなと思うことは大抵、既に誰かが考えて整理してくれていますからねー。

    参考までに体系的な知識を身に付ける私のやり方をば:

    1.自分で目次を書いてみる
    2.書いたものをじっと見て、既存の体系に属していないか検討する
    3.属していたら、その分野の本を買って勉強する
    4.1へもどり、目次が洗練されていく

    まあ、主さんと同じようなやり方だと想像します。ポイントはやっぱり目次を作ることで、思考が整理されることだと思います。これをやりだしてから、知識の吸収速度が加速を付けて増していく実感があります。

  7. 皆さんのご意見参考になります。
    が、個人的な感覚からすると「目次が書けている時点で、ある程度達成してませんか?」という
    感じがします。目次を書くには、ある程度対象についての大枠を理解しておく必要があります。
    目次が書けている時点で、いろんな知識の相関や位置づけについては掌握できているのではない
    でしょうかと。まぁケースバイケースではありますが。
    また、目次が書けない状況(細かいところは見聞きしたが、それらがどう関連しているかが自分
    で整理できない)であれば、やはり誰かについて学ぶのが一番早いですね。

  8. yorihito_tanaka

    2009-05-25 at 09:27

    教育機関で学習者に「シラバスを書かせる」ことがあります。実際にそれに基づいて講義を行わせるわけではありませんが目次を作るだけでも頭の整理になりますし、書かせる側としては「この人がどの程度自分の知識を体系づけたか?」を見る上で役に立ちます。

  9. 今から学ぼうと思っている事の目次を書けますか?

  10. 論理に支配されている観がありますね。

  11. inoue_moro

    2009-05-26 at 23:46

    体系を考える(目次)→各個別(項目ごと)に勉強する。という理論でしょうか?
    この場合の注意点は考えた目次(体系)が正しいかどうかをチェックする必要がでてきますよね?
    正しいかどうかの点は必要な情報が抜けていないかどうかと言うことでしょう。
    この方法では、余分な知識はあとで消せますが、足りないものは(知らないため)補えない気がしますので。
    知識の使用目的からそれていても体系的に覚えるためには、必要な情報がでてくる可能性がありますし、そもそも知らないことは目次にでてこない可能性があります。
    なので、ハウツー的には、くわしいひとに目次をつくってもらう(できるだけ情報の抜けをなくす為)。→個別に勉強する。このほうが効率的ではないかと言うのが結論でした。
    詳しい人を厳選しないと項目がかたよる可能性もあるのでどっちもどっちかもしれませんが・・・

    考えさせるすばらしい記事に感謝します。

  12. 論理に支配されている観がありますね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


© 2020 栗林健太郎

Theme by Anders NorénUp ↑