プログラミングの勉強を始める際に、まず何から始めるべきでしょうか?
この半年、色んなサイト・ブログを目を通し、オンラインのプログラミングスクールで勉強したりしました。それ以外にもアマゾンで、初心者向けと言われている本を買い漁っていました。そして見つけました。初学者の方がまず読んだ方が良いと思う本を。
これですね。アマゾンで★5ついてました。プログラミング教育はまだ体系化されていません。現在活躍しているエンジニアの方々はとにかく自宅のPCをいじりながら、独学でいつのまにか覚えていたというパターンが多いです。そのため、いざ人に教える時に、どうしても細かい部分から説明する傾向が強いのです。ただ、初学者が勉強を始める際、その分野の全体像をつかむべきです。プログラミング言語は、HTML、CSS、JavaScript、PHP、javaなど、様々な言語があります。しかし、根本の考え方、アルゴリズム×データなどの概念は共通です。最初に言語の勉強を始める前にその共通で使える概念を頭に入れておく事で、理解が早まるのではないでしょうか。そして、勉強が進んできて、中々理解できない部分が出てきたとしてもそこで基本に立ち帰る事で解決する事もあると思います。スクールでは、毎回の授業でこの本を15分ほど読み合わせる事で、まずは共通の考え方をしっかり定着させていきたいと思っています。
プログラミングの共通概念 アルゴリズム×データ
まずはこの、プログラミングの基本構造である、データとアルゴリズムについて整理しましょう。
プログラミングとは何でしょうか。元々人はなぜプログラミングを行うのでしょうか。それは解決したい課題・欲求があるからです。プログラミングがスタートではありません。課題が先です。「効率的に記録を取りたい」「計算を素早く行いたい、さらに簡単に数字を出力したい」「経済の勉強をしながら遊べるゲームを作りたい」などの課題があって、それを解決するための道具がプログラミングです。
プログラミングの流れ 課題⇒アルゴリズム⇒データ
課題・欲求が見つかったら、それを解決するためのストーリー・段取りを整理します。これがアルゴリズムです。細かい説明は後回しにして、課題を解決するための大枠を考える事なんだと、覚えておいて下さい。料理でいうところのレシピとも言えます。
次にデータです。データは課題を解決する流れの中の材料にあたります。料理でいうところの食材ですね。
ペットに自動的に餌を食べさせるプログラム
では、まず課題から考えてみましょう。あなたは旅行好きでペット好きです。一泊二日で伊豆に行きたい欲求があるとします。あなたがいない間、ペットへ自動的に餌をあげるというロボットのプログラムを考えましょう。
①7時、18時に一定量の食事を出す。水⇒ドッグフードの流れ
②一回当たりの食事はまず水が出てくる⇒水を残したら、水を回収する。
③水を飲みきったら、もう一度だけ水を出す。その場合、前の量の半分の水を出す。
④水を回収したら、ドッグフードを出す。味が足りなそうなら、バーベキューソースを一絞り。足りなければ、一絞りを繰り返す。
⑤ドッグフードを食べ終わったら、再度水を出す。
この場合アルゴリズムは
①水⇒ドッグフード⇒水の順で出す。(逐次実行)
②水を飲みきったら、前の量の半分の水を出す。水を残したら、水回収。(条件分岐)
③ドッグフードの味が足りなければ、足りるまで、バーベキュー一絞りを繰り返す(繰り返し実行)
アルゴリズムは3種類
アルゴリズムは逐次実行(ちくじじっこう)と条件分岐、繰り返し実行の3種類です。
逐次実行は、上から順に命令を実行する事です。先ほどの例では、大きな流れとして、水⇒ドッグフード⇒水の順で命令を実行しています。
条件分岐は、もしパターンAなら処理Bを行え。パターンCなら処理Dを行え。という、パターンによって実行する命令を変える事です。先ほどの例では、水を飲みきったらその半量の水を出す。水を残したら回収。という、水を飲みきったかそうでないか(条件)で、やることを変えています。(分岐)
繰り返し実行は、その名の通り、同じ処理を繰り返す事です。先ほどの例では、味が足りないうちは、バーベキューソース一絞りを繰り返し続けるという処理ですね。言葉通りなのでわかりやすい内容ですが、注意点があります。繰り返し処理は「条件」を設定しないと成立しません。「味が足りないうちは、」という設定を抜かした場合はどうでしょうか。「水を飲んだ後、バーベキューソースを一絞りし続ける。」終わりの条件が無いため、無限にバーベキューソース一絞りを繰り返す事になります。いわゆる無限ループです。
ここまでが、アルゴリズムの内容になります。
データの道具も3種類
先程の例だと、材料=データは、「水」「ドッグフード」「バーベキューソース」になりますね。アルゴリズムは流れ。データは材料でしたね。
ここで、データを扱うための道具3種類をご紹介します。
変数、関数、配列です。
変数・・・データを入れておくカゴ。
関数・・・データを変換するブラックボックス。
配列・・・データを整理してまとめて入れておく仕切りのついたトレイ。
input⇒処理⇒outputが全て
ここまで、プログラミングのおおまかな流れを見てきました。アルゴリズム(ストーリー)があってそれを構成しているデータ(材料)があるのでした。しかし、まず一番最初のスタートは課題・欲求から始まっているのです。課題を解決するという事は何かしらのインプットを行い、それを加工し、必要な答えをアウトプットするという事です。
アプリを作ろうとする場合⇒
何をインプットするのか?
インプットしてアウトプットする事は何か?
その流れでどんな価値を加えるのか?
そのためのアルゴリズムは何か?
必要なデータは何か?
これを意識しながら学習を進めていくと、理解が早いだけでなく全体像が忘れないために、モチベーションの維持にも役立つと思います。
現に今2491文字目を書いた私も、今この記事を書きながら、毎日の学習スケジュールに「この記事を10分目を通し、適宜文章をブラッシュアップする」という作業を加えようと考えています。それは、私の学習にも良い効果あります。
話を戻しましょう。
上のペット餌やりのプログラムでは、アウトプットのみを行う、主力系のプログラムです。しかし、もう少し、利便性を高めていけば、インプットと加工についても考えていく事になります。
例えば、商品の単価を入れると税込表示を出力してくれるプログラムはどうでしょうか?
まず商品の単価を入力します。例えば2,940円を入力(インプット)。暗算では面倒ですよね?すると2,940円×108%の加工をプログラムが行います。そして、税込み3,175円という答えがアウトプットされます。
簡単なプログラムですが、インプット⇒加工⇒アウトプットがイメージできたのでは無いでしょうか?
プログラミングを料理で例える事の意味
ここまでが大体一章分の内容になります。本の20%分。結構ボリューミーでしたね(笑)
これからは、より理解を深めるために、プログラミングを料理に例えて解説しています。例のごとく課題と欲求から考えていきましょう。
この本では主人公のイサム君がカレーを食べたいという欲求からスタートしています。ターゲットはイサム君という事になりますね。
そして解決したい課題は、カレーを食べる事で幸せな気分になって、疲れを癒せること。なぜカレーにここまでの課題解決を求めるのかは、本書をお読み下さい(笑)
そして具体的に何を作るのかは、「お母さんが作ってくれた普通のカレー」となりました。
これがプログラミングのスタートになります。
まず誰の課題を解決するのか?⇒イサム君
解決したい課題は何か?⇒ノスタルジックな気分でホッとしたい
解決するために何を作るのか?⇒お母さん作ってくれた普通のカレー
真剣にカレー作りを考える
ここからは、カレーを作る段取り(アルゴリズム)を考えていきましょう。少し長いですが、おつきあい下さい(^_^;)。
①下ごしらえ
じゃがいも、にんじんは皮をむき、大きめに切る。
玉ねぎは細かくみじん切り。
牛テール肉はよく叩いて、小さめに切る。
②具を炒める
鍋にサラダ油を引いて、下ごしらえした野菜と肉を入れる。
塩、胡椒しながら、きつね色になるまで強火で炒める。
③火を加えて沸騰するまで加熱する。
④沸騰したら固形のカレールー(中辛)を入れてかき混ぜる。
⑤弱火にして20分、コトコト煮込む。隠し味に七味唐辛子と、おろしニンニクを加える。
⑥常温に戻し、冷蔵庫に入れて一晩置く。翌日食べる直前に温める。
ここまでの流れがアルゴリズムです。ちなみに課題を解決するためのアルゴリズムは一つではありません。カレーの作り方が一つで無いのと同じです。最初の具にシーフードを足したり、煮込む時間を変えたりと、組み合わせは様々です。
続いて、実際にカレー作りを始めてしまい、データ(材料)の取り扱いを見てみましょう。
カレーの下ごしらえでデータの取り扱いを学ぶ
それでは、カレー作りを初めましょう。あくまで真剣に。
玉ねぎを冷蔵庫から取ってきます。この、「冷蔵庫から取ってくる」という表現をしていた事を忘れないで下さい。後から活きてきます(笑)
①玉ねぎの皮をむいて、白い皮が現れるまでむき続ける。
②それをみじん切りにする。
③みじん切りにした玉ねぎをボウルに入れる。
みじん切りされた玉ねぎがデータです。
そしてこのボウルのように、データの入れ物の事を変数と言います。プログラミングの世界では、データは必ず入れ物に入れて使います。
次に冷蔵庫から、牛テール肉を取り出します。
①電子レンジに入れて、解答モードのボタンを押す。
先程のように、牛テール肉はデータです。
電子レンジは関数です。関数とは何かを入れたら、加工した答えを返してくれるデータの事です。この場合、カッチカチの牛肉を入れる⇒解凍処理⇒解凍された牛肉が出て来る。という流れになります。
同じことがフードプロセッサーにも言えます。
肉を入れる⇒刻み処理⇒細切れ肉。そしてその細切れは、その後どうしますか?そうです。いったんボウルに入れましょう。そうです。加工したデータはふただび変数という入れ物に入れて使いましょう!