現役プログラマーによる解説コラム「アブラ・カタブラ・アルゴリズム」
2021/04/19
現役プログラマーとして様々な活動をされている鳥井雪氏による、プログラミング通信をご紹介します。こちらのコラムでは、「実際のプログラマーが毎日どんなことを考えてプログラミングしているか」や「実生活でプログラミング的思考がどのように役立つのか」などを、わかりやすく分解してご紹介いただいています。
★こちらの「こどもプログラミング通信」も合わせてご覧ください!
本記事の筆者:鳥井雪(とりい・ゆき)氏
Railsプログラマーとして活躍し、女性にプログラミングの技術を解放する世界的ムーブメント「RailsGirls」の、日本での普及にも尽力する。その功績を認められ、2013年楽天テクノロジーアワード ルビー賞受賞。
RailsGilrsの創始者の一人である、リンダ・リウカス著のプログラミング教育絵本『ルビィのぼうけん』を翻訳、1カ月経たず3刷2万部のヒットとなり、プログラミング教育必修化にむけての一助となる。
翻訳に『ルビィのぼうけん こんにちはプログラミング』『ルビィのぼうけん コンピューターの国のルビィ』『プログラミングElixir (笹田耕一と共訳)』
アルゴリズムってなに?
先日、こども向けのプログラミング本を開いていた4歳の子供が言いました(英才教育…というわけではなく、わたしが資料として買った本を、子供向けの本は全部じぶんのもの、とばかりに奪われただけです。実際にプログラミングやコンピューターの話をしようとすると面倒がられます)。
「おかあさん、あるごりずむって、ろぼっとのなまえ?」
ということで、今日の話題は「アルゴリズム」について。
プログラミングに触れはじめたころに、いきなり出くわしてぎょっとするフレーズNo.1(※個人の感想)です。響きがすごくむずかしそうですよね。アルゴリズムの定義を、フリー百科事典『ウィキペディア(Wikipedia)』で参照すると、冒頭にあるのは「計算可能なことを計算する、形式的な(formalな)手続きのこと、あるいはそれを形式的に表現したもの」(注1)とあります。…むずかしいですね…。
むずかしい定義にはむずかしいなりの理由があるので、噛み砕くと失われる意味もあるのですが、4歳児にそのまま説明するわけにもいきません。伝わるかなーとハラハラしながら、答えを捻り出します。
「ロボットじゃなくて、ロボットにしてほしいことの名前だよ」
4歳児は、はて、という顔。
「ロボットは、一つの命令を一つずつ、順番にやっていくってご本に書いてあるよね。『出かける準備をする』っていうめあてを、小さく分けるとどんな命令だった?」
「ふくをきる、くつしたをはく、くつをはく!」
「そう、そういう一つずつの命令や判断を、ある目的のために順番にならべてまとめたものがアルゴリズムだよ。今のは、『お出かけの準備のアルゴリズム』。ここで大事なのはね…」
4歳児は、「あっおかあさんの長い話が始まるぞ」という顔で逃げて行きました。
「いいアルゴリズム」と「わるいアルゴリズム」
こんにちは。鳥井雪です。「ヒューマンアカデミーこどもプログラミング教室」の教材監修をしています。
このコラムでは、 みなさんにプログラミングを身近に感じてもらえるよう、プログラマーが日常でどんなことを考えて生活や仕事をしているのかを紹介しています。
4歳児には聞いてもらえませんでしたが、もう少し話を続けさせてください。
アルゴリズムは、ある目的のために、命令や判断を順番にまとめたものです。その手順にしたがって行えば、必ずその目的は達成できます。ここで大事なのは、同じ目的のためのアルゴリズムでも、「いいアルゴリズム」と「わるいアルゴリズム」があることです。
たとえば、「サンドイッチを5個つくる」という目的があるとします。この目的のために、アルゴリズム「その1」と「その2」を考えてみます。
アルゴリズムその1
- パンを2枚スライスする
- パンを1枚お皿の上に載せる
- パンにバターを塗る
- レタスを1枚洗って水を切り、パンに重ねる
- トマトを1枚切って重ねる
- チーズを1枚取り出して重ねる
- パンを1枚重ねる
…以上を5回繰り返す
アルゴリズムその2
- パンを10枚スライスする
- 5皿の上に、パンを一枚ずつ載せる
- 5皿の上のパンにバターを塗る
- レタスを5枚洗って水を切り、それぞれのパンに重ねる
- トマトを5枚切って、それぞれに重ねる
- チーズを5枚取り出して、それぞれに重ねる
- パンを1枚ずつ、それぞれに重ねる
「できるだけ早くサンドイッチをつくる(時間の効率)」という観点でみたとき、どちらが「いいアルゴリズム」でどちらが「わるいアルゴリズム」なのか、すぐに分かりますよね。
プログラミングで解きたい問題(目的)は様々ですが、分解した根源的なところでは同じ問題であることも多くあります。たとえばバラバラに並んだものを大きさ順に並び替えたいとか、できるだけ少ない手順で点を線で結びたいとか。
そんな時に、よりよい(目的に沿った)アルゴリズムを検討することで、ぐっとよいプログラムをかけるのです。アルゴリズム、という難しげな言葉がプログラミングにつきものなのは、そういうわけです。
アルゴリズムの選択には「目的」をしっかりと考えることが大切
さて、アルゴリズムについて、もう一つ大事だとわたしが思っていることがあります。
それは、「アルゴリズムのいい・わるいは、基準によって変わる」ことです。
たとえば先ほどのサンドイッチのプログラムでは、「できるだけ早くサンドイッチをつくる(時間の効率)」を基準にすると、「その2」のアルゴリズムに軍配が上がります。
けれど、このサンドイッチ作りの主旨が、「5人のこどもにサンドイッチの作り方を覚えさせる」だったらどうでしょう。どちらのアルゴリズムが「いいアルゴリズム」でしょうか。あるいは、「お皿一枚分しかない、狭いキッチンでサンドイッチをつくる(空間の効率)」だったら?
いま目の前で、4歳児が「かず」のドリルをやっています。右の4組のうさぎと左の4組のうさぎ、足して10になる4つの組み合わせを線で結ぶ問題です。すでに3つの組み合わせに、よろよろした線が引かれています。4歳児は、のこり1つの右のうさぎの数を数え、それから左のうさぎの数を足して数えているところです。親としては「もう3つの組み合わせがわかっているんだから自動的に答えは決まるよ」と口出ししたくてしかたがありません。
でも、ここで立ち止まって考えましょう’。
この問題の目的は、組み合わせて10になる左右の組を見つけること。その目的は、「ちいさな子供が、数に慣れること」。効率よく問題に正解することではありません。
よいアルゴリズムを選択するために、親はぐぐぐと口を引き締めるのです。
(注1)「アルゴリズム」『フリー百科事典 ウィキペディア日本語版』