視座を上げ下げしてみると勉強が捗る話
プログラミングを学習して3ヶ月ちょいのサラリーマンです。
今回は僕が未知なる分野でプログラミングを勉強してみて感じた、「新しいことを学ぶには、レベルを上げ下げしながら学ぶと良い」みたいな話をします。
最初に言っておくと、「レベルを上げ下げ」というのは、「簡単にする・難しくする」という話ではありません。「視座」と言うほうが近いかもしれません。
視座とか具体・抽象とか
よく、「視座が高いほうが良い」とか、「もっと具体的に話してくれないと困る」とか、「きみの話はいつも抽象的だな」とか、一定のイメージを伴って扱われる言葉たちがあります。
「視座が高い」ということは、ものごとを抽象的に見ることと近いでしょう。
逆に具体的であるためには、そのものごとに対して視座を下げていく必要があります。
具体的に捉えるか、抽象的に見るか、どちらが良いのでしょうか。
具体的な勉強
まず極端に具体的なケースについて考えてみましょう。
プログラミングの学習において、「具体的」な勉強とは以下のようなイメージです。
rubyにおいてメソッドはdef ~ endで囲む
入力された値を受け取るにはgets を使う
条件分岐を記述するには、 if,elsif,elseを使う
配列を表すには[]を使い、ハッシュを表すには{}を使う
このように細かい内容を覚えていくことで、徐々にプログラミングができるようになっていく、という面はあります。
しかし、このレベルの学習だけではなかなか実践的な力は付きません。
ここで誤解のないように定義しておくと、「レベル」という言葉は「ポケモンのレベルが高い」といった意味合いではありません。
「部長のレベルで判断してよい案件だ」とか「社長のレベルまでエスカレーションしないといけない」のような、純粋な高さの話です。
つまり、「具体的」「抽象的」を言い換えると「レベルが低い」「レベルが高い」と表現できます。
具体的な勉強だけをしていても、実践的な力をつけるのは難しいでしょう。
例えるなら、英単語を大量に暗記しただけでは、アメリカのSUBWAYで野菜を抜いてもらう注文はおそらく出来ないだろう。ということです。
ちょっと抽象的な勉強
抽象的な例を見ましょう。
勉強において「抽象的」なレベルは、いわば「まとめ」のようなものです。
RailsではMVCアーキテクチャによって、データ処理やアクションの呼び出し、画面の描画を行っている
Rubyのメソッド内で定義された変数はメソッド外で呼び出すことができない。これによってメソッド内部の変更がアプリの他の箇所に影響することを防いでいる。
メソッド内外にデータを受け渡したい場合は、引数を用いて変数をやりとりする。
なんとなく「全体」の話をしているイメージが伝わるでしょうか。
こういったまとめを作成するのも、効果的な学習の一つです。
ちなみに、この抽象化はもっと上のレベルがあります。
もっと抽象化
上記の例をさらに抽象化すると、このようになります。
仕事のあと、2時間勉強した
1週間に23時間勉強している
今月はめっちゃ勉強した
このへんまでくると、もう細部の情報は消え失せ、聞いても特に何もわからない、いらん情報になってしまいました。
これが、「抽象的な話」が嫌がられる理由の一つかもしれません。
具体と抽象を往復しながら勉強するのがいい
具体的すぎたら「英単語フル暗記マン」になってしまいます。
逆に抽象的すぎたら「なにかをすごい勉強しているっぽい人」になってしまいますね。
ではどうすればいいのか。
答えは簡単です。「往復」するのです。
例えばこんな感じ。
今日は3時間勉強した(超抽象)
RubyのMVCについて学んだ(やや抽象)
Mはモデル。データのやり取りや更新を担当する(具体)
モデルはmigrationファイルに記述し、rails db:migrateを使ってテーブルを生成する(だいぶ具体)
Vはビュー。ブラウザに表示する内容を記述する(まぁまぁ具体)
ビューファイルはERB形式で、HTMLの中でRubyの計算を使うことで動的なHTML生成が可能(具体)
ERBでは<%= %>や<% %>といったERBタグを用いてRubyのコードを記述する。=があると描画され、無い場合には描画されず計算のみ行う(だいぶ具体)
Cはコントローラー。ルーティングに則りリクエストに対して指定のアクションを呼び出す(まだちょっと抽象)
MVCアーキテクチャを正しく使うことで、ファイルごとの役割が明確になり、Railsを書く人全体の認識が概ね揃うことでプロジェクトに参画したばかりの人もアプリの構造を理解しやすい(結構抽象)
Ruby on Railsってよくできてるなぁ(超抽象)
(Rails初見の時を思い出しつつ)
なんか、すごく全体的によく理解していそうな気配がしませんか?
具体だけ・抽象だけ・の報告よりも、「具体と抽象を往復」して理解を進めていく方が、全体観の把握と個別の認識の両面を同時に深められるのでオススメです。
新しい概念を学習するとき、「どの具体・抽象レベルの話をしているのか」をイメージしながら進めると把握しやすいです。
で、恐ろしいことに、仕事がデキる人はトレーニングによって/あるいはセンスで、こういうことをちゃんとやっています。
もう確立されていたノート術
具体的・抽象的に学習対象のものごとを掴みに行くことを応用したメソッドは、すでに有名なものがいくつかあるようです。
例えば「コーネル式ノート術」というノートでは、まず一般的な内容・問題や板書などをノート中央のブロックに取ります。
次に、ノートの左側に設けたエリアに「書いた内容に対する自分の質問や、想定される問題など」を書きます。これで、ノートの内容を1段階「具体化」したことになります。
さらにコーネル式ノート術では、ページ下部に「このページのまとめ」をする欄があり、そこに「3行くらいでまとめる」という方法となっています。
3行くらいでまとめるためには、当然ノート全体の内容を抽象化する必要があります。
「具体化」「抽象化」の作業には一定の理解度が必要であるため、「わかった気になりにくい」「わからない点が浮き彫りになる」というメリットがあります。
詳しく紹介されているサイト貼っときます。
https://studyhacker.net/columns/cornellnotebook-method
ということで、時間がない社会人が勉強するときに、同じ時間でもより理解度を高めることができそうな勉強法について、実体験ベースで書きました。
実際にこれまで3ヶ月、マッタクワカラン状態からプログラミングを勉強してきて、「勉強法をいろいろ試行できること自体」を楽しんでいます。
これもある意味抽象化ですね。
今日はここまで。最後までお読みいただきありがとうございました。
この記事が気に入ったらサポートをしてみませんか?