∑考=人

そして今日も考える。

研修まとめ②

先週は研修内容をまとめるのを忘れていた。先週の分も合わせてまとめておこう、と思ったのだが、正直言うとあんまり新しく得た知識はない。ただ以前よりも深くIT系の知識は身についたとは思う。特に、アルゴリズムオブジェクト指向については、講義の説明を聞く中で、改めてよく出来た考え方だと思った。

 

アルゴリズムという言葉に、どうも難しいことのように考えてしまいがちである。しかし、これらを単純に言えば、ある目標を達成するための行動手順を具体的にまとめたもののことだ。例えば、私たちが普段何気なく行っている行動を具体化すれば、それもアルゴリズムの1つと言える。

 

そして、全てのアルゴリズムは順接、分岐、繰返しで表現できるプログラミング言語で言うと、if文とfor文で基本的には表現できることになる。また、正確にアルゴリズム化することができれば、誰でも同じようにその行動を行うことができる。マニュアル化、という言葉に近い。これがIT技術の原点にある考え方である。

 

しかし、「正確に」というのがミソである。例えば、子供に水を飲ませる場合を考えてみよう。水の入ったペットボトルと空のコップを置いておき、「この水をコップに入れてください」といえば、子供は勝手に水を注ぐことができるだろう。これは子供がすでに、ペットボトルに入った水を注ぐ行動手順を理解しているからである。

 

一方、コンピュータ相手では「この水をコップに注ぎなさい」では全く伝わらない。注ぎ方を知らないからだ。ではどう伝えなければならないのかというと、ザッと以下のような記述になる。

 

  1. ペットボトルの蓋を回す
  2. 蓋を取る
  3. ペットボトルを持ち上げる
  4. ペットボトルをコップに向かって傾ける
  5. ペットボトルを真っ直ぐに戻す
  6. キャップを締める

 

このように、一つ一つ丁寧に書き出してみると、意外と様々なことをしていることに驚かないだろうか。私たち人間は「水を注ぎなさい」と言われただけで、これらの作業を頭の中で無意識レベルで構築できているのである。

 

しかし、驚くのはまだ早い。実はこれでもコンピュータには全く理解できない。例えば、1の手順においては、いつまで蓋を回すのか?という疑問が登場する。コンピュータは言われたこと以外については自分で判断することができないので、いつまで蓋を回すのかを指定していないといつまでも蓋を回すこと(無限ループ状態)になってしまうのだ。

 

さらに、いつまで蓋を回すのか?という指定方法は実に様々である。どのくらいの角度を回すか?あるいはどのくらいの秒数回すのか?という指定も可能だろう。しかし、できれば、人間と同じような判断基準を付け加えることが望ましい。人間も実はある条件を満たした時にキャップを回すのをやめているのだ。

 

私の場合であれば、キャップが空回りするようになったらキャップを取る。では、「キャップが空回りする」とは、キャップを回すために必要な力が一定の力よりも弱くなることを意味する。つまり、1の手順については、

  1. ペットボトルの蓋を回す。
  2. ただし、キャップを回すために要する力がある一定値以下になったら、キャップを回す作業(1.)を終える。そうでなければ、(1.)を繰り返す

というところまで指定しなければならない。ここで登場した、「なったら」にあたるのが条件分岐、if文であり、「繰り返す」にあたるのが、繰返し、for文である。このように、アルゴリズムは私たちの日常に溢れかえっており、また私達自身もアルゴリズムをほぼ無意識に処理している。

 

今回の事例では1の手順のみに絞って掘り下げることにしたが、他の手順についても不順分な点が多く、コップに水を入れるという単純な作業でも、そのアルゴリズムは極めて煩雑なのである。

 

しかし、先に述べたように、私たちはこのアルゴリズムを意識することが少ないため、重要性を認知しにくい。日常的なことであれば、全体のまとまりとして記憶してしまっているからだ。

 

しかし、今までにやったことがないこと、例えば、「会社を作ってください」と言われてもやり方がわからない人の方が多いだろう。それは会社を作るためのアルゴリズムを知らないためである。逆に言えば、アルゴリズムさえわかっていれば、できないことはないのだ。

 

既知の作業についても正確なアルゴリズムを考えてみると、色んな発見があって面白いものです。