仮説-検証が学習効率を向上させる

どうも皆様お久しぶりです。みこせんです。今回は学習効率の話・・・ではないんですね。どちらかというと、プログラミングに向いている人の思考傾向の話です。これ一朝一夕で出来ることではないので、「こうやれば学習効率があがるよ!!」なんてうまい話じゃないんですよ。ごめんなさいね。


さて、プログラミングを教えているとき、端からみたら覚えの早い人と遅い人がいます。その差はなにか、一般的にはすごくふんわりとした言い方で、「要領がいい」とか「地頭がいい」とか言われますが、それってなんなのでしょうか?


プログラミングを勉強するときに重要なこと

- 情報の適用範囲の幅を広げる

- 帰納的推論で法則を見出す

この二つです。以下に例を出しましょう。

【情報の適用範囲を広げる】

変数availableを定義します

上記解説を見たとき、まず変数というのはなんなのか、ということを考えると、中学校数学で扱う変数xやyなどと基本は同じということはわかりますね(わからない人はプログラミング辞めときましょう。他にも貴方に合う仕事はきっとある)。プログラミングでは文字一文字でなくても変数である、という形で適用範囲を広げてください

文字列型の変数strを定義します

向いてない初学者はこれを見てまず困惑しますねぇ。文字列型?変数?文字なのに数?どゆこと?って感じですね。ここが情報の適用範囲を広げるということ。向いてない人は変数には文字も含まれるのだ、という、今までの中学校、高校で学んだ知識外の定義にすんなり置き換えることが出来ないのです。

余談ですが「定義する?」ってなる人もいます。これも中学校、高校の数学の証明なんかでやりますよね。「点Pが池の周りを動く速さを時速x kmとする(おいそこの点P、止まれ)」っていうのと書き方は変わるけど意味は同じ。この有名な点Pを知らない人はちょっとプログラミング辞めて他の業種に行くための転職書類の書き方を勉強しましょう。海外の人はこの動き回る迷惑な点Pを知らないかもしれないけどね、それはまた別のお話ですから。

関数、というのも基本的に中学高校でやるのと変わりません。高校でやる以下の関数なんてほぼプログラミングの関数と同じだね。

f(x) = 3x + 4
y = f(2)

同じことをCの関数で書くと以下のようになります。

int f(int x) {
  int result = 3 * x + 4;
  return result;
}
 
 
int y = f(2);

ただし、プログラミングの関数は中学、高校の時とはちがって複数の式を内包させたり、条件で分岐したり、繰り返したりするわけですね。その、適用範囲の拡大がすんなりできる人は関数、引数、戻り値の理解が速いんですよ。


【帰納的推論で法則を見出す】

number型の変数aは以下のように宣言します
let a : number = 0;
let a : number;


boolean型の変数aは以下のように宣言します
let a : boolean = false;

上の説明を見たあと、以下の問いに答えられることが重要です

string型の変数strを宣言してください

自分で書いてて思うし、わかる人なら「何がわからないの?え?何が難しいの?」って思うんですけど、向いてない人はこれがまぁできない。おもしろいくらいできない。​で、理解できない人ってちょっとおもしろいこと言うんですよね。

「僕きちんと理屈がわからないと覚えられないんです〜」

ふっ(笑)。まぁ置いときます。


関数を用いた例では

関数は以下のように記述します。

void sample(int a){
  // do something
}

voidは戻り値がないことを意味します。sampleが関数名、括弧の中には引数が指定されています。

Q.文字列を受取り、整数に変換して返すtoInt関数を定義してください

まぁ上記のQに答えられず教えてくださいって言ってくる初学者の多いこと多いこと・・・

実際のサンプルの記述から、法則性を推論し、少し異なる課題が与えられても推論した法則性で試していける人、こういう人がプログラミングに向いています。目の前の事実となるサンプルを拡大できず、


「ありの〜ままの〜コード覚えるの〜よ〜♪」


ってやってる人はいつまで立ってもどれだけやっても無駄なのでプログラミング辞めましょう。きっと貴方が輝くステージは他の分野に存在するはずです。


プログラミングには上記のような数学に似た思考回路が必要です。

「私数学苦手なのよね〜」

そんなことを言い出す人が結構いますけどね。

・・・・ふっ(笑)

貴方が苦手なのは数学じゃなくて物ごとを深く考えること、つまり頭が悪いか知能が低い、または勉強してこなかっただけでしょう。数字の扱いじゃないのよ?


論理的思考とか言われたりするんですけどね、私これ嫌い。論理的思考と言われて紹介している本やサイトの記事、必ずしも論理的思考じゃないし、抽象てきだし、書いてる本人よくわかってないんじゃないの?って思うこと多いですもの。


さて、実は向いてる向いてないにはもう一段階あると思っています。それが以下。

- 自分の推論が必ずしも正しくなくても良いと思えること

数学的なものの考え方って、理解するためのツールなのですよ。で、以前の記事にも書いたように、我々エンジニアは「技術を使って作る」が第一歩であって「正しく理解する」が最重要事項じゃないんです。


学習者が稀に以下のような質問をしてきます。


学習者 > つまり〇〇っていう解釈で良いですか!?

私の心の声 > シラネーヨ。


初学者の推論はほぼ間違ってます。全てに通じる一つの法則なんてないんですわ。だからあくまで推論の目的は納得して覚えるため。ここ履き違えて真実に辿りつこうとするのは、「近所の公園の通称仲良し山を登れない人が富士登山をしようとする」に近い(富士山登るのさほど辛くなかったけどね。寒いけど)。


中学高校では法則としてあてはまらないケースがたくさんあることをあえて伏せて、それが全てに通じる真実かのように物事を教えることがありますが、それと等しいです。まず身近な理解しやすい対象だけに範囲に絞って法則付けをしましょう。その後、反証的な事象には必ずぶち当たるので、自分なりに付けた法則を修正しましょう。これが出来る人はサックサク進む。出来ない人は真実を追いかけて最悪の場合フォースの暗黒面に堕ちていきます。さようなら。


と、まぁ色々言ってきましたが、私自身上記のような思考を鍛える、という意味で、誰でもプログラミングに一度は挑戦して良いと思っています。ただ最初からそれを使った報酬を求められると、「社会人辞めますか?それともプログラミング辞めますか?」って聞きたくなります。向いてないという言動に心当たりがある人はまず基礎力付けろな?極論言ってしまえば、向いてなくてもやりたいならやってみれば良いさ。向いてないって言われて辞められるくらいの興味だったら、最初からやらないほうがいいぞ。別に何に興味を持つのかは人それぞれ、「みんな違ってみんな良い」なのだから、大した興味がないから長続きしなかった、って別にバカにされたりけなされたりするような話じゃないからね。


それでは皆さん、今回の話は以上となります。引き続き楽しいエンジニアリングライフをお送りください

...そろそろ技術的なアウトプットの記事を書かないと、こいつただの偉そうな人だ、って思われそう…


ごきげんよう。あでぅ!



この記事が気に入ったらサポートをしてみませんか?