ソフトウェアの単純さ

UNIXの代表的なプログラムにcatがある。Wikipediaから引用すると、

catはUNIXの標準コマンドであり、ファイルを連結させたり表示したりするのに用いる。catは連結することを意味する「catenate」の略である。
(中略)
UNIXファンの間では、cat(1)はユーザインターフェースデザインのよい手本とされている。catはファイルの内容に空白やヘッダのような余分なものを一切付加せずに提供してくれるためであり、またテキストファイルのみならずどんな種類のデータに対しても正しく動作するためだ。
UNIX嫌いの間では、cat(1)は悪いユーザインターフェースデザインの正統な手本とされている。それはこの悲しげなまでにわかりづらい名称のためである。catは、ファイルの連結(concatenate)に使うよりもむしろ標準出力への出力に使われることの方がはるかに多い。後者の使用法に対するcatという名称は、ちょうどLISPのcdrのように非直感的である。

悪いユーザインタフェースの見本にもなるということだが、本来は指定されたファイルを読み込んで、順に標準出力に出力することで、「catenate」するという単純なプログラムだ。ツールボックススタイル(KISSの原則)を体現していて、名前だってわかりにくいとは思わない*1

悪いのは、cat -v Considered Harmfulに代表される悪しき拡張じゃないか。

ここでPlan9GNU coreutilsNetBSDのcatのプログラム規模を比較してみよう。

GNUの実装は、Plan9の20倍の規模があって、ちょっと検索すると解説記事が見つかった。

一方、Plan9版はCがわかれば一目瞭然だ。オプションもないという潔さ*2。単純さを保つには背景に確固とした思想が必要である。そのためか、9fansではしばしば新参者に対するフレームウォーが起きる。

*1:Pike & Kerninghanの"Program Design in the UNIX System Environment"には「catという名前もUNIXのプログラムの名前のいい例になっている。つまり、短く発音できはしてもそれがする仕事に対して普通に使われる英語ではない。」とある。

*2:UNIX 7th editionで-uオプションが追加されたが、8th editionですぐに撤廃されたそうだ。