プログラムを勉強する時の基礎知識として、アルゴリズムとオブジェクト指向があげられます。
突っ込んでいくとどちらも難しいのですが、初心者はさわりだけでも知っておくと、プログラムに対する考え方や方向性がグンと分かりやすくなります。
今回はふたつのうちのひとつ、アルゴリズムに焦点をあてて解説していきます。
アルゴリズムとは
アルゴリズムとはひとことで言うと方法のことです。
現実世界においても人はアルゴリズムで動いているんですよ。
例えば、お風呂に入るときにお風呂に湯を張るまでをアルゴリズムで説明すると、
・使わない水が既に張ってある場合は水を抜く
・風呂場を掃除する
・栓をして浴槽へお湯を張る
・お湯の温度が熱ければ温度を下げ、冷たければ温度を上げる
・お湯が浴槽の8割ほど溜まったらお湯を止める
で、完了します。
コンピューターでは目的をもって行動することをデータで処理していきます。その行動を実現するのがプログラムであり、方法がアルゴリズムなのです。
アルゴリズムはプログラムの設計書
機能を実現するためにはプログラムでどのように作り上げていくかを考えなければなりません。
例えばデータのソートが有名です。
値をソートする際に値と値を比べて大きいほうから(もしくは小さいほうから)順番に並べますがプログラム的にはソートアルゴリズムがいくつか存在しています。
例えばバブルソートの場合は隣り合う値を比較して値が大きいほうを頭に近づくように並べ替えるということを、値が並べ替えされないようになるまで整列させた状態がソートされた状態です。
その他にも、一定の数の値を大きいほうから(小さいほうから)順に並べた後、並べた数値グループと次に並べた数値グループのデータを比較しながら一つの整列データにしていくという方法を繰り返し、データを並べ替えるというマージソートという方法もあります。
わかりやすくいうとこんな感じです。こちらはマージソートです。
アルゴリズムは機能を実現するための方法の一つ
ソートだけを考えても、アルゴリズム(ソート手順)はいくつもあるのがわかるかと思います。。
使われたアルゴリズムが最適かどうかは用意されるデータによって処理回数が変わってきます。その分処理速度が変わってくるのです。
プログラムの処理手順を減らして機能を実現できるのがいいアルゴリズムといえます。
プログラマーにとってのアルゴリズム
プログラマーにとってアルゴリズムはセンスの見せ所です。
アルゴリズムひとつで処理速度が早くなったり遅くなったりするからです。
2ちゃんねるの創設者であるひろゆき氏がプログラマーとして自分は天才ではないと言わしめたアルゴリズムの話があります。
ファミコンなどにはコントローラーが最初からついていますが、パソコンゲームではキーボードをコントローラーの代わりに使うことがあります。
例えば、キーボードの4が押されたら左に座標1つ分移動(座標を-1)して、6が押されたら右に座標1つ分移動(座標を+1)する。
これをプログラムで実現するにはどのような方法で作ればよいでしょう?
一般的に思いつく方法は、
1.押されたボタンが4の場合、座標を-1する
2.押されたボタンが6の場合、座標を+1する
といった方法です。
その時にひろゆき氏が見たプログラムは
1.押されたキーから5を引いて、座標を計算する
という方法だったそうです。
どちらの仕組みも目的を実現させていますが、後者のほうが処理が少ないためプログラムが速く動きます。
ボタンを押した後の反応を重要視するゲームであれば後者の仕組みのほうが良いと考えることができますね。
アルゴリズムを学ぶためには
アルゴリズムを学ぶためには最適な答えが何なのかに気づく必要があります。
前述したひろゆき氏の話も気づきの問題です。
知らないことに気づくのは至難の業であり、多様な考え方、多様な見方を常に意識する必要があります。
プログラミングセンスといわれる部分でもありますが、センスは生まれ持って備わっている能力だけで成り立つものではありません。
多くは経験で埋めることが可能なのです。
プログラミングセンスを埋めるための経験とは、仕組みを理解しどのようなアルゴリズムで目的を実現しようとしているかを知ることにあります。
具体的にはプログラムのソースコードを読むことです。
こう書くとなんだそんなことかと思われるかもしれません。
しかし単純にソースコードを文章のように読むのとはちがいます。
「なぜこのような方法でプログラムを書いているのか?」「もっと簡単な仕組みで同じように動かすことができないか?」を常に意識してコードを読むことです。
プログラムのソースコードには製作者の考え方や意図がすべて書かれています。
制作者の考え方や意図が読み取れるようになると新しい気づきをえることができるのです。
そういう意味で気づきをえられたひろゆき氏はやはりすごい人なのだなと思います。。
プログラムの勉強は一人より二人で行うと成長する
ひとりで考えて進めるプログラミングはどうしても一方的な考え方になってしまします。
一定のレベルまで辿りついたなら、進んで他の人が書いたコードを見て思考を深めていく作業が必要です。
イベントやカンファレンスに進んで参加したり、プログラミングの話ができる仲間がいればいいですね。
初心者は独学が難しいと感じるならプログラミングスクールで勉強するのもいいでしょう。