Just do IT

思うは招く

「Learn Better」を読んで、効率の良いプログラミング勉強法を考えた

「Learn Better」という、勉強に関する本を読んだ。 「効率が良い学習方法は何か?」を突き詰めた本で、あらゆる学術論文からヒントを導き出している。

今回は読書メモに加えて、自分がいましているプログラミングの勉強法にどう応用できるのかを考えてみた。

結論

Learn Better を読んで、プログラミングを効率よく学ぶ方法を考えた。

  • ブログを書く
    • 自分で考えた問題を解いてアップし、説明する
    • 読んだ本の内容を自分の言葉でまとめる
    • 自分がミスったことを細かく記録する
  • 自分でアプリケーションを作り、発表する
  • 外部の意見を取り入れる
    • コードレビューをしてもらう
  • 教える
    • スタックオーバーフローなどのプログラミングコミュニティサイトで回答してみる
    • ブログでわかりやすく解説した記事を書く
  • 思い出す
    • ブログを定期的に読み返す
    • ブログを定期的にリライトする

つまり、ブログは最強の学習ツール。

学習時に注意すべきこと

学習を効率化するうえで、最低限抑えておくべき考え。

効果の薄い勉強法

これらの勉強法は効果が薄い。

  • 蛍光ペンを使って文章をなぞる
  • 同じ資料を繰り返し読む

なぜダメなのか。それは、「頭を働かせる活動を促すには至らない」から。 「こんなんじゃ頭使ってるうちに入らないから、勉強の効果は薄いぜよ」ということ。

では、どのように資料を読むのか。

Learn Betterの考えとしては、違う資料を順番に読むのが良いそう。 たとえば、プログラミングでRubyの勉強をしたい場合、A、B、Cという本を用意して、それをA→B→Cという順番で1回ずつ読む(やっていく)。

Aをマスター→Bをマスター→Cをマスター、という順番ではダメ。

違う本を連続して読むことで脳が連続性を理解して、頭に残りやすくなるのだとか。 これを最低でも3周はする。

ちなみに、速読に効果があるというエビデンスはないそう。 その分野の前提知識が多ければ、その本を読むスピードは自然と早くなるとのこと。

前提知識が必要

何かを学ぶには、前提となる知識が絶対に必要。 よって、その前提知識をまず身につけたり、継続して勉強する必要がある。

プログラミングの勉強なら、アルゴリズムについてだったり、その言語そのものの文法だったり。 私はこれを知ってから「Ruby基礎問題100本ノック」を開始した。

学習はむずかしくて当たり前

学習にコンフォートゾーンはない。また、学習のコンフォートゾーンは絶えず変化する。 学習が毎回苦労をともなうものとならなければいけない。

苦しくなければ簡単すぎるので自分の身になっていない。 自分のスキルより、少し背伸びしたレベルで学習しなければならない。

とはいえ、やってることが今のスキルレベルとあまりにも離れていたら、途方に暮れてしまうので注意。人は新しいことを学習するとき、簡単すぎることか、難しすぎることをめざしがち。

成果ではなく習熟度を測る

「自分がどれだけ伸びたか」に注目すること。

マイナス思考はウイルスのように短期記憶を破壊する。 習熟度を目標にするとマイナス思考を振り払うことができる。

短期記憶の仕組みを理解しておく

何かを新しく学ぶときは短期記憶が働く。

短期記憶はふとしたことで邪魔されて働かなくなる。

歌詞がある音楽を聞いたり、ツイッターを見たり、YouTubeを見ながら勉強はできない。スマホが視界に入るだけで集中力は下がる。短期記憶を邪魔するものは遠ざけておくこと。

頭の良し悪しは、産まれた時点では確定していない

知的能力はあらかじめプログラミングされていない。 つまり、頭の良さは後天的に伸ばせる要素だということ。

「俺バカだからな〜」は言い訳。

どんな方法で学ぶと効率が良いのか?

著者いわく、学習という活動は、大きく6つの段階に分けられるという。

  • 価値を見出す
  • 目標を設定する
  • 能力を伸ばす
  • 発展させる
  • 関係付ける
  • 再考する

これらが上から下に順番に起こるのではなく、それぞれが同時に発生することもある。

学習内容に価値を見出す

まず、「学習対象が自分に関連性がある」と思わなければならない。 そうすることで「学びたい」というモチベーションが湧き、学習が続く。自発的にというのがポイント。やらされてるのでは意味がないし、続かない。

では、「自分にとって価値がある」という感覚を得るにはどうするか?

  • 報酬
  • 目新しさを感じる
  • 背景情報を知る
  • 生来の関心

仕事に必要で、「それを身につけたら報酬が上がる」ものは価値を見出すようになる。資格を取ったら給料が上がる、みたいな感じ。

目新しいものは、たとえば今なら機械学習VRなど?

能力を伸ばすフィードバック

能力の習熟度を高めるにはフィードバックがおすすめ。

