webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

アルゴリズムってなんだろう?

 

 

はじめに

プログラミングスクールの講師をやっている中で、基本的な構文は分かったけど、いざプログラムを書くとなったら何をしていいかわからない。手が動かない。と言う方がほとんどです。

 

そこで今回は、まずそもそもプログラミングって何?という話をします。話の中でプログラミングとプログラムという言葉が出てきますが、プログラム(文字)を考えて入力する行為がプログラミングになります。混同しないように注意して下さい。

 

プログラミング(またはプログラム)が何か説明した上で、プログラムを書く方法をお伝えします。ただし、具体的なプログラミングの書き方やコードの説明ではありません。

最終的にアルゴリズム≒プログラムという結果になるので、タイトルは「アルゴリズムってなんだろう?」にしています。

 

また、小学校からプログラミング教育(いわゆるプログラミングじゃなくて、プログラミング的な考え方、要するにアルゴリズム)が始まるそうです。もう始まっているのかな。この文章はプログラミングを教えることになったけど、今いちよく分からんという講師・教師に向けたものでもあります。

 

一プログラマの意見ですが、参考になれば幸いです。

 

【目次】

 

 

 

 

プログラムって何?

まず、プログラムって何でしょう。

 

JavaScriptのコードとか、Scratchのブロックの並びですね。

もう少し抽象的に言うと、「ある問題を解決する手順を自動化したもの」です。

 

ここで、「問題」と「手順」それから「自動化」という3つのワードが重要になってくるので、順に見ていきましょう。

 

問題

まず、どのようなプログラムにも解決すべき問題が先にあることに注意しましょう。

「線を描く」「ある点からある点へ移動する」もしくは「動く点を作り、別の移動可能なオブジェクトがあり、点に触れたらゲームオーバーと表示する」のような。

 

より現実的には「不用品を簡単に売る」「適当なことを全世界に向けて簡単につぶやく」

があります。語尾に「~にはどうすればいいか」を付けると問題っぽくなります。

 

あなたにとってこれらは解決すべき問題だと考えます。

では、これらの問題を解決するにはどうすればいいでしょうか。

 

「線を描く」なら、定規と鉛筆があればいいですね。

 

「動く点を作り、別の移動可能なオブジェクトがあり、点に触れたらゲームオーバーと表示する」なら、人が二人必要ですが、追いかけっこのようなボードゲームを作ればいいです。

 

「不用品を簡単に売りたい」なら、フリーマーケット。

「適当なことを全世界に向けて簡単につぶやきたい」なら、世界的な新聞みたいなのを作って、はがきで応募できる会社を作ればいいですね。

 

この時点では全てアナログの世界です。

手順

手順は、それら問題の解決策を具体的な「手続き」書類にしたものです。

「線を描く」なら、「鉛筆を持って、定規を反対の手で固定し、定規に鉛筆を当てながら動かす」というのが手順になります。

 

フリーマーケットなら、手順は複雑になります。主催者は「会場の確保ー>申込書の作成ー>ルールの作成ー>告知ー>応募受付ー>・・・」出品者なら「フリーマーケットへの応募ー>出品物の準備ー>値段設定・・・」などが手順です。

 

言い換えれば、これがアルゴリズムになります。つまり、だれにとっても、いつでも再現可能な手順です。マニュアルもイメージとしては近いです。

アルゴリズムと言えばコンピュータを思い出してしまいますが、今はまだ、ただのアナログな手順です。

 

自動化

さて、ここからがプログラムの話です。

 

まず大切なことですが、プログラムもしくはコンピュータと言うのは、人間ができる以外のことはできません。

ただ処理速度がめちゃくちゃ早いだけです。

 

したがって、プログラムが実行する手順も人間がアナログに実行する手順も大きく異なりません。

 

しかし、人間がアナログで行うと困ったことがあります。線を1万本描くと手が疲れるとか、出品した商品が売れるまでそこに居ないといけないとか。

 

そんな、処理速度に限界が来た時にはコンピュータを使って作業を自動化すればいいのです。線を書く処理を1万回繰り返したり、データを登録しておいて、勝手に売買が成立しちゃうとか。

ただし、人間じゃなくてコンピュータにやってもらうので、やれと言った仕事はちゃんとやるけど、言われなかった仕事は決してやりません。

 

そこで、仕事の手順書を用意し、コンピュータが理解できる言葉に翻訳したものがプログラムになります。プログラミングはコンピュータに仕事を依頼することともいえます。プログラマはコンピュータに仕事を依頼する専門職です。

以下は線を描くということをプログラムした一例です。

 

