── アルゴリズムの陳腐化
◆古いエアコン
その掲示を読んだのは、確か2年前(1995年)の春頃のことだった。
電子掲示板上で「古いエアコン探しています」というタイトルの掲示を見つけ、興味を引かれて何気なく読んでみたのである。掲示の内容は、昭和49年以前の東芝製エアコンを探しているというものだった。該当するエアコンを持っているか、知っている方はご一報くださいと記されている。何か、特許係争にからむ話のようであった。
そういえば我が家にも古いエアコンがある。現在では各部屋に1台ずつ設置されているけれど、昔は一家に1台が普通だった。そういう時代に購入した年代物のエアコンが、まだ家に残っている。
「各部屋に1台」などと書くと、さも自慢しているように聞こえるかもしれないが、そんなことはない。私の近所の家では犬小屋にまでエアコンが設置されているくらいだ。何でもその家では、四畳半ほどの大きさの犬小屋を作ってエアコンで冷暖房完備にしているのだという。贅沢な犬もいたものである。そのデラックスな犬小屋を作った大工は、最後に家主にこう尋ねたという。「入り口に鍵でも付けましょうか?」
最終的に鍵を付けることに犬が同意したのかどうか、そこのところは聞き漏らしたが、犬は出来たばかりの小屋のヒノキの香りが気に入らず、結局中には入りたがらなかったそうである。
その、一家に1台が普通であった頃に買ったエアコンが、我が家ではまだ無事に稼動しているのだ。記憶をたどってざっと計算してみると、購入したのは昭和44年頃ということになる。十分にこの条件に当てはまるではないか。
最近のエアコンは冷暖房兼用が常識であるが、初期の頃のものは冷房機能しか付いていなかった。妻の実家に1台と我が家に2台、都合3台のまとめ買いをしたのである。我が家の分の1台は、当時同居していた今は亡き私の母親が息子の会社の製品をということで買ってくれたのである。もちろん最新型ではあったが冷房専用のものだった。
その後に買ったエアコンは、いずれもマイコン制御で冷暖房兼用のものになっていた。しかしこのマイコン制御というのが曲者でよく故障する。修理に来てくれた人に「たいして使っていないのに、直ぐ壊れてしまった」と不満を言うと、使わないのがかえっていけないのだと言う。マイコン組込みの機器は、普段使っていないとかえって壊れやすくなるのだそうである。要するに、使わないでいると“錆び付いてしまう”ということなのであろう。
それに引き替え、最初に買った冷房専用のエアコンはマイコン制御ではなく、シンプルで頑健だった。家の改築などで移設したことは何度かあったが、決して壊れることはなかった。ガスが抜けてしまうという事故が一度あった程度である。
買った当時我が家では、家族の者が冷房をあまり好まなかった。夏の余程暑い日でない限りスイッチを入れないのである。冷房専用エアコンであるから、夏の盛りのある一時期だけ使って、後はほとんど使わずにきたのである。もちろん、手入れはまめに行ってきた。内部を定期的に掃除するようにしていたので、開けてみても内部の機器には錆び一つ浮いてはいない。まさに新品同様の状態を維持しているのである。
その上、私はこの古いエアコンに特別な愛着があり、手放し難い思いがするのであった。それは単に、故障しないからということだけではなく、買ってくれた母親の思い出とが一体になっているためであろうと思う。最近は、夏になるとほぼ毎日フル運転である。古いタイプだから電力を食う困った存在なのかもしれないが、故障もせずにけなげに働いてくれている。もっとも、最近は外置きの機器の方から何やら苦しそうなモーターの回転音が聞こえてくることがある。ウンウンと苦しそうに唸っているような感じで、そろそろ引退させてやらねばならぬ時期にきているのかもしれない。
そんなことを考えながら帰宅して妻に尋ねると、家計簿の記録から昔エアコンを購入した日付を確認してくれた。やはり26年前(昭和44年)に購入した物であることが分かった。そこで私は、早速「我が家のエアコンは、‥‥」と購入時期と型番を電子メールで掲示の発信者(富士工場の方)に伝えたのであった。すると、折り返し保証書の有無を問い合わせてきた。そして「古いエアコンのデータベース」に登録する旨の連絡があった。これが7月初めの頃のことである。
その後何の連絡もなかったが11月のある日、突然職場に(フジ)の方から電話があり、現物を見せてほしいと言ってきた。そこで、自宅まで見にきてもらうことになった。当日は、生憎私は会社に出ていて立ち会えなかったが、妻の話によると富士工場の技術者二人がこられて写真を何枚か撮っていったそうである。
そして何日か後再び連絡があり、特許問題の公知例に使用するため2台とも引き取りたいといってきた。このようにして、我が家の古い年代物のエアコン2台が引き取られていき、その代りに冷暖房兼用の最新式のエアコン2台が無償で設置されたのである。随分と得をしてしまったが、こんなことをしてもらっていいのかなあ、と内心では少し後ろめたい気持ちが残るのであった。古いものを大切にしていると、何時かこういう良いことが起るものなのであろう。
◆ソフトウェアも錆びる
こうして新しいエアコンを使ってみると、これがすこぶる性能がよい。今まで使っていたのは何だったのか。電力は食うし、音もすごいし、それに何よりも冷房の効きが段違いで到底比較にならないときている。随分とエネルギーを無駄遣いしていたことになる。表面的にはどこにも錆びは見えなかったけれど、本当のところは全体が錆付いている代物を長年それとは知らずに使い続けていたのである。古いエアコンを大切にしていたのは、単なる自己満足に過ぎなかったことを私はようやく理解したのであった。
しかし、こういうことはソフトウェアの世界ではよくあることのようである。我々は“錆びたソフトウェア”をそれと気が付かずに後生大事に使っていることが多いのではなかろうか。
どういった状況で錆びたソフトウェアが生じやすいか、一例をあげてみよう。
その昔、コンパイラ開発に従事していたころの話になるが、コンパイラ本体の開発に追われていると実行時サブルーチン(いわゆるライブラリ関数)を作る仕事の方がどうしても疎かになる。そこで、そういう仕事は新人の若手技術者にまかせてしまうことが多かった。もし間違えても影響が及ぶ範囲が限られているからという安易な気持ちもあったが、新人にやらせるにはモジュールの規模が丁度適当な大きさの仕事だったからでもある。
しかしそうやってできあがったシステムを使って見ると、ベンチマークなどの際に痛い目に会うことがよくあった。お客が用意したプログラムの実行時間が予想外に遅いのである。色々と調べてみると遅くなる原因はライブラリ関数にあることが分かってきたりする。
たとえば、aのn乗を求める記述がプログラム上にあったとしよう(ここで、nは整数とする)。nの値が“4”とか“7”とかの整定数で直接指定されていれば、コンパイラは頑張ってインラインに目的コードを展開しようと努力する。しかしnの値が変数で指定されている場合には、実行時まで計算できないからライブラリ関数が使われることになる。
ところが新人に作らせたaのn乗を求めるライブラリ関数の造りは、単にaをn−1回のループの中で掛け合わせるようなアルゴリズムになっていたりする。素朴というか何というか、何しろそういう実用を無視した例題が載った市販のプログラミング入門書が多いのだから、これは新人を責めても仕方のないことなのかもしれない。
こんなアルゴリズムでは、得られた結果は正しいかもしれないが時間が掛かりすぎてまず実用にはならない。たとえば、
a=1.01
n=10000
だったりしたら、もう目も当てられない事態になる。ベンチマークテストだから、そういう意地悪な記述が多かったのである。
こういう場合は、nの値としてどんな値が指定されようとも、確実に一定時間内に計算が終了するような特殊な計算アルゴリズムを使わなければならない。よく知られた簡単なライブラリ関数でも、実は内部的にはそういった先人の知恵と工夫の宝庫になっていること多いのだ。それを知らずに素朴に作ると、とんでもない目に会う。
そういう失敗をしないよう、普通は先人の作ったライブラリ関数を解読して新しいマシンに合うように移植するのである。ところがこれが結構面倒な作業で、結局なぜそうする必要があるのかを十分理解できないままに、何となくアルゴリズムをそのまま移植していくことになる。最近のようにマシンのアーキテクチャが統一されてくると、移植作業も楽になってきた。更には、ライブラリの記述言語が高水準言語になってきたので益々移植作業は楽になり、もはや解読などしないでそのまま移行すればよいようになってきた。ただコンパイルし直すだけで、そのまま動作するのだから楽なものである。これは生産性の面からは結構なことではあるが、実はこれこそがソフトウェアに錆びが発生する原因の一つになっているのである。
普段使い慣れたツールであっても、その中で使われているアルゴリズムは、実は最新の技術進歩から取り残された時代遅れの“陳腐化したアルゴリズム”になってしまっているかもしれない。たとえば、大容量補助記憶装置の出現とそれへの高速アクセスが可能になったこと、あるいは安価で大容量の直接アクセスメモリの出現などは、特に環境の変化として注意を要するところである。昔は省みられなかったようなアルゴリズムが、こういった技術進歩の結果として意味を持つようになってきているかもしれない。直接アクセスメモリが高価で十分装備できなかった時代に作られたソフトウェアは、メモリを節約することを第一義に作られた巧妙なアルゴリズムを用いていることが多い。しかし、もっとメモリをふんだんに利用できれば、更に画期的に高速な処理ができるようになるかもしれないのだ。そのようなアルゴリズムは、普通は碌でもない素朴な手法であることが多いのだが、結局その方が高速処理を実現できるとすれば、その時点ではそちらの方が良いアルゴリズムだと言えるのではなかろうか。
新しいソフトウェアが出ると直ぐに飛びつくのもどうかと思うが、逆に、移植が楽だからとかあるいは使い慣れていて愛着があるからといった理由だけでいつまでも古いソフトウェアにしがみついているという態度も一度見直した方がよいのかもしれない。もしかするとそれは、古いエアコンを愛着があるからと言って使い続けているのと同じで、貴重なリソースの無駄遣いを続けていることなのかもしれないからである。■(1997-7 記)