97年12月2日執筆

プログラムを書こう!


前口上

ひょんなことから、「オンラインソフトウェア大賞(以下OSPと略す)'97」なん てものの選考委員になってしまった。どうも今年からLinux部門というものが 出来たらしく、また関係者に知人もいるために選ばれたのであろう。本誌が出 る頃には既に結果が出ているとは思う。

主催団体である電子ネットワーク協議会を好きかと言われれば、迷わず嫌いと 答えるし、イベントそのものに興味もそれ程あるわけではないが、この手のイ ベントにLinuxの部門が出来たというのも嬉しいし、「一見公式立場っぽいも のの委員」になるというのは、ビジネスでハッタリを効かす時に役に立つかも 知れないので、いろいろ忙しい時ではあるが引き受けることにした。引き受け てしまえば当然仕事はあるわけで、当面の仕事は「ノミネート候補作品の選出」 である。つまり、目ぼしいソフトを選んで推薦しなくてはならないのである。 さて、今回はこの辺から話を始めよう。

純国産free softwareの現状

OSPの候補として出せるソフトは、基本的に国産であることが求められている。 Linuxを使っている人ならわかると思うが、我々が普段使うソフトで純粋に国 産というものはあまり多くはなく、たいていは「向こう産」のソフトを日本語 化(場合によっては国際化)したものが大半である。そもそも、Linux自体が国 産ではないし、UNIXも国産ではない。また、国内のプログラマの数よりも、国 外のプログラマの方がずっと多いわけであるし、そもそも「ソフトそれ自体に はに国境はない」のだから、「純国産」ということは、ある意味ナンセンスで あるとは思う。

しかし、過去のOSPで受賞したソフトを見ると、「うーん国産」という感じが するものが多数ある。もちろんそれは海外に出してもひけをとらないものであ るし、別段「和風」ということもないのだが、やはり「日本人が作った」と感 じると言うか、日本人らしいセンスを感じるものばかりである。そうなると、 「純国産」というものも価値があるように思える。

OSF受賞ソフト
第1回 LHA
第2回 WTERM
第3回 JW_CAD
第4回 なし
第5回 AL-Mail

さて、そこでLinuxの「純国産ソフト」を探してみよう。「落ち」などがあっ たりすると申し訳ないので、一々挙げるようなことはしないが、パッチの類や 小さいものを除くと100は挙げられないように思う。fj.sourcesのようなとこ ろに公開されたUNIX用のものを総合しても、そんなにたくさんは挙げられない。

ではMS-DOSやWindowsはどうであろうか? ベクターデザインから出ているPACK シリーズのCD-ROMのタイトルを見れば、軽く10000を越えている。もちろんこ れは玉石混交であるし、既に古いものも多数あるとは思うが、それでも桁違い に多いことだけは確かである。

MS-DOSは古くからあって、パソコンの黎明期の「プログラムは自分で作る」と いう空気があった字代に多くプログラムが作られたのだという意見もある。し かし、Windowsのソフトも既に10000のオーダーになっているので、これは説明 にならない。Win95(と言うかWin32 API)に関して言えば、Linuxよりも後に出 て来たのだから、「プログラムを作る時間」ということなら、Linuxの方がた くさんあったはずである。

開発環境の充実といあ観点から言えば、Linuxには最初からタダで使える開発 環境が揃っている。これらが使い易いかどうかは議論のあるところだろうが、 少なくともMS-DOSと比べれば快適だと思う。そうなると、結局Linuxに純国産 free softwareが少ない原因は、「作られなかったから」としか言いようがな い。

無論、プログラムはあれば良い作れば良いというものではない。クズがいくら あってもしょうがないし、守備範囲の広いプログラムが、小さい複数のプログ ラムを合わせた機能を持っているのも悪くない。しかし、ごく一般的な傾向を 言うなら、プログラムは多い程選択枝は増えるし、目的に合ったものが発見出 来る確率は高くなる。もちろん単純にプログラムの種類を考えた時には、何も 純国産にこだわる必要はないが、色々なことを考えると、やはり国産は嬉しい ものである。このことは多くが認めるところではないかと思う。

では、そんな誰もが求めそうな「国産ソフト」がなぜ作られなかったかという ことを分析しながら、今回の「何を為すべきか」について考えてみよう。

開発環境

普通クラスのプログラマ、特にUNIXでの開発経験のある人にしてみれば、 Linuxの開発環境は「必要にして十分なものが揃っている」と言ってしまって 良いだろう。また、多少不足であっても、手元のCD-ROMをあさるとか、ftpを 捜すとかすれば、たいていのものは揃う。Motifのような有償配布されている ライブラリも、Lesstifのような代替ソフトがある。

言語に関して言えば、メジャーな言語でfreeなものがないのは、COBOLくらい なものである。これとて必要なら商用処理系は存在しているので、「出来ない」 というものではない。

ツールキットやライブラリの類は、選択に困る程ある。また、そのうちメジャー なものに関しては、たいてい既に日本語化(国際化)されているので、日本語の アプリケーションを書くことも、そう難しくない。

ところが、これがWindowsの開発環境との比較となると、ちょっと悲しくなる。 と言うのも、Windowsにはいわゆる「ビルダ」というものを装備した開発環境 が結構ある。VC++にしてもBC++にしても、ビルダでGUI周辺を作ってしまい、 プログラマがコーディングするのは個々の処理の中身だけということが可能に なっているのだ。これだと見栄えの良いGUIなアプリが、かなり簡単に作れて しまう。このような便利な環境がLinuxにもあると嬉しいのであるが、残念な がら今のところうまく使えるものはない。

反面、LinuxにはたとえXの上であっても、shell promptというものが存在して いる。だから、ちょっとしたフィルタの類や、何もGUIするまでもないものは、 簡単に書くことが可能である。また、実際の処理部分はshell promptで使うよ うにしておいて、後でGUIな皮を被せることも可能であるから、プログラムの 内容によっては簡単にGUI化することも出来る。そういった点ではLinuxの方が 楽かも知れない。

このように考えると、Win95が特別に楽だとか、Linuxが特別に楽だとかという ことはなさそうである。

定番ソフトの存在

Linuxには非常にたくさんのプログラムが既に存在している。 SAL(http://SAL.KachinaTech.COM/) を見れば、自分の欲しいと思うプログラムは既に何種類も存在している。これ らの多くは日本語が通らないのではあるが、そのことに我慢すれば新たに作る 必要は感じないし、日本語を通したければ日本語化すれば良いわけで、特別に 新規作成の必要は感じない。さらに、これらの「多種多様」のものの中には、 いわゆる「定番」というものが存在している。つまり、多くの人が「ふつ〜○ ○」と言って使っているソフトである。例えばエディタならMuleだろうし、イ メージビュアならxvといったものである。もちろん「俺は別のを使っているよ」 という人もあるだろうが、それにしても「2番目にメジャー」なソフトである ことが多いので、物事としては大差がない。いずれにせよ、「定番」が存在し ているのは誰の目にも明らかである。

そうなると思うことは、「今さら作ってもなぁ」ということである。プログラ ムの勉強にはエディタのようなものを作るのは、なかなか良いのであるが、そ んな時でもつい見てしまうのはMuleであったりするわけで、「とても追いつけ ない」などと余計なことを考えてしまう。

確かに、プログラムを実用本意で考えれば、定番にはそれなりの価値があるわ けで、定番ソフトの存在は重要である。しかし、プログラミングという行為を 考えるなら、何も定番があるからと言って、萎縮する必要もないはずである。 勉強のためなら、定番ソフトを見て萎縮するのではなく、それを目指して頑張 れば良いのである。

さらに言うなら、「実用本意」であっても、定番を打ち破る価値はある。 「freeなPC-UNIX」というものは、今まで誰も経験したことのない世界である。 そして、現在「定番」とされているソフトの多くは、WSやミニコンといった 「古い世界」で動いていたものであるから、必ずしも「freeなPC-UNIX」とい う新しい世界にマッチしているとは言い切れない。そのことを考えれば、必ず しも今までの定番が永遠の定番ではないだろうし、別のソフトが新たな定番に なる可能性も十分ある。

「freeなPC-UNIX」がどれくらい従来のプラットホームと異るかに示してみる。

プラットホーム Linux MS系OS UNIX
OSの価格 タダ ほとんどタダ 結構いい値段
開発環境の価格 ほぼタダ 結構いい値段 最近は高い
商用ベンダ ある 多い ある
インストール数 多い 非常に多い 少ない
資源の占有 不可
資源の管理 厳密 割といい加減 厳密
「画面」の存在 当然 存在が前提 必ずしもない
安定性 超安定 よく落ちる 安定

かなり手前味噌的な表ではあるが、言いたいことは「freeなPC-UNIXはUNIXの 良い点とMS系OSの良い点を両方持っている」ということである。もちろんこれ は下手をすると「両方の悪いところを持つ」ということにもなりかねないが、 物事は必ず良い方に動かすことが出来るはずなので、「いいとこ取り」と思っ ておこう。

個人的にこの中で重要だと思うのは、当然と言えば当然であるが、PC-UNIXは 「UNIXでありながらパーソナルユースである」ということである。つまり、 UNIXのようにちゃんと資源やプロセスが管理されている上に、パーソナルユー スということで、ほぼ資源やプロセスが占有出来るということである。つまり、 多少重いプログラムでも、平気ということである。

これが古くからあるUNIXの使われ方だと、「マルチユーザ」ということの重き を置かれていたので、「資源の浪費はしないこと」という制限があったのだが、 Linuxではその辺はあまり気にする必要はない。まぁDOSのプログラムであった dynamic stop(*1)は歓迎されないが、多少のムダがあっ ても、困るのは自分だけであるから、あまり深刻な問題にはならない。このこ とはCPUだけではなく、各種デバイスやメモリにも言えることで、「基本的に 占有」という考えでプログラムを書いても、特別問題になることは少ない。だ から、この辺を活用した便利なプログラムがあれば、新たな定番になる可能性 は十分にある。たとえばtimidity (*2)のようなデー タ処理が大量にあって重いと言われるプログラムも、Linuxでは特別に問題は ないし、現代のCPUでは重いとさえ思わないで済む(今使っているP6 dualのマ シンくらいだと、全く邪魔にならない)。こういったアプローチが、これから のアプリケーションに求められるとするなら、そうでないアプローチによる定 番にとって代わることも可能である。

*1 dynamic stop

無限ループを使ってプログラムを停止する手法。たいていループの中身は脱出 条件のチェックだけになっている。確かに停止するが、CPUは100%の負荷にな る。busy waitとも言う。

*2 timidity

MIDIプレイヤーの一種。MIDIデータをソフトウェアで音に変換する。楽器デー タを用意してやれば限りなく良い音になる。しかし、処理するデータも大量な ので、CPUを食いまくる。

学校教育

私はサーバ屋として仕事をしながら、高専の非常勤講師として働いている。つ まり、産業界と教育界の両方に身を置いているわけである。教えているのは 「情報工学科」といういわゆるコンピュータ系の学科なのであるが、プログラ ミングの話をすると、きょとんとした顔をする者が多い。実習で書いたプログ ラムを見ると、かなり出来る奴でも「なんだよ。そりゃあ」と言いたくなるよ うなプログラムを持って来る。早い話が、「マトモなプログラムが書けない」 のである。これは高専だけの問題ではなく、大学でも似たようなもので(場合 によってはもっとタチが悪いかも知れない)、情報学科の出だからと言ってプ ログラムが書けるわけではないようである。つまり、学校でプログラミングは 教えてない(に等しい)のである。これは日本に学校発のプログラムが少ないと いうことからも伺える。もちろん例外はどこにでも存在するのではあるが、一 般論として「情報学科を出てもプログラムは書けない」というのは成り立つこ とのようである。

これを外国に目を向けるなら、学校発のソフトはかなりある。そもそも、 Linux自体が学生の書いたプログラムである。もちろん、外国の学生がみんな Linusのようだとは思わないが、これを「アメリカの大学発」と限定しても、 かなりある。考えてみれば、Linuxだけではなく、BSDもそうであるし、Gnuな んかも大学の文化から産まれたものである。

ここで「だから日本の学校教育は」といった教育論をぶつ気はない。だいたい、 学校で教えるかどうかと、個人がやるかどうかは別次元の話である。しかし、 現実の役に立たない理論ばかりを教え、プログラムすら書けないような「情報 工学科卒」に何の意味があるのだろうか。産業界の人間として大いに疑問を感 じる。fjあたりで「Linuxのコードは○○がダサいんだよ」的発言をする奴の 中で、いったいどれだけの連中が実際に「自分のものとして」Linuxのコード を読んだ経験があるだろうか? 単なる評論なら、元ロック評論家だって出来 る(しかも、彼はちゃんとコードを読んでいる)。

大学の先生なら、「現実の役に立たない理論」に反感を持つかも知れないが、 悔しかったら何か実用になるソフトを研究室の外に出してみると良い。そんな ことが出来ないような「情報工学科」なら、クソだ。「工学」とは理論の実装 の学問であって、単なる理論だけでも、腕力だけでもないものだ(と習ったも のだ)。

振り帰って、自分たちが学生の頃を考えてみると、環境は悪かったが随分とプ ログラムを書いたような気がする。これは、私と同じ世代の人は一様に同じよ うなことを言う。これを「老人の昔話」と断じてしまうのは簡単であるが、ど うも現実がそうなのだ。別の世界に目をやると、「天体観測」が趣味の人々は、 私よりももう少し上の年代が、「いろいろ頑張った」世代だそうである。身内 に目を向ければ、JEの真鍋さんや、JFの小野さんなんぞは、私よりも随分と歳 が下である。などと考えると、いわゆる「黎明期」には「無から有を作る」エ ネルギーがあったと言えなくもない。とは言え、どう考えても今は「小康期」 であって、「安定期」であるとは言えないと思うのだがどうだろう。

まだまだ?

この手のことで、「条件は揃ってるじゃないか」と問い詰めると、必ず「いや。 私はまだまだそんなレベルではありません」と答える人がいる。いや、そうい う人の方が多いと言っても良いくらいである。まぁ確かにやっと`Hello World'が書ける人に、いきなりWWWブラウザを書けと言えば、「まだまだそん なレベルではありません」というのは嘘ではないかも知れない。しかし、ここ で無茶を言わせてもらおう。「それは不可能ではない」と。

これはオリジナルのプログラムではないが、先日私はXClass95の国際化をやっ た。XClass95とは、X環境でWin95風のGUIを実現するC++のクラスライブラリで ある。今日現在で、まだ日本語入力は出来ていないが、ボタンやラベルに日本 語がちゃんと出る程度には完成している。実作業は、だいたい2週間くらいで やったのであるが、この作業に着手した時まで、私はC++のプログラムを自分 では書いたことがなかったのだ。つまり、`Hello World'以前だったのである。 まぁ読んで読めないこともなかったのではあるが、「自分のもの」として取り 組んだことがなかったので、身にはなっていなかった。しかも、Xのプログラ ムもほとんどやったことはなく、Xawを使うアプリをちょっと書いたことがあ る程度だったのだ。つまり、XもC++も、ほぼ全くの素人だったのである。そん な私でも、ちゃんと国際化は出来た。あまりこんなことを誇るのは、格好の良 いことではないかも知れないが、正直に

「頑張った自分を誉めてあげたい」
と思う。

おそらくそれを始めた時点の私よりこの作業に向いた人、つまりXやC++を多少 なりとも経験した人は大勢いたと思う。ここで「じゃあなんでそいつらがやら なかったんだ」と言う気はない。「そいつら」が必要を感じなければ、やる必 要はないからだ。だから、ここで言いたいのは、その当時の私のレベルよりも 高いレベルの人は大勢いたということである。つまり、そんな私に出来たとい うことは、出来る人はいっぱいいるはずであるということだ。

もちろん私は過去にCのプログラムなら山のように書いて来たし、COBOLや FORTRANで書いたものも含めれば、いったいどれくらい書いたかわからないく らいプログラムを書いて来た。そういった経験はあるから、「全くの素人だ」 と自称する気はない。しかし、そんな私を見て「あなただから出来たのだ」と は言って欲しくない。と言うより、そのようにして「自分には出来ない」とい う理由を探しては欲しくない。それよりは、「なんだ、そんな奴だってやれば 出来るんだ」というところを見て欲しい。そう。`Hello World'級の私でも、 小さいとは言え、Xのツールキットが国際化出来たのだ。だからというわけで はないが、「私はまだまだ」などと言う必要は全くない。やりたくなったらや ればいいのだ。

確かに聖書には、「塔を築こうとするとき、まずすわって、完成に十分な金が あるかどうか、その費用を計算しない者が、あなたがたのうちにひとりでもあ るでしょうか。基礎を築いただけで完成できなかったら、見てい た人はみな 彼をあざわらって、『この人は、建て始めはしたものの、完成できなかった。』 と言うでしょう(ルカによる福音書15章28節〜30節)」という個所があって、見 積りや見通しを立てることの重要性を言っている。そんな話を持ち出すまでも なく、見通しはちゃんと立てないと困るというのは嘘ではない。

しかし、そうかと言って、「石橋を叩いて叩き壊して渡らない」といった行為 をするのもどうかと思う。仕事でやっているのなら別であるが、趣味でやると するなら、「とにかくやっちゃえ」でも悪くはないと思う。

XやC++のことをほとんど知らずにXClass95の国際化を始めた私であったが、今 は程々にその辺はわかるようになった。つまり、「必要な技術はやっているう ちに身につく」のだ。「まだまだ」などと言っていれば、永遠にそんな技術は 身につかないだろう。

ドキュメント

先日、linux-users MLである人が「Linuxで簡単に使えるグラフィックライブ ラリはありませんか」という意味の質問をした。その質問に「Xlibはどうか」 という意味の答えを書いた人がいたのである。確かにXlibを単なるグラフィッ クライブラリだと思って使うことは、それ程難しいものではないし(Xlibの難 しいのは色とかイメージとかイベントとかである)、必要なプリミティブはた いてい揃っている。そう考えると、確かにXlibをグラフィックライブラリとし て使うというのは、結構いいアイディアであるし、「簡単に使える」ものでも ある。GUIのツールとしてのXlibは色々面倒なことをしたりする必要があって、 「簡単に使える」とは言い難いものであるが、一度ウィンドウを開いてしまえ ば、そこに描画することは、単に描画関数を呼ぶだけであるから、かつての MS-DOS上のグラフィックライブラリと大差ない。

では現状のXlibを「グラフィックライブラリ」として「簡単に使える」と勧め ることが可能かと言えば、それは無理なことだと思う。私がXClass95の国際化 をした時でも、そこらじゅうのXの本をかき集め、manを読みまくり、あるいは テストプログラムを書いて関数の動作を習得しながらやった。つまり、かなり 試行錯誤しながら習得したのである。わかってしまえば特別難しいことはない ので、Xの設計が特別にタコいとかとは思わないのであるが、とにかく適当な 教科書がないのである。また、あってもR4以前の古いXを基本として書いてあっ たりして、情報が古いのである。だから、使える教科書がないのだ。

逆に言えば、適当な教科書さえあればXlibを使うのは「Cが書ける人なら誰で も出来る」レベルのことなのだ(XtやXawは概念的にはもっと難しい)。そういっ た意味で、プログラミングのHOWTOを書いた文書の存在は重要である。何しろ、 不可能を可能にするくらいの威力があるのだから。

TODO

さて最後にTODOでまとめてみよう。

一言で言えば、「プログラムを書かない理由はない。必要だと思ったら書け」 ということである。既に定番があろうと、学校で実装技術を教えてくれなかろ うと、あるいは自分の技術が至らないものであろうと、とにかく書くのだ。技 術が不足していれば、習得する努力をすれば良い。プログラミングを学ぶのに 一番の近道は、「プログラムを書く」ことである。確かに何人もの人が同じよ うなプログラムを書くのはナンセンスであろう。しかし、何か違ったコンセプ トを持ったプログラムなら、それぞれが存在する価値があるはずだ。

次世代の定番ソフトを作るのはあなたかも知れないのだ。


もどる