Глава XII. Философия Unix
Что такое философия Unix?
Философия Unix — это не формальный документ и не стандарт. Это набор принципов, которые сформировались стихийно в процессе разработки Unix в Bell Labs и позже были осмыслены такими людьми, как Дуг МакИлрой, Брайан Керниган и Питер Сэлмон. Эти принципы — своего рода эстетика программирования, ответ на вопрос "как писать хороший код".
Главное отличие философии Unix от, скажем, философии Lisp-машин или OS/360: она не теоретическая, а сугубо практическая. Это не "как должно быть", а "что работает на практике".
Пайпы и композиция
Самая знаменитая идея Unix — пайпы (конвейеры) — была предложена Дугом МакИлроем в 1964 году, но реализована Кеном Томпсоном только в 1972-м. Пайп (pipe) — это механизм, позволяющий передавать вывод одной программы на вход другой без создания временных файлов. Простой пример: cat file | grep foo | sort | uniq. Четыре программы, каждая делает своё дело, данные текут по конвейеру.
Революционность пайпов в том, что они делают композицию программ тривиальной. Программисту не нужно знать внутреннее устройство других программ — достаточно того, что они читают из stdin и пишут в stdout. Это принцип "чёрного ящика" в чистом виде.
Каждая программа — это фильтр. Она берёт поток байтов, преобразует его и передаёт дальше. Текстовый поток как универсальный интерфейс — идея, которую никто до Unix не формулировал. И которая до сих пор работает: grep, sed, awk, jq, yq — все они читают текст и пишут текст.
Принцип "одно дело хорошо"
Вторая ключевая идея: программа должна делать ровно одну вещь и делать её хорошо. Не пытайтесь сделать универсальный инструмент — сделайте простой, который можно комбинировать с другими.
Посмотрите на стандартные утилиты Unix. cat — только выводит содержимое файлов. grep — только ищет по паттерну. sort — только сортирует. wc — только считает. Ни одна из этих утилит сама по себе не решает сколько-нибудь сложной задачи. Но в комбинации они становятся мощнейшим инструментом обработки данных.
Противоположный пример — GNU coreutils в сравнении с оригинальными утилитами: ls из GNU добавляет кучу опций, которых не было в оригинале (цвета, группировка, сортировка по времени), и это удобно, но нарушает принцип простоты. Компромисс между простотой и функциональностью — вечная тема споров.
Текст как универсальный интерфейс
Unix-разработчики приняли фундаментальное решение: формат обмена данными между программами — это текст. Не бинарные протоколы, не сериализованные структуры — просто текст, строки, разделённые символами новой строки.
Почему текст? Потому что текст можно читать глазами, его можно редактировать в любом редакторе, его можно передавать по сети, его можно grep-ить. Текстовый вывод означает, что каждая программа в пайпе может быть заменена другой, а промежуточный результат всегда можно посмотреть.
Сегодня это кажется очевидным, но в 1970-х это было смелое решение: большинство систем использовали бинарные форматы для скорости и компактности. Unix пожертвовала производительностью ради прозрачности.
"Современное" наследие этой идеи — JSON и YAML. API современных сервисов отдают данные в JSON — это текст. Dockerfile, Kubernetes manifests, Ansible playbooks — всё это YAML. Мы вернулись к тексту как формату конфигурации, обмена данными и описания инфраструктуры.
KISS и принцип минимальности
KISS (Keep It Simple, Stupid) — не просто аббревиатура, а фундаментальный закон Unix. Если можно не добавлять функцию — не добавляй. Если можно сделать проще — сделай проще.
Пример: файловая система Unix не имеет дефрагментации, потому что она не нужна для простого случая (файлы редко фрагментируются при однопользовательской работе). Ядро Unix в версии V6 (1975) было всего 8600 строк кода на C — это меньше, чем современный драйвер одного сетевого адаптера.
Канонические примеры: cat, grep, sed, awk
Четыре программы, которые иллюстрируют философию Unix:
cat— тупейшая программа: читает файлы, выводит их содержимое. Никакой логики, никакой обработки. Но именно поэтому она подходит как первое звено в пайпе.grep— ищет строки по регулярному выражению. Это всё, что она делает. Но делает быстро и надёжно.sed(stream editor) — редактирует текст потоково. Позволяет заменять, удалять, вставлять строки на лету. Мощь sed в том, что он не загружает весь файл в память — он работает как конвейер.awk— уже не просто утилита, а язык обработки структурированного текста. Разбивает строки на поля, позволяет выполнять произвольные действия. awk — это "grep на стероидах", при этом он остаётся фильтром: читает строки, обрабатывает, выводит.
Доктрина МакИлроя
Даг МакИлрой сформулировал принципы Unix в трёх пунктах:
- Программа делает одну вещь и делает её хорошо.
- Программа работает вместе с другими программами.
- Программа обрабатывает текстовые потоки, потому что это универсальный интерфейс.
Это лаконичнее и точнее, чем любой манифест. И это — сердце Unix.
Заключение
Философия Unix не о морали и не о политике — она об инженерии. Дисциплина простоты, модульности и композиции — это то, что отличает хорошую Unix-программу от раздутого монстра. И это то, чему мы можем научиться у операционной системы, созданной полвека назад, чтобы писать лучший код сегодня.
Комментарии
Комментарии пока не подключены.