ある問題を解決してみる
みなさん、こんにちは!
B-CHANです。
今日は、コンピュータのプログラムとまったく無縁の人へのお話です。
こういう世界もあるということを知ってください。
ここに箱がいくつかあり、それぞれの箱にはボールが入っています。
箱によってボールの数はバラバラです。
すべての箱の中で、一番多いボールの個数をパネルに書きなさい。
こういう問題があるとしましょう。
例えば次の図(例1)なら、答えは10個です。
これ、人間が目で見て判断するのはとても簡単ですよね。
では、これをコンピュータに判断させようとするとどうするか?
コンピュータは電子計算機
もしコンピュータが人間と同じように、パッと見て一番大きな数字を選び出す能力があれば簡単なんですが、そうは行きません。
コンピュータの別名は電子計算機。
すべて計算によって結果を出さなきゃいけないのです。
で、計算によって結果を出すための手順を考えるのは人間なんです。
人間が手順を考えて、その手順をコンピュータに教えてやるわけです。
それがコンピュータプログラムです。
コンピュータは教えられた通りのやり方、つまりプログラムどおりに動き、決して間違えません。
それがコンピュータのメリットですが、逆に言えば、教えられたこと以外はできないのがコンピュータの欠点です。
いや、教えたこと以外を勝手にやると困るので、それはそれでメリットかも知れません。
ボールの数の問題を解く手順
では、上記の箱とボールの問題は、どういう手順でしょうか?
こういう考え方をしてみましょう。
まずあらかじめ、パネルには0個と書いておきます。
これがスタート。
最初に、パネルの数値と1番目の箱のボールの数を比較します。
そして、箱のボールの数がパネルの数値よりも大きければ、パネルの数値を箱のボールの数に書き換えます。
ここでは、1番目の箱のボールが3個でパネルの数値が0個なので、箱のボールの数の方が大きいですよね。
だから、パネルの数値を3個に書き換えます。
1番目の箱が終わったら2番目の箱に移り、同じことをします。つまり、パネルと箱を比較し、箱のほうが大きければ、パネルを箱のボールの数に書き換えます。
ここでパネルの数値は10個になりますね。
そして3番目の箱に移り、また同じことをします。
ただし、パネルは10個で箱は5個なので、パネルのほうが数値が大きいです。だから、この場合は、パネルの数値は書き換えません。
4番目の箱でもパネルの方が数値が大きいのでパネルは書き換わりません。
5番目の箱でもパネルの方が数値が大きいのでパネルは書き換わりません。
こうやって5つの箱すべて終わった時点で、パネルの数値は10個になっています。
見事に正解ですよね。
やったことをおさらいしましょう。
- 最初にパネルに0個と記入。
- 1番目の箱とパネルを比較し大きい方の数値をパネルに記入。
- 以下、残りの箱について繰り返す。
こういう作業を行うことで、最終的にパネルには、箱に入っているボールの最大値が残るわけです。
この手順をコンピュータに教えてやれば、コンピュータも同じことができます。
もし最初からコンピュータに、一瞬で最大値を見つける機能が備わっていれば、こんな手順を人間が考える必要は無いんですが、コンピュータは電子計算機なので、機能自体はシンプルです。
シンプルだからこそ、コンピュータに無い機能は人間が手順を考えてコンピュータに教え込むわけです。
上記の手順を教えることによって、コンピュータは複数の箱のなかから最大値を記録する機能が備わるように見えるわけです。
汎用的な手順
ちなみに上記の手順は箱の個数がいくつになっても適用できます。
次の図(例2)でやってみてください。
箱の個数は6個に増え、中のボールの数もさっきと異なりますが、まったく同じやり方で進めていくと、最後にはパネルには9個という数値が残りますよね。
まったく同じ手順が異なる条件でも使えるということです。
こんな風に、いろんな条件で同じ手順を使いまわせる時、この手順には「汎用性」がある、と言います。
汎用の反対語は専用ですね。
男性専用トイレは女性には使えませんし、女性専用トイレは男性には使えません。
でも汎用トイレは誰でも使えます。
上記の手順は汎用です。だから条件の異なる場面でも使えるのです。
ということは、いったんこの手順をコンピュータに教えてしまえば、何度も教える必要が無いということです。
手間がかからないですよね。
アルゴリズム
ここまで、手順と言ってきましたが、こういう手順のことを、特にコンピュータの世界では「アルゴリズム」と呼ぶことが多いです。
実は、コンピュータのプログラミング言語を覚えること自体は誰でもできます。
forとかifとかwhileとかswitchなど、いろんな命令文があり、+や-などの計算記号もあります。
それらを覚えてしまえばいいからです。
でも仮に完全に覚えたとしても何もできません。
なぜならコンピュータを動かすためにはアルゴリズムが必要だからです。
複数の箱の中からボールの数が一番多い箱を探し出す機能にはコンピュータにはありません。
だから、上記のようなアルゴリズムを人間が考え、そしてそれを実現するようにプログラミング言語を使ってプログラムを書くわけです。
つまり、重要なのはアルゴリズムなんです。
天才プログラマーの仕事
世の中には天才プログラマーと呼ばれる人たちがいます。
彼ら彼女らはプログラミング言語を完璧に覚えているから天才なのではありません。
上記のような問題を解決するための手順すなわちアルゴリズムを生み出す能力が優れているのです。
上記の問題を見てもらえばわかるように、図で解説しましたよね。
問題を解決するアルゴリズムを考えるのはプログラミング以前の話です。
問題解決力です。
天才プログラマーはプログラミングではなく、その前段階が天才なのです。
他のアルゴリズム
例えば、ボクは箱の中のボール問題を上記のやり方で説明しました。
でもそれはあくまでもボクが考えたアルゴリズムです。
もしかしたら、同じ答えを導くための、もっと良い方法があるかも知れませんよね。
ボクはパネルとひとつひとつの箱を比較する方法を使いましたが、箱どうしを比較する方法も考えられます。
ひょっとしたら、その方が手数が少なくて済むかもしれません。
手数が少なくて済むということは、答えが出るまでの時間が短くて済むということです。
であれば、そのアルゴリズムはより優れたアルゴリズムと言えます。
そういう優れたアルゴリズムを生み出すのが天才プログラマーです。
天才プログラマーは決して、プログラミングに詳しい人という意味に留まるのでは無いということを知っておいてください。
機械の仕組みを知ることとアルゴリズムを考えることは別
このことは言い換えれば、あなたがもしコンピュータプログラムをまったく知らなくても、より優れたアルゴリズムを考えだすことができれば、それが既存のコンピュータ・システムを覆す可能性があるということです。
そう考えると、コンピュータなんて理系とか文系とかあまり関係無いことがわかりますよね。
機械の仕組みそのものは理系の分野ですが、アルゴリズムは思考力の問題ですから。
自分は文系だからと言って敬遠せずに興味を持ってもらえればうれしいですね。
ボクもこんなブログ書いていますが大学は経済学部ですよ。
個人的には理系文系関係なく色んな分野を日頃から学んでますが。
ところで最初に、「人間が目で見て判断するのはとても簡単」と書きました。
実は人間も意識はしていないものの、脳が超高速にアルゴリズムを使って箱の中のボールの最大値を判断しているんです。
そういう意味ではコンピュータと同じです。