La philosophie Unix a-t-elle été abandonnée dans la conception d'applications Web? [fermé]

8

La philosophie Unix encourage l'utilisation de petits programmes de coopération génériquement réutilisables qui collaborent avec des formes de communication inter-processus comme les tuyaux, les fifos, les sockets, par opposition à l'espace mémoire partagé et à la liaison. Les programmes MH et uzbl sont souvent donnés comme exemples d'applications qui illustrent la philosophie Unix dans leur conception.

Si tel est le cas, n'est-il pas vrai que la philosophie Unix a été totalement abandonnée dans la conception d'applications web? Presque toutes les applications Web qui traitent les demandes sont désormais conçues comme de grands processus monolithiques de longue durée qui gèrent l'ensemble du cycle de demande / réponse (à l'exception des appels à un programme de base de données externe) non seulement pour une ressource, mais toutes les ressources d'un domaine entier.

Est-ce principalement parce que la canalisation vers une collection de programmes externes pour construire une réponse dynamique à une demande Web a trop de temps de démarrage du processus? Je peux voir comment cela est le cas si vous souhaitez diriger vers des scripts Ruby ou Python, mais peut-être que si vous utilisez un langage comme Haskell que vous pouvez compiler, les vrais obstacles à la mise en œuvre de la philosophie Unix dans la création d'applications Web disparaissent?

dan
la source
Cette question n'a vraiment pas de réponse spécifique et d'après ce que je comprends, les questions de discussion sans réponse spécifique sont généralement fermées.
mdpc

Réponses:

4

Je pense que cela dépend beaucoup de l'endroit où vous tracez une frontière entre les applications (c'est-à-dire quelle est votre définition d'une application) et des cas d'utilisation que vous prenez en considération.

Bien que vous puissiez implémenter un navigateur Web en tant que fusion de wget/ curl, un analyseur HTML / XML qui appellerait une application simple pour chaque nœud de document, un moteur JavaScript autonome qui interagirait avec tout cela et un afficheur "simple" qui "juste" placez la sortie de ce qui précède à l'écran (et renvoyez les entrées à un processus de coordination de base), ce serait encore plus compliqué que (probablement n'importe quel) autre navigateur d'aujourd'hui.

Quant à la transmission des données à un processus externe - c'est ainsi que cela a réellement commencé . Si vous êtes préoccupé par la taille d'un code d'application Web moyen, oui, ils sont souvent volumineux (et souvent parce qu'ils sont une couche située au-dessus d'une plate-forme écrite dans un langage de programmation interprété plutôt qu'une application "simple"), mais comparez-la à leurs équivalents. Clients de messagerie, suites bureautiques ... vous l'appelez. Tous ces éléments sont assez complexes et ont trop de fonctionnalités pour être implémentés sous la forme de deux processus communiquant via des canaux. Pour les tâches pour lesquelles vous utilisez ces applications, elles sont souvent aussi complexes. Il n'y a pas de bonnes solutions simples à des problèmes complexes.

Il est peut-être temps de regarder un peu au-delà de la motivation derrière la devise UNIX "les applications qui font un peu mais qui sont bonnes dans ce domaine". Remplacez «applications» par «unités modulaires générales» et vous arrivez à l'une des bonnes pratiques de programmation de base: faire les choses de manière modulaire, afin que les pièces puissent être réutilisées et développées séparément . C'est ce qui compte vraiment, à mon humble avis (et le choix du langage de programmation a très peu à voir avec cela).

ps (après le commentaire) : Au sens strict, vous avez généralement raison - les applications Web ne suivent pas la philosophie UNIX (d'être divisées en plusieurs programmes autonomes plus petits). Pourtant, tout le concept de ce qu'est une application semble plutôt trouble - sedpourrait probablement être considéré comme une application dans certaines situations , alors qu'il agit généralement comme un filtre.

Par conséquent, cela dépend de la façon dont vous voulez le prendre. Si vous utilisez la définition habituelle d'un processus - quelque chose qui fonctionne comme un seul processus (au sens où le noyau le voit), alors par exemple une application Web PHP interprétée en httpd par un module est exactement le contraire. Les bibliothèques partagées chargées tombent-elles toujours dans le cadre d'un processus unique (car elles utilisent le même espace d'adressage) ou sont-elles déjà quelque chose de plus séparé (immuable du point de vue du programmeur, complètement réutilisable et communiquant via une API bien définie)?

D'un autre côté, la plupart des applications Web sont aujourd'hui divisées en parties client et serveur, qui s'exécutent en tant que processus distincts - généralement sur des systèmes différents (et même sur du matériel physiquement séparé). Ces deux parties communiquent entre elles via une interface bien définie (généralement textuelle) (XML / HTML / JSON sur HTTP). Souvent (au moins dans le navigateur) il existe plusieurs threads qui traitent le côté client de l'application (JavaScript / DOM, entrée / sortie ...), parfois même un processus distinct exécutant un plugin (Java, Flash, ... ). Cela ressemble exactement à la philosophie UNIX originale, en particulier sous Linux, où les threads sont des processus par (presque) n'importe quel compte.

En plus de cela, les parties du serveur sont à peu près toujours divisées en plusieurs parties distinctes - un moteur de base de données distinct effectuant les opérations demandées sur des données structurées (ou non structurées) est un exemple canonique. Il n'est tout simplement pas très logique d'intégrer une base de données dans un serveur Web. Pourtant, cela n'a pas beaucoup de sens de diviser une base de données en plusieurs processus qui se spécialiseraient par exemple en analysant uniquement les demandes, en récupérant les données du stockage de données, en filtrant les données ... Il faut trouver un équilibre entre la création d'un géant omnipotent et un essaim de travailleurs presque nilpotents qui passent la plupart de leur temps à se parler.

En ce qui concerne l' interface textuelle : notez que ce qui était vrai pour les données traitées il y a 40 ans n'est pas nécessairement vrai aujourd'hui - les formats binaires sont moins chers à la fois en termes d'espace et de puissance requis pour la dé / sérialisation, et la quantité de données est immensément plus grande.

Une autre question importante est également de savoir quelle a été la cible de la philosophie UNIX? Je ne pense pas que des simulations numériques, des systèmes bancaires ou des galeries de photos / réseaux sociaux accessibles au public aient jamais existé. Cependant, la maintenance des systèmes exécutant ces services a été et sera probablement dans le futur.

peterph
la source
Je vous remercie. Si vous regardez l'art de la programmation Unix, Ch 7, la modularité au sein d' un programme n'est en fait pas considérée comme une expression de la philosophie des petits outils Unix, mais seulement comme un complément à celle-ci. Voir les 4 premiers
dan
2

Je ne suis pas sûr que la philosophie Unix ait jamais été présente dans la conception d'applications Web - cependant, même s'il est vrai que de nombreuses applications Web se comportent comme vous l'avez décrit, on pourrait considérer que les applications Web de nos jours sont plus susceptibles d'être des consommateurs de données (étant donné la méthode de plus en plus axée sur les API / services Web de production de données pour la consommation Web).
À son tour, cela pourrait être considéré comme encourageant l'utilisation de petits composants réutilisables (sous forme de fonctions JavaScript) qui collaborent entre eux, de sorte qu'un petit parallèle pourrait exister.

Raad
la source