フィードバックには2種類ある。

  • セルフフィードバック
  • 外部のフィードバック

セルフフィードバック

セルフフィードバックの方法としては、モニタリングがある。

  • 自分の行動やミスを詳細に記録する
  • メモや動画にして残す

つまり、やったことをテキストや動画にして残し、見返すということ。ミスを記録すると再発度が低くなるという研究結果もある。 ちなみに、減量を成功させるのは、何を食べ、今の体重がどれだけあるか把握している人とのこと。

外部のフィードバック

どんなに優秀でも人は自分のミスには気づきにくい。自分でモニタリングしても無理な時がある。そんなとき、外部から指摘してくれる他者が必要。そこで価値があるのが、「教育者」からの的を絞ったフィードバック。細かく的を絞るのが大切。

外部からのフィードバックな屈辱的な場合もあることを理解しておく。一流の職人でも、「なぜ粗探しをされなきゃならないんだ!」と感じてしまうもの。

また、フィードバックの先には苦労が待ち受けていると覚悟する。スキルを伸ばすためには大変な思いをして、気を張り詰め、多少なりとも自分を追い込む必要がある。

「学習は楽しみではなく、苦痛をともなうもの」 〜アリストテレス

どんな天才でも必ずミスをする。ミスが好きな人などいない。強烈に痛いし、恥ずかしく、自信をなくす。何年も頭を離れなかったりする。ただ、絶対に起こるので観念しなければならない。

悪いフィードバックとは?

  • 悪いフィードバックとは、答えをそのまま教えてしまうこと
  • 良いフィードバックとは、知識レベルに合わせたヒントを教えること

単純に答えを教えるのはもっともやってはいけない。自分で考えなくなる。効果の高いフィードバックは、気づきと共に結果を生み出すための体系的な方法を教えてくれる。

まず、答えが間違っていることを指摘し、なぜ間違っているか詳細を説明する。人は説明を求める性質があるため、考え方へのフィードバックも行う。

次に、答えにたどり着くまでの軽いヒントを与える。それでも相手がわからなければ、ヒントを徐々に与える。

ただし、相手の学習が進んできたらフィードバックは控えめにして、学習者が頭を働かせて理解を形成し、自分で答えを考え出せる。

思い出す

効率よく学ぶには、学んだことを思い出すことが大事。

とある研究で、

  • 文章を4回読む
  • 文章を1回読み、3回思い出す

といった実験をしたところ、後者のほうが、はるかによく文章を覚えていた。 情報は繰り返し読むのではなく、繰り返し思い出すことが重要。

方法としては、自分に問題を出す、自己テスト方法がある。 ただ、ポイントは自分に問題を出すことではなく、思い出す手間をかけることにある。

だから、学校の定期テストも本当は毎回小テストを知識を定着させるのがよいとのこと。

・自己テスト例

例えば、登山にアイゼンを使うのはなぜか?と自問してみる。プログラミングなら、なぜこのライブラリを使うのか?なぜここにこのコードを書いているのか?このコードの意味は何か?などと考えて、自分なりの答えを出す。

スキルや知識の習得が上手な人は頭の中で頻繁にはこのようなテストをしている。

「なぜこれが正しいのか?」 「これは他の概念とどのようにつながるのだろうか?」

わかりやすく教える

人にわかりやすく教えるには、自分が深くそれを理解しておかなければできない。 SHOWROOMの前田裕二さんは、英語を学ぶとき、英語講師のアルバイトをしたというが、まさにそれだと思った。

理解した内容を自分なりの言葉でまとめられると、知識として定着する。

学習は全身で

脳は視覚的な器官なので、五感をフル活用して学習する。 においを嗅ぐ、触る、舐める、見る、図に描く、映像にしてイメージするなどなど。

とにかく体を動かさないとダメ。そういえば、ドラゴン桜で卓球しながら勉強してなかったっけ?

謙虚さ

「自分はわかっている」と思ったらダメ。それ以上勉強しなくなる。

常に自問自答する。

  • 「自分はどれだけよくわかっているのか?」
  • 「わからないと感じるところはどこだろう?」

カーネギーメロン大学のある教授は、講義の後で次の課題を出す。

  • 自分は何を学んだか?
  • 理解しづらかったのはどこか?
  • わからないと思えるのはどこか?

これらに答えさせることで、知識の定着をする。

まとめ

  • ブログを書く
    • 自分で考えた問題を解いてアップし、説明する
    • 読んだ本の内容を自分の言葉でまとめる
    • 自分がミスったことを細かく記録する
  • 自分でアプリケーションを作り、発表する
  • 外部の意見を取り入れる
    • コードレビューをしてもらう
  • 教える
    • スタックオーバーフローなどのプログラミングコミュニティサイトで回答してみる
    • ブログでわかりやすく解説した記事を書く
  • 思い出す
    • ブログを定期的に読み返す(知識定着)
    • ブログを定期的にリライトする(自分の間違いに気づける)

つまり、ブログ最強。