Урок о сокращениях.
Это примерный пересказ поста Роба Пайка в его Г+. Я плохой переводчик, поэтому никогда не называют такие тексты «переводом»
Давным
давно, когда был разработан дизайн файловой системы Unix, были
придуманы записи . и .., для облегчения навигации. Я не уверен, но
кажется .. появился при переписывании Версии 2, когда в файловой системе
появилась иерархия (до этого структура была совсем другой). Когда
кто-то набирал
ls
эти записи показывались на экране,
поэтому Кен или Деннис добавили простую проверку в программу. Тогда всё
писалось на ассемблере, но код был примерно эквивалентен чему-то вроде
этого: if (name[0] == '.') continue;
Этот код был слегка короче, чем должен, потому что правильно было написать
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
continue;
но блин, это же было проще.
Результатом были две вещи.
Во-первых,
был создан неприятный прецедент. Толпы других ленивых программистов
порождали баги, используя то же самое упрощение. Настоящие файлы
начинающиеся со знака точки часто пропускались, даже в тех случаях,
когда должны были быть учтены.
Во-вторых, и это намного хуже, появилась идея «скрытых» файлов или «файлов с точкой». Как следствие, толпы других ленивых программистов1
стали разбрасывать файлы в домашних каталогах. У меня не так много
всего установлено на машине, в которую я сейчас набираю этот текст, но
мой домашний каталог содержит около сотни файлов с точкой, и я даже не
знаю, что в большинстве из них и нужны ли они вообще. И каждое
дополнительное имя файла в домашней папке замедляет работу машины, пусть
не намного, но это же накапливается.
Я совершенно уверен, что концепция скрытых файлов была непреднамеренной оплошностью. Это просто была ошибка.
К
какому количеству багов, потраченных циклов CPU и случаев человеческого
разочарования (не говоря уже о плохом дизайне) привело одно маленькое
упущение, случившееся 40 лет назад.
Задумайтесь об этом в следующий раз, когда захотите «срезать угол» в вашем коде.
(Я
не спорю с теми, кто говорит, что скрытые файлы служат определенной
цели, но это цели служат файлы, а не соглашение об их наименовании. Их
легко можно было складывать в $HOME/cfg или в $HOME/lib, как мы и
сделали в Plan 9, где нет файлов с точкой. Выводы были сделаны)
Комментариев нет:
Отправить комментарий