strokeWeight(0.5);
line(windowWidth * 1/8, 0, windowWidth * 1/8, h);
line(windowWidth * 2/8, 0, windowWidth * 2/8, h);
line(windowWidth * 3/8, 0, windowWidth * 3/8, h);
line(windowWidth * 5/8, 0, windowWidth * 5/8, h);
line(windowWidth * 6/8, 0, windowWidth * 6/8, h);
line(windowWidth * 7/8, 0, windowWidth * 7/8, h);

 

細かいことは気にしなくてもいいですが、「line」という部分で線を描いています。

このコードでは、多い時には1秒間に60回、6本の線を描かないといけないので、人間には速度的に不可能ですよね。速度を無視すればほとんど可能です。

 

メルカリも、処理速度を気にしなければフリーマーケットでいいし、処理速度を気にしなければTwitterも手紙で応募するような会社があればいいです。

 

昨今人気のAIやブロックチェーンのような技術もゆっくりでいいのなら人間の手計算で実行することができます。人間がやると遅いのでコンピュータに仕事させているだけです。

 

AIが仕事を奪うとか言われていますが、コンピュータができたときからとっくに人間の仕事を奪っています。

問題から手順へ

 

さて、前節では、プログラムとは、人間の仕事を高速化・自動化したいために、コンピュータに仕事を依頼する方法ということが分かりました。

 

コンピュータがちゃんと仕事をこなしてくれるなら、すぐにでもプログラムを書き始めていいのですが、プログラムを書くことは人間の仕事です。ミスをするとしたらここです。複雑な仕事ならよりプログラムに漏れが発生しそうです。

 

そこで、実際にプログラムを書く前に、しっかりとした(もれが無く、順番を間違っていない)手順を用意しておきます。これがアルゴリズムです。アルゴリズムはあくまで人がプログラムを書くときに補助的に使うものです。コンピュータはアルゴリズムなんて知りません。

 

 

上記で、問題がまず先にあると書きましたが、問題が複雑なとき、どうプログラムを書いたらいいか分からない。

こういう時にアルゴリズムを考えます。アルゴリズムは何も巧妙で技巧的である必要はないのです。

 

アルゴリズムは問題を単純な作業へ分割し、順番に並べたものです。ただし、繰り返しだったり、条件によって次に行う作業を変えたりもします。

 

単純な作業は人によって違うのですが、「歩く」という問題なら、「右足を挙げる」「左手を挙げる」「右足を体より前に下す」などが単純な作業です。

 

が、人によっては「歩く」自体が単純な作業である場合もあります。

 

これら単純な作業を実行する順番に並べます。

「右足を挙げる」ー>「左手を挙げる」ー>「右足を体より前に下す」ー>・・・->「もし前が崖なら体を右に向ける」ー>・・・->「最初に戻る」

 

これがアルゴリズムです。

 

ウェブサーバのプログラミングでは、「getで/usersにアクセスされたら、ユーザの一覧を返す」を実装したいなら、次のように分割します。

 

「アクセスを解析し、実行するメソッドを選ぶ」ー>「メソッド内でデータを準備する」ー>「準備したデータを使ってHTMLファイルを作成する」ー>「ファイルをブラウザに返す」

 

手順から自動化へ

 

アルゴリズム(手順)ができたら、それに従ってプログラム(実際にやってもらう仕事内容)を書いていきます。

 

実はこの作業は非常に単純作業で、プログラマはほとんどの時間をアルゴリズムを考えることに使っています。ただし、アルゴリズムを考えながらプログラムを書いているので、ずっとプログラミングしているように見えます。

 

もしこの時点で、アルゴリズムを構成している各「単純な作業」の実装も難しいのであれば、さらにもっと細かく作業を分割します。

複雑な仕事の指示はミスが発生しやすいので、必ず自分が「単純な作業」だと思えるところまで分割していきます。

 

最後に

 

Scratchでもどんな言語でも、「今解決しようとしている問題は何か」「どういう手順なら解決できるか」「手順をどうコンピュータに伝え自動化するか」がプログラミングの基本になります。

 

手順を分解した「単純な作業」一つ一つがすでに言語に用意されているならば、アルゴリズムとプログラムは一致します。アルゴリズム通りに書けばいいのです。

 

このような意味で私はプログラミング教育とは、アルゴリズムを学習ことだととらえています。学校の授業で、同じ問題に対していろんな人の考えたアルゴリズムを知ることはとても重要だと思います。

 

 プログラムを書く際に、簡単なパートに分割するという方法は基本的ですが、「今何が解決すべき問題なのか」を抜かしている場合が多いです。これがプログラムを書くときに何をしていいか分からない問題を引き起こしているのだと思います。

 

実際、レッスンでも「〇〇のやり方が分からない」と言う生徒に、「どういう風にしたいですか?」「何がしたいのですか?」と聞いても「分からない」と返ってくることが多いのです。

 

問題が無いと、解決策も手順も生まれません。もちろんその先も。繰り返しになりますが、プログラミングは「問題、手順、自動化」です。