Была ли заброшена философия Unix в дизайне веб-приложений? [закрыто]

8

Философия Unix поощряет использование небольших, многократно используемых программ сотрудничества, которые взаимодействуют с такими формами межпроцессного взаимодействия, как каналы, fifos, сокеты, в отличие от общего пространства памяти и связи. Программы MH и uzbl часто приводятся в качестве примеров приложений, которые служат примером философии Unix в их дизайне.

Если это так, разве не правда, что философия Unix была полностью заброшена при разработке веб-приложений? Почти все веб-приложения, обрабатывающие запросы, теперь создаются как единые большие монолитные длительно выполняющиеся процессы, которые обрабатывают весь цикл запрос / ответ (кроме обращений к программе внешней базы данных) не только для одного ресурса, но и для всех ресурсов всего домена.

Это связано прежде всего с тем, что передача в коллекцию внешних программ для создания динамического ответа на веб-запрос имеет слишком много накладных расходов при запуске процесса? Я вижу, как это происходит, если вы хотите использовать сценарии на Ruby или Python, но, возможно, если вы используете язык, такой как Haskell, который вы можете скомпилировать, какие-либо реальные препятствия для следования философии Unix при создании веб-приложений исчезнут?

Дан
источник
На этот вопрос действительно нет конкретного ответа, и, насколько я понимаю, вопросы для обсуждения без конкретного ответа, как правило, закрыты.
mdpc

Ответы:

4

Я думаю, что это во многом зависит от того, где вы проводите границу между приложениями (т.е. как вы определяете приложение), и какие варианты использования вы принимаете во внимание.

Хотя вы можете реализовать веб-браузер как объединение wget/ curl, анализатор HTML / XML, который будет вызывать простое приложение для каждого узла документа, автономный движок JavaScript, который будет взаимодействовать со всем этим, и «простой» инструмент отображения, который «просто» разместите вывод вышеупомянутого на экране (и верните входные данные обратно в какой-то основной координационный процесс), это будет еще более беспорядочным, чем (возможно, любой) другой сегодняшний браузер.

Что касается передачи данных во внешний процесс - это то, как он фактически начался . Если вас беспокоит размер среднего кода веб-приложения, да, они часто бывают большими (и часто потому, что они представляют собой слой, расположенный над платформой, написанной на интерпретируемом языке программирования, а не на «простом» приложении), но сравните его. к их эквивалентам. Почтовые клиенты, офисные пакеты ... вы называете это. Все они довольно сложны и имеют слишком много функциональности, чтобы быть реализованными в виде пары процессов, взаимодействующих через каналы. Для задач, для которых вы используете эти приложения, часто тоже сложны. Нет хороших простых решений сложных проблем.

Может быть, пришло время взглянуть на мотивацию под девизом UNIX «приложения, которые мало что делают, но у них это хорошо получается». Замените «приложения» на «общие модульные блоки», и вы получите один из основных хороших методов программирования: делайте вещи модульно, чтобы детали можно было повторно использовать и разрабатывать отдельно . Это то, что действительно имеет значение, ИМХО (и выбор языка программирования имеет к этому мало отношения).

ps (после комментария) : В самом строгом смысле вы в основном правы - веб-приложения не следуют философии UNIX (разделить на несколько небольших автономных программ). Тем не менее, сама концепция того, что представляет собой приложение, выглядит довольно мутной - sedвозможно, в некоторых ситуациях ее можно рассматривать как приложение , хотя она обычно действует как фильтр.

Следовательно, это зависит от того, насколько буквально вы хотите это воспринимать. Если вы используете обычное определение процесса - что-то, выполняемое как отдельный процесс (в том смысле, в котором это видит ядро), то, например, веб-приложение PHP, интерпретируемое модулем httpd модулем, является полной противоположностью. Загруженные разделяемые библиотеки все еще попадают в область действия одного процесса (потому что они используют одно и то же адресное пространство) или они уже являются чем-то более отдельным (неизменным с точки зрения программиста, полностью повторно используемым и взаимодействующим через четко определенный API)?

С другой стороны, большинство современных веб-приложений разделены на клиентскую и серверную части, которые выполняются как отдельные процессы - обычно на разных системах (и даже на физически разделенном оборудовании). Эти две части взаимодействуют друг с другом через четко определенный (обычно текстовый) интерфейс (XML / HTML / JSON over HTTP). Часто (по крайней мере, в браузере) есть несколько потоков , которые обрабатывают клиентскую часть приложения (JavaScript / DOM, ввод / вывод ...), иногда даже отдельный процесс, выполняющий плагин (Java, Flash, ... ). Это звучит точно так же, как и в оригинальной философии UNIX, особенно в Linux, где потоки являются процессами (почти) любой учетной записи.

Кроме того, серверные части почти всегда разбиты на несколько отдельных частей - отдельный механизм базы данных, выполняющий запрошенные операции со структурированными (или неструктурированными) данными, является каноническим примером. Просто не имеет смысла интегрировать базу данных в веб-сервер. Тем не менее, не имеет большого смысла разделять базу данных на несколько процессов, которые специализируются, скажем, только на синтаксическом анализе запросов, получении данных из хранилища данных, фильтрации данных ... Необходимо найти баланс между созданием всемогущего бегемота и рой почти нильпотентных рабочих, которые проводят большую часть своего времени, разговаривая друг с другом.

Что касается текстового интерфейса: обратите внимание, что то, что было верно для данных, обработанных 40 лет назад, не обязательно верно сегодня - двоичные форматы дешевле как по пространству, так и по мощности, необходимой для де-сериализации, а объем данных намного больше.

Другой важный вопрос также заключается в том, что на самом деле было целью философии UNIX? Я не думаю, что когда-либо имело место численное моделирование, банковские системы или общедоступные фотогалереи / социальные сети. Однако обслуживание систем, работающих с этими службами, безусловно, было и, вероятно, будет в будущем.

peterph
источник
Спасибо. Если вы посмотрите на Искусство программирования Unix, глава 7, модульность внутри программы фактически не рассматривается как выражение философии Unix для небольших инструментов, а лишь как дополнение к ней. Смотрите 1 - й 4 параграфов здесь: faqs.org/docs/artu/multiprogramchapter.html
дан
2

Я не уверен, что Unix Philosophy когда-либо присутствовала в дизайне веб-приложений - однако, хотя это может быть правдой, что многие веб-приложения ведут себя так, как вы описали, можно подумать, что веб-приложения в наши дни с большей вероятностью потребляют данные (учитывая все более и более управляемый API / веб-сервис метод получения данных для веб-потребления).
Это, в свою очередь, может стимулировать использование небольших повторно используемых компонентов (в форме функций JavaScript), которые взаимодействуют друг с другом, поэтому может существовать небольшая параллель.

Раад
источник