habrahabr

О срезании углов

  • вторник, 29 апреля 2014 г. в 03:10:15
http://habrahabr.ru/post/221105/

Давным-давно, когда разрабатывалась файловая система Unix, в ней появились «псевдо-файлы» . и .., чтобы упростить перемещение между каталогами. Кажется, .. был добавлен в Версии 2, когда файловая система стала иерархической (в первой версии она была устроена совсем по-другому). Но эти «псевдо-файлы» засоряли вывод ls, и то ли Кен, то ли Деннис добавил в код ls простую проверку:
if (name[0] == '.') continue;
На самом деле программы тогда писались на ассемблере, но суть проверки была в точности такой.
Правильнее было бы реализовать эту проверку более развёрнуто:
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;
— но какая разница, главное что всё работало.

У этого было два далеко идущих последствия.

Во-первых, был создан прецедент для подобных «небрежных оптимизаций» в Unix, и уйма других ленивых программистов аналогичным способом насажали баги в свои программы: в частности, файлы, начинающиеся с точки, зачастую игнорируются там, где должны бы обрабатываться.

Во-вторых, и это намного хуже, «скрытые файлы», начинающиеся с точки, были восприняты как «фича». Уйма ленивых программистов стали создавать такие файлы в домашнем каталоге каждого пользователя. На моей машине установлено не так много программ, но в моём домашнем каталоге около сотни скрытых файлов, и про большинство из них я даже не догадываюсь, зачем они нужны, и нужны ли вообще. Каждый поиск файлов в моём домашнем каталоге замедляется в разы из-за всего этого невидимого мусора.

Я уверен, что «скрытые файлы» появились в Unix по ошибке, как непредвиденный результат той «оптимизации» в ls.

Сколько багов, сколько впустую сожжёных тактов процессора, сколько человеческой досады можно объяснить лишь тем, что 40 лет назад авторы Unix сэкономили полстрочки кода?

Вспоминайте об этом случае каждый раз, когда в вашем собственном коде вам захочется «срезать угол».

(Многие утверждают, что файлы с точкой в системе необходимы. Да, сами файлы необходимы, но точка в их именах — нет. Их гораздо удобнее было бы хранить в $HOME/cfg или в $HOME/lib; и именно так мы сделали в Plan 9, в которой «скрытых файлов» нет. Мы умеем учиться на своих ошибках.)