最終更新日: 2009-11-03
WEB+DB PRESS Vol. 51 に向けて書いた記事の元の原稿です。
ソフトウェア開発における危険信号「バッドシグナル」についての本連載、2回目の今回は「相性の問題」を取り上げたいと思います。
コンピュータを使っていると「原因はわからないが、何かがなぜかうまく動かない」という類いの問題に悩まされることがよくあります。私の見る限り、原因がよくわからない問題はとりあえず「相性の問題」と呼ばれることが多いようです。「なんかこれ動かないんだけど」「相性の問題じゃない?」のように困っている人に対してわかったような返答するときにもよく使われます。
「相性の問題」と呼ばれるもののうちよくあるのは次のようなケースです。
ソフトウェア開発においてよく遭遇するのがこの問題です。何かライブラリをダウンロードしてきて使おうと思ったら手元の言語処理系のバージョンが古すぎて動かない、といったことはよくあります。反対に、何かプラグインをダウンロードして使おうと思ったら手元のブラウザが新しすぎて動かない(古いバージョンのブラウザでしか動かないプラグイン)といったこともあります。
とりわけ厄介なのはこの2つが組合わさったときです。
「ひさびさに日曜プログラマになるぜー。限られた時間でものを作るには便利なライブラリを使うのが一番。へー、今は libBK ってのが流行っているのかー*1。さっそく使ってみるぜー」「よしよし use BK; っと。あれ、動かない。これ使うには Perl の最新版が必要なの?まあ上げればいっか」
「うわ、Perl 上げたら今度は mod_perl がなんか動かなくなった。」「何でだろ。ビルドやり直せば解決するんかな。」「だー、ちっともうまくいかねー。俺は一体何に時間を使っているんだ」「そもそも libBK って一体なんなのよ」
(こうして日曜日は終わっていく)
こういった場合には、古いバージョンの libBK を試してみる、自力で libBK を修正して解決する、あきらめて別のものを探す、といった面倒な作業が必要となります。しかも、問題をひとつ解決するとまた別の問題が浮上するという yak shaving 的*2 な状況になりやすいのも困りものです。
ブラウザの Firefox はプラグイン (アドオン) によって機能拡張を行えるソフトウェアの代表例です。プラグインによって提供される機能には便利なものがたくさんあります。
しかし、闇雲にプラグインをいれすぎると、プラグイン間での相性の問題が発生して、プラグインの挙動がおかしくなったり、最悪の場合、ブラウザが起動しなくなったりします。
「また日曜日がやってきたー。今度こそクールな Web 2.0アプリを作るぜー」「まずは開発環境を整えなきゃだよな」「Firebug ってのが基本なのか、まずはこれを入れてっと」「他はどんなのあるんかいな」「へー、BKbug ってのも注目されてるのか*3。ってどっかで聞いた名前だなー。まあこれも入れとくか」
「いよいよ hello world を実行!」「あれ、JavaScript のエラーでた」「こういうときこそ Firebug でデバッグ!」「っと思ったら Firebug がエラーで起動しねー」「なんかブラウザ止まっちゃったんですけど」「これってFirefox をセーフモードで起動すればいいんだっけ。どうやるんだったかな。。」「あ、起動した。もしかしてこれ、BKbug ってプラグインが原因? Firebug と相性悪いのかなあ」「んー、やっぱ外したら動いたなあ」「しかし、謎な挙動だなあ。ちょっと調べてみるか」
(こうして日曜日は終わっていく)
こうした問題の原因でありがちなのは、2つのプラグインが同じ名前のグローバル変数を使っているといったケースです。変数の名前空間に限らず、グローバルなリソースの競合 (たとえば、2つのプログラムが同じファイルに同時に書き込みにいってしまうとか) は相性の問題を引き起こす典型的な原因です。
データフォーマットも相性の問題の主要な発生源です。たとえば、 Excel がエクスポートした CSV 形式のテキストファイルを別の表計算ソフトで正しく読み込めるとは限りません。
日本語の文字コードは何なのか?セルの中に改行が入っていた場合はどうなるのか?カンマ記号が入っていた場合はどうなるのか?などなど、CSV 形式ひとつをとってもさまざまな危険が待ち受けています。
同じソフトウエアでもバージョンが違うとデータフォーマットが変わって読み込めなくなることがあります。
「次の記事の原稿、iXXXX のファイルで送っていいですか」「iXXXX ならうちにあるから、いいですよ」「じゃ、できたら送りますね」
(数週間後)
「原稿、ありがとうございます。あのー、でもこれ、 iXXXX 08 だと読めないんですけど」「えー、まだ iXXXX 08 なんて使っているんですか。こっちは iXXXX 09 ですよ。超便利になってますよ」「と言われても読めないものは読めないのですが...」「新しいの買ったらどうですか」「はい。。しかし、一年で使えなくなるソフトウェアって一体。。」
データフォーマットの問題を解決するには同じソフトウェアの同じバージョンを使うのが最も安全な方法です。他人とデータ交換をするときは相手が同じソフトウェアを持っているかだけでなく、バージョンも確認する必要があります。
他にも、マイナーなブラウザとウェブサイト(IE でしか正しく見れないウェブサイトとか)、マイナーなハードウェアとデバイスドライバ(デバイスがちゃんと認識されないとか)、アンチウィルスソフトウェアと一部のアプリケーションとの相性(なぜかOSが全体的に不安定になるとか)など、相性の問題といわれるものにはたくさんの種類があります。
コンピュータを使っていて相性の問題が発生するのはある程度仕方のないことですが、年がら年中、相性の問題にはまっていたら時間がいくらあっても足りません。ここでは、どのようにしたら無用な相性の問題を避けることができるのか考えてみたいと思います。
一般に、ライブラリのバージョンに起因する問題は、たくさんのライブラリに依存するほど発生する可能性が高くなります。ソフトウェア開発を行う上では、非標準のライブラリ(言語処理系に標準で付属しないもの)への依存を必要最低限に押さえることは、バージョンの問題を避けるいい方法です。
プラグインの相性の問題も同様に、たくさんのプラグインを入れるほど発生する可能性が高くなります。こちらも必要最低限にしておくのが安全です。
定番の (枯れた) 製品はよく使われている分、安定して動くことが期待できます。何か問題があった場合にネット上の情報が充実しているのも利点です。どうしてもそれを使いたいという理由がない限り、マイナーなものは避けたほうが無難です。いくらその製品が優れているとしても、相性の問題に頻繁に遭遇するようではメリットが帳消しになってしまいます。
相性の問題の中には、真の原因を解明するのが困難なものが多く、深追いして調べはじめると、大して重要でないライブラリやプラグインのために膨大な時間を費やしてしまった(しかも真の原因は謎)、という結果になりがちです。傷が深くなりすぎる前に、自分が何をやっているのか我に返って冷静に撤退することが大切です。
相性の問題に何度もはまっていると、自然と「何かいやな予感がするぞ」と、バッドシグナルを嗅ぎつける直感が磨かれます。パソコンやプログラミングの初心者があれこれと問題につまずくのに対して、熟練者があまり問題につまずかないのは、相性の問題などの落とし穴を直感的に避けているから、という理由が大きいのではないかと思います。
今回は相性の問題というバッドシグナルを取り上げました。コンピュータと相性がいい人というのは、無用な相性の問題を避けることができる人、そして必要に応じて相性の問題を楽しんで乗り切ることができる人なのではないかと思います。
*1流行っていません。架空のライブラリです。
*2 一見無関係に見えるけど、真の問題を解くのに必要な問題を解くのに必要な(これが何段階も続く)問題を解くのに必要な活動のこと。
<http://0xcc.net/blog/archives/000196.html> を参照のこと。
*3注目されていません。架空のプラグインです。