何かむつかしそうなことを理解するときの自分の思考回路
Javaを、というか初めてプログラムと言うものを学んだ時、比較的周りの人よりも理解が早かった。
何も恐れずに自慢すると、人よりも多少か賢くてロジカルなんだろうけれども、それ以外の理由があるなということに気が付いた。
実際理解はしていない
Javaを勉強していると最初につまづくのはオブジェクト指向だと思う。
インスタンスを生成したりstaticしてみたり、スーパーに親が子でサブで継承してみたり……。
別につまづくことなく書き方を覚え書けるようになった。周りがインスタンスとは……?と苦戦しているなかスイスイ先に進んだ。
が、別にオブジェクト指向自体をその時理解できていたわけではない。オブジェクト指向って結局何で何が嬉しいねん、というのを理解したのは多分一年から一年半経ってから。
ただ、それだけの時間が経ってからでも挫折せず理解するに至ったのには自分なりの理由がある、と思う。大体オブジェクト指向で挫折するって言うじゃない?
はぁ~ん、なるほどねと思っておく
それに気が付いたのははてなのホームページにあがっていた以下の記事を拝読したとき。
まず三角関数が何かを完全に忘れていたし、点を回したい欲求も今のところないので一旦スルーしていたが、急に気になって読んでみた。
三角関数をつかえば点を回せるよ、というのをものすごく丁寧に説明してくれている。すごい面白い。三角関数で遊べるページもあるし。
そこで私は三角関数についての説明の以下の文を読んだとき、
実際のところ、サインコサインとはなんでしょうか。
(中略)
これに答えるのは簡単です。これは長さです。cosθとsinθは、半径1の円(単位円)上で、角度θのところにある点の、x座標の値(横の長さ)とy座標の値(縦の長さ)です。
↑これ あとはこれも↓
直角三角形における「斜辺」と「横の辺」との比がcos、「斜辺」と「縦の辺」との比がsinである、と。
つまり最初はサインとコサインを「長さの比」として習うわけです。だから「結局それってなんの量なの?」ってなっちゃいがち。でも実はこの二つ(「長さの比」と「長さ」)ってほぼ同じことを言っているのです。二つの長さの比って、どっちかを1に固定してしまえば一つの長さになります。
「二つの値の比とは、一方が1のときのもう一方の値である」という言い方もできるでしょう。
「はぁ~ん、なるほど」と思った。「へぇ~、そうだったのかぁ」と。
で、2秒くらいしてから、「なるほどとか思ってるけど、実際ちゃんと理解してる?お前」と自問自答した。
してない。
全く何を言っているかわからんわけではないが、ぼやぼやとした理解でしかない。
「はい、じゃあこれを自分なりの言葉で説明してください!」
とか言われたら、「えっとぉ、んっとぉ、ボクちゃんスライムよ」なんて言い出しかねないくらいにはわかってない。
が、これこそが私が何かむつかしいことを理解するために必要なことだと気付いた。「ボクちゃんスライムよ」と混乱することではなく、「ほぉ~ん、なるほどね」と思うこと。
難しくてわからないものというのは、苦手意識を持ちがちだ。「私にはわからない、だから私には向いていない」と遠ざけてしまう。しかし、それは勿体ない。「わからないけど、いいものだ」と思っておけば、いつかまた興味が出てきたときに再スタートしやすいだろう。
「へぇ、なるほどな」と思っておくことは苦手意識を持たないようにするための一種の工夫である。別にそうだと意識して思ってるわけではないけど。
「なるほど」というポジティブな感情を、頭に刷り込むことで実際理解できていなくても「私はこの分野に少なからず関心を得ています」という暗示ができる。「わからないけど、ちょっとだけわかる」と思っておけば、「向いてない」とはならないはず。
Javaの学習をしていたときも、「int n = 1 + 1」の n を出力して2が表示されたとき、理屈はわからなくても「ほーん、なるほど、こいつぁすげぇや」と思ったものだ。
自分が理解できたところを理解しておく、他は知らんぷり
なるほどと思ってポジティブな感情を植え付ける以外でも、なんとなくやっていることがある。
それは、理解できたところは大事にして、わからないことがあっても一旦後回しにすることだ。
理解できるまで先に進めない、階段形式で学ぶのではなく、進んではまた前やったところに戻る、なんだ、一歩進んで二歩下がる的な、違うか。スパイラル形式というと聞こえがいいか。
わからなくても理解できる部分はあるはず。上のサインコサインの文も、どう考えても「サインコサインは長さである」というのはわかるはず。
そこで、「サインコサインが長さってどういうこと?」とか「だから何?」とか思ってしまうと、もう「わからない!」「サインコサインのこと何一つ理解できない!」となってしまう可能性がある。
そうじゃなくて、言いたい。「落ち着け、「サインコサインが長さ」という一点に絞ればわかっているはずだ。理解できているぞ、君は」と。
理解できた部分が少なからずある、という理解が非常に大事だ。何もわからないなんてことはないよ。それが自信につながっていくのさ。
そしてもう一つ、わからないことは一旦後回し、について。
Javaはオブジェクト指向で足踏みしがちだ。例えば、staticってなに?いつ使うの?全部staticじゃだめなの?なのためにこいついるの?となる(少なくとも私の周囲では)。
しかし私は別にそこは気にしなかった。へぇ~、インスタンスを生成しなくても使えるんだなーと思い書き方しか覚えなかった。
だいぶ経ってから、staticがある意味や、有用性を知った、というか理解できた。
当然、初めて学習した段階でそれを理解できた方がいいだろう。そりゃそうだ。
だが、そこでなんだかよくわからず調べても小難しいことばかり書いてあってさらに謎が増えて、先の学習を進めることもできないし、もうプログラミングなんてやだー!となる可能性があるのなら、書き方覚えたんならそれで先に進むのは、今後も学習を進めるのであれば悪いことではないと思う。
staticってなんだかわからないけど、書けるし動くから!と思っていれば苦手意識も生まれない。
もういや!何に使うかわからないものばっかり!となると、もうプログラムなんてできやしない。
とかやってるうちに本当に覚えていく
とかっていい加減なことばかりやっていても、振り返ることさえやればいい加減だった理解が本物の理解になっていく。
先ほどの三角関数の記事も、一読しただけでは「ほぉ~ん、面白いなぁ」で終わってしまったが、繰り返して読んでみるとどんどん何を言っているかわかってくる。
わからない!と思いすぐブラウザバックしていたらこうはならない。
いい加減なままの理解で先に進むのは、ある程度その分野に関して分かるようになってからまたいい加減だった場所に帰ってくること前提だ。そら、上で書いたような、「書けるし動くから!」で終わってしまったらプログラマーとして問題である。
きちんと帰ってくることで、最初はベースが0だったから全くチンプンカンプンだったものが、その時には2くらいになっていれば頭にも入ってきやすい。
大切なのは面白いというポジティブな感情
何かを学ぶときに大切なのは、やっぱりポジティブな感情だと思う。
わからないけど、わかる所はある気がする!とか、
わからないけど、これは面白いものなんだ!と思うと、
なんだか学ぶのが楽しくなってくる。
楽しく学びたいはず、誰だって。
こういう考え方は大人になってから身に着いたものだが、もし高校生の頃などにこう考えられていたら数学はもっと楽しくなっていたかもしれない。理科とかも。
しかしこういうのは自発的に思わないといけないと思うので、強制してもしょうがない。
ただ、思ってもいないのに「なるほど」ととりあえず難しい顔をして頷くとなんだかおもしろいのでそれだけでポジティブに勉強が進められると思う。「何がなるほどだよ」となる。
あと、多分心の中で思うにとどめた方がいい。うざいやつになりそうだから。
って長々書いたけど、勉強するのは今でもすげぇ嫌い。