新・闘わないプログラマ No.25

魔法使いとの付き合い方


唐突ですが、wizardという単語を辞書で引いて見ました。「(男の)魔法使い」だそうです。女性じゃなかったんですね、wizardって(^^;)

最近のマイクロソフトの製品には「なんちゃらウィザード」とかいう機能がよく付いています。自分がやりたいことを順番に答えてゆくと、自動的にやってくれる便利な機能です・・・といいたいところなんですけど、私はこれが嫌いです。
私が最初にこのウィザードなる機能に出会ったのは、確かExcelのグラフウィザードだったと思います。表上のグラフにしたい範囲を選択してグラフウィザードを起動すると、どんな形のグラフ(棒グラフとか折れ線グラフ)にするのか、とか、軸のスケールはどうするのか、とか、グラフのタイトルは何にするのか、とか、いろいろ聞いてきます。それに答えてゆけば、自動的にグラフを表示してくれるわけです。
メニューなどからいろいろな設定を行えば、これと同じ事をすることは出来るのですが、非常に面倒です。そういった一連の作業を自動化してくれるのがウィザードなわけです。そういう意味では、面倒な作業を簡略化してくれるウィザードは、便利な機能がついてよかったね、というだけで、文句を言う筋合いのことでは無いかも知れません。でも私は、諸手をあげて賛成するわけにはいきません。

何が不満か、と言いますと、ウィザードは典型的な作業を自動化してくれるに過ぎず、ウィザードの生成物にある程度手を加えないと、最終的にユーザーが欲しているものにはならないのです。例えば、先のグラフウィザードの例でゆけば、出来たグラフに対して、例えば、色を変えるとか、凡例のフォントを変えるとか、配置を微妙に移動するとか、いろいろやる必要があります。
まぁ、それはそれで仕方の無い部分もあるわけですが(すべての条件をウィザードで指定できるようにしたら、操作が煩雑になりすぎる)、でも、これは厄介な問題を引き起こします。例えば、せっかくそうやって作ったグラフを、3次元グラフから2次元グラフに変更したい場合を考えて見ます。さて、どうしたらいいでしょうか。
この場合、二通りのやり方が考えられます。まず、そのグラフの設定を変更して、元グラフから2次元グラフにする方法です。でも、ユーザーはグラフウィザードを使ってグラフを作りましたから、いったいどこの設定を変更すれば望みの操作を行う事ができるのか、検討も付きません。
じゃあ、グラフウィザードを使えば、簡単に変更が出来るのでしょうか。ところが既に出来ているグラフには、グラフウィザードを適用する事は出来ません。ようするに、この場合は、まっさらな状態から、再度グラフを作る事をやり直す必要があります。出来たグラフに手を加えることも含めて。

ちょっと、説明が分かりにくかったかも知れませんが、要するに、ウィザードを使って何かの操作をした場合、あとでそのパラメータの変更をしようと思っても、ウィザードではそれをすることが出来ないので結構面倒だ、ということです。
ウィザードは、裏でどんなことをやっているのかユーザーには見えず、ブラックボックス化しているので、非常に不安が残ります。ただ、私が言いたいのは「ブラックボックス化」そのものが悪い、ということではありません。ユーザーから煩雑な設定やら処理を隠す「ブラックボックス化」という考え方自体は何ら問題があるわけではありません。
問題は、だったらブラックボックス(ここではウィザードのこと)で全部やって欲しいのにそれが出来ない、ということにあります。先の例で言えば、グラフを3次元から2次元にするのにだって、ウィザードで出来て欲しい、ということです。
このブラックボックス化は、オブジェクト指向でいう「カプセル化」そのものだと思いますが、ソフトの操作性を上げる、ためにはこういう事も必要なのではないでしょうか。皮肉な見方をすれば、ソフトの操作が煩雑になりすぎたので、ウィザードなる機能をおまけで付けて、それでごまかしました、とも言えると思います、本来の操作性を改善することをしないで。

Excelのような、エンドユーザー向けのソフトの場合は、これでも、まぁ、そんなに問題になることも無いのかも知れません。しかし、最近は、Visual C++(VC)というC++というプログラミング言語の開発環境にまでウィザードが付いてきます。
VCで何かプログラムを作ろうとしたとき、どんなプログラムを作るか選択すると、自動的にウィザードが起動されます。ここで作りたいプログラムの概略を答えてゆくと、プログラムのテンプレートが出来上がります。ここにはプログラムソースも含まれるのですが、これに処理の追加・手直しをして、自分の作りたいプログラムを作り上げてゆきます。
このやりかたって、作る方にはとっても不安なんですよね。ある程度のソースが勝手に生成されるのですが、これが何をやっているか全部追うのは結構大変です。かといって、この部分をブラックボックス化できるようなものでもありません。要するに中途半端なんです。
これが完全に見えないような形式になっていれば(たとえば、Visual Basicなら、この部分はユーザーからは見えないようになっています)、使う方としても気にする必要が無いのですが、そういうわけでもありません。かといって、何をやっているか追ってゆくのも大変です。まして、ウィザードで答えた項目を後から変更しようとしても、それは不可能にちかいわけです。再生成すれば、一から作り直しになりますから。
最近も、それでトラブルを経験しました。これは、私とは全然関係の無いところで開発されたシステムなのですが、どうも動きがおかしいのだけれど原因がわからない、ということで、調査の応援にかり出されました。VC++のウィザードで生成したプログラムのテンプレートを、プログラマ自身がよく理解しないで手を入れたために、動作がおかしくなってしまったものでした。もともと、このテンプレート、いろんな状況に対応できるように結構複雑になっていて、見通しがきかない、というもので、理解するのに骨が折れたりします。

これに限らず、私はプログラムの自動生成、というものに昔から懐疑的です。生成したプログラムソースに手を入れることなくコンパイラに渡すようならいいのですが(たとえば、ある言語から別の言語への自動変換とか)、生成したソースに手を入れるのは邪道だと思っています。

今回の話は分かりづらかったかもしれません。どうもうまく説明できなかったのですが、要するに言いたかった事は、もっといろいろな場面でオブジェクト指向の考え方を取り入れて欲しいな、ということです。

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp