2011年7月7日木曜日

プログラムの汎用性

お世話になっている先生とプログラミングの話をしていたときに聞いた話です。

その先生は、プログラミングの授業を担当されているのですが、その授業の課題に対して「課題として間違ってはいないけれども汎用性が殆ど無い、本当に「ただ課題をやるためだけ」のプログラムを書いて出す学生が少なからずいる。」と言っておられました。具体的な例を見たわけではありませんが、「課題をやるためだけのプログラム」といえば、決め打ちが多くて、例外処理などを行っていないプログラムでしょうか。例えば、配列の探索に対して、配列ははじめからプログラムに打ち込まれていて…というような。

数値計算やプログラミングの関連で私のところに質問に来る友人・後輩が少なからずいます。その友人の多くが、わざわざ全て決め打ち(それも、マクロも使わず)しています。簡単な例として、Gauss-Jordan法により連立方程式を解くプログラムについて考えてみます。

一般的には
・入力されるNに対して、N☓(N+1)の拡大係数行列を入力し
・それを変形する関数を作成しておき、その関数を実行し、
・答えを出力する
というふうにすると思います。関数にしておけば、移植や、他のプログラムに使うときにも便利です。

しかしながら、質問に来てくれる友人・後輩は大抵
・行列は内部で打ち込んでいる
・関数化しておらず、ループは全て数字の決め打ちである
と言う特徴を持ちます。

そんなソースを書く人に「仮に解かないといけない連立方程式が20個あったら20回打ちなおして20回コンパイルするの?」と聞いてみましたが、返事はなく、又直すこともありませんでした。返事はないながら、その場で解くべき連立方程式は5つでしたが、5つ全てについてプログラムを書きなおしていました。

極端な例なのかも知れませんが、このようなプログラムを少なからず見聞します。

冒頭であげた師の言葉にもありますが「課題さえ何とかなればいい」という姿勢でプログラミングをするからこういうことになるのだと思います。単位取得というある種の資格取得のためだけに勉強している、とも言い換えられます。今読んでいる「暗黒のシステムインテグレーション」という書籍にも「資格試験のためだけに勉強するのは資格の意味をなさない」という意味の文が書いていましたが、そのとおりであると思います。

私は決して出来のいい学生ではないですが、他人のプログラムの汎用性の無さを見るに付け「ただ単位取得のためだけに勉強してはならない」と思います。汎用性のかけらもないプログラムを見る中で、それを他山の石と思い、自らの姿勢を改めねばと思います。

身につける勉強をすること。プログラムの汎用性に、そのことを見ました。

2 件のコメント:

Volcanologue さんのコメント...

きっと楽をするための苦労をするという発想のない人に,プログラミングを教えるのはなかなか難しいのではないでしょうか?

達哉ん/Tatuyan さんのコメント...

>volcanologue 様
ありがとうございます。
ちょっとコメントが遅くなりました。

そうですね、「怠惰を求めて勤勉に行き着く」などといいますが、その発想がないとなかなかやる気にはならないものなのかもしれません。