大きな問題は小さくして1つずつ対処する――分割統治法問題解決力を高めるコツはプログラミングの原則・思考にあり(4)(2/4 ページ)

» 2017年08月21日 05時00分 公開
[上田勲]

1歩ずつ少しずつ

 英語  One by one

 別名  1つずつ少しずつ

 What 〜ステップ・バイ・ステップ

 プログラミングは、一度に、小さな1つのことを行います。

 1つずつ、少しずつ、小さな段の階段を上っていくように作業します。決して複数を相手にせず、1つずつ対処します。

 小さな作業を1つ行い、それをしっかり確認し、次の作業に移る、というサイクルを繰り返します。

 Why 〜「手堅い歩み」は効率的

 小さいけれども、確実な1歩を繰り返して進む方が、結果として品質も時間効率も上がります。

 なぜなら、複数の作業を一度に行うと、それらの作業が混線して、どれも失敗する可能性が高くなるからです。失敗まで行かなくても、2つの作業がごちゃ混ぜになり、コードの質が悪くなる上に、余計に時間がかかります。

 1歩ずつ進めると、最後の1歩を後戻りすることが楽になります。

 問題が発生して、修正をいったん元に戻したい時、ステップ・バイ・ステップで進んでいれば、後戻りは楽です。進んだ時と逆の順に、ステップ・バイ・ステップで戻っていけばよいからです。

 例えば、タスクAだけを取り消したいのに、タスクAとタスクBの結果がコードに混在していたとしたら、タスクBの内容には手を加えずに、タスクAだけ後戻りさせるのは、非常に厄介な作業です。

 1歩ずつ進めると、各1歩の確認が楽になります。

 例えば、新しく関数を書く時、まだどこからも使用されていないとしても、まずコンパイルすることで、文法エラーがないことを確認できます。次に、ユニットテストを行うことで、実際の動作を確認できます。このように、コンピュータに仕事をしてもらえるようになるのです。

 1歩ずつ進めると、特に古いものを新しいものに変えていく場合、それを安全に行うことができるようになります。「すべてを壊して、すべてを作り直す」のではなく「動く状態を保ちつつ、新しいコードを追加していき、古いものがすべて新しくなったところで、古いものを壊す」という手順を踏むのです。はじめは面倒に感じますが、この方が失敗する危険が少なくなります。

 実用的な理由のほかに、心理的な理由もあります。

 1歩ずつ進めることは、コードの状態を把握して、コントロールできていることを意味します。そのため、不確定要素がなくなり、不安を感じることのないまま、作業することができるのです。

 心理的に圧迫されていると、普段のような質のよい判断ができません。自分の状態をコントロールすることも、よいコードを書くためには必要です。

 How 〜一度に複数やらない

 1歩ずつ、少しずつ作業を行いましょう。

 例えば、リファクタリングであれば、モジュール間で関数を移動する時、関数名の不備に気付いたとしても、移動と名前変更を同時に行ってはいけません。関数を移動した後、いったんその状態で動作確認をしてから、関数名の変更に取り組みます。

 あるいは、テスト駆動開発中であれば、コードを一気に書いて、後からまとめてテストを実行してはいけません。もちろん、必要なテストコードを全部書いてから、本番コードを全部書くということもしてはいけません。少しずつテストコードを書き、少しずつ本番コードを書き、それを繰り返します。

 関連1 〜思考も「1歩ずつ、少しずつ」

 頭のいい人は、コツコツ考えたりしないで、瞬時に、一足飛びに答えを導き出しているように見えます。

 確かに、頭のいい人は、アウトプットが速い上に正確なので、何かショートカットしているように見えるかもしれません。しかし、これは誤解です。

 頭のいい人は、何か特別な手法を使って、手順を飛ばして、考えるのが速くなっているのではありません。コツコツ考えているのですが、やらなければならない論理ステップを構築し、各ステップそれぞれを速く、確実に行うので、全体として速く正確になっているのです。「コツコツを高速化している」ということです。

 少し考えて、わからないと、すぐに自分の頭の悪さを責めてしまうのは誤りです。手順をしっかり踏んで、コツコツ考えるようにしましょう。

 関連2 〜論理的思考のコツ

 論理的に考えるには、ポイントがあります。

  • 瞬時に答えを得ようとする態度は誤りです。瞬時にわからなくても考え続けましょう。
  • 考え始めて、すぐに結論に飛びつくのは誤りです。条件を満たすものが1つ見つかった時に思考停止せず、思い込みを排除して、ほかの可能性も検討しましょう。
  • 既に考えたことを、しっかり覚えておきましょう。そうすれば、同じことを何度も繰り返し考える「思考のループ」に入り込んでしまうことを避けられます。
  • 覚えておくのは大変なので、書きながら考えるようにしましょう。書きながら考えることには、副次効果があります。書いて、目で見えるようにすると、頭の中だけで考えていた時にわからなかったものが、なぜかわかるようになります。
  • 論理的に考えるとはいえ、直感も大切です。例えば、「マトリクスを作れば情報が整理されるかもしれない」と直感的に思ったら、まずそれを試します。ただし、これは思考の過程の話で、直感のみで直接答えを得ようとするのは、単なる当て推量で、よい習慣ではありません。

出典書籍

『Java言語で学ぶリファクタリング入門』結城浩, ソフトバンククリエイティブ(2007)

関連書籍

『新装版リファクタリング―既存のコードを安全に改善する』Martin Fowler, オーム社(2014)

『テスト駆動開発入門』ケントベック, ピアソンエデュケーション(2003)

『史上最強の論理パズル―ポイントを見抜く力を養う60問』小野田博一, 講談社(2003)


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。