勝ち続けるための応用力の身につけ方を、自然にできるようになりたい
今までの自分は、解法を見つけるために本を読んだり、検索したりしていたのですが、結局は応用力がないと、いつ使うのかわからないという問題にぶち当たる。
(基礎大事!基礎大事!ってやっていてもこれ何に使うんだよ……ってなってツライ)
数学でも、行列で座標変換するのはこの公式でやればいいみたいなのを知ったときに、ゲームプログラミングでの応用例がなければどう使うのかとか、「数学とか難しいからいらない!」と考えたときもありましたが、今は数学知っているとすごく便利だし、楽しいと感じるようになってきた。
数学を勉強しようと思う時、巷に溢れている数学本はこのエントリで言うWikipediaの説明が多い気がする。
この例は、まさにWikipediaの思想と、調べる側の人間が求める説明とのギャップを端的に示している。
子供との会話の中で
「のこぎりってなあに?」
と質問されたら
「木を切る道具だよ。」
と、答えるだろう。
そして子供は納得し、さらに「どうやって使うの?」
と質問することだろう。
「こうやって使うんだよ。」
と、身振り手振りで説明すれば、子供なりに「のこぎりとは何か」を理解するだろう。
つまり、我々は、知らない道具を見せられた時に、
「それは何をするための道具なのか?」
ということをまず知りたい。
そしてそれから
「では、どうやって使うのか」
ということを知りたい。これが一般的な考えだろう。
一方 Wikipediaでは、そもそも「のこぎり」と定義される道具は、どのような性質を備えたものであるかを延々と説明する。
これが、Wikipediaの説明が「わからない」理由だ。
特に3Dゲームプログラミングには応用がきき、結果も出やすいし、新しい方法がどんどんGDCなどでも発表されている。数学以外ではGPUとかハード的な部分で最適化とかかけないといけませんが、まずは数学の土台を知らないと、最適化がしづらい印象があるし、どのときに使うかがわからないと宝の持ち腐れである。
そこで悩むのが、どのように学ぶべきもの(数学など)を応用できるように会得していけるのだろうかという点。
これを考えていくと、勉強するために勉強法を学ぶという、これも解答がない難しい部分にぶつかっていくのですが、俗にいう頭のいい人は、この応用できるようにする学び方が上手いのではないかと思える。
ただ、この方法は結果が出るのが遅い気もする。しかし、結果を焦るとろくな結果にならないと最近感じてきているのですが、試験で良い点を取る勉強は暗記勝負なので、良い点を取るという結果は追わないことにする。
なので数学の場合には、応用例から学ぶのは使う場面のイメージもしやすく、これを学んでどうすればいいかも考えやすいので、公式などから応用例を探す方法が良い気がした。それを実践していこう。
ただ、基礎を得るのにはまずは暗記が重要なのではないかという思いもある。
初めてやることに関しては、まず写経して、とりあえず動かす。そのうちに#include<stdio.h>の意味は分かるのではないかと信じて書く。
はじめからコンパイラを作る勉強しても、遠回りだと思う。結果、コンパイラが作れたとしても、プログラミングをする人の気持ちがわからなかったり、何かは足りない状況になりそう。あと、難しい分野になるので分からない時に質問できないのがキツイかな。
分からない状況を分かる状態にするのが、勉強するうえでの一番わかりやすい成長だと思う。学んだことをどう使うかは、いろんな状況のときにどうするべきか?という選択肢を増やす作業だと思う。
- 問題定義
- 解決法の列挙
- 問題に適した解決法の選択
上記の流れで、『解決法の列挙』が多く、『適した解決法を選択』できる能力がすごく大事。
そこを学ぶにはどうすればいいのか、俗にいう実際の試合のバッターボックスに立たなければバッティングは分からないというやつなのかもしれません。
ただ、何が問題がわからないというときもありますので、以下のエントリとかみたいに、今自分のできることは何か、表現したいことは何なのかとかをどんどん文字や言葉の情報として出していくのは大事だと思う。
まずは問題を認識し、解決策を模索、そして解決策を試したりして解決後、異なる方法を探ってみたり、違うことをやっていたときに見つけたりしてどんどん成長していくのがセオリーなのかなぁ。
そうなると、「この問題を解決する時にどうする方法があるのか?」という問題提起をどんどん出していき、実際に試していくのがかなり重要な気がしてきた。