Примеры программирования в реальном мире философии Unix

Что такое определенный [1] код реального мира [2]/примеры дизайна, личные анекдоты, извлеченные ошибки (с большим вниманием на личные анекдоты, ошибки вместо того, чтобы указывать стороннее программное обеспечение), которые лучше всего иллюстрируют философию программирования Unix? Для начала здесь Рэймонд обобщает философию из Искусство программирования Unix:

Правило Модульность: Напишите простые части соединенных чистыми интерфейсами.

Правило Ясность: Ясность лучше чем ум.

Правило Состав: проектные программы для подключения к другим программам.

Правило Разделение: отдельная политика от механизма; отдельные интерфейсы от двигателей.

Правило Простота: дизайн для простота; добавьте сложность только там, где вы должны.

Правило Парсимония: напишите большую программу только когда это ясно, демонстрация что ничего не будет делать.

Правило Прозрачность: дизайн для видимость для проведения инспекции и легче отлаживать.

Правило Надежность: Надежность - это ребенок прозрачности и простоты.

Правило Представление: Сложите знания в данные, поэтому программная логика может быть глупый и надежный.

Правило Наименьший сюрприз: В интерфейсе дизайн, всегда делают наименее неожиданным вещь.

Правило Тишина. Когда программа ничего удивительного сказать, он должен ничего не говори.

Правило Ремонт. Когда вы должны выйти из строя, сбой шумно и как можно скорее.

Правило Экономика: время программирования дорогая; сохранить его в предпочтении для машинного времени.

Правило Генерация: Избегайте ручной взлома; писать программы для записи программы, когда вы можете.

Правило Оптимизация: прототип перед полировка. Попросите его работать до вас оптимизируйте его.

Правило Разнообразие: недоверяйте все претензии для "одного истинного пути".

Правило Расширяемость: дизайн для будущее, потому что оно будет здесь раньше чем вы думаете.

[1]: просто сказать "Linux" (или инструменты Unix или мой любимый проект Foo) недостаточно; что такое Linux, что делает его примером философии программирования Unix? Аналогичным образом просто говоря: "Linux модульный" тоже неискренен; снова - что делает linux следовать правилу модульности, как указано здесь? (например: lkm и т.д.) Дьявол находится в деталях.

[2]: Этот вопрос касается не просто "кодовых" примеров, как, кажется, полагает С. Лотт. В этом вопросе также четко указаны дизайн, личные анекдоты и ошибки, с большим вниманием к более поздним двум (для которых еще не дан ответ).

Ответы

Ответ 1

Попробуйте "философию UNIX" Майка Ганкарца, вместо того, чтобы слушать ESR. В своей книге он упоминает почтовый клиент "MH":

http://rand-mh.sourceforge.net/

mh - небольшая серия программ, которые вы можете использовать вместе с другими утилитами unix для чтения почты.

Проверьте дизайн MH http://www.rand.org/pubs/notes/N3017/ И руководство http://www.rand.org/pubs/reports/R2367/

Я бы также рекомендовал Plan9 как замечательный пример чего-то большего, чем UNIX, чем UNIX. Все это файл внутри plan9 и его.

Ответ 2

Git является воплощением программного обеспечения, построенного с помощью философии Unix.

При установке git вы устанавливаете в вашу систему буквально 100 команд, большинство из которых называются git-plumbing, которые git использует внутри, а 36 - команды высокого уровня, называемые git-porcelain, которые абстрагируют водопровод использование и скрытие детали реализации (ну, якобы) создают хороший интерфейс.

Ответ 3

На мой взгляд, самый высокий идеал программирования UNIX - это набор очень маленьких программ, которые "хорошо справляются" и могут быть скомпонованы, как правило, через PIPE и обычно обрабатывают данные как текст.

Другие стили программирования также имеют эту философию, хотя и в разных формах. ООП имеет принцип единой ответственности, функциональное программирование имеет комбинаторы, функции более высокого порядка, монады и т.д. ОС Linux демонстрирует философию UNIX достаточно хорошо, особенно в том, как она загружает и выгружает независимые модули, но в ней есть достаточно большое ядро. GNU Hurd сделал эту идею еще дальше и избавился от ядра макроядер Linux и попытался создать целую ОС на основе небольших независимых друг от друга частей, хотя сам Hurd никогда не занимался полетом.

Конкретные примеры

В терминах примеров философии UNIX есть несколько мест для поиска. Хорошая практика написания сценариев должна демонстрировать UNIX-foo, как и хорошо написанные режимы Emacs и некоторые ядра - попробуйте MINIX, если вы не хотите что-то маленькое и читаемое: http://www.minix3.org/source.html

Для среднего сценария сценариев оболочки BASH script in /etc/init.d/skeleton является скелетом для UNIX-демона и, на мой взгляд, написан с некоторой ясностью. Вы можете прочитать об этом здесь (с исходным кодом): http://www-theorie.physik.unizh.ch/~dpotter/howto/

Некоторые более мелкие примеры сценариев оболочки, которые (IMO) демонстрируют философию UNIX, следуют:

Получить точное количество слов в документе LaTeX, разделяемом несколькими файлами

detex mydocs/*.tex | wc -w

Проверьте наличие больших файлов в репозитории SVN

svn status | awk '{print $2}' | xargs du | sort -n | tail

Список файлов по дате изменения

find -type f -print0 | xargs -r0 stat -c %y\ %n | sort

Со всеми этими примерами мы просто объединяем простые строительные блоки для получения единственного результата. Вы можете найти целую кучу сценариев, подобных этому, в http://www.commandlinefu.com

Ответ 4

Я предлагаю Windows PowerShell? Я считаю, что она воплощает философию лучше, чем сама Unix. Для тех, кто незнакомо, вот что Википедия должна сказать об этом: http://en.wikipedia.org/wiki/Windows_PowerShell

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

Ответ 5

Все инструменты Unix воплощают эти идеи. Unix вышел первым. Книга пришла позже. Это должно вам что-то сказать.

Ответ 6

В реальных приложениях django определенно имеет сильную философию Unix.

Вы хотите добавить "пользователей электронной почты и подтвердить свою электронную почту, при регистрации", добавить приложение: (django-registration) [http://bitbucket.org/ubernostrum/django-registration] и укажите его на шаблон URL. Вы хотите добавить "Добавить возможность входа через Facebook, твиттер", добавить другое приложение: Django-Socialauth и указать его на другой URL-адрес.

Даже сами приложения: "Сделай одно и сделай это хорошо" Очень похоже на unix.

Ответ 8

Так как ОС Linux является значительным реальным примером этого, что еще вам нужно? Другие части программного обеспечения, которые фиксируют шаблон Linux? Большинство широко используемых, очень активных проектов с открытым исходным кодом, которые работают под Linux, соответствуют этому шаблону. Это много реальных примеров.

Ответ 9

Простые части, соединенные чистыми интерфейсами.

Это может быть скорее мета-пример, но я думаю, что несколько AWS-сервисы воплощают философию Unix, поскольку данные передаются от одной службы AWS до другой (или для службы без AWS), позволяющей создавать функциональные возможности очень творчески.

Разработка программ для подключения к другим программам.

В частности, по моему опыту:

  • AWS Lambda
  • AWS S3
  • AWS Kinesis
  • Простая служба уведомления AWS

Некоторые модули Apache, также как и серверная часть.

(Я добавлю несколько подробностей, когда буду на рабочем столе - я набираю текст с телефона!)

Ответ 10

Будьте гибкими, что вы принимаете в качестве входных данных

Я думаю, что файлы плей-листа m3u (и приложения, которые их потребляют, такие как VLC) показывают некоторое воплощение философии Unix. Они представляют собой линейные списки песен (или видео), а если есть недопустимая запись, игрок просто переходит к следующему. И даже если у вас могут быть комментарии, которые дают метаданные о файле, плеер будет работать без него ( "быть гибким, что вы принимаете в качестве входных данных" ).

Я хочу, чтобы что-то подобное существовало для слайд-шоу или для нелинейного редактирования видео.

Ответ 11

Хорошо делайте

Twitter напрямую не использует Unix Philosophy, но на более абстрактном уровне:

  • подумайте, насколько ограничена его функциональность ( "сделайте одно хорошо" ) и в результате
  • Чем жестче функциональность, тем дольше будет длиться программа (что, как инструменты, такие как grep, просуществовали десятилетия, они не были бы гибридами индивидуальной логики)
    • Готов поспорить, что из всех сайтов сегодня, Twitter - тот, который я поставил, все еще работает в 2047 году, потому что он по своей сути является плоской файловой базой данных. Плоские файловые базы данных сохраняются практически навсегда

Ответ 12

Примеры счетчиков

Я думаю, было бы полезно в академических целях вести список примеров ошибок в учебниках. Это может помочь вам определить, следует ли инструмент, который вы оцениваете (или писать!), Следует философии Unix.

Правило нарушения молчания

  • Maven, как известно, плохо относится к этому. Вы запускаете mvn compile и видите 3 страницы вывода до BUILD SUCCESS. Представьте себе, что mv или cp работают следующим образом.

    • Когда ничего удивительного не происходит, закройте ад.