先日、プログラミング系のPodcastを聴いていたら、こんな話をしていました。
プログラムを組む時、最初から性能チューニングのことを考えて分かりにくい複雑なプログラムを書いてはいけない。まず、分かりやすいきれいな構造のプログラムを作り、出来上がったプログラムの性能測定を行って、問題があったらその箇所のチューニングをしなさい、ということでした。
これを聞いて、この話はプログラミングに限らず、日常の様々な場面にも応用できるテクニックだと思いました。
やりがちなアプローチ
日常生活で何かを改善したいと思う場面はよくあります。例えば、
- 貯金が全然貯まらないので、節約したい
- 趣味の時間が取れないので、時間の使い方を見直したい
- 電気代が高いので、節電したい
- 体重が増えてきたので、ダイエットしたい
- パソコンのディスクがいっぱいになったので、ファイルを減らしたい
などなど。
こういうことを考え始めた時、ついついやってしまいがちなのは、思いついたところや、やりやすいところから、とりあえず改善していこうというアプローチです。上の例で言うと
- 貯金が貯まらない → スーパーのチラシで安売りを探そう
- 時間が取れない → 見たいテレビ番組を1本減らすか
- 節電したい → 小まめに電灯を消そう
- ダイエットしたい → 少し運動してみるか
- パソコンのファイルを減らしたい → 思いつく不要なファイルを消そう
こいう思いつきのアプローチは、やらないよりはマシかもしれませんが、根本的な改善には至らないことが多いものです。
効果的なアプローチ
そこで、最初のプログラミングの話です。この話を一般化して段階に分けて書くと、以下のようになります。
- 計測
問題のある対象を体験あるいは試行し、改善したい指数を部分毎に計測する。 - 分析
計測した結果を元に、どの部分が指数悪化の主要因となっているか(つまりボトルネックがどこか)を特定する。 - 対策
特定したボトルネックを改善する対策を考え、実施する。
上で述べた思いつきのアプローチは、いきなり3の対策に走っているので、たまたま思いついた対象がボトルネックであればいいのですが、そうでなければ苦労の割に効果が出ない、ということになります。
実際に大切なのは1の計測と2の分析です。お金の例で言うと、まず家計簿を付けて自分の消費の傾向を具体的に把握し、次にそれを元に削減する対象を決定するということになります。時間の例では、自分が何に時間を使っているかをライフログを付けるなどして把握し、それを元にどの時間を削るかを決定します。
ほとんどの場合、改善対象全体の中で大きな割合を占めている部分に対して大鉈をふるわないと、根本的な改善にはつながりません。
ただし、計測・分析でボトルネックが見つかったとしても、それを改善するかどうかは対策にかかるコストとの兼ね合いになります。たとえば、時間の話でボトルネックが通勤時間であったとすれば、改善するには多分住所を変えるか勤め先を変えるしかありません。
このように、特定したボトルネックに対して実際に対策を実施できるかどうかは各人の都合・状況をふまえて判断する必要があります。しかし、やみくもに思いつきで対策を行うよりはずっと効率的で、効果の薄い無駄な努力をしないで済みます。
日常の様々な場面で、応用を考えてみてください。