lintで思い出した話

二つ前からの、一つ前の話のアナザーストーリー。

またの名を、「終わりなき連想ゲーム」。

「コンパイル時チェックのありがたさ」について、読み物として一番楽しく読んだのはエキスパートCプログラミング―知られざるCの深層だった。もう既に古典の部類に入るほど古い本だが、ワタシが学生だった頃に翻訳版初版が出版されて、立ち読みして一目惚れし、一気に最後まで読んだほどに楽しかった。

この著者は、(今はなき)Sun Microsoft の人で、なおかつ(今はなき)SunOS 開発チームの人である(と読み取れる)。その中で、「SunOS は lint クリーンであることを誇りにしている」ことについて触れている。そこで何が起こったのか、誰が得をしたのかについて知りたい人は、立ち読みでもいいから是非読んでみて欲しい。ワタシが今でも持っている第一版第三刷では P81。

この本の影響はワタシにはいまだに強いから、どんな言語に立ち向かうのにも警告に無頓着であることはないし、チェックツールがあるなら貪欲に活用しようとはする方だ。それはなによりも「そうせねばならぬ」のではなく「そうするとオイシイ」からに過ぎない。そして実際何度も lint 系ツールが検出する「未使用変数」に助けられもしている。以下は実際に何度か(何度も)やらかした「このテスト、テストになっとらん」バグである:

コードは擬似コード
1 data1 = read_testdata("data1");
2 EXPECT("data1", data1);
3 data2 = read_testdata("data2");
4 EXPECT("data1", data1);

2回目の EXPECT は無論 data2 のテストを書きたかったわけだが、書き換え忘れたわけだ。そしてこのテストは、data1 が正しいならば、「data2のテストだと思っているもの」(実は data1 のテストの繰り返し)は「パスして当たり前」。これは何度もやっているが、少なくとも一度は、そのテストの漏れがダイレクトに実装のバグを隠してしまっていた。未使用変数のようなチェックは、この手のミスを検出するのに役立つ。だから警告だから(もしくは優先度の低いものだから)と軽視するのは、自分のためにならない。

そういうわけで、「lint系のツール」に対する期待感やありがたさ、ということについて、「エンジニアとしてのワタシ」はもちろん十二分に実感しているし、ワタシ以外のエンジニアもそうであって欲しい、と強く願う人ではある。

けれども一方で、「それは違うんじゃない?」という反応をする人がたまにいて、物凄く違和感を憶えることがある。

読んで驚いてしまったんだけれども、とある「同じ目的を持つ2つの OSS」の比較をしている人がいて(海外の人よ)、その人の決断の理由がね、「lint クリーンかどうか」だけだったのな。えーっ?? 要するに自分の価値観でもって「これさえ出来てないものなんかダメなものであるはずだ」ってわけだ。この人とは絶対に友達になりたくない。まず間違いなく人の話をきかない人だろう。近視眼で融通がきかない、周りから迷惑がられるタイプの人であることに疑いの余地はない。

何かを評価するときってさ、複数の観点と優先度のマトリクスでもって、「総合的に」やらんといかんでしょうよ。「実」を取るなら、瑣末な減点ポイントがあっても、それを自分で補えるなら「これは買い!」という評価にだってなるはずなんだ。

実際その「比較」をワタシは1bitも参考にせずに、自分で両方評価してみたんだけれど、当たり前だがその人の評価とは正反対になった。「lint クリーンだから良い」とされた方は、「保守なんか出来ないひどい雑な(いわゆるスパゲッティ)プログラム」であったし、それ以前に振る舞いがダメだった。「lint クリーンでないからダメだ」とされた方は、設計が大変美しく、実装も綺麗で、テストも良くされていて、「遅い」という欠点を除けば大変行儀よく振舞っていた。これではあまりにも後者の作者が可哀相だなぁと思い、ワタシが lint 的なことをしてあげて報告してあげたほど。(その人は「クソ」がつくほど真面目な人で、喜んで受け取ってくれた。)

つまりは、lint は「原則ワタシのため」であって、「必ずしもアンタのためじゃない」ということ。義務感や強迫観念でやるようなもんじゃないし、ましてや「それをやってないから許せない」という感情に結び付けるのは間違ってる。(というかお得じゃない。)

当然のことながら「lintも基礎設計も振る舞いも全部素晴らしい」のがベストなのは言うまでもないこと。全部揃ってりゃそりゃぁ理想だ。だけど優先度も付けずにどれか一つだけ欠けてる、よりにもよって「lint さえも欠けているのだから」と考えるのは、まさに「バカ」。