EY-Office ブログ

人は動いて欲しいと思うコードを書く(プログラミング教育の雑談シリーズ)

2022年最後のブログは「プログラミング教育の雑談シリーズ」です。

多くの日本人は日本語を話すさいには、日本語の文法など全く考えずに会話していると思います。人間に対しての会話は文法的に問題があっても、たいていの場合は正しく解釈され問題なくすごせます。

しかし、現在のプログラム言語は文法的に正しくないとエラーになったり、おかしな動作をしたりします。
教育の現場でよくみる間違ったコードに付いて考えてみたいと思います。

未来 AIピカソで「人は動いて欲しいと思うコードを書く」を描いたよ! #aipicasso

値の範囲内チェック

変数xの値が1〜5かチェックするコードを書かせると、プログラミング初心者には以下のように書いてしまう人が多いです。

if (1 <= x <= 5) {
  console.log("OK");
}

Pythonではこれで良いのですが、RubyやJavaではエラーになります、またJavaScript, C言語では正しく動作しません。😅

JavaScriptでは、まず1 <= xが実行され結果はxの値によりtrueまたはfalseになります。そしてtrue <= 5false <= 5共に結果はtrueになります。
不思議ですが、JavaScriptでは暗黙の型変換が起こり、true <= Boolean(5)true <= truefalse <= Boolean(5)false <= true として解釈されるからです。

正しくは、以下のようになります。ここでは論理演算も含まれて初心者にはかなり難易度が高いですよね。

if (1 <= x && x <= 5) {
  console.log("OK");
}

状態やタイミング(時間)は難しい

プログラミング教育の雑談シリーズの第1回先生if文とwhile文の違いがわかりませんで取り上げたLEGOのプログラミング出来るロボットを使った新人プログラマー教育の続ですが、先頭にタッチセンサーを積んだモーターで動く車をプログラムでコントロールする話の続きです。

最初止まっているロボットのタッチセンサーを押すと走り出し、再度タッチセンサーを押されたら止まるプログラムを書く実習は、以下のようなコードを書てしまい悩む受講者が多数います。

function main() {
  // 最初はモーターは止まっている ①

  // タッチセンサーがOnになるのを待つ ②
  while (TouchSensor() != On) {
    Sleep(0.5);
  }

  // モータ起動 ③
  startMotor();

  //  現在、ロボットは走っている 🚗

  // 再度タッチセンサーがOnになるのを待つ ④
  while (TouchSensor() != On) {
    Sleep(0.5);
  }

  // モータ停止 ⑤
  stopMotor();
}

素直に「①最初止まっているロボットの②タッチセンサーを押すと③走り出し、④再度タッチセンサーを押されたら⑤止まる」仕様をコード化してます。

しかし、このコードでは動きません❗

制御系のプログラマーの方は、直ぐに判ると思います。タッチセンサーがOnの時間は人間の感覚では瞬時に終わるように思えますが、コンピューターに取っては凄く長い時間なので、②でOnになった後③を実行し、直ぐに④に達します。
この時点でタッチセンサーはまだOnなので、直ぐ⑤のモータ停止が実行されてしまいロボットは動かないままです。

解決方法は何通りかありますが、たとえば以下のように、走っている間にⒶのタッチセンサーがOffになるのを待つコードを追加する方法があります。
こうすると④の時点ではタッチセンサーはOffなので、本当に再度タッチセンサーがOnになるのを待てます。

function main() {
  // 最初はモーターは止まっている ①

  // タッチセンサーがOnになるのを待つ ②
  while (TouchSensor() != On) {
    Sleep(0.5);
  }

  // モータ起動 ③
  startMotor();

  //  現在、ロボットは走っている 🚗

  // タッチセンサーがOffになるのを待つ  Ⓐ
  while (TouchSensor() != Off) {
    Sleep(0.5);
  }

  // 再度タッチセンサーがOnになるのを待つ  ④
  while (TouchSensor() != On) {
    Sleep(0.5);
  }

  // モータ停止 ⑤
  stopMotor();
}

まとめ

以前ブログと同様に、人間の持っているメンタルモデルと、プログラミング言語や実行環境(制御対象のセンサー等の動作)は一致していないのです。

新人のうちは動いて欲しいと思うコードを書いてしまいがちですが、経験(失敗)を通じてメンタルモデルとプログラミング言語や実行環境の違いを(知り)学び 正しく動くコードを書けるようになっていくのです。

- about -

EY-Office代表取締役
・プログラマー
吉田裕美の
開発者向けブログ