■ 1. 操作中心の思考の課題
- 操作中心の思考とは: インプットからアウトプットを計算したり、状態を変更する「操作」(関数定義)から先に考える思考法である。
- 問題点:
- 抜け・漏れの発生: 最初に最も可能性の高いケースを考え、それ以外の例外的なケースを後回しにする傾向がある。これにより、状態変更の考慮漏れが発生しやすくなる。
- コードの複雑化: 仕様の「ただし書き」や、考慮漏れを補うためのif文が増え、コードが不必要に複雑になる。
- 安易な仕様変更: コーディングを楽にするために、不自然な仕様や複雑な状態を生み出すことがある。
■ 2. 状態中心の思考への転換
- 状態中心の思考とは: 操作を考える前に、まず操作の前後で取りうる「状態」や「性質」を定義し、それを可能な限りシンプルに保つ思考法である。
- 実践方法(ユーザー登録の例):
- 操作前の状態を定義する: 該当メールアドレスのユーザーが「存在しない」「有効である」「無効である」の3パターンを定義する。
- 操作後の状態を定義する: 成功した場合、必ず「該当メールアドレスのユーザーが存在し、有効である」という単一の状態を保証する。
- 思考の順序:
- 1. 操作の前後に成り立ってほしい状態や性質を考える。
- 2. その状態や性質を満たすには、どのような操作が必要かを考える。
■ 3. 状態中心の思考の適用範囲
- コードレビュー: コードレビューでは、この思考順序がコードに如実に現れる。操作から考える傾向のあるコードは、後から追加されたif文などによって不必要に複雑になっていることが多い。
- 仕様定義: この考え方は、より大きなプロジェクトの仕様定義にも適用できる。
- ユーザーが抱える課題(事前条件)や、達成したい目標(事後条件)といった「状態」を先に定義する。
- その「状態」を満たすために必要な機能(操作)を次に考える。
- 問題解決全般: 解決方法(How)を先に考えるのではなく、「どういう状態になったら成功か」という問題を先に理解することで、より本質的な解決策を導き出せる。
■ 4. まとめ
- 思考の習慣の重要性: 多くのエンジニアが意識していないが、美しく堅牢なコードを書くためには「操作」よりも「状態・性質」に注目する習慣が不可欠である。
- 堅牢なコードの基盤: この思考順序で取り組むことで、複雑さを避け、美しく堅牢なコードの土台を築くことができる。