最近、独学でも教えてもらってもダメ、プログラミングができない本当の理由という記事を読みました。EY-Officeでは2000年代初頭からプログラミングの教育を行っています。
ReactやRuby on Railsのような新しめの技術をプログラマーに教える事が多いですが、新人教育やキャリア・チェンジ教育など初心者に近い人にもプログラミングを教えて来ました。
その中で、プログラミングに関する興味深い問題にあたることがあります。そのような話をときどき書いて行こうかと思います。
DALL·Eで生成したプログラミング教育の画像
先生if文とwhile文の違いがわかりません
だいぶ前ですが、LEGOのプログラミング出来るロボットを使った新人プログラマー教育を手伝っていた事があります。
先頭にタッチセンサーを積んだモーターで動く車をプログラムでコントロールし、壁まで前進し、壁に当たっらバックして戻ってくロボットを作る実習をしている時でした。
ここでのプログラムは、JavaScriptで書いたら以下のようになります。
function main() {
setMotorDirection(Forward); // モータを前進に設定
startMotor(); // モータ起動
while (TouchSensor() != On) { // 壁に当たるとセンサーがOnになる
Sleep(0.5); // 壁に当たるまは何もする事がないので0.5秒スリープ
}
setMotorDirection(Backward); // モータを後進に設定
// モータの停止は人間が行う
}
ある受講者を指導しているときに「先生if文とwhile文の違いがわかりません」と質問を受けて驚きました。😅
受講者はこのロボットの教育の前にプログラミング言語の教育を受講していたそうですが、いざロボットを動かすプログラムを作ろうとして、どうしたら良いのかが分からなくなったそうです。
受講者は、以下のようなコードを書いて、動かずに悩んでいました。詳細は忘れましたが、図とかを書きながらif文とwhile文の違いを説明し、受講者は課題のプログラムを完成できました。
function main() {
setMotorDirection(Forward);
startMotor();
if (TouchSensor() == On) {
setMotorDirection(Backward);
}
}
帰りの電車内で考えた
「if文とwhile文の違いがわかりません」は妙に記憶に残り、帰りの電車の中でつらつらと考察してみました。
プログラマー以外の人にもif文は、分かりやすいのではないでしょうか。 仕事はもちろん、普段の生活でも人は頻繁に判断を行っています、「今日のお昼ご飯は、ラーメンにしようかカレーにしようか?」などのように。
しかし、プログラマー以外の人はwhile文のような状況でもwhile文のようには考えていないのではないでしょうか。
たとえば、傘を持たずに外出し、雨が降ってきたのでしばらくカフェで待つ状況を考えてみましょう。
日本語で書くと、以下のような感じでしょうか?
- カフェに入りコーヒーを頼み、席に座る
- 席に座りながら
- スマフォでSNSやニュースを読む
- ときどきコーヒーを一口飲む
- ときどき窓の外を見て雨が降っているかチェックする
- 雨が止んだら、コーヒー代を払いカフェを出る
プログラマー的には、2.の部分はwhile (雨が降っている) {
ですよね、しかし人はwhile(繰り返し)をあまり意識してないように思えます。
プログラマー的に言うと人間はイベント駆動で動作していて。上の例では、雨が止むイベントが起きるまでは、デフォルトタスク「スマフォでSNSやニュースを読む」を行っています。
また謎タイマーのイベントで、コーヒーを飲んだり、雨をチェックしたりしています。
ただし、このプログラミング実習ではリアルタイムOS等は使っていないので、while文でセンサーがオンになるのを待っています。
まとめ
人間の持っているメンタルモデルと、if文、while文のようなコンピューターの命令体系とは必ずしも一致していなように思います。
プログラミングに慣れてくると、人間の考えや自然言語で書かれた仕様を、コンピューターの命令体系(プログラミング言語の体系)に変換できるようになります。
しかし、初心者には変換するのが難しいものがあるのです。