トラック2・🧭プログラミング的思考

問題を分解する(Decomposition)

読む目安 約10分・ゴール:大きな問題を、手が動く大きさの小問題に分ける考え方を身につける

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

「引っ越しをする」と言われて、いきなり最初の一手を出せる人はいません。大きすぎて、どこから手をつけるか分からないからです。プログラミングでも同じことが起きます。「家計簿アプリを作る」と考えた瞬間に固まってしまうのは、能力の問題ではなく問題の大きさの問題です。

そこで最初の道具が分解です。大きな問題を、それ以上考えなくても手が動く大きさまで割っていきます。

カレーを作る、を分解する

「カレーを作る」を一段割ると、こうなります。

まだ「材料を切る」は大きいので、もう一段割ります。

ここまで来ると、もう迷いません。迷わずに手が動くところが、分解の止めどきです。

カレー作りが枝分かれして小さな作業に分かれていく木の図
カレー作りが枝分かれして小さな作業に分かれていく木の図

止めどきの目安

分解しすぎても困ります。「包丁を持つ」「刃を下ろす」まで割ると、かえって全体が見えなくなります。目安は次の2つです。

  1. その作業を人に頼めるくらい、内容がはっきりしている
  2. 「これってどうやるんだっけ」と手が止まらない
ビット『あとはやるだけ』の状態まで割る。それ以上でも以下でもないんだ。

もう一つの例: 家計簿アプリを分解する

料理だけの話ではありません。「家計簿アプリを作る」も同じように割れます。

さらに「支出を記録する」を一段割ると、「日付と金額と分類を受け取る」「入力が正しいか確かめる」「ファイルに書き込む」になります。ここまで来ると、それぞれが数行から数十行で書けそうだと想像がつくはずです。作れる気がしない、から、作れそう、に変わる瞬間——それが分解の効果です。

分解はそのまま設計になる

分解した1つひとつは、のちのC言語では関数という部品になります。「材料を切る」が1つの関数、「炒める」が1つの関数、といった具合です。今それを知る必要はありませんが、いま紙の上でやっている作業が、そのままプログラムの設計図になるのだと知っておくと、この訓練の意味が見えてきます。

もう一つ、分解にはうれしい副作用があります。どこで失敗したかが分かりやすくなるのです。「カレーがまずい」では原因を追えませんが、「炒めが足りない」なら直せます。プログラムでも、細かく分けてあるほど不具合の場所を絞り込めます。この考え方は、第3トラックのデバッグでもう一度出てきます。

分解は、プログラミング的思考の第一歩であり、4つの道具のなかで最もよく使うものです。プロが大きな仕事を任されたときにやることも、結局は同じで、まず紙に書き出して割ることから始まります。難しい問題に出会ったら、まず「これは何と何でできているか」と問いかけてください。答えが3つか4つ出てきたら、それだけで前進です。手が止まったら、それは能力ではなく粒度の問題だと思い出してください。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

「問題を分解する」ことの説明として、最も適切なものはどれでしょう。

  1. いまの目的に関係ない情報を捨てること
  2. 似た問題を過去の経験から探し出すこと
  3. 大きな問題を、迷わず手が動く大きさの小さな問題に分けること
  4. 分けられるだけ細かく分けて、1動作ずつにすること
答えを見る

正解:C(大きな問題を、迷わず手が動く大きさの小さな問題に分けること)

分解の止めどきは「人に頼める」「手が止まらない」大きさです。分けられるだけ細かくすると、かえって全体が見えなくなります。「関係ない情報を捨てる」のは抽象化、「似た問題を過去から探す」のはパターン認識で、どちらも分解とは別の道具です。

確認問題 2

「部屋を片づける」を分解した結果として、粒度がちょうどよいものはどれでしょう。

  1. 「きれいにする」
  2. 「がんばって片づける」
  3. 「右手を伸ばす」「本をつかむ」「持ち上げる」「棚まで運ぶ」
  4. 「机の上のものを箱に入れる」「床に掃除機をかける」「ゴミをまとめて出す」
答えを見る

正解:D(「机の上のものを箱に入れる」「床に掃除機をかける」「ゴミをまとめて出す」)

正解の3つは、どれも「あとはやるだけ」の状態で、人に頼むこともできます。「きれいにする」「がんばって片づける」は元の問題と同じ大きさのままで分解になっていません。「右手を伸ばす」まで割ると細かすぎて、かえって全体が見えなくなります。

「プログラミング的思考」の目次

  1. 問題を分解する(Decomposition)
  2. パターンを見つける(Pattern Recognition)
  3. 抽象化——捨てる勇気
  4. アルゴリズム——手順を組み立てる
  5. 擬似コードで書いてみる
  6. フローチャート入門
  7. 日常の問題をアルゴリズム化する
  8. 良い手順・悪い手順——効率の予感

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版