# 不具合の根本原因を探す

症状を消す修正ではなく、原因を直す手順である。原因が分かるまで修正を書かない。

1. エラーメッセージとスタックトレースを最後まで読む。答えがそのまま書いてあることが多い
2. 確実に再現する手順を作る。再現しないうちは、観測点を増やして情報を集める
3. 最近の変更を見る。差分、コミット、依存、設定、環境の違いである
4. 複数の層をまたぐ処理は、層の境界ごとに入ってきた値と出ていく値をログに出す。壊れている層を特定してから、その層を調べる
5. 不正な値は、呼び出し元をたどって出どころまで遡り、そこで直す
6. 同じコードベースで動いている似た実装を探し、壊れている側との違いを小さなものまですべて挙げる
7. 失敗するテストを先に書いてから、修正を 1 つだけ入れる

複数の層をまたぐ処理の例は、CI からビルド、署名へ進む処理や、API からサービス、DB へ進む処理である。

修正にはついでの改善やリファクタリングを混ぜない。混ぜると何が効いたか分からなくなる。

3 回直しても直らなければ、4 回目を試さずに設計を疑い、ユーザーに相談する。直すたびに別の箇所が壊れるのは、設計の問題であることが多い。
