JavaRush /Java Blog /Random-IT /Pausa caffè #131. Il ruolo di Java nello sviluppo di appl...

Pausa caffè #131. Il ruolo di Java nello sviluppo di applicazioni web e mobili. Programmazione funzionale: pro e contro

Pubblicato nel gruppo Random-IT

Il ruolo di Java nello sviluppo di applicazioni web e mobili

Fonte: DZone Java è uno dei linguaggi di programmazione più utilizzati. Viene utilizzato attivamente nello sviluppo di applicazioni aziendali, web e mobili. Java ha applicazioni nei principali settori tecnologici, dalla scienza dei dati all'AR/VR. Sebbene lo sviluppo aziendale in Java sia il caso d'uso più popolare per questo linguaggio, anche le applicazioni Web e mobili sono considerate una delle aree in cui viene utilizzato Java. Pausa caffè #131.  Il ruolo di Java nello sviluppo di applicazioni web e mobili.  Programmazione funzionale - pro e contro - 1Diamo un'occhiata al motivo per cui lo sviluppo Java è diventato così popolare sul Web e sui dispositivi mobili negli ultimi vent'anni. Uno dei motivi principali per utilizzare Java per il web e i dispositivi mobili è che si tratta di un linguaggio di programmazione ad alte prestazioni. Garantisce che le tue applicazioni possano essere eseguite rapidamente e senza errori di elaborazione. Ci sono anche altri motivi:

1. Fonte aperta

Essendo un linguaggio di programmazione open source, Java presenta numerosi vantaggi. Innanzitutto, riduce il costo del processo di sviluppo dell'applicazione. In secondo luogo, gli sviluppatori cambiano facilmente la lingua e la aggiornano frequentemente poiché è open source. Inoltre, Java ha una sintassi di facile lettura che semplifica lo sviluppo di applicazioni per il Web e i dispositivi mobili. Infine, gli sviluppatori possono utilizzare la codebase del linguaggio esistente e migliorarla.

2. Multipiattaforma

Un altro vantaggio della programmazione in Java è che si tratta di un linguaggio multipiattaforma. Gli sviluppatori possono scrivere codice su Windows ed eseguirlo su macOS e Linux. Qui si applica il principio “scrivi una volta, corri ovunque”. Ciò semplifica il lavoro degli sviluppatori su sistemi diversi e semplifica il processo di test su macchine diverse. Ad esempio, gli sviluppatori possono verificare se un programma funzionerà correttamente su schermi di dimensioni e sistemi operativi diversi.

3. Ottimizzato per i dispositivi mobili

Java è una tecnologia popolare per le applicazioni mobili. Gli sviluppatori di app Android utilizzano principalmente il linguaggio Java perché è facile da implementare, presenta funzionalità di sicurezza e funzionalità multipiattaforma. Android richiede un linguaggio potente per scalare un'applicazione, ma Java offre incredibili capacità di scalabilità. Semplifica inoltre il processo di test delle applicazioni Android. Tutto ciò suggerisce che si tratta di un linguaggio di programmazione affidabile e dinamico per la creazione di applicazioni mobili.

4. Strumenti e librerie

Uno dei vantaggi più significativi di Java è la sua compatibilità con vari strumenti. Framework come Spring, Hibernate, Struts, Spark e altri semplificano notevolmente il processo di sviluppo. Tutti questi strumenti offrono varie funzionalità per la creazione di applicazioni interattive e dinamiche. Librerie come Apache Commons, Java Standard Libraries, Maven, Jackson, ecc. consentono agli sviluppatori di aggiungere funzionalità senza scrivere codice da zero.

5. Comunità attiva

Ci sono più di 7,6 milioni di sviluppatori Java nel mondo. Aggiornano costantemente il linguaggio di programmazione e vi aggiungono nuove funzionalità. Poiché Java viene aggiornato ogni 6 mesi, gli sviluppatori hanno l'opportunità di apprendere rapidamente e creare prodotti migliori. Puoi anche utilizzare la comunità Java per trovare risposte a varie domande.

L'ascesa di Java nello sviluppo di applicazioni Web

Dalla sua creazione nel 1995 da parte di Sun Microsystems, il linguaggio Java è diventato una delle priorità nel settore della programmazione. Oggi aziende di tutto il mondo utilizzano questo linguaggio di programmazione per creare applicazioni web. Google, Netflix, Spotify e Pinterest sono solo alcune delle aziende che utilizzano Java nel proprio stack tecnologico. Gli esperti stimano che oltre il 60% delle aziende che lavorano nel settore IT utilizzano Java in una forma o nell'altra. Inoltre, rimane un linguaggio di programmazione popolare grazie alla sua adozione in altre aree dello sviluppo web, ovvero cloud computing, social media, sviluppo aziendale, AR, VR e altro ancora. È un linguaggio di programmazione eccellente e potente da utilizzare nelle aziende che ora necessitano di un'architettura basata su cloud. Se combinato con JavaScript, Java consente di creare applicazioni Web ad alte prestazioni che possono essere eseguite su qualsiasi piattaforma.

L'ascesa di Java nei casi d'uso moderni

Oltre allo sviluppo web e allo sviluppo mobile, Java ha lasciato il segno nel moderno mondo tecnologico. Oggi Java è un linguaggio di programmazione estremamente utile per applicazioni scientifiche. Offre un ambiente sicuro, veloce e portatile per il calcolo scientifico. MATLAB è una delle librerie più popolari per applicazioni scientifiche basate su Java.
  • Java è utile anche nello sviluppo front-end e back-end di applicazioni scientifiche. È possibile utilizzare Struts e Java Server Pages per lo sviluppo front-end e Java Core per lo sviluppo back-end di applicazioni scientifiche.

  • Java è utile anche per l'analisi dei dati. Consente agli sviluppatori di creare soluzioni di analisi dei dati utilizzando varie librerie e strumenti. Oggi Java ha trovato applicazione nel segmento Internet of Things. Si tratta di una tecnologia chiave nei sistemi integrati come smart card e sensori. Pertanto, le aziende utilizzano questo linguaggio di programmazione nel settore della domotica. Inoltre, viene utilizzato attivamente nello sviluppo di tecnologie per dispositivi di streaming e Smart TV.

  • La piattaforma Big Data Hadoop è scritta in Java. Poiché è un linguaggio open source e orientato agli oggetti, è la pietra angolare per le applicazioni Big Data. Linguaggi di programmazione come Scala possono essere facilmente eseguiti sulla Java Virtual Machine e semplificano l'analisi dei big data.

  • Il gaming è un settore emergente e in rapida crescita in cui Java è ampiamente utilizzato per varie applicazioni di gioco. Ad esempio, offre supporto per jMonkeyEngine, il più grande motore di sviluppo di giochi 3D open source. Inoltre, Dalvik Virtual Machine (DVM) è supportato principalmente da Java e viene utilizzato per creare giochi interattivi per Android.

Programmazione funzionale: pro e contro

Fonte: Dev.to Nonostante il mio tradizionale scetticismo verso le tecnologie non familiari, riconosco i vantaggi della programmazione funzionale. Di seguito è riportato un elenco approssimativo dei vantaggi che descrivono questo paradigma di programmazione. Pausa caffè #131.  Il ruolo di Java nello sviluppo di applicazioni web e mobili.  Programmazione funzionale - pro e contro - 2

Concorrenza sicura

L'approccio funzionale incoraggia la concorrenza sicura, ovvero la capacità di eseguire lavori in thread separati senza causare conflitti di thread o collisioni di modifiche. Il motivo è che, a differenza dell'approccio basato sugli oggetti, non si condivide un oggetto il cui stato può essere modificato durante l'elaborazione. Ci sono entrate e uscite e l'entrata non cambia per colpa tua. In Java, anche se utilizzi oggetti “thread-safe”, non puoi garantire che avranno gli stessi valori quando verrà chiamato il tuo metodo. Nell'esempio seguente possiamo vedere che un ciclo che elabora gli elementi uno alla volta può essere facilmente elaborato in parallelo utilizzando una funzione lambda all'interno di un thread.
for( String item : items ) {
   process(item);
}
E ora diventa:
items.parallelStream().forEach( item -> process(item) );

I/O veloce

La programmazione funzionale supporta un approccio diverso rispetto al multithreading. Ciò significa che non abbiamo più thread separati in attesa di risposte I/O come le chiamate al database. Cioè, massimizziamo l'utilizzo della CPU e della larghezza di banda. Per le applicazioni ad alte prestazioni questo è un chiaro vantaggio. Ciò viene implementato con l'idea che una chiamata di funzione può restituire un Future, che non è il risultato effettivo della chiamata, ma piuttosto una promessa di restituire il risultato in un momento futuro. Ad un certo punto nel futuro, si ottiene un valore restituito che esegue la funzione. Ciò significa che i thread del processore non attendono il completamento delle chiamate al database o REST e possono fare qualcos'altro.

Brevità di espressione

Gli sviluppatori di software vogliono essere in grado di esprimere idee complesse con garbo. La programmazione funzionale ti consente di farlo in modo conciso. Ad esempio, costrutti comuni come i cicli for possono essere sostituiti da thread, che astraggono le operazioni for comuni per le quali vengono utilizzati i cicli. Non c'è dubbio che l'aggiunta di funzioni e thread Lambda a Java abbia ampliato la capacità di esprimere idee che prima erano impossibili.

Perché non diventare funzionale?

Giusto per ribadire quanto sopra: ci sono molti vantaggi nella codifica funzionale, quindi questo articolo non cerca di generalizzare tutto in un caso e dire che dovresti assolutamente fare programmazione funzionale o viceversa. Questa decisione deve essere presa con una chiara comprensione delle ragioni della transizione e dei potenziali problemi.

È sempre difficile capirlo intuitivamente

Quando scrivi il codice, stai cercando di comunicare con il computer? Se per te la comunicazione con un computer è così importante, perché non scrivere in codice macchina? Naturalmente, questo è molto difficile, quindi sono stati inventati i linguaggi informatici per renderlo più semplice. Consentono inoltre ai programmatori di creare espressioni che altri programmatori possono comprendere. Poiché il software diventa sempre più grande e complesso, abbiamo bisogno di strategie per gestire la complessità. Raggiungiamo questo obiettivo attraverso le astrazioni e l’occultamento delle informazioni. La classe che usi in Java per inviare e-mail è piuttosto complessa, ma l'interfaccia di questa classe è semplice. Nasconde l'implementazione dettagliata, rivelandoci solo il lato esterno del controllo. Le caratteristiche del linguaggio come le parentesi graffe e le parentesi quadre ci dicono la struttura come le istruzioni condizionali e i cicli. Solo ora spostiamo i cicli, o meglio la ricorsione, e le condizioni nelle funzioni:
for( String item : items ) {
    System.out.println(item);
}
Si scopre:
items.foreach( item -> System.out.println(item) );
L'approccio streaming e lambda sono decisamente più brevi. Puoi esprimere la stessa funzionalità con meno codice. Il problema è che ora stiamo nascondendo il comportamento reale all’interno dei metodi che dobbiamo conoscere. I cicli in Java utilizzano parole chiave. D'altra parte, le funzioni lambda possono implementare varie forme di ricorsione e qui solo il nome indica cosa fa. Per esempio:
boo.fooble( item -> System.out.println(item) );
Non è più possibile leggere semplicemente il codice per comprenderne la struttura. Ciò rende difficile monitorare il flusso di esecuzione. Un'altra caratteristica è il concatenamento di funzioni, in cui il risultato di una funzione è l'input della successiva senza assegnare una variabile intermedia.
boolean result = boo
    .fooble( /*some code*/ )
    .bobble( /*some code*/)
    .goober( /*some code*/);
Questo potrebbe avere senso per l'autore di questo codice perché sembra che abbia scritto ogni funzione e sappia cosa fa. Tuttavia, per chi è nuovo al codice, questo non dice molto sui parametri, sui processi o sui valori restituiti di ciascuna funzione. Ma se scrivi la stessa cosa in qualcosa che assegna i tipi, otterrai:
Car car = boo.fooble( /*some parameters*/);
Tyre tyre = car.bobble( /*some parameters*/);
int pressure = tyre.goober( /*some parameters*/);
Questa potrebbe non essere un'analogia perfetta, poiché parametri e funzioni anonime non sono la stessa cosa, ma il punto qui è che una lunga frase con risultati e parametri sconosciuti è difficile da leggere senza una comprensione più profonda di ciò che fanno le funzioni descritte di seguito. E quindi è possibile che la programmazione funzionale sia altamente espressiva in segmenti di codice sorprendentemente brevi, ma incomprensibile per le persone nuove al software. Lo scopo delle classi e delle interfacce è nascondere i dati, creare pezzi di codice riutilizzabili che non richiedono allo sviluppatore di comprendere o forse anche di guardare l'implementazione. Esistono in modo che gli sviluppatori possano lavorare su sistemi grandi e complessi senza grattacapi. Questo è un modo conveniente per organizzare il codice associato a entità specifiche. Tuttavia, ho poca comprensione di come la programmazione funzionale aiuti a strutturare progetti grandi e complessi. Probabilmente ci sono ragioni soggettive per questo.

Per impressionare gli altri con le tue abilità

Alcuni sviluppatori di software sono così insicuri nelle proprie capacità che cercano di impressionare scrivendo codice inutilmente complesso. In qualità di sviluppatore senior, non ammiro particolarmente gli altri sviluppatori di software che provano a scrivere codice intelligente. Naturalmente questo non si applica solo alla programmazione funzionale; la stessa cosa può accadere in qualsiasi stile di codifica. Ma ho notato una certa vanità intellettuale tra i sostenitori della programmazione funzionale. Il punto è che gli sviluppatori di software non lavorano nel vuoto. Questo codice "intelligente" dovrà essere mantenuto e, se è difficile da comprendere, sarà difficile da leggere e modificare, nonché difficile da eseguire il debug. Quando gestiamo i team, abbiamo persone a tutti i livelli, quindi la cosa più intelligente da fare è scrivere il codice in modo che tutti i soggetti coinvolti possano capirlo. Questo è il motivo per cui abbiamo nomi di variabile lunghi e chiari, quindi limitiamo la lunghezza dei metodi. Il codice “intelligente” richiederà più tempo, quindi non è molto intelligente scriverlo. Credo che la programmazione funzionale utilizzi gli stessi argomenti riguardo alle espressioni concise e potenti che Perl fece molti anni fa. I sostenitori di Perl erano orgogliosi della sua espressività, del modo in cui potevano scrivere programmi molto potenti in poche righe di codice. Era vero. Il problema era che erano difficili da capire. Forse la programmazione funzionale è caduta nella stessa trappola.

Perché è una nuova moda

C’è sempre una nuova tecnologia o paradigma “caldo”. Nuove tecnologie, linguaggi e approcci emergono costantemente. Dobbiamo costantemente metterci alla prova e imparare cose nuove. Essere uno sviluppatore di software significa far avanzare la tecnologia. Ma come sviluppatori di software, dobbiamo valutare da soli quali tecnologie abbiamo bisogno per creare un prodotto. Imparare una nuova tecnologia popolare solo perché è popolare non è un uso saggio del tempo. Ciò non significa che non dovresti imparare la programmazione funzionale, ma piuttosto che dovresti valutare i pro e i contro di questo paradigma per l'applicazione che stai scrivendo.

Perché questa è l'unica vera via

Molte volte in passato ho visto sviluppatori promuovere questo o quell'approccio come l'unico corretto. Ma come mi ha detto un amico, lavori diversi richiedono strumenti diversi. Ad esempio, personalmente utilizzo Python e PyTorch per l'intelligenza artificiale, sebbene esistano molti altri strumenti e tecnologie, ciascuno con i propri vantaggi e svantaggi. Ci sono buone ragioni per considerare la programmazione funzionale come un'opzione per i servizi che necessitano di una significativa scalabilità. Ciò è dovuto alla sicurezza della concorrenza offerta da questo approccio. Ma dovresti anche essere consapevole dei costi e dei potenziali rischi. Alcuni anni fa ho avuto un'esperienza simile con l'iniezione di dipendenza e Spring è stato considerato il migliore per il lavoro. Quando ho chiesto ai sostenitori della Primavera quali benefici porta, non mi hanno dato risposte chiare. Sto vedendo qualcosa di simile ora con alcuni puristi della programmazione funzionale che sembrano impegnati in una sorta di campagna religiosa piuttosto che in una valutazione imparziale della tecnologia. A proposito, l'iniezione di dipendenza è stata un'ottima idea e ora posso identificarne chiaramente i vantaggi. Allo stesso modo, penso che le mie preoccupazioni sulla programmazione funzionale riguardino il modo in cui viene utilizzata, piuttosto che se sia un approccio utile e valido.

Conclusione

Lo scopo di questo articolo non è fornire una risposta chiara alla domanda se sia opportuno fare programmazione funzionale. Il punto è come valutare qualsiasi nuova tecnologia o approccio. La cosa principale: non lasciare che il tuo ego ti blocchi una valutazione obiettiva. Lo sviluppo del software non è una prova delle tue capacità intellettuali o delle tue qualità personali. Si tratta di creare valore nel mondo reale. Se la programmazione funzionale ti aiuta, usala.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION