Because We Love Happy Coding

フリーライターからエンジニア × 講師。発信力だけあり余ってる感じ

アルゴリズムの粒度

今日もまたコーディング。だって僕らはHappy Codingが大好きだから。

アルゴリズムの初歩を教える時に、よく「一日の手順をフローチャートに描く」とか「味噌汁の作り方をフローチャートに描く」とかって練習させる教師がいるんだけど、その際に説明を省略しがちなのが「粒度」について。たぶん、教師自身が無自覚なのでそういうことになる。生徒はこれだけでだいぶ混乱しがち。

たとえば「朝食を作る」というフローの中では「味噌汁を作る」が1つの項目だけで記述される場合もあるし、「味噌汁のレシピ」というフローの中では「豆腐を切る」「豆腐を煮る」「だし入れる」「味噌入れる」というレベルで項目が記述されることもあるし、機械工学的にロボットに味噌汁を作らせるフローなら「豆腐をつかむ」「豆腐をこの角度で切る」「豆腐を持ち上げてお椀に入れる」というところまで項目にする。

つまり、粒度が様々なのだ。この辺りをきちんと説明してあげないと、初心者は戸惑ってしまう。最初は粒度を揃えるために「豆腐を切る」「豆腐を煮る」「だし入れる」「味噌入れる」という選択肢を用意しておいて、順番を考えさせるくらいから始めるべき。その際に、粒度の説明も一緒にする方が良い。

本来のコーディング設計においては、言語の組み込み関数の知識があって初めて粒度を想定できる。

たとえばよく「最大値を求める」アルゴリズムを考えさせたりするけれど、言語によっては「最大値を求める関数」が用意されているわけだから、普通はそれ一つで処理が終わる。だから、そういう組み込み関数がある前提でアルゴリズムを描くなら「最大値を求める」で終わりで、くどくどその中身を考える必要は(あまり)ないはずだ。

練習問題でも、想定の粒度を明記しておかないと、はっきしいって解けない、と思う。