http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.0.1.html
![]() |
『Cプログラミング診断室』目次/ 次(開院準備・レベル差)
『Cプログラミング診断室』
第〇章 開院準備
■ 昔むかし
私がコンピュータを始めたのはもう16年も前になります。半田ごてを持っ て、TK-80なんてキットを組み立てたりしました。今から考えるとまるで情報 のない時代でした。趣味のパズルで、しらみつぶしに検索するのに、自分でやっ たらミスはするし、面倒くさくてやってられないので、ばかばかしい作業を代 わりにやってくれる道具を捜していました。そのころ世に出てきたのがマイク ロコンピュータでした。
当時はパソコンという言葉さえ存在しませんでした。今のパソコンよりも遥 かに低速なVAX-11/780という1億円もするコンピュータ、といってもメモリは 増設してやっと750キロバイト、ハードディスクは50メガバイトを使って、3 次元CADプログラムを組むという、今考えると空恐ろしいことをやったりもし ました。あるいは、それよりもさらに前に、1600万色フルカラーの画像処理装 置のプログラムの開発をしていました。たった2MBのメモリを管理するため に、専用のハードウェアメンテナンス要員がいました。
AppleIIにCP/Mボードを挿して、全部アセンブラでコンパイラを作り上げた りもしました。それどころか、CPU不明のポケットコンピュータ相手に、付属 していたBASICを使って、ROMの内容をみんなで解析して、分かった範囲のマシ ン語を利用して液晶ディスプレイを高速に制御し、ゲームを作って遊ぶという 狂気じみたことまでやったり、やらせたりという、旧き良き時代がありました。
そういうことをしていたので、結構周りにはコンピュータをよく知っている のがうろうろしていて、新しい情報を容易に入手できました。コンピュータ関 係の雑誌や単行本も少なく、刊行されているものはとにかく全部購入してしま うということをしても金が続きました。全く情報の少ない、旧き良き時代でし た。
C言語については、カーニハンの『プログラミング言語C』の英語版の青焼 を見たのが最初だった記憶があります。その後日本語訳がすぐに出て、使える 環境がないにもかかわらず読んでみました。当時、どこまで理解して読んだか 全然覚えていません。それからしばらくして、会社でUNIXを導入することになっ てからは、Cを毎日使用するようになりました。もう10年以上も前のことで す。
その後のコンピュータの発展は、予想はしていたものの本当にすばらしいも のです。ハードウェア性能はどんどん向上し、どんどん使いやすくなって来ま した。美しい3次元コンピュータグラフィックスの表示を家庭で自由に楽しめ る時代も現実になりつつあります。
■ レベル差
コンピュータが良くなり、より複雑な処理をするプログラムがどんどん増え てきました。大学には多数の情報関係の学科が新設され、コンピュータ専門学 校もどんどん増え、多数のプログラマを排出しました。したがって、プログラ ムの開発技術の方も着実に進歩したと考えるのが当然でしょう。いまでは、学 校で正規にプログラミング教育を受けた人達がプログラムを組むようになって きたので、コンピュータメーカ、大手企業のソフト開発部門から中小ソフトハ ウスに至るまで、ソフト開発のレベルも自然に上がってきたと考えるべきでしょ う。
しかし、現実の姿は全く反対で、技術レベル差はますます広がり、下級レベ ルは「ごみプログラム」を大量生産しているだけになってしまいました。趣味 のプログラマが下手で、どうしようもないのは趣味だからまだ良いのですが、 下手なプログラマが報酬を得て下手なプログラムを組み、そのプログラムで社 会活動の一部が動いているかと思うとゾッとします。コンピュータは日常生活 のあらゆる分野に入り込んでいるので、人権、金銭、財産に関することはもち ろん、交通機関、医療機械などでもどんどん利用されているので、バグが生命 を奪う危険性も当然考えられます。
プログラマという名前さえついていれば、誰あるいはどの会社に発注しよう と同程度のプログラムができ上がると思っている人がいます。相見積りをとり、 できるだけ安いところに決定することが良く行なわれています。これはとんで もない間違いです。プログラムの開発は、一度始めたら、あらゆるものがコン ピュータ処理になっていくため、少々どころか全然満足できないプログラムで さえ我慢して使い続け、拡張し続ける運命にあります。最初が肝心です。最初 にきちんとした人が開発していれば、その後の保守、拡張はスムーズにできた はずなのに、土台がだめなので何をやってもうまく行かず、システム全体を廃 棄処分にしてしまうことすらあります。もっと悲惨なのは、リース期限が切れ るまで、使いもしない粗大ごみを社内にデーンと置いておくことでしょう。
少々不満でも、発注先を別の会社に変更すると慣れるまでの時間がかかると の判断で、いつまでも同じ所に発注し続ける傾向があります。どの専門分野で も同じ傾向がありますが、客はそんなにコンピュータに詳しくないので、どこ に発注するのが一番ベストか分からないのが普通です。現在付き合っている会 社の技術レベルを標準と考えがちです。複数の会社に仕事を出すと、各社の色々 な分野でのレベル差とか特徴が分かってきて、継続して発注すべき所と、早く 切り捨てた方が良い所が分かってきます。
プログラムの単価は、まだまだ1行いくらという、内職と同じレベルで評価 されることが多いのです。もちろん、コンピュータ会社以外の経理部門などが そういう考え方をするのはやむを得ないと思いますが、まだまだコンピュータ で生計を立てている会社ですら、その様な技術を無視した考えを持っていると ころが多いものです。
■ 教育
今まで、コンピュータ教育、とくにソフトウェア教育というと、プログラミ ング言語などを覚えて、与えられた仕事をこなすことだと思われていました。 そして、実際の仕事についてプログラムを組み始めたら、プログラミングの品 質管理などについて社内研修があったりします。プログラムの品質向上は今ま で数え切れないほど話題にされ、各種の技法が紹介され実用に供されました。 また、最近の開発ツールはいろいろな開発支援をしてくれることも事実です。
しかし、やはりどんな道具を使おうと、下手なプログラマのプログラムは下 手なのです。フローチャートや、その他の設計方法でしっかり設計しても、形 式だけでは結局だめなのです。プログラムを組むためには、プログラミング言 語を理解していなければなりません。でも、これは文法を理解しただけに過ぎ ません。これでは日本の英語教育の欠陥とまったく同じです。日本語が使える のは、幼いころ、自分の周囲で日本語を話すのを聞いているうちに自然に身に つけたものでしょう。誤ったことを言えば、何度も何度も直してくれた人がい たはずです。
コンピュータ教育も他の分野と同じで、基礎的なことは本から、あるいは講 義などで知識を得ることは必要です。しかし、その知識を運用して、やりたい ことをやれるように育てることが教育の本質です。それには、どこで誤りを犯 すかを指摘し、正しいやり方を教え、使いこなせるようにしなければなりませ ん。それも、正しい方法そのものを「公式」の形で示すだけではなく、その 「公式」を使えば良い理由を教えなければなりません。重要なのは公式ではな く、理由の方なのですが、今の学校教育の弊害なのか、「公式の丸暗記」だけ をしようとする人がいます。学校教育では、最も単純な生徒の能力判定として、 今も暗記力を問うテストが多く行なわれています。
仕事では、記憶は学校教育ほど重要ではありません。不確かな記憶に頼るぐ らいなら、メモを取るなり、資料や本を見たり、オンラインヘルプを見て正確 を期せば良いのです。不確実な記憶に頼って間違えたら罵倒されるに決まって います。無理をして覚える必要は全然ありません。それより、どこにどんな情 報があるかを、どうやったら調べられるかを知っていることが重要なのです。
コンピュータの世界では、情報はどんどん古くなってしまいます。全ての情 報はナマモノ、生鮮食料品みたいなものです。学校で習った知識や技術がいつ までも通用する世界ではありません。それどころか、たとえ最新の技術教育を 受けたにしろ、卒業した時点ですでに古くなっています。学校で習った知識で 一生食べていけるなんてことは有り得ません。私がコンピュータを始めたころ の知識で役に立っているものはほとんど有りません。当時は役に立ったのです が、もう使っていたコンピュータも廃棄処分になっています。このように変化 の激しいコンピュータの世界で生き抜くためには、記憶に頼るようなことはや めた方が無難です。
■ ネットワーク
コンピュータの世界でネットワークと言うと当然LANのことを考えますよ ね。でも、違うのです。ここで言いたいのは、コンピュータを使っていく上で 助けてくれる「お助けネットワーク」のことです。
コンピュータは非常に性能が上がり、その利用法も複雑多岐に渡っています。 たとえどんなに優秀なコンピュータ技術者でも、その全容を理解し利用してい る人などいません。各自が、自分にとって必要な部分を理解し、使っているに 過ぎません。
このようなコンピュータについて、誰にも未知の分野がいっぱいあるのは当 然です。新しいことに応用してみようとか、新製品とかについては未知なのは 当り前です。でも、どこからか情報を仕入れて使っています。製品を買えば説 明書はついてきます。それで一通りの使い方はできるようになるものですが、 さて、自分のやりたいことはどうやったら実現できるのかという一番大切なこ とには答えてくれないものです。もしかすると、自分がわざわざプログラムを 作ろうとしていることはすでに誰かが実現しているかも知れないのです。
特定のメーカの製品だけでコンピュータシステムを組んでおけば、それらの 組合わせで不都合が起きれば、そのメーカに問い合わせれば何とかなるでしょ う。でも、それぞれに適した製品を購入すると、たいていの場合メーカがバラ バラになります。複数のメーカの製品を組み合わせて使う場合、相性の問題が 良く発生します。規格ぎりぎりで作っているメーカがあるかと思えば、十分な ゆとりを持って作っているメーカもあり、トラブルになることは良くあります。 さらに、メーカが推奨していない安い製品を利用したいこともあるでしょうが、 そのときの信頼度はどうなのかなど知りたいでしょう。
コンピュータの導入時には知りたい情報はいっぱいあるはずです。ディーラー を呼んで資料を請求すれば持ってきてくれますが、十分な資料、知りたい情報 はなかなか手に入らないものです。できることなら、実際に使っている人の使 用感でも聞ければ最高ですよね。プログラムについても、個人、あるいはソフ トハウス、企業の一部署程度では、なかなか情報が集まらないものです。適当 な指導者も見つけにくいものです。
では、どうすればそのような情報を提供してくれる人々と知り合いになり、 指導してもらったり、情報を交換するのでしょうか。
答えは簡単なんです。待っていても、ダメなんです。もちろん、金を払って 指導を受けたり、情報を買う方法もあります。しかし、これではまだ受け身に しか過ぎません。自分の疑問点を持って、あちこちに自ら飛び込んでみるしか ありません。失敗をするでしょうが、失敗に懲りずにあちこちに顔を出してみ ることでしょう。顔の広さと、情報の集まり方はだいたい比例するものです。 上達しようと望めばそういう連中のいる集まりの存在を耳にするようになり、 自然と顔を出すようになるものです。
コンピュータと言うと、世間では、人と口を聞かず、ただひたすらコンピュー タに向かってキーを打ち続けている人間のようなイメージがまだあります。人 付き合いが悪くても、コンピュータの仕事なら構わないように誤解されていま す。私なんか、ディスプレイに向かっていても、実際にプログラムを作成して いる時間は非常に少なくなりました。多くの時間は、原稿を書いたり、仕事の 連絡のための文書を作ったり、電子メールを読んで返事をしたり、電子ニュー スの海の中を漂っています。色々な情報を提供し、提供されて日々暮らしてい ます。
色々なソフトハウスを見てきましたが、だいたいレベルの差は、各社の技術 者の人的ネットワークの質とサイズに比例するようです。レベルが低いところ ほど、外部と交流することを拒否する傾向があります。個人、あるいは小さい グループだけでやっていたのでは、相当の強者でもいない限りハイレベルを保 つことは無理でしょう。
■ 情報集め
プログラムを作るためには、多数の情報を集めなければなりません。的確な 情報を、他社より早く入手し、世の流れに乗ること、あるいは時代に遅れない ことは絶対に必要です。
では、情報集めはどうすればよいでしょうか。本、雑誌、新聞などに頼るこ とはもちろん必要ですが、それだけで十分でしょうか。実際には、そのような マスコミの媒体に掲載される前に、第一線の技術者の間では衆知の事実と言う ことがよくあります。それどころか、第一線の技術者たちの中には、マスコミ 媒体に記事を書いたり情報を提供している人達が大勢います。彼らは、いった いどこから情報を得るのでしょうか。
今はコンピュータを使った情報通信が非常に発達しています。その一つがパ ソコン通信です。その他にもさまざまな通信手段が全世界的に張り巡らされて おり、短時間の間に情報が全世界を駆け巡ってしまいます。電子メールを使え ば、国内はもちろん、海外までも短時間の間に情報が届いてしまいます。また、 電子掲示板を読んだり、あるいはもっと積極的に自分の意見や聞きたいことを 書き込むと、いろいろ答えてくれる人がいます。このようなコンピュータ通信 を利用すると、非常に早期に情報を入手できます。
もう一つの効果的な情報入手手段は、コンピュータによるネットワークでは なく、「人のネットワーク」です。コンピュータを良く知っている友人、知人 をできるだけ沢山持つことです。直接会って話すことにより、こちらの疑問に 的確にこたえてくれたり、一般には公開されていない情報をこっそり教えてく れたりします。
そういえば、もうずいぶん前のことですが、80186-3というCPUを使ったパソ コンを販売していたメーカがありました。「-3」がついているのを不思議に思 うでしょう。この余分なものは要するにCPUのバグで、本来の80186としては動 作しないこと、とくに数値演算プロセッサ8087が使えないバージョンで、正式 の80186と交換しなければいけなかったのです。ここまでは、正式バージョン ができる前にサンプルを入手してテストする場合にはよくある話です。
けっこう仲間うちではこのパソコンを使ったりしていたものがいたので、そ のような事情は仲間達から聞いていました。一部の仲間のところには、メーカ から無償で正常なCPUが送られてきていました。また、そのCPUの輸入代理店か らも情報が入っていました。それで、私も、「このCPU不良だから交換して」 とメーカに言ったら、メーカの人に、「どうしてそんなに詳しいことまで知っ ているのだ。知り過ぎだ。どこからそのような情報を入手したのだ」と詰問さ れてしまいました。十数年コンピュータの世界にいますが、バカな対応をする 人はいっぱいいましたが、こんなにふざけた対応をされたことはありませんで した。後日、簡単すぎる謝罪文と共に正常なCPUが送られてきました。
その少し後で、そのパソコンが東京大学に大量に納められることに決まり、 仲間のいる学科にもまとめて入ることになりました。色々な縁があって、それ を手伝う(手伝わされる?)はめになり、そのメーカがどのように納入するか 見守っていました。技術計算を頻繁に行なうため、数値演算プロセッサ8087は 必須だったので、そのままではCPUの交換が必要でした。すると、CPUだけ正常 品に無償交換されており、なおかつその事実も知らされない、つまり最初から 正常品が納入されたことにされていて、みんなでびっくりしました。
もうひとつの話です。Xウィンドウは一般ユーザが使用する場合、Open WindowsとMotifの2つがあり、互いに張り合っていて、どちらを使うか迷って いたユーザがいっぱいいました。最近、主要メーカ間で、Motifに一本化する ことに話がまとまりました…ということになっています。しかし、これも遥か 前から衆知の事実として知られており、発表の日時がいつになるのかだけが時々 話題になっていました。
ところで、世の中には記者会見で発表され、新聞に取り上げられるまで知ら なかった人達がいっぱいいたのです。まあ、そのくらいなら、「バカですね、 無知ですね」で済ませられますが、そうなることを知らず、OpenWindows対応 のソフトをせっせと開発し、発表しようと準備していた会社もあったのです。 もう、情報音痴というか、救い難いですね。UNIX上のウィンドウは必ずMotif に対応させなさいと前々から教えていたのに、教えを守らずあわてふためいて いる会社もあります。情報処理の仕事をしていながら、一番重要な情報の処理 ができていないところも結構あるようです。
地方には、なかなか正しい情報が伝わらず、変なコンピュータを買わされた りして後で困っているところが多いようです。地方の公立短期大学や公立高校 などでは、公立であるがゆえに入札でしか決定できないため、変なパソコンを 安価に大量導入したのはいいけれど、ソフトウェアがないので教育が破綻して いるところもあるようです。担当者がきちんと調べて、ダメなものはダメだと 言わなかったのがいけないのですが、そこまで彼らに求めるのは無理でしょう。 入札の前に、ダメなものはダメと排除しなければいけないのですが、入札金額 だけですべてが決定されてしまうような方式をとっているところは、今後もメー カにだまし続けられることでしょう。コンピュータを導入し、成功していると ころを何個所か訪問し、自分のところとの相違を考えた上で決定すれば大きな 間違いはしないでしょう。
とにかく、プログラム以前の、コンピュータに関する情報の収拾および処理 に問題があるところが多く、困ったものです。
■ 隠すことについて
プログラミングの指導をするとき、一番困るのが、自分のプログラムリスト を隠すことです。もちろん、自分の書いたプログラムに自信がないから隠すの でしょうが、隠せば隠すほど誰からもプログラムの手ほどきを受けられなくな ります。
プログラムは、プロジェクト単位とか、部署単位で自由に見ることができる ようにしておいたほうが、色々な問題点を指摘し合えて、互いに向上の機会が あります。プログラムを誰でも自由に書き換えられるようにしておくと、今度 は管理上の問題がありますので、プログラムの管理ツールを用い、見ることは 自由にできるが、変更は作成者など許可された人だけが変更可能にしておくこ とが必要です。
以前、某社のコンピュータ教育を担当したことがあるのですが、とにかく一 部の人を除いて自分の書いたプログラムを人に見せないので困りました。どう いう風にプログラムを組めば良いかをいくら説明したって、一般論になってし まいます。何を説明しようが、机上の空論、眠けを催す講義にしかなりません。 各人のプログラムの組み方には差があるので、実際に各人の作ったプログラム を使い、悪い点を指摘することが重要です。
この会社では、プログラムを見せないことが一般化し、最終的に動けば内部 はどうなっていても誰も知らないような情況でした。最初は、動けば良いと気 楽に言っていられるのですが、時間が経つとともに次第に混乱が発生してきて、 泥沼に陥っていました。
もちろん、技術者全員が隠そうとしていた訳ではありません。新人や、技術 的なことに興味を持っている一部の人達は相談に来たりするのですが、会社の 上層部あるいは古株の人達が隠したがるのです。今まで作ってきたものに、重 大な欠陥が指摘されたら困るのは分かるのですが、欠陥が分からずに、どんど ん変なプログラムが増えていく方が、長期的には大変に決まっているのですが、 分かっていても自分の立場などもあり、最善の選択が何かが分かっていても取 れないのが実情のようです。
逆の会社もありました。プログラムを見せたがって、ぜひプログラム診断室 の連載に採用して欲しいというところです。社内で独自に研究会を開いたり、 社外の人を呼んでプログラムコンテストまでやっていた会社です。私も部外者 ながら参加して、賞品をいただきました。この会社のプログラムは、残念なが ら、下手なプログラムが発見できず、診断室には利用できませんでした。
大きなプログラムを複数の会社で共同開発することがあります。これは、プ ログラムを作る以上に、各社の体制の違い、レベルの違いに苦労させられます。 人数が増えるだけでも色々なトラブルが発生するものですが、会社まで異なる と調整は一段と難しくなります。大規模なソフトを複数の会社に分割して発注 しているところは、さぞ管理が大変だろうと思います。
こういうとき、だいたい苦労させられるのは、レベルの高い方で、低い方は ついてくるだけ、ということが多いのです。下手をすると、別の下請けの作っ たプログラムのバグ取りまでさせられることにもなりかねません。正直言って、 足手まといです。日本では取引関係のしがらみで、一度発注すると、切るに切 れない下請けとの関係になったり、とにかく諸般の事情があって、理屈だけで は割り切れないようです。色々の問題点を教えて、もっと楽をして、より品質 の良いプログラムを作り、発注側も、受注側もハッピーになるようにと思って も、難しいのが現実ですね。
昔々、小さなソフトハウスに身を置いていたころ、なんとか社内の技術レベ ルを上げようということで、発生したトラブルを社内ミーティングのときに発 表する制度がありました。いちいち些細なミスまで発表されるときりがなくな るので、バグの原因発見まで30分以上のものを発表するようにしました。あ る人の陥るバグには、他の人も陥りやすいし、また似たような場面に遭遇する こともあるので、そういう場合に役立てようとしたのです。もう遠い昔のこと で内容は覚えていませんが、各自の馬鹿さを発表することにより、随分楽しめ たし、互いのレベルも向上したように思います。
日本では、プログラムに限らず、都合の悪いことはできるだけ隠そうとする 傾向があります。隠すことによって、その場は何とか取り繕うことはできるで しょうが、将来同様のトラブルが起こったとき、前回の経験が生かせません。 トラブルにみんなで対処することにより、よりよい対策を打つことができ、ひ いては被害を最小限に抑えられます。これこそ教育のはずです。けれども、こ ういうことを指導すべき教育機関、そしてそれらを管理指導している教育委員 会とか行政機関に隠す傾向が特に高いのは、いったいどういうことなのでしょ うか。
■ プログラムコンテスト
またまた昔の話ですが、社内で共同でプログラムを組むとき、バグを入れて しまった者が、バグを発見し、直した人に昼食や夕食をサービスする、プログ ラマの間で自然にできた制度がありました。程度の差によって、ちゃんとした 料理から、缶ジュース1本だったりしました。この制度のおかげで、ずいぶん 食事代が助かりました。でも、得する人と、損する人がいつも固定してしまう ので、いつまでも続けられるものではなく、残念ながら自然消滅してしまいま した。
アルゴリズムやプログラムの美しさなどについてのコンテストみたいなこと をやっている会社は時々聞きます。評価そのものは難しく、優劣の判定は決め にくいものがありますが、とにかく、何とかして技術面の向上を目指している ことが重要なことです。
ある会社へ行ったら、社内で実行速度が問題になっている部分の高速化アル ゴリズム募集の広告が掲示されていました。なんと、社外の人も応募可能となっ ていて、ちょっとその気になったこともありました。
■ ドキュメント
プログラムを書くとき、自分に分かればいいやという気持ちで書くときがあ ります。どうせ自分でメンテナンスをやるのだし、早く完成させるために急い でいるのだから、分かりやすくとか、美しくとか考えられないことがあるでしょ う。私だって、使い捨てのプログラムもいっぱい書いています。そういうとき は、とりあえずの目的を満たすことだけを念頭に置いてプログラムしています。
しかし、そういうプログラムでも、けっこう後で使ったり、さらには機能拡 張したりするものです。こういうとき、作ってから時間がたっていると、自分 で作ったものでも忘れてしまっていて、思いだすのに時間がかかるものです。 自分のプログラムでも、まるで他人のプログラムのように全然分からなくなっ たりするものです。いっぱいドキュメントを作るのもいいのですが、キーとな るコメントだけでも入れておくと非常に助かるものです。コメントやドキュメ ントは量があれば良いというものではありません。
プログラムを移植するとき、ドキュメントを請求したら、1000ページ近いド キュメントを渡されたことがあります。全関数にA4一枚の説明がありました。 それを、ご丁寧にも関数のアルファベット順に並べてくれていて、シーケンシャ ルナンバーまで振っていたことがありました。主要な関数について、関数の主 要な機能とか、引数の意味とか、特別に注意しなければならない個所だけを知 りたかったのですが、分厚いファイル2冊も渡されて、見た瞬間に、「これは 無駄だ。裏が白紙だから、裏返してプリント出力にでも使おうか」と思ってし まいました。でも、仕事が終わったら返却しなければならないので、さすが裏 紙として使うことはしませんでした。
でも、この1000ページものドキュメント、どうも私が、「何かドキュメント はありませんか」と言ってから作ったらしいのです。もちろん、今まで受託し て作業をしていた別のソフトハウスが作ったのですが、なかなか大変だったろ うと思います。でも、全く役に立ちませんでした。経理部門が見たら、分厚い 2冊のファイルを見て、立派なドキュメントと思うかも知れませんが、全く役 に立たなかったのです。
■ 楽するように
今まで多数の人のプログラムを見てきました。動かないから面倒を見てくれ (実際は尻拭い)と言われて人のプログラムをデバッグしたり、その他色々の ことをしてきました。プログラミング診断室の連載も同じですが、とにかく下 手な人は、ものすごい努力をしてプログラミングし、デバッグして悩んでいる のです。
手間のかかるように、手間のかかるようにとプログラムしています。わざわ ざ作らなくてもシステムが標準で提供しているものを自作し、バグを入れて四 苦八苦していたりします。信じられないような何千行にもおよぶ長大な関数を 作ってデバッグしていることもあります。
見ていると、とにかく「作る」ということだけにしか注意がいっていないの です。作業をしていること自体、悩んでいること自体が仕事になっている場合 が多いのです。実際に希望のシステムを作り上げるうえで発生する問題点とか の調査とかに頭がいっていなくて、最後の最後に、設計の最も基本的な部分が 変だったというのがあります。ここで廃棄し、再設計すればまだ救われるので すが、完全に間違った設計を何とか生かそうとして、プログラムのあちこちに ツギを当てて、苦労に苦労をして、結果としては保守できない奇怪なプログラ ムを作り上げています。
私は、プログラミングで一番重要なことは「楽をすること」だと思っていま す。それも、あらゆる面で楽をすべきだと思っています。プログラムはできる ことなら短く、もしもプログラムを組まなくて済むのなら組まないべきでしょ う。何かしようとしたとき、すぐにCでプログラムを組むというのは考え物で す。特に、ウィンドウシステムに関連するような場合、良く調べると何もしな ければちゃんと動くものを、わざわざいっぱいプログラムを書いたために動作 しなくなる例がよくあります。
「関数は短く」と何度も書いていますが、これも本質はプログラムが楽に読 みとれるようにするためです。
「同じことを書くな」は、同じことを何度も書くと、たとえエディタでコピー しても、後日の保守はもとより、デバッグ中にバグを見つけて何個所も直すと いう作業をしたくないためです。
プログラムを打ち込むときも、できるだけキー入力を省きたいものです。こ れは変数名を短くとかではなく、変数名は打ち込まず、画面上に表示されてい る宣言部分の変数名をマウスを使ってコピーするようにしたいですね。こうす れば、長い名前もなんのそので、入力ミスはなくなるし、変数名自体に意味を 持たせられるので楽できます。
とにかく、プログラム、システム設計の基本は楽をすることにあります。そ れも、トータルで見て楽になるようにすることです。「楽する」という観点か ら考えてみると、正しい選択を得られるものです。
単純に単純にと設計していても、なんだかんだと要求が入ってきて、あれこ れ対応しているうちに複雑になるものです。とにかく、単純明解、楽すれば楽 ありです。楽するための勉強をしましょう。人がヒーヒーいいながらプログラ ムを組んでいる隣で、楽をして成果をあげられるようになると楽しくありませ んか。優越感も味わえますしね。
■ 手抜きと下手の違い
良くないプログラムに2種類あります。
1つは手抜きのプログラムです。プログラムのことがよく分かっている者で も、1度しか使わないプログラムとか、動作確認のためだけとか、とにかく数 時間で作り上げなければ作ること自体が無意味になるような場合には手抜きの プログラムを作ります。プロのプログラムだって、メンテナンスのまったく必 要のないときには、徹底的に手抜きのプログラムを作ります。ただし、元々腕 がよいのですが、理由があって手を抜いているわけです。したがって、プログ ラムの筋はよく、何をやろうとしているのか見当もつかないということはあり ません。
もう1つは、下手なプログラムです。コンピュータシステム全体のこととか、 プログラミング言語の理解不足、経験不足などにより、やるべきことを理解で きないまま書き上げたプログラムです。ムダが非常に多く、プログラムが混乱 していて、何をやろうとしているのか読み取れないものです。自分で書いたプ ログラムの面倒を自分でできないでいるのです。
この2つは全く違います。よく「汚いプログラム」という言い方をします。 この場合は、だいたい下手なプログラムを意味しています。下手なプログラム に対して「汚い」と指摘すると、時間がないからとか、忙しかったからとか理 由をつけますが、それならば手を抜けば良いのです。上手がいくら手を抜いて も下手なプログラムを作れるわけではありません。上手が手を抜いたプログラ ムは手元にいっぱいあるのですが、診断室の対象になるような汚さはありませ んでした。上手が下手のふりをして下手なプログラムをねつ造しても、うまく ねつ造できません。上手な者には下手な者のまねをするのは困難です。
「汚い」というのにも、様々なパターンがあります。ソースリストが見かけ 上ぐちゃぐちゃしている程度のから、設計そのものが完全におかしいのではな いか、全部廃棄して作り直す以外に手はないものまであります。全部廃棄して 作り直すにしても、どうして完全な再作成をすべきかを理解しないままで作業 すると、結局同程度のものができることになります。これは指導するときに非 常に注意しなければいけないことです。細かい点をいっぱい指導するより、重 要などうしようもない点を1つ2つ指導すれば、見違えるようなプログラムを 作ってくるはずです。
診断室では、下手の下手たる本質をできるだけ研究し、まとめようとしたも のです。下手にも色々な種類があり、救える者もいれば、もう救い難い者もいっ ぱいいます。自ら上手になろうと努力している者が救われるだけでしょう。
■ 開院
さて、そろそろ開院です。いくら文章を書き並べて、正しいプログラミング 作法の講義をしても訴えるものがなく、眠けを催す本をまた1冊世に送り出す ことになってしまいます。医学においても、実際の生身の患者を相手に臨床実 習を行ない、現実の切実な問題に対処できて始めて一人前の医者なり看護婦な りになれるのです。これは、医学とか、コンピュータとかに限ったことではな いでしょう。あらゆる分野で、実習は最も価値のある教育現場です。
本書では、実際に仕事で使うために書かれた、つまり必要だから書いたプロ グラムに対して診断を行なっています。できるだけプログラムは全体を掲載す るようにしました。直接問題になっている一部だけ見せて、その直し方、治療 方法を示しても、それでは現実の世界を反映したことにはなりません。できる だけ作成者の本来の意図を反映した形で元のプログラム全体を書き換えること で、部分的ではない修正方法を示すように努力しました。
本書で示している修正は、完璧をめざしてはいません。完璧などめざしたら、 ついついプログラム全体を破棄して、奇麗に書き換えてしまいたくなってしま います。私も一人の人間だし、完璧なプログラムなどそうそう書ける訳ではあ りません。しかし、十分に納得できるようなプログラムの修正方法を、私が現 場で作業している情況に近い形で示しました。本当は、ビデオで提供できたら もっと良かったかも知れませんが、そうもいかないので紙上で説明しました。
これだけ色々書いて心の準備をしていただいたので、どんなプログラムを見 ても卒倒などしないと思います。では、診察を開始することにいたしましょう。
私は、UNIX上で仕事をし、この原稿も書いています。読者から送られて きたCプログラムもUNIXのファイルに変換して評価しています。MS-D OSに強力に依存していないものは、UNIX上のGCCでコンパイルし、実 行して動作確認も行なっています。こういう環境で作業をしている関係で、U NIX上ではあまり都合の良くない半角カタカナは全角カタカナに変換してい ます。とくに、パソコン上でないと評価できないプログラムは、MS-Cで評 価しました。
■参考文献
[0-1]「こちら救命センター/病棟こぼれ話」、浜辺祐一、集英社文庫
『Cプログラミング診断室』目次/ 次(第1章 普通の初心者 プログラムの紹介)
第1章 普通の初心者
上手になる秘訣
上手になるには、上手な師匠につくことが一番ですが、周りにCをちゃんと教えてくれる人がい ない場合も多いでしょう。大都市に住んでいる場合や、大企業の技術者の場合は、その気で探せば 結構身近にいるものです。でも、そうでない人にとっては、本や雑誌くらいしか情報がないといえ ます。パソコン通信を利用するのも手ですが、やはり直接教えてもらう方が優れています。
プログラムを教えてもらうには、まず、自分でプログラムをどんどん書いてください。たぶん、 いっぱい失敗をするでしょう。原因の大部分は自分だけで分かるでしょうが、どうしても分からな い個所はよく知っている人に聞いてみましょう。
すでにCでプログラムを組んでいる人は、ソースプログラムを診断してもらってください。でき れば、何万行、何十万行のCプログラム開発経験がある人ならば最高です。でも、「ひどいプログ ラムだ」と言われるのが普通でしょう。どこが下手なのか、じっくりと聞き出してください。初心 者のうちは、上級者の言うことは理解不能な内容も多いですが、できるだけ理解するように努力し ましょう。最初は理解できなくても、そのうちできるようになる時期がきます。
自分のプログラムを人に見せると同時に、人のプログラム、できれば優秀なプログラムをできる だけ見て参考にしてください。今では、Cで書かれたPDSがいっぱいあるので、入手は比較的簡 単ですね。
Cの本はいっぱいありますが、Cの勉強そのものを目的にした本は、どうしても細部にこだわっ たものが多く、表面的な知識や技術に終わってしまいがちです。本はいっぱい読んでください。効 率良くノウハウを身につけられます。でも、本だけに頼るのは危険です。
本を読み、自分でプログラムも組み、そのプログラムを人に見せて批評してもらい、人のプログ ラムも読んでください。これだけすれば、絶対上達するはずです。
あるパソコンソフトハウスでの話です。Cプログラム経験が何年あっても、すごく下手なプログ ラムを書いている人たちがいました。彼らは、自分たちのソースプログラムをできるだけ隠し、誰 にもソースを見られないよう努力していたのでした。グループ内部にもCの得意な人もいず、外部 に教育やコンサルティングも依頼しなかったため、あまり分からないままCのプログラムの量だけ が肥大していきました。初期にちゃんとした指導がなされていたら、いったい何十人年(何億円) の節約になったことでしょう。
これは1社だけではありませんでした。みなさん、こんなことにならないように気をつけましょ う。
Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次/ 次(第1章 普通の初心者 プログラムの紹介)
