Skip to content

Lint Your Life

バグだらけのOSSを作っているわたしが言うべきではないとわかっている。しかしいちおう本職はソフトウェア品質管理だったこともある。

品質管理の第一歩はリンターだ。コードを書いた瞬間に指摘してくれる。人間のレビュアーと違って疲れないし、感情もない。未使用変数、型の不一致、到達不能コード。人間が見落とすものを機械が拾う。

ESLintが長らくJavaScriptの標準だった。Airbnbのルールセットを入れておけば、だいたいのチームで揃った書き方になる。セミコロンの有無、インデントの幅、アロー関数の括弧。くだらない議論をルールに委ねられる。コードレビューで「ここセミコロン抜けてます」と指摘する時間がゼロになる。

Prettierはフォーマッターだ。コードの意味には触れず、見た目だけを整える。ESLintと役割が違う。ESLintはバグを見つけ、Prettierは見た目を揃える。両方入れるのが定番だったが、設定の競合に悩まされることが多かった。

Biomeが出てきて風向きが変わった。リンターとフォーマッターを一本化して、Rustで書かれているから速い。依存がゼロだ。node_modulesの肥大化に疲れた身には、それだけで泣ける。ESLintとPrettierの二本立てから移行するチームが増えている。設定ファイルがひとつ減るだけで、精神衛生がだいぶ違う。ただしVueのようなフレームワーク固有の対応はまだ弱く、どこでも使えるわけではない。

C/C++の世界にはclang-tidyがある。静的解析とリファクタリングを兼ねる。メモリリーク、ダングリングポインタ、未定義動作。JavaScriptの「セミコロン抜け」とは重みが違う。落ちるか落ちないかの世界だ。

エディタとの連携が品質管理の生命線だ。保存するたびにリンターが走り、フォーマッターが整形する。CIで弾くのでは遅い。書いた瞬間に指摘されるから直す気になる。CIで落ちると「あとで直す」になる。あとで直すは、だいたい直さない。CIをデプロイのゲートにするかどうかはチームで議論になる。OSSではゲートにしないプロジェクトも多い。正解はない。

リンターもテストも全部入れている。それでもバグは出る。リンターは構文を守り、テストは挙動を守る。ただし間違ったロジックはテストできない。テストも間違うからだ。品質管理とは、バグをゼロにすることではなく、バグに気づく速度を上げることなのかもしれない。