psj-notes
~/home ~/series ~/archive

Глава XII. Философия Unix

03.08.2026 Серия: История Unix "unix" "philosophy" "pipe" "do-one-thing-well"

Что такое философия 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 в трёх пунктах:

  1. Программа делает одну вещь и делает её хорошо.
  2. Программа работает вместе с другими программами.
  3. Программа обрабатывает текстовые потоки, потому что это универсальный интерфейс.

Это лаконичнее и точнее, чем любой манифест. И это — сердце Unix.

Заключение

Философия Unix не о морали и не о политике — она об инженерии. Дисциплина простоты, модульности и композиции — это то, что отличает хорошую Unix-программу от раздутого монстра. И это то, чему мы можем научиться у операционной системы, созданной полвека назад, чтобы писать лучший код сегодня.

Комментарии

Комментарии пока не подключены.