この文章は Rob Pike 氏が Google+ に投稿した内容の意訳です。現在は web archive からしか閲覧できません。面白かったので訳してみました。
ショートカットからのレッスン
ずっと昔の話。Unixファイルシステムで移動を簡単にする為に .
や ..
を追加する設計がほぼ完成していた頃。確かではないけれどバージョン2への書き換え中、つまりファイルシステムが階層的になった頃(初期の段階では構造が全く違っていた)に .
と ..
は入った。ls をタイプするとドット付きのファイルが現れたので、Ken か Dennis のどちらかが簡単なテストプログラムを追加しました。当時はアセンブラでしたが問題のコードは次のようなものと同等でした。
if (name[0] == '.') continue;
この1文は、本来あるべき以下の1文よりも多少短かった。
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;
ただこうだとしても簡単ではあったんだけれども。
2つの事が起きました。
まず、悪い前例を作ってしまった。他の多くの怠惰なプログラマも同じ単純化をした事によりバグが入ってしまった。ピリオドで始まる実際のファイルは、ファイル数をカウントする時にスキップされてしまう場合があります。
さらに悪い事に「hidden」または「dot」ファイルのアイデアが作られてしまった。結果として、もっと怠惰なプログラマが皆のホームディレクトリにこのファイルを置き始めました。私がこの文章をタイプするのに使っているマシンにはそれほど多くの物がインストールされていませんが、私のホームディレクトリにはおよそ100個もの良く分からない、また必要なのかどうかも分からないドットファイルがあります。私のホームディレクトリ上でのファイル名の評価はこの蓄積されたヘドロによりどんどん遅くなります。
隠しファイルの概念は意図しない事から生まれた結果だったと確信しています。それは確かな間違いだった。
約40年前のたった1つのショートカットから、バグや無駄なCPUサイクル、そして人間の欲求不満(デザインが悪い事は言うまでもない)の実例がいったい幾つ生まれてしまったんだろうか。
次回コードを書く際にコーナーケースをショートカットしたい場合は留意しておいて下さい。
(ドットファイルが目的を果たしているかについて異論を唱える人に関して私はそれに異議を唱えませんが、目的を果たすべきはファイル自身でありファイル名の為の習慣ではないと反論するだろう。これらは $HOME/cfg
や $HOME/lib
に置くことが出来るし Plan9 では実際にそうなっていてドットファイルは1つもない。レッスンには学びがある)