静的解析
『Google のソフトウェアエンジニアリング』第20章を読んで理解した内容を、自分の言葉で書き直したもの。 本文の引用ではない。節番号は原典を引き直すときの手がかり。
何のために使うか
プログラムを実行せずに潜在的な問題を見つける仕組み。バグ検出だけの道具ではない。
- 本番にチェックインされる前にバグを捕まえる
- ベストプラクティスをコード化する
- コードが新しい API バージョンに追随し続けるよう促す
- 技術的負債を防ぐ、あるいは減らす
静的解析が失敗する原因は、精度ではなく信頼
技術的に正しくても使われなければ意味がない。この章の主張はほぼここに集約される。
実質的誤検出という考え方 (§20.2.1)
判定基準を、ツール側の正誤ではなく開発者の行動に置く。
- 開発者が問題を知らされても何も行動しなかったなら、それは実質的誤検出
- 逆に、解析が技術的には間違って報告していても、 リーダビリティや保守性のために開発者が快く直すなら、それは実質的誤検出ではない
だから、誤検出率が低いツールだけをデプロイする。 フィードバックを能動的に集め、それに基づいて実際に手を入れる。 これがユーザーの信頼の確立とツールの改善の好循環を作る。
解析自体がどれだけ成果を挙げているかも追跡し続ける。
カスタマイズを消したらどうなったか (§20.3.4)
書籍が挙げている実例が分かりやすい。 プロジェクトごとのカスタマイズ機能を全部取り除いたところ、 すぐに「うっとうしい解析結果」への苦情が来た。
有用なシグナルが少なく、役に立つことが稀な解析は、結局無効化される。 だから信頼できる結果だけを出すことで信頼の土台を作る方を先にやる。
何を、どこで出すか
出す量を絞る (§20.1)
数十億行のコードベースにスケールすること
編集されたファイル・行についてだけ結果を出すこと
新しく出てきた警告に的を絞ること
既存コード全体の警告を一度に見せない。費用対効果のトレードオフとして設計する。
出す結果の条件 (§20.3)
価値がある
理解できる
行動可能で、修正が容易である
開発者のワークフローに埋め込む (§20.2.2)
独立したツールとして置かず、普段の流れの中に入れる。 ありふれた問題を自動で目立たせることで、レビュアーの時間を節約できる。
| 埋め込み先 | やること |
|---|---|
| コードレビュー | 変更行についての結果を表示。「役に立たない」ボタンで理由を回収する |
| 修正提案 | スタイルの問題は自動修正する。 人間のレビュアーの時間の使い道として適切ではない |
| コンパイラ | チェック結果を警告ではなくエラーとして扱い、ビルドを壊す |
| エディタ | 編集中・閲覧中に出す。ただし解析は1秒未満、理想は100ミリ秒未満 |
自動的に修正できるものは、すべて自動的に修正されるべき。
関連
- コードレビュー — 機械が指摘できるものを人間に見させない
- テスト — テストフレームワーク用の静的解析も同じ基準で整備する
- ビルド
- 継続的インテグレーション — パイプラインのどこに載せるか
- Go —
go vet/staticcheckを CI のどこで走らせるか - アクセシビリティの検証 — 道具の位置づけが同じ領域