バッドシグナル通信

02 相性の問題

この記事を読むのに必要な時間:およそ 2 分

相性の問題

ソフトウェア開発における危険信号「バッドシグナル」についての本連載,2回めの今回は「相性の問題」を取り上げたいと思います。

コンピュータを使っていると,「原因はわからないが,何かがなぜかうまく動かない」という類いの問題に悩まされることがよくあります。筆者の見る限り,原因がよくわからない問題はとりあえず「相性の問題」と呼ばれることが多いようです。「なんかこれ動かないんだけど」「相性の問題じゃない?」のように,困っている人に対してわかったような返答するときにもよく使われます。

相性の分類

「相性の問題」と呼ばれるもののうち,よくあるのは次のようなケースです。

ソフトウェアのバージョンが古過ぎる,新し過ぎる

ソフトウェア開発において,よく遭遇するのがこの問題です。何かライブラリをダウンロードしてきて使おうと思ったら手元の言語処理系のバージョンが古過ぎて動かない,といったことはよくあります。反対に,何かプラグインをダウンロードして使おうと思ったら手元のブラウザが新し過ぎて動かない(古いバージョンのブラウザでしか動かないプラグイン)といったこともあります。

とりわけ厄介なのは,この2つが組み合わさったときです。

「ひさびさに日曜プログラマになるぜー。限られた時間でものを作るには便利なライブラリを使うのが一番。へー,今はlibBKってのが流行っているのかー注1)。さっそく使ってみるぜー」「よしよし,use BK;っと。あれ,動かない。これ使うにはPerlの最新版が必要なの? まあ上げればいっか」

「うわ,Perl上げたら今度はmod_perlがなんか動かなくなった」「何でだろ。ビルドやり直せば解決するんかな」「だー,ちっともうまくいかねー。俺は一体何に時間を使っているんだ」「そもそもlibBKって一体,何なのよ」

(こうして日曜日は終わっていく)

こういった場合には,古いバージョンのlibBKを試してみる,自力でlibBKを修正して解決する,あきらめて別のものを探す,といった面倒な作業が必要となります。しかも,問題を一つ解決するとまた別の問題が浮上するというyak shaving的注2な状況になりやすいのも困りものです。

注1)
流行っていません。架空のライブラリです。
注2)
一見無関係に見えるけれど,真の問題を解くのに必要な問題を解くのに必要な(これが何段階も続く)問題を解くのに必要な活動のこと。こちらを参照のこと。

プラグインの類いをたくさん入れ過ぎ

ブラウザのFirefoxは,プラグイン(アドオン,拡張機能)によって機能拡張を行えるソフトウェアの代表例です。プラグインによって提供される機能には,便利なものがたくさんあります。

しかし,闇雲にプラグインを入れ過ぎると,プラグイン間での相性の問題が発生して,プラグインの挙動がおかしくなったり,最悪の場合,ブラウザが起動しなくなったりします。

「また日曜日がやってきたー。今度こそクールなWeb2.0アプリを作るぜー」「まずは開発環境を整えなきゃだよな」Firebugってのが基本なのか,まずはこれを入れてっと」「他はどんなのあるんかいな」「へー,BKbugってのも注目されてるのか注3)。ってどっかで聞いた名前だなー。まあこれも入れとくか」

「いよいよhello worldを実行!」「あれ,JavaScriptのエラー出た」「こういうときこそFirebugでデバッグ!」「っと思ったら,Firebugがエラーで起動しねー」

「なんかブラウザ止まっちゃったんですけど」「これってFirefoxをセーフモードで起動すればいいんだっけ。どうやるんだったかな...」「あ,起動した。もしかしてこれ,BKbugってプラグインが原因? Firebugと相性悪いのかなあ」「んー,やっぱ外したら動いたなあ」

「しかし,謎な挙動だなあ。ちょっと調べてみるか」

(こうして日曜日は終わっていく)

こうした問題の原因でありがちなのは,2つのプラグインが同じ名前のグローバル変数を使っているといったケースです。変数の名前空間に限らず,グローバルなリソースの競合(たとえば,2つのプログラムが同じファイルに同時に書き込みにいってしまうとか)は相性の問題を引き起こす典型的な原因です。

注3)
注目されていません。架空のプラグインです。

データフォーマットが食い違う

データフォーマットも相性の問題の主要な発生源です。たとえば,ExcelがエクスポートしたCSV形式のテキストファイルを別の表計算ソフトで正しく読み込める

とは限りません。

日本語の文字コードは何なのか? セルの中に改行が入っていた場合はどうなるのか? (, カンマ記号)が入っていた場合はどうなるのか? などなど,CSV形式一つをとってもさまざまな危険が待ち受けています。

また,同じソフトウェアでも,バージョンが違うとデータフォーマットが変わって読み込めなくなることがあります。

「次の記事の原稿,iXXXXのファイルで送っていいですか」「iXXXXならこちらにもあるから,OKですよ」

「じゃ,できたら送りますね」

(数週間後)

「原稿,ありがとうございます。あのー,でもこれ,iXXXX2008だと読めないんですけど」「えー,まだiXXXX2008なんて使っているんですか。こっちはiXXXX2009goldですよ。超便利になってますよ」

「と言われても読めないものは読めないのですが...」

「新しいの買ったらどうですか」「はい...しかし,1年で使えなくなるソフトウェアって一体...」

データフォーマットの問題を解決するには,同じソフトウェアの同じバージョンを使うのが最も安全な方法です。基本中の基本ですが,他人とデータ交換をするときは相手が同じソフトウェアを持っているかだけでなく,バージョンも確認する必要があります。

その他の相性の問題

ほかにも,マイナーなブラウザとWebサイト(IEでしか正しく見れないWebサイトとか),マイナーなハードウェアとデバイスドライバ(デバイスがちゃんと認識されないとか),アンチウィルスソフトウェアと一部のアプリケーションとの相性(なぜかOSが全体的に不安定になるとか)など,相性の問題といわれるものにはたくさんの種類があります。

私と相性がいいのはどなたかしら

相性の問題を避ける習慣

コンピュータを使っていて相性の問題が発生するのはある程度仕方のないことですが,年がら年中,相性の問題にはまっていたら時間がいくらあっても足りません。

ここでは,どのようにしたら無用な相性の問題を避けることができるのか考えてみたいと思います。

ミニマル主義

一般に,ライブラリのバージョンに起因する問題は,たくさんのライブラリに依存するほど発生する可能性が高くなります。ソフトウェア開発を行う上では,非標準のライブラリ(言語処理系に標準で付属しないもの)への依存を必要最低限に抑えることは,バージョンの問題を避ける良い方法です。

プラグインの相性の問題も同様に,たくさんのプラグインを入れるほど発生する可能性が高くなります。こちらも必要最低限にしておくのが安全です。

定番主義

定番の(枯れた)製品はよく使われているぶん,安定して動くことが期待できます。何か問題があった場合にネット上の情報が充実しているのも利点です。どうしてもそれを使いたいという理由がない限り,マイナーなものは避けたほうが無難です。いくらその製品が優れているとしても,相性の問題に頻繁に遭遇するようではメリットが帳消しになってしまいます。

深追い禁止

相性の問題の中には,真の原因を解明するのが困難なものが多く,深追いして調べ始めると,大して重要でないライブラリやプラグインのために膨大な時間を費やしてしまった(しかも真の原因は謎),という結果になりがちです。傷が深くなり過ぎる前に,自分が何をやっているのか,我に返って冷静に撤退することが大切です。

直感を磨く

相性の問題に何度もはまっていると,自然と「何かいやな予感がするぞ」と,バッドシグナルを嗅ぎつける直感が磨かれます。パソコンやプログラミングの初心者があれこれと問題につまずくのに対して,熟練者があまり問題につまずかないのは,相性の問題などの落とし穴を直感的に避けているから,という理由が大きいでしょう。

まとめ

今回は,相性の問題というバッドシグナルを取り上げました。コンピュータと相性がいい人というのは,無用な相性の問題を避けることができる人,そして必要に応じて相性の問題を楽しんで乗り切ることができる人なのではないかと思います。

著者プロフィール

高林哲(たかばやしさとる)

ソフトウェアエンジニア。バッドノウハウの研究,スルー力の探究,自転車置場の建設,Binary 2.0の布教などの活動を行っている。共著に『Binary Hacks』(オライリー 2006年)。ブログはhttp://0xcc.net/

著書

コメント

コメントの記入