数学が苦手な人にプログラミングを教えるときにGoogle Formが役立った

関数と型がむずかしい

以前、数学が苦手な人にプログラミングを教える機会がありまして。「こう書けばこう動くよ」と言うのは簡単なんですが、そのときは彼が自分で考えてコードを書けるようになる必要があったので、理論的な話から丁寧に教えていました。

それで彼がものすごく引っかかったポイントがあって。それが「関数」と「型」についてです。

関数というのはあの f(x)=3xみたいなやつで、型というのは「このデータは文字列型です」「このデータは数値型です」といったような「情報の集合」のことを指します。どちらも別にプログラミング特有の概念ではないのですが、数学が苦手だからこそこういう抽象的なハナシが難しかったらしく…。「字面では理解しているんだけど、どうにも、ねぇ」という感じで、なかなか自分で自由に扱えるようにならなくて困っていました。

自分が勉強したときはわりとすんなり理解できたので、私はその人が何で躓いているのか理解できてなかったんですね。あれこれ説明を試みるんですけどどうも伝わらない。これはもう、理論的な説明とかじゃないんだなと思って、今度は日常生活のあらゆることを関数と型に例えてたんです。人間はう◯こ関数だよ〜とか言って。

それでひとつ、劇的にハマったものがあって。それがGoogle Formだったんです。

Google Formを例にしてみる

たしか、こういう会話をしていました。

私:例えばさ、フォームの回答者が高身長かどうか判定したいとするじゃん。

彼:うん。

私:身長いくつですか?って質問をつくるとして、どうやって高身長かどうか判定する?  

彼:身長178cm以上だったら高身長って考えるかな。

私:それってさ、頭の中で「この数字は身長178cm以上か」っていう判断をしてるってことじゃん。

彼:うん。

私:つまり君の頭の中にはこういう高身長判定関数があるってことなんよ。


高身長判定関数 () {
  // 身長が178cm以上かどうか判定するなんらかの処理
}

彼:あー、うん

私:でさ、回答者が高身長かどうか判定するために必要な情報あるじゃん。

彼:回答者の身長ってこと?

私:そうそう。その情報をここにこうやって書くんよ

高身長判定関数 (身長) {
  // 身長が178cm以上かどうか判定するなんらかの処理
}

彼:あー、なるほど?

私:でさ、身長ってどういう種類の情報なんだっけ?短文回答?チェックボックス?

彼:いや、数値だね

私:そうだね。そういう場合、引数の「身長」に型をつけるんよ。今回は数値型だから number

高身長判定関数 (身長:number) {
  // 身長(数値型)が178cm以上かどうか判定するなんらかの処理
}

彼:あー、たしかにね。

私:これでまあ、関数の定義ができたわけ。ざっくりまとめると、関数をGoogle Formっぽく定義するとしたらこんな感じになるのね。

関数の名前 (質問で聞き出したい情報:質問形式) {
  // 回答してもらった後にこちらがやりたいこと
}

彼:んー、なるほど。

私:でさ、関数は呼び出さないと使えないじゃん。Google Formでいつ関数の呼び出しが行われているかって言うと、それは質問のときなのね。

彼:ほう?

私:Google Form開いたときってさ、最初こんな感じで空欄になってるじゃん

Screen Shot 2022-10-24 at 12.16.28

彼:うん、そうだね

私:それって、さっき定義した関数がこんな感じで置いてあるイメージなのよ

高身長判定関数() 

彼:ほう?

私:でもこのままじゃうまく作動しないわけ。なんでかわかる?

彼:「身長」が入力されてないから?

私:そうそう。じゃあ回答者がこんな感じで身長を入力してくれたとするじゃん。

Screen Shot 2022-10-24 at 12.18.24

彼:うん

私:この状態は、さっきの関数で表現するとこんな感じなのよ

高身長判定関数(176) 

彼:あー!そういうことか!

私:そうそう。この状態になるとうまく関数が発動できてるってわけ。

彼:たしかに。176cmの情報があるから、「この人は高身長ではないな」っていう判定ができるわ。

私:そうそう。で、まあ、Google Formだとありえないかもだけど、仮に「身長いくつですか?」に対して「私は高身長です」っていう文で回答してくる人がいたとするじゃん?

彼:うん(?)

私:そうすっとこんな感じになるのよ

高身長判定関数('私は高身長です') 

彼:困るね。

私:そう。なんで困る?

彼:こっちは身長を数値でもらわないと判定できないのに、文字列の情報をもらってるから。

Screen Shot 2022-10-24 at 12.17.55

私:そうそう!そういうこと!だから関数の定義のとき、処理に合わせて引数、つまり質問の回答の型を指定したってわけ。

高身長判定関数 (身長:number) {
  // 身長(数値型)が178cm以上かどうか判定する処理
}

彼:なるほどな〜。

私:ちなみにだけどさ、身長が178cm以上かどうか判定するだけなら他の質問の仕方でもいけるよね?

彼:というと?

私:例えば、「あなたの身長で当てはまるものを選択してください」って質問にして、「168cm、168178cm、178cm~」みたいなラジオボタンを用意できるじゃない?

Screen Shot 2022-10-24 at 12.18.10

彼:あー!そういうこと。

私:これだとさ、質問の型とやりたい処理がちょっと変わってることわかる?

彼:うん、なんとなく。こういうこと?

高身長判定関数 (身長:ラジオボタン型) {
  // 3番目の選択肢が選ばれているかどうか判定する処理
}

私:そうそう、イメージはそんな感じ!他にも「あなたの身長は178cm以上ですか?」で「はい・いいえ」で答えてもらうとかもできるよね。

彼:たしかに。

私:だからさ、自分のやりたい処理・やりやすい処理に合わせてデータ型を考えていけるといいよね。関数は自由に作れるからさ!

彼:おおー、そういうことかー!

もし自分がこういう説明を受けてドンピシャで理解できるのかと聞かれたら、ちょっとイマイチな気もするんですが…。とにかく彼には大ハマリしたようで、その後は「やりたい処理を考えて、質問を用意する。質問形式(型)も考える。」というステップで関数と型を扱うことができるようになりました。

これだけの話なんですが、もし数学が苦手な人にプログラミングを教える機会があったら参考にしてください。

Please Share

この投稿が参考になったらぜひシェアしてください。 あなたの感想がBoctozの力になります😊