その昔、jgawkを使ってSGMLによる入力をパースしてDB上の情報を参照しながらTeXのソースに変換するプログラムを書いていた。行き詰まってjperlに移行した。DOSエクステンダを使っていた頃の話だ。

perlに慣れてみると、もうawkを使うことがまったくなくなった。DOSを離れてUNIXを使うようになるとますますその傾向が高まった。awkは複数のファイルを扱うことが得意ではない。1個の入力を1個の出力に加工するフィルタプログラムを書くのが本分だからである。しかし、プログラムを拡張しているうちに複数のファイルを参照したくなることなんかいくらもあることである。

awkを使っていると、複数のファイルを参照したくなったときに「袋小路」にはまりこむ。最初からperlで書いておけば「袋小路」にはまることがない。では、perlが自由に使える場合、あえてawkを使う理由って何だろう？

Nifty Serveのsed/awk/perlの掲示板で質問してみると「絶対に複数の入出力が必要にならない処理ならawk」とか「メモリの消費量が少ないのはawkだから、無闇にperlにはしない」みたいな返答が返ってきた。

ShiroさんのLisp:よくある正解に、僕の体験したものよりずいぶんレベルの高い話ではあるが、意味的には同じような「袋小路を避ける」話が出ている。この文章はもう何度も読んでいるのだけれど、自分の体験と結び付いて「ああ、そうか。だから自分はLispに惹かれるのか」と納得したのは今日のことだった。

Paul GrahamもOn Lispの中で「どんなプログラムを書くのかまだ確かでないなら、Lispで書いておくのが安全な賭けだ。それがどんな種類のプログラムになったとしても、それを書いている間に、Lispはその種類のプログラムを書くためのプログラミング言語に進化していることだろう」と述べている。

多くの場合、非力な言語で開発をしていると、機能拡張を続けているうちに理解不能なプログラムになっていく。プログラムは利用され続けている限り、機能拡張の要求から逃れられないものだ。そして、どのような機能拡張が要求されるかは前もっては予想できないものである。

デザインパターンのいくつかはオブジェクト指向プログラミング言語においてどのような工夫をしておくと将来の拡張性に備えることができるかを示唆している。だが、これは延命措置に過ぎないし、現実には適切にデザインパターンを使いこなせるレベルにいる設計者/プログラマーはそう多くない。

SIerの立場からすると、ある程度の機能拡張の末にリプレース需要が生まれる方が予算規模が大きくなるから美味しいように思える。だから、徹底的に「袋小路」を避けるより、あえて「袋小路」にハマるのも悪くないと思うからも知れない。だが、そうではない。機能拡張困難になったプログラムに手を入れなければならなくなり、開発者たちが悲鳴をあげる日々なくしてリプレース需要は生まれないからだ。その悲鳴の日々において、多くのものが失われているはずだ。

まずは袋小路を恐れる気持ちを持つことから始めてはどうだろうか？