Quali sono i rischi di affidarsi al livello O.S (comandi e shell) come piattaforma di programmazione?

3

Contesto

Sto per iniziare un nuovo progetto per la mia azienda 1 che l'architettura comprenderà diversi elementi. Ci sono 2 applicazioni mobili (Android e iOS), una web API (Java) e un ETL (decidendo ancora se utilizzare NodeJS o Java).

Il sistema dovrebbe estrarre i dati da diversi repository OpenData (web APIS), trasformare ciascun set di dati in un modello di dati univoco e consolidare i dati.

Il modello risultante è il modello che deve essere pubblicato tramite l'API Web e quello che viene utilizzato dalle app mobili. Inoltre, l'API web fornirà funzionalità simili a quelle che troviamo nei social network (Mi piace, Preferiti, link di condivisione, suggerimenti, ecc.)

Il sistema verrà distribuito come contenitori Docker. Probabilmente in una piattaforma cloud pubblica.

Motivazioni

Ho costruito sistemi simili prima e mi sono reso conto che costruisco sempre l'ETL con un linguaggio di programmazione di alto livello (principalmente in Java). Sono consapevole della debolezza di Java per quanto riguarda la serializzazione / deserializzazione e gestione della memoria. Sono giunto alla conclusione che Java è diventato il mio Golden Hammer e talvolta potrebbe essere eccessivo (o inadeguato).

Ho iniziato a considerare altri linguaggi come NodeJS perché è molto efficace nell'esecuzione di I / O e trasformazione dei dati (JSON). Il tipo di ETL che ho in mente può sfruttare queste funzionalità e facilitare l'implementazione.

Tuttavia, ho eseguito recentemente i compiti di DevOps e mi sono innamorato dello scripting di shell di Linux. Complessivamente con comandi come wget , awk , grep , sed e jq . Sono anche riuscito a creare un ETL con questi 4 comandi senza bisogno di un altro linguaggio di programmazione. Ho trovato il livello O.S per essere abbastanza comodo, veloce ed efficiente.

Di conseguenza, ho iniziato a giocare con l'idea di sfruttare le potenzialità di O.S e di costruire il prossimo ETL che si estende più estesamente sul livello O.S.

Domanda

Dato che non ho mai costruito qualcosa di simile, le mie domande sono

  • Quali sono i rischi (almeno quelli più rilevanti) di fare affidamento sul livello O.S (comandi e shell) come piattaforma di programmazione?

  • Di cosa dovrei essere a conoscenza?

  • Sono solo io o di solito non sfruttiamo le funzionalità sottostanti di O.S? Se sì, perché? 2

Nota

L'idea sarebbe di implementare un'applicazione web leggera in cui gli utenti possano programmare dinamiche (e) xtractions, (t) ransformations e (l) oads, digitando il codice dello shell shell in aree di testo. Trasforma queste aree di testo in file eseguibili sh ed eseguili in un dato ordine. Se hai familiarità con Jenkins, probabilmente sai cosa intendo.

L'estrazione può essere gestita con wget , trasformazione con jq, awk and sed e il caricamento, beh, spero che Ubuntu abbia un cli di MongoDB. In caso contrario, potrei risolvere quella parte con Java o NodeJS.

1: Dove interpreto il ruolo di un ingegnere senior del software. Ma per questo progetto, mi aspetto che io sia l'architetto. Penso di poterlo fare, ma non ho mai giocato completamente questo ruolo prima di

2: Mi chiedo se questa domanda sia (in qualche modo) simile all'eterna discussione sul fatto che mettere la logica di business nel database sia malvagio.

    
posta Laiv 11.04.2018 - 11:49
fonte

1 risposta

5

Dato che hai usato entrambi i tipi di strumenti, mi aspetto che tu conosca già la maggior parte dei vantaggi e degli svantaggi di questi strumenti da riga di comando: il vantaggio principale è che puoi risolvere molti problemi con poche righe di codice. Sul lato svantaggio, trovi

  • capacità di gestione degli errori con restrizioni
  • quasi nessuna possibilità di creare strutture dati o codice OO
  • è (almeno nella mia esperienza) più difficile implementare qualcosa come input sanitizing (ma YMMV)
  • Funzionalità di debug e profiling molto limitate
  • Funzionalità dell'interfaccia utente molto limitate.
  • ogni comando genera un nuovo processo e la comunicazione tra questi strumenti può essere effettuata esclusivamente da file o pipe. Questo può avere un impatto sulle prestazioni.
  • la notazione degli script della shell può essere davvero complicata e difficile da mantenere da parte di sviluppatori inesperti. Perdite di espressività e leggibilità
  • soffre di tutti gli inconvenienti della programmazione procedurale e batch

La dipendenza del sistema operativo potrebbe anche essere un problema, e potrebbe essere più semplice mantenere il sistema operativo del codice indipendente usando Java piuttosto che usando lo script di shell Linux / Unix. Ma anche i programmi Java diventeranno dipendenti dal SO se non si fa attenzione, e gli script di shell Linux possono spesso essere eseguiti su Windows utilizzando un ambiente come Cygwin .

Esiste un'alternativa, che consente di scrivere programmi quasi concisi come gli script di shell, quasi portatili quanto Java, ma senza i suddetti inconvenienti?

Certo che esiste: diversi linguaggi di scripting. Ad esempio, il buon vecchio Perl era AFAIK originariamente progettato proprio per questo, e sono sicuro che troverai un modulo Perl equivalente per quasi tutti i principali strumenti da riga di comando di Linux su www.cpan.org . L'ecosistema Python ha proprietà simili, ma un linguaggio di base molto più pulito. Ad esempio, wget è anche un pacchetto Python standard, awk e grep possono essere sostituiti dalle capacità del modulo re e jq da pyjq .

Dato che hai menzionato node.js , poiché è molto più recente di Python o Perl, non mi aspetto che il sistema dei moduli sia al momento completo come quelli per le ultime lingue, ma non sono un esperto in questo, e se si adatta alle tue esigenze, è sicuramente un'alternativa ragionevole.

    
risposta data 12.04.2018 - 09:34
fonte

Leggi altre domande sui tag