C言語学習ポータル(無料版) 学習コンテンツ プログラミング的思考 問題を分解する(Decomposition)

🧭 プログラミング的思考

問題を分解する(Decomposition)

無料公開版に収録・読む目安 10分

🎯 大きな問題を、手が動く大きさの小問題に分ける考え方を身につける

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

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

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

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

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

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

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

止めどきの目安

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

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

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

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

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

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

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

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

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

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

同じトラックのほかの項目

パターンを見つける(Pattern Recognition)分解した作業の中から共通点・繰り返しを見つけ出せるようになる 抽象化——捨てる勇気目的に必要な情報だけを残し、残りを捨てる「抽象化」の考え方を理解する アルゴリズム——手順を組み立てるアルゴリズムの条件を理解し、順次・分岐・反復の3つの型で手順を組み立てられる 擬似コードで書いてみる擬似コードの書き方を知り、日本語まじりで手順を表現できるようになる フローチャート入門フローチャートの基本記号を覚え、処理の流れを図で読み書きできる 日常の問題をアルゴリズム化する身近な問題を、抜けのない手順として書き下せるようになる 良い手順・悪い手順——効率の予感同じ結果でも手順によって手数が大きく変わることを、探索の例で実感する
パターンを見つける(Pattern Recognition) ›

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

完全版(BOOTH)を見る

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

Web版 / BOOTH