Implementazioni, un altro problema irrisolto nell'ingegneria del software [chiuso]

3

Perché è così difficile confezionare e distribuire software? Voglio capire qual è esattamente la complessità intrinseca della creazione di binari autonomi? Attualmente sembra che golang sia l'unico gioco in città quando si tratta di risolvere quasi completamente il problema di distribuzione, ma anche andare ha alcuni problemi con le dipendenze di versioning. Perché non ci sono più linguaggi che risolvono questo problema a livello di compilatore / lingua?

Nota che non sto parlando del codice della libreria. Sto parlando di un'applicazione reale o di un servizio che deve raggiungere un ambiente di produzione nel modo più rapido e affidabile possibile.

    
posta davidk01 09.02.2015 - 00:14
fonte

4 risposte

9
  • Dipendenze. Prendi una semplice applicazione Python. Posso distribuirlo come una sceneggiatura. Funzionerà su alcune macchine e non funzionerà su altre, perché lo script sta usando Python 3 e quelle macchine hanno solo Python 2 installato, o nessun Python.

    Quindi ora devo assicurarmi, durante la distribuzione, che una versione specifica di Python sia disponibile o che verrà installata durante la distribuzione.

    Come risolveresti quello a livello di compilatore / lingua? ...

    Vedi anche: Qualcuno ha inchiodato la gestione delle dipendenze?

  • Configurazione. Utilizza un servizio molto semplice che riceve chiamate dall'esterno. Funziona sulla mia macchina. Lo distribuisco sul server e smette di funzionare. Non succede nulla: il servizio non riceve chiamate, indipendentemente da ciò che faccio.

    Questo perché il server ha un firewall che blocca la porta utilizzata dal servizio.

    Il che significa che il mio script di implementazione dovrebbe aprire la porta specifica. Se ho il controllo totale sui server e so che ogni server utilizza UFW come unico firewall, l'attività è relativamente semplice. Se non ho questo controllo e devo supportare più firewall, l'attività diventa più complessa.

    Non c'è nulla che un compilatore / linguaggio possa fare per me lì.

  • Infrastruttura. Fai un esempio di un'app Web che utilizza MongoDB. Se non c'è un server MongoDB, l'app non funzionerà. Ciò significa che anche il database dovrebbe essere distribuito, probabilmente su un altro server. Pertanto, dovrei creare una macchina virtuale dedicata per il database, distribuire MongoDB e configurare l'app Web implementata impostando la stringa di connessione corretta.

    Ma poi, sembra che ho bisogno di un failover, quindi ora ho bisogno di due server di database, e ho bisogno di cambiare la stringa di connessione di conseguenza. Ancora più importante, ho bisogno di configurare il failover in modo che i dati si replichino come previsto dopo che una delle macchine del database è stata distribuita.

    Quindi, non voglio perdere tutti i dati se le macchine virtuali che ospitano il database vengono distrutte, quindi eseguo i backup. Ora, lo script di distribuzione dovrebbe anche gestire il ripristino dall'ultimo backup.

Questi tre punti sono solo un piccolo sottoinsieme di tutte le sfide che potresti avere durante la distribuzione.

In tutti questi punti, né il compilatore né il linguaggio di programmazione possono essere d'aiuto. Questo perché la maggior parte delle sfide di implementazione non sono inerenti al linguaggio / compilatore / framework che usi.

Ma aspetta, ci sono invece una serie di strumenti specifici per le distribuzioni:

  • Gestori di pacchetti. hai utilizzato npm in Node.js, pip in Python o NuGet in C # / Visual Basic? La loro gestione delle dipendenze è particolarmente eccitante e rendono abbastanza facile la distribuzione di un piccolo prodotto software. Hai usato apt-get ? Il solo fatto che puoi semplicemente digitare apt-get install something e lasciare che lo strumento faccia tutto il lavoro, senza fare domande, è quasi magico.

  • Gestori di configurazione / strumenti di automazione dell'infrastruttura. Strumenti come Chef, Puppet o OpenStack fanno un ottimo lavoro per semplificare l'automazione delle distribuzioni. Ciò non significa che tu possa dire "Fammi un failover MongoDB" e guardare il risultato (anche se lo fa esattamente per casi semplici), ma almeno puoi avere un processo riproducibile e automatizzato che ti semplifica la vita .

risposta data 09.02.2015 - 03:18
fonte
1

La distribuzione è facile. Si impacchettano i binari e si fa riferimento ai progetti dipendenti di cui ha bisogno. Quindi distribuisci il pacchetto e i file binari in una posizione ben nota e chiunque possa installarlo e qualsiasi dipendenza che non hanno già, con una singola chiamata.

Naturalmente, se non si utilizza un repository Linux, sarà necessario utilizzare qualsiasi meccanismo di distribuzione (inferiore :)) supportato dal sistema operativo.

Ma questo non gestisce ancora cose specifiche per installazione, come l'aggiunta di utenti che è qualcosa che non è possibile distribuire automaticamente man mano che cambia per sito. Certo, puoi renderlo più semplice e un utente finale può creare script di implementazione utilizzando uno strumento come pupazzo o cuoco e implementare una configurazione personalizzata.

Anche in questo caso, ci sono progressi nelle distribuzioni: guarda i sistemi di applicazioni virtualizzati come Docker. questo ti permette di costruire un sistema (ad es. pre-distribuito) e poi spedirlo nel suo piccolo mondo, isolato dal resto del sistema operativo, in modo che non sia in conflitto con altre applicazioni installate.

    
risposta data 09.02.2015 - 12:27
fonte
1

La radice di questo problema è che il tuo programma non vive in isolamento nel tuo sistema, i dischi rigidi sono condivisi, librerie, ecc.

In questo regno Snappy Ubuntu fornisce un contributo importante, dal loro sito web:

Ubuntu Core provides transactional updates with rigorous application isolation. This is the smallest, safest Ubuntu ever, on devices and on the cloud. We’re excited to unleash a new wave of developer innovation with snappy Ubuntu Core! (Mark Shuttlewort)

Che cosa significa:

  • Transazionale: una nuova installazione ha esito positivo o non riesce completamente. Se fallisce, torna indietro e lascia il sistema esattamente com'era. Niente più schifezze da file di un aggiornamento parziale.

  • Isolamento delle applicazioni: non importa quale versione specifica di una libreria utilizzata dal programma dipende da quella libreria non verrà sovrascritta da un'altra applicazione. Né la tua applicazione può cancellare altri file di app.

  • Piccola: questa versione base di Ubuntu è di circa 70 MB.

risposta data 09.02.2015 - 21:21
fonte
0

Non credo che questo sia un problema linguistico. Si tratta più di un'architettura software o di un'architettura run-time o di un problema di architettura del sistema operativo (nota, non dico problema).

Se ogni distribuzione software fosse un binario autonomo, allora ogni pacchetto software sarebbe un'installazione ENORME. Dovresti replicare ogni libreria dipendente e parte del software di runtime necessario per il software in questione.

Quindi in realtà, a meno che tu non voglia spedire una versione da 6 giga di solitario, le dipendenze esterne sono una buona cosa.

    
risposta data 09.02.2015 - 01:04
fonte

Leggi altre domande sui tag