「自動」のしくみを見てみよう|人間の意図とプログラミング

冷蔵庫のドアを開くと、庫内が明るくなります。自動ドアは、人が近づくと開きます。スマートフォンの画面は、指で触れた場所に反応します。

どれも身近で、ふだん不思議に思うことはありません。

けれども、これらの製品が自分の意思で動いているわけではありません。動き方を決めたのは、人間です。そして、その決めごとを機械に実行させる方法の一つが、プログラミングです。

この記事では、「自動」と呼ばれている動きの中に、どれだけの決定が入っているのかを見ていきます。

「自動」は何もしなくても動くことではない

自動ドアを見ていると、ドアが人に気づいて、自分で開いたように見えます。しかしドアは、周囲の状況を人間のように理解しているわけではありません。

人が近づいたことを何らかの方法で受け取り、あらかじめ決められたとおりに動いています。

「自動」という言葉は、動きの原因が見えないときに使われます。原因がないわけではありません。見えていないだけです。

「人が来たら開く」は人間が決めた

自動ドアをつくるとき、最初にあるのは、

人が近づいたら、ドアを開けたい

という人間の意図です。

ただし、この意図だけではドアは動きません。

どれくらい近づいたら反応するのか。開いたあと、いつ閉じるのか。人がドアの間に立っているときは、どうするのか。

一つひとつを決めなければ、機械は動けません。私たちが「自動」と呼んでいる動きは、人間が決めた細かな取り決めの積み重ねです。

プログラミングは意図を実行できる形に変える

人間なら、「危ないときは閉めないで」と言われれば、その場を見て判断できます。

コンピューターには、それができません。「危ないとき」がどういう状態なのかを、機械が扱える情報として示す必要があります。何を手がかりに判断するのか。その手がかりがどうなったときに、どう動くのか。

プログラミングとは、こうした意図を、機械が迷わず実行できる形に置き換える作業です。

プログラミングはとても細かい

「人が近づいたらドアを開ける」。—文にすれば、たったの一行です。

ところが、実際に安全に動かそうとすると、決めることは一行では終わりません。

自動ドアが決めていること

  • どこからどこまでを「近づいた」とするか(センサーの検知範囲)
  • 横を通り過ぎるだけの人に、反応しないようにするか
  • 人ではないもの(荷物、カート、雨、落ち葉)を検知したときは、どうするか
  • 開いたあと、何秒間そのままにするか
  • 閉じ始めたあとに人を検知したら、途中でも開き直すか
  • ドアの間に人が立ち止まっているときは、閉じないようにするか
  • 開く速さと閉じる速さは、同じでよいか
  • 停電したとき、開いたままにするか、閉じたままにするか

一つでも決め忘れると、「動くけれど危ないドア」になります。

自動ドアは、単純な機械に見えます。単純に見えるのは、これらの決定がすべて済んでいて、私たちの目に触れないからです。

スマートフォンのタッチパネルが決めていること

画面に触れたとき、機械が受け取るのは「触れた」「離した」「どこか」という情報だけです。そこから先は、すべて決めごとです。

  • 触れた位置が、どのボタンの範囲に入っているか
  • 触れてから離すまでが短ければタップ、長ければ長押し
  • その「長い」は、何秒からか
  • 触れたまま位置が動いたら、スワイプ
  • 何ミリ動いたら「動いた」ことにするか
  • 手のひらが当たっただけの反応を、無視するかどうか

同じ画面の同じ場所に触れても、触れ方によって結果は変わります。その違いは、機械が理解しているのではありません。人間が「区別することにした」ものです。

ゲームの「自然な動き」もつくられたもの

家電やスマートフォンだけではありません。ゲームの中の動きも同じです。

敵が近づいてくる。床が往復する。時間が切れると終わる。どれも自然に見えますが、自然に起きているものは一つもありません。

敵は、自分で考えて追いかけてくるのか

ゲームの敵がこちらを見つけて追いかけてくると、本当に考えているように見えます。

しかし、敵が自分で目的を決めたわけではありません。

どこまで近づいたら追いかけ始めるのか。追いかけている途中で見失ったら、どうするのか。壁に当たったら、どちらへ回り込むのか。離れすぎたら、あきらめて元の場所へ戻るのか。

これらはすべて、ゲームをつくった人が決めています。

自動ドアとゲームの敵は、見た目にはまったく違うものです。けれども「ある状態になったら、決められた反応をする」という点では、同じ形をしています。

難しさも、設計されている

敵の速さ。敵の数。攻撃してくる間隔。障害物の位置。制限時間。アイテムが出る確率。

これらの数値を少し変えるだけで、ゲームの難しさは変わります。「ちょうどいい」と感じる場面も、「理不尽だ」と感じる場面も、誰かが数値を決めた結果です。

ここまで来ると、プログラミングが「ものを動かす技術」だけではないことが分かります。どう動かせば、遊ぶ人がどう感じるか。そこまで含めて設計できます。むしろ、そちらのほうが本題かもしれません。

まとめ

身の回りにある製品も、ゲームも、自分の意思で動いているわけではありません。

誰かが「こう動かしたい」と考え、その意図を、機械が実行できる細かな取り決めに置き換えた。私たちが目にしているのは、その結果です。

次に何かが自動で動いたときは、こう考えてみてください。

  • 何をきっかけに動いたのか。
  • その動き方を決めたのは、誰か。
  • 自分なら、どこを変えるか。

最後の問いに答えられたとき、もう使う側ではなく、決める側に立っています。

この記事を書いた人

Flowz

身の回りのしくみをプログラミングや数学の視点で読み解く「Flowz」を運営しています。答えを覚えるだけではなく、「なぜそうなるのか」を考える学びを大切にしています。