La filosofia Unix è stata abbandonata nella progettazione di applicazioni web? [chiuso]


8

La filosofia Unix incoraggia l'uso di piccoli programmi cooperativi genericamente riutilizzabili che collaborano con forme di comunicazione tra processi come pipe, fifos, socket, anziché spazio di memoria e collegamento condivisi. I programmi MH e uzbl vengono spesso forniti come esempi di applicazioni che esemplificano la filosofia Unix nel loro design.

In questo caso, non è vero che Unix Philosophy è stata totalmente abbandonata nella progettazione di applicazioni web? Quasi tutte le applicazioni Web che elaborano le richieste sono ora costruite come singoli grandi processi monolitici di lunga durata che gestiscono l'intero ciclo di richiesta / risposta (oltre alle chiamate a un programma di database esterno) non solo per una risorsa, ma tutte le risorse in un intero dominio.

Ciò è dovuto principalmente al fatto che il piping a una raccolta di programmi esterni per costruire una risposta dinamica a una richiesta Web ha un eccessivo sovraccarico del tempo di avvio del processo? Posso vedere come questo è il caso se si desidera eseguire il pipe out degli script Ruby o Python, ma forse se si utilizza un linguaggio come Haskell che è possibile compilare, eventuali ostacoli reali a seguire la filosofia Unix nella costruzione di app Web scompaiono?


Questa domanda in realtà non ha una risposta specifica e da quello che capisco le domande di discussione senza una risposta specifica sono generalmente chiuse.
mdpc,

Risposte:


4

Penso che dipenda molto da dove si traccia un confine tra le applicazioni (cioè qual è la tua definizione di applicazione) e quali casi d'uso prendi in considerazione.

Mentre potresti implementare un browser web come una fusione di wget/ curl, un parser HTML / XML che chiamerebbe semplice applicazione per ciascun nodo del documento, un motore JavaScript autonomo che interagirebbe con tutto questo e un "semplice" visualizzatore che "solo" posizionare l'output di quanto sopra sullo schermo (e restituire gli input a qualche processo di coordinamento di base) sarebbe ancora più disordinato di (probabilmente qualsiasi) altro browser di oggi.

Per quanto riguarda il piping dei dati a un processo esterno, ecco come sono stati effettivamente avviati . Se sei preoccupato per le dimensioni di un codice medio di applicazione web, sì, sono spesso grandi (e spesso perché sono uno strato sopra una piattaforma scritta in un linguaggio di programmazione interpretato piuttosto che un'applicazione "semplice"), ma confrontalo ai loro equivalenti. Clienti e-mail, suite per ufficio ... lo chiami. Tutti questi sono abbastanza complessi e hanno troppe funzionalità per essere implementati come un paio di processi che comunicano attraverso i tubi. Le attività per le quali stai utilizzando queste applicazioni sono spesso anche complesse. Non ci sono buone soluzioni semplici a problemi complessi.

Forse è tempo di guardare un po 'oltre la motivazione dietro il motto UNIX "applicazioni che fanno un po' ma sono brave a farlo". Sostituisci "applicazioni" con "unità modulari generali" e arrivi a una delle buone pratiche di programmazione di base: fai le cose in modo modulare, in modo che le parti possano essere riutilizzate e sviluppate separatamente . Questo è ciò che conta davvero, IMHO (e la scelta del linguaggio di programmazione ha ben poco a che fare con esso).

ps (seguendo il commento) : Nel senso più stretto hai per lo più ragione - le applicazioni web non seguono la filosofia UNIX (di essere divise in diversi programmi autonomi più piccoli). Tuttavia l'intero concetto di cosa sia un'applicazione sembra piuttosto oscuro - sedpotrebbe probabilmente essere considerato un'applicazione in alcune situazioni , mentre di solito funge solo da filtro.

Quindi dipende da quanto letteralmente vuoi prenderlo. Se usi la solita definizione di un processo - qualcosa in esecuzione come un singolo processo (nel senso in cui lo vede il kernel), ad esempio un'applicazione web PHP interpretata in httpd da un modulo è esattamente l'opposto. Le librerie condivise caricate rientrano ancora nell'ambito di un singolo processo (perché utilizzano lo stesso spazio degli indirizzi) o sono già qualcosa di più separato (immutabile dal punto di vista del programmatore, completamente riutilizzabile e in comunicazione attraverso un'API ben definita)?

D'altra parte, la maggior parte delle applicazioni web oggi sono suddivise in parti client e server, che sono in esecuzione come processi separati - di solito su sistemi diversi (e persino hardware fisicamente separato). Queste due parti comunicano tra loro attraverso un'interfaccia ben definita (di solito testuale) (XML / HTML / JSON su HTTP). Spesso (almeno nel browser) ci sono diversi thread che stanno elaborando il lato client dell'applicazione (JavaScript / DOM, input / output ...), a volte anche un processo separato che esegue un plug-in (Java, Flash, ... ). Sembra esattamente come la filosofia UNIX originale, specialmente su Linux, dove i thread sono processi di (quasi) qualsiasi account.

Inoltre, le parti del server sono praticamente sempre divise in più parti distinte: un motore di database separato che esegue le operazioni richieste su dati strutturati (o non strutturati) è un esempio canonico. Non ha molto senso integrare un database in un web server. Tuttavia, non ha molto senso dividere un database in diversi processi che si specializzerebbero nel dire solo analizzare le richieste, recuperare i dati dalla memoria dei dati, filtrare i dati .... Bisogna trovare un equilibrio tra la creazione di un colosso onnipotente e un brulicante di lavoratori quasi nilpotenti che trascorrono la maggior parte del loro tempo a parlare tra loro.

Per quanto riguarda l' interfaccia testuale : nota che ciò che era vero per i dati elaborati 40 anni fa non è necessariamente vero oggi - i formati binari sono più economici sia nello spazio che nella potenza richiesta per la de / serializzazione e la quantità di dati è immensamente più grande.

Un'altra domanda importante è anche: qual è stato l'obiettivo della filosofia UNIX? Non credo che simulazioni numeriche, sistemi bancari o gallerie fotografiche / social network accessibili al pubblico siano mai stati. La manutenzione dei sistemi che eseguono questi servizi, tuttavia, è stata sicuramente e probabilmente lo sarà anche in futuro.


Grazie. Se osservi l'Arte della Programmazione Unix, Ch 7, la modularità all'interno di un programma non è in realtà vista come un'espressione della filosofia dei piccoli strumenti di Unix, ma solo come un complemento ad essa. Vedi i primi 4 paragrafi qui: faqs.org/docs/artu/multiprogramchapter.html
dan

2

Non sono sicuro che Unix Philosophy sia mai stata presente nella progettazione di applicazioni Web - tuttavia, mentre può essere vero che molte applicazioni Web si comportano come descritto, si potrebbe considerare che le app Web in questi giorni hanno maggiori probabilità di essere consumatori di dati (dato il metodo sempre più api / basato sul servizio web di produzione di dati per il consumo web).
Questo a sua volta potrebbe essere visto per incoraggiare l'uso di componenti piccoli e riutilizzabili (sotto forma di funzioni JavaScript) che collaborano tra loro, quindi potrebbe esistere un piccolo parallelo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.