概要
- コードを書く速度 と 正確さ を向上させる実践的な思考法の紹介
- 「頭の中で証明をスケッチする」 という習慣の重要性
- モノトニシティ や イミュータビリティ など、設計上の考慮点
- 前提条件・事後条件・不変条件 によるロジックの検証法
- 変更の影響範囲 を限定し、既存動作の安定性を保つ工夫
コードを書く際の思考法とその効果
- 難しい問題 に取り組む際は、 自分のコードが意図通り動作するか を頭の中で証明する習慣
- フローを妨げずにオンラインで実施 するには、 練習と経験 が必要
- この思考法が身につくと、1回または2回の試行で動くコード が書けることが多くなる
- 明確な手法は人それぞれ だが、いくつかの代表的な考え方を紹介
モノトニシティ(単調性)の活用
- モノトニックな処理 は「一方向にしか進まない」特性を持つ
- チェックポイント の実装例:スクリプトの進捗をディスクに保存し、クラッシュ後も未完了のタスクから再開可能
- LSMツリー のようなデータベース構造体は、 操作履歴の蓄積と単調増加 を活用
- Bツリー との比較で、 直感的な理由付けのしやすさ を確認
- イミュータビリティ (不変性)も類似の考え方で、 値の変更禁止による予期せぬ動作の排除
前提条件・事後条件による検証
- 前提条件(pre-condition) :関数実行前に成立しているべき条件
- 事後条件(post-condition) :関数実行後に成立しているべき条件
- これらに基づく単体テストの着想やassertionの導入 による堅牢性向上
- 前提・事後条件が曖昧な場合も発見できる利点
不変条件(インバリアント)の維持
- 常に成立すべき条件 を「不変条件」として定義
- コードを原子的なステップに分割し、それぞれが不変条件を保つことを確認
- ダブルエントリー会計の会計等式 のような古典的インバリアントの例
- ライフサイクルメソッドやリスナー による状態同期の実装
- 実行経路が少ない場合の推論のしやすさ
変更の隔離と影響範囲の管理
- 既存システムを壊さずに拡張・修正する ことがソフトウェア開発の重要な「クラフト」
- 「ブラスト半径」 という考え方で、変更の影響範囲を限定
- 構造的な「ファイアウォール」 による変更の波及防止
- Nerve のクエリエンジンを例に、 依存フィールドの過剰取得と後処理で設計変更を最小限に抑える方法
- クエリプランナーとクエリエグゼキュータ間の境界 で変更を封じ込め
- 本質的なロジックは未変更のまま、既存動作の信頼性確保
- Open-Closed Principle にも通じる考え方
まとめ
- 頭の中で証明をスケッチする習慣 は、 バグの早期発見と高品質なコード の実現に直結
- モノトニシティ、イミュータビリティ、不変条件、前提・事後条件、変更の隔離 といった思考パターンを活用
- 設計・実装時の思考フレームワーク として、日々意識的に使いこなすことが重要