2014年9月9日火曜日

コードは動けばいいってものじゃない

グローバルナレッジの公式ブログはいくつかありますが、その中で「Win Win Windows」は主にマイクロソフト製品を扱っています。

今日公開された記事「第49回 [開発スキル再始動特集2] プログラムコードを洗練させよう~配列からコレクション、そしてジェネリック~」では、「リファクタリング」について扱っています。

Visualo Studioには、コードを洗練させる「リファクタリング」機能が数多く備わっており、既存のコードを再利用しやすくなっています。

本来は、モジュールの独立性が高く、外部インターフェースがしっかり定義されていれば、モジュールの中身はブラックボックスとして扱えるはずです。しかし、現実にはなかなかそうもいきません。バグが発見されたり、実行効率を上げるための修正を加えたりする必要があります。外部公開しているモジュール名を変える必要があるかもしれません。

私が学生時代、ゼミ生に課題を兼ねて、自分の修士論文に使うサブルーチン作成をお願いしていました。特にK君は、驚くほど早くて正確なコーディングをしてくれたので大変助かりました。3日くらいかかるつもりで出した課題が、翌日に提出されたのは本当にびっくりしました。

しかし、K君が書くコードにはとても大きな問題がありました。変数名や関数名が明らかに間違っているのです。スペルミスとか誤訳というレベルではなく、言葉の解釈が間違っており、全く違う名前がついているのです。

入力したパラメータに対して、正しい出力が得られるのですが、内部で使っている変数名や、呼び出しに使う関数名が、本来の意図と違うので使っていてイライラしますし、いずれ動作を勘違いしてバグが混入することは容易に予想できます。

しかも、主に使っていた言語はLispとPrologであり、再帰呼び出しを多用します。つまり、間違った関数(サブルーチン)名が、1つのモジュール内に何か所も登場するのです。外部モジュール名だけを1箇所変更したら、使う人にとっては同じ、というわけにはいきません。

(defun copy (x)
(cond ((atom x) x)
(t (cons (copy (car x))
(copy (cdr x))))))

たとえばこんな感じです。copyが外部モジュール名ですが、定義中にcopyを2回呼び出しているのが分かります。


当時使っていたのは、日立のメインフレーム機M-280Hでしたが、プログラマ向けの便利なエディタがなく、単語変換機能を使ってひとつずつ置き換えていました。


Visual Studioのリファクタリングツールには名前の変更リファクタリング機能があるので、こうした作業もずいぶん簡単で正確になったはずです。


もちろん、本来の名前変更リファクタリングは、「間違った名前」を直すものではありません。外部仕様が同じで実装が変わったとき、実装にあわせて名称を変更するものなのでしょう。


その後、K君はメーカー系のIT子会社に就職したのですが、ちゃんとプログラムを書いていたのでしょうか。リファクタリングの話題が出るたびに思い出します。