「夕飯の材料を買ってきてね」というママはプログラマー 〜 プログラミング入門一歩前
今回もプログラミング入門一歩前と題しまして、
夕飯の準備をするママ(※)になったつもりで、子どもに食材を買ってこさせるために「お買い物メモ」を工夫して書くという生活の一コマから、プログラミングとは何か?という理解を進めたいと思います。
※もちろんその他の保護者でもよいのですが、なんとなく「クレヨンしんちゃん」のみさえママを想像してます。
では、はじまりはじまり。
プロローグ
あなたは夕飯にカレーを作ろうと玉ねぎを炒めているところで、食材が足りないことに気づきました。そこで、ゲームで遊んでいた子どもにお使いを頼みます。
シナリオ1 行き当たりばったりで命令をする
「ねぇ牛肉300g買ってきてくれる?」
いやいやながらも子どもはお肉屋さんでお肉を買ってきました。
一件落着と思いきや、じゃがいもも無いことに気づきました。
「帰ってきて早々悪いのだけど…じゃがいもも買ってきてくれる?」
2回もお使いに出されてちょっと不機嫌になって戻ってきた子どもに
「ごめん、福神漬けも…」
「母ちゃん…いっぺんに言ってよー」
シナリオ2 いくつかの命令を予め書いて渡す
(時を戻します)
「ねぇこのメモに書いてあるもの買ってきてくれる?」
・お買い物メモ(バージョン1)
┌───────────────┐
| ・牛肉 300g |
| ・じゃがいも 3個 |
| ・福神漬け 1袋 |
└───────────────┘
ところが、なかなか買い物から戻ってきません。
ようやく疲れた感じで帰ってきた子どもに
「あんたどこ寄り道してたのよ!心配したんだからね!」
「寄り道なんかしてないぞ!(メモに書いてある)順番に買ったらすごい遠回りだったんだぞ」
・家とお店の位置関係
[八百屋] [肉屋]
| |
ーーーーーーーーーーーーーーーーーー
| |
[家] [漬屋]
※今時はスーパーで全部揃いますが話の都合により。
「はぁ。まずね、メモに書いてあることを一通り見て、最適な買い物順を考えなきゃだめよー」
「じゃあ最初っから ”最適な順番” で書いといてよう」
シナリオ3 いくつかの命令を最適な順番で予め書いて渡す
(時を戻します)
「このメモを持って買い物してきてー」
・お買い物メモ(バージョン2)
┌───────────────┐
| 1.じゃがいも 3個 |
| 2.牛肉 300g |
| 3.福神漬け 1袋 |
└───────────────┘
ところが、なかなか帰ってきません。
子どもの携帯に連絡しようとカバンの奥にしまい込んでいたスマホを見ると、着信が何件も。
「あんたどうしたの!?」
「牛肉が売り切れていて何をかったらいいか分からなくて…。」
「なんだ〜そんなの豚でも鳥でも何でもいいのよー」
「じゃあ、最初っから ”牛肉がなかったとき” のことも書いといてよぅ」
シナリオ4 いくつかの命令を最適な順番で、さらにもしもの場合のことも予め書いて渡す
(時を戻します)
「このメモを持って買い物してきて」
・お買い物メモ(3)
┌───────────────┐
| 1.じゃがいも 3個 |
| 2.牛肉 300g |
| もしなければ 豚肉 |
| それもなければ 鳥肉 |
| 3.福神漬け 1袋 |
└───────────────┘
子どもはさっと買い物を済ませて、すぐにまたゲームを始めました。
ただ…、ママはメモを書くのが少し面倒になってきました。
シナリオ5 省略、あるいは再利用
(時をすすめます)
先日、子どもにお使いさせてから数週間経ちました。今晩もカレーを作ろうと思ったらお肉が足りません。今回もお使いを頼もうと思ったのですが、メモを書くのがちょっと面倒だなぁと思いました。
その時、運良く前回のメモが買い物袋の中から出てきました。今回はそれを少し書き直して渡します。
「このメモに書いてあるもの買ってきてねー」
・お買い物メモ(バージョン3 改)
┌───────────────┐
| ■■■■■■■■■■■■ |
| 2.牛肉 300g |
| もしなければ 豚肉 |
| それもなければ 鳥肉 |
| 3.福神漬け 2■袋 |
└───────────────┘
※ ■はペンで塗りつぶしたところ
ところが、なかなか子どもが帰ってきません。
(次のシナリオに続きます)
シナリオ6 想定外
(シナリオ5からの続き)
想定外のことが起きました。
食材は全部売り切れ、さらに子どもは犬に追いかけられ洗濯物にからまり、落とし穴に落ちて泥にまみれてヤケになり、手渡されたお金でチョコビを買ってムシャムシャと食べながら帰ってくるのでした。
「…」
まとめ
今回は、ママになって子どもにお使いを頼むことを通じて、プログラミングとは何かと、その極意を学びました。
まず、冒頭では次のように説明しました。
子どもに食材を買ってこさせるために「お買い物メモ」を工夫して書く…
これは少し抽象的にいうと、
「子ども」 = 目的の達成ために動いてもらうモノ
「食材を買ってこさせるため」= 目的
「メモ」 = その命令をあらかじめ書き記したモノ
「工夫」 = より効率よく的確に目的を果たすための工夫
※メモそのものを効率よく書くための工夫もある
となるので、冒頭の説明を言い換えると
あるモノに目的を達成させるための命令を、より効率よく的確に目的達成できるように書く…
となり、さらにこれをプログラミングの話に置き換えると、
目的 = コンピュータにさせたい何か
子ども = コンピュータ
メモ = プログラム
工夫 = アルゴリズム(※またはプログラム言語の仕様なども工夫)
ママ = プログラマー(命令するヒト)
よって、
プログラミングとは、
プログラマーがコンピュータにさせたいことをアルゴリズムを駆使して予め書くことをいい、そのようにして出来上がったものをプログラムという。
ということになります。
さらに、今回はプログラミングの極意もいくつか学びました。
一、命令する
プログラミングとはコンピュータに動いてもらうために命令することです。
一、命令は予め書いてまとめて渡す
コンピュータにやってもらいたいことが、プロジェクトのようにいくつかの作業のまとまりであるなら、いちいち命令するのは非効率です。かといっていっぺんに命令したら覚えきれないので、書いたものを渡すのです。
一、命令は順序よく的確に書く
順序によって効率や結果が変わります。無駄で余計な命令はいりませんし、目的が果たせないのは論外です。
一、プランBも予め書いておく
想定される「もしもの時はどうしたらよいか」も予め書いておきます。もしもの時にに、都度、動きが止まったり、いちいち相談されたりするのも面倒です。
一、同じことは省略する
同じことを繰り返し書くのは無駄だし、嫌なのでなるべく書くことを省略したり既に書いたものを再利用したりします。
※変数、関数、関数ライブラリ、ループ処理などの考えに繋がります。
一、想定外は必ずある
プランBは必要ですが、もし、あらゆるもしもの時に対応しようとするとキリがありません。お買い物でいえば、店が閉まってる、お金を落とす、途中でトイレに行きたくなる、などなど。
ですのでプログラミングは果たすべき目的を限定するところから始まります。
ただし、もし想定外のことが発生したらその度にできる範囲で想定内に取り込んでしまうことは可能です。それをアップデートなどといいます。
以上です。
プログラミング用語まとめ
💻 コンピュータ =プログラムを実行するモノ
📝 プログラム =コンピュータに実行させたいコトを予め書き記したモノ
🖌 プログラミング =プログラムを工夫して書くコト
👩💻 プログラマー =プログラミングをするヒト
次回は「歌作り」でプログラミングを解説したいとおもいます。今回の説明で抜けているプログラミング上の考え方、とくに繰り返しや共有、デバッグはそちらの方がわかりやすいと思います。
令和2年11月30日 小春日和に