ASP.NET MVC ed ASP.NET Core sono diventate tecnologie sempre più potenti e versatili rimanendo un pilastro dello sviluppo di applicazioni enterprise.
Ma ti sarai chiesto, perché investire tempo e soldi nello sviluppo di qualcosa che ormai dovrebbe essere morto e sorpassato dai framework client come Angular o React. Giusto?
Il fatto che oggi Microsoft stia investendo nello sviluppo di ASP.NET Core molto di più che degli anni passati, è sicuramente un segnale da tenere in grande considerazione. A meno che non si siano bevuti il cervello, non credi?
Vuoi sapere quali errori ci hanno permesso di sviluppare applicazioni con ASP.NET con successo software in .NET da 20 anni a questa parte?
Cosa puoi sviluppare con ASP.NET Core?
ASP.NET Core oggi è ancora più performante e versatile, si possono sviluppare i 3 pilastri delle applicazioni web:
- Backend di API REST che permetta di gestire, validare, proteggere e salvare dati ed ASP.NET Core svolge davvero egregiamente questo lavoro.
- Applicazioni SPA, in cui l’utente si logga ed entra nel nostro favoloso mondo lato client, con framewok React, Angular, Vue o qualsiasi altro se ne inventi un nuovo sviluppatore nerd del Nebraska, hanno bisogno di un sistema server che eroghi file JavaScript, CSS e HTML, gestisca l’autenticazione, la compressione, la cache etc…
- Frontend, siti pubblici con ASP.NET Core: c’è ancora una grossissima fetta di applicazioni web, che sono quelle che vengono erroneamente chiamate “siti vetrina”.
Termine che mi fa inorridire, perché qualsiasi sia lo scopo di un sito, non può essere certo quello di investirci tempo e risorse e poi essere lasciato lì e non avere nessuno scopo se non di essere “visto”.
I passi da gigante di ASP.NET Core
ASP.NET Core ha fatto passi da gigante sotto tutti i punti di vista, evolvendo ASP.NET MVC e le Web API in un unico ecosistema.
Ma per sfruttare correttamente una nuova tecnologia devi fare molta attenzione alle scelte che compi.
Ti voglio fare un esempio. Nel 2002 ho iniziato lo sviluppo di un nostro CMS con ASP.NET WebForms e un sistema client-side in JavaScript, ai tempi in cui non esistevano ancora WordPress e altre piattaforme.
Questo sistema permetteva all’utente di poter fare drag & drop di elementi visuali per comporre il sito aziendale ed inserire contenuti autonomamente, per creare l’interfaccia grafica delle diverse sezioni, inserire i testi e tutto ciò che serviva per creare una grafica accattivante.
Il cliente aveva possibilità di scegliere tra un’ampia gamma di tipologie di elementi, poteva inserire form di registrazione, sezione news, immagini, elenchi prodotto, schede prodotto, etc… insomma, tutto il necessario per trasformare il suo sito in una macchina da soldi.
Il sistema che avevamo sviluppato si chiamava Hyperion CMS, era diventato un vero gioiellino, che abbiamo venduto negli anni a centinaia di aziende.
Fin dall’inizio io e gli sviluppatori del mio team l’abbiamo evoluto con rigore, nel senso che abbiamo continuato ad aggiornarlo, aggiungere funzionalità per gli utenti, renderlo più veloce, migliorarne l’architettura e sostituire le vecchie tecnologie con quelle più nuove, tutto finché stavamo vendendo ovviamente.
Aggiornare le tecnologie è un boost eccezionale, se sai quali scegliere ed evitare gli errori di adozione che spesso distruggono dei progetti. E credimi, non è così infrequente, anzi, l’80% dei progetti fallisce entro i primi 5 anni proprio perché vengono compiuti grossi errori che ne rallentano o inchiodano completamente lo sviluppo e nel frattempo arriva un concorrente più agguerrito e fresco che sviluppa il tuo stesso software, ma fatto meglio e in tempi più rapidi.
Succede perché le nuove aziende e i nuovi team, studiano i software presenti sul mercato, si registrano per le trial o chiedono a qualche loro cliente di poter accedere per capire come funziona. E poi evitano tutti gli errori che hai fatto tu.
Così è molto più semplice, scrivere un sistema da zero è sempre più facile, all’inizio, rispetto a manutenere uno esistente. Per questo la più straordinaria abilità che devi apprendere è l’arte di adottare nuove tecnologie e alzare l’asticella di tutte le caratteristiche del tuo software, senza mai perdere di vista gli utenti.
Sfruttare bene la tecnologia fa differenza tra aumentare la produttività del team e la quantità e qualità di funzionalità che si possono pubblicare per gli utenti, nonché per migliorare la user experience, e invece infilarsi in una sabbia mobile da cui non esci più, rallentare lo sviluppo e a volte veder esplodere il sistema tra le tue mani!
La tecnologia sbagliata può distruggere il tuo progetto
Ti faccio un esempio per farti capire meglio cosa intendo.
Il 5 settembre 2007 è arrivato Silverlight, te lo ricordi?
In quell’occasione, come in centinaia di altri casi, ho dovuto fare una scelta complessa e delicata.
Ho dovuto decidere se avrei preso quella nave, in base a tutte le valutazioni che avevo fatto, oppure no.
Avevo valutato le opportunità di quella nuova tecnologia:
- come avrebbe influito sulla nostra produttività
- il vantaggio di usare un solo linguaggio
- la possibilità di implementare il pattern MVVM
- la possibilità di usare un linguaggio per sviluppare la UI, XAML, più robusto di HTML, CSS e JavaScript
Alla fine, decisi di non usare Silverlight, essenzialmente in base a due fattori, che valuto sempre quando scelgo una tecnologia:
- Quanti sviluppatori/designer si trovano sul mercato che la conoscono
- Quale sarà la sua possibile evoluzione e durata in anni
Ho creato una checklist di più di 20 fattori che uso sempre per fare una scelta tecnologia, che ho affinato in più di 20 anni di sviluppo software insieme ai miei soci e al mio team.
L'affiniamo costantemente, è fatta di prove, errori, test sul campo, progetti sperimentali e tanta, tanta esperienza.
Anche tu ti trovi spesso a dover fare queste valutazioni, e un errore in questo caso può costare molto caro.
Alcuni fa, nel 2010 più precisamente, è capitato uno scenario che poi si è ripetuto in molte aziende a cui abbiamo fatto consulenza, quando ormai il danno era fatto, perché avevano fatto scelte sbagliate.
Ad esempio, ho fatto consulenza ad un’azienda che produce un software molto conosciuto in Italia, 2 anni prima che li incontrassi avevano fatto l’errore di scegliere Silverlight per lo sviluppo della versione web.
Hanno pagato questo errore dovendo impiegare 2 sviluppatori a tempo pieno su un progetto già morto, perché avevano già molti clienti attivi sulla piattaforma in Silverlight, ma contemporaneamente avevano la necessità di iniziare lo sviluppo anche su ASP.NET MVC, per avere anche una versione che sarebbe durata negli anni.
Microsoft infatti nel frattempo aveva annunciato la morte di Silverlight.
Questa azienda è piuttosto grande e strutturata, ma non tutti si possono permettere un errore simile, specie in team medio piccoli come quelli italiani. Da noi in Italia un team di 10 persone è già piuttosto grande, mentre all’estero esistono anche team di 500 persone.
Se non hai un team di 500 persone, devi stare molto attento alle scelte che fai, perché se ti dovessero portare fuori strada il tuo software potrebbe essere spacciato!
In più c'è un grosso pericolo, molto insidioso, molto più della sola scelta, che può mandare all'aria il tuo progetto: implementare la soluzione con "tuoi sistemi" e infarcirlo di anti-pattern.
Sai quante volte ho sentito "abbiamo sviluppato il nostro sistema di accesso ai dati"? E la mia reazione è sempre stata questa 🤦♂️. Perché ho visto delle schifezze, codice così intrecciato che, hai presente gli spaghetti alla carbonara, ecco piattoni belli pieni.
Cose che solo una mente contorta può partorire, e sai perché vengono fuori abomini del genere? Perché vengono da sviluppatori che non si formano e si inventano loro soluzioni.
Sì, gli spaghetti alla carbonara sono deliziosi, ma non farti distrarre, scrivere spaghetti code, non va bene!
Perché ASP.NET Core è la scelta giusta
ASP.NET Core è stato alleggerito, componentizzato con Nuget in ogni sua funzionalità, dal rendering dell’HTML alla sicurezza.
Ne hanno ottimizzato le performance, tanto che oggi è uno degli ambienti più veloci in assoluto.
È multi piattaforma e quindi può girare su server Windows come su Linux, e volendo anche su Mac. E questo è un vantaggio enorme, non che possa girare su Mac, almeno non ASP.NET Core, ma su Linux, server più leggeri e il cui hosting costa meno anche su Azure.
Hanno integrato la gestione della UI con Razor e delle API con i controller, rendendo tutto uniforme e facile da testare, grazie ad un grande lavoro di separazione delle dipendenze, ora tutto è un’interfaccia (C#).
La potenza di ASP.NET Core è anche l’integrazione con 3 sistemi fondamentali per sviluppare velocemente e senza stress:
- Visual Studio come IDE
- DevOps per gestire il codice sotto TFS o GIT e il progetto
- Azure per deployare le applicazioni e sfruttare il cloud con semplicità
Un piccolo appunto al volo: rilasciare applicazioni ASP.NET è diventato veramente semplicissimo, puoi usare la pubblicazione manuale da Visual Studio o la puoi lanciare in automatico da DevOps quando fai checkin su TFS o commit su GIT.
Vediamo in dettaglio come puoi sfruttare al massimo ognuno dei tre sistemi di cui ho parlato poco fa.
1. Backend di API REST
Come ti dicevo poco fa, ASP.NET Core ha integrato la parte di MVC con le Web API, per questo non c’è più il suffisso MVC.
Mai più regressioni e grattacapo infiniti!
Puoi eseguire l’accesso ai dati con tecnologie velocissime, come Entity Framework Core, Cosmos DB e la lettura con Dapper, un framework molto leggero ma performante.
Puoi implementare CQRS per separare la parte di lettura da quella di scrittura, e rendere il tuo strato di API super performante e facile di manutenere grazie all’uso sapiente della dependency injection e degli unit test.
Con ASP.NET Core validare i dati , cioè i comandi, passati come parametri nei metodi in PUT, POST e DELETE, diventa un gioco da ragazzi. Il pacchetto Nuget FluentValidation permette di utilizzare le convention per applicare il validatore, una classe C# con definizione delle regole tramite una fluent interface in automatico.
E restituire un errore 400 (BadRequest) con gli errori di validazione in JSON come risposta, in modo che il client abbia un feedback su cosa non funziona.
L’autenticazione e l’autorizzazione si possono implementare in tantissimi modi, con OAuth, OpenId, Identity Server e garantire l’accesso sicuro alle tue API, con la gestione di permessi e ruoli.
Con gli unit test, gli integration test e un framework come SharpTestsEx
Con ASP.NET Core e Azure puoi creare un’infrastruttura senza limiti, ci sono diversi servizi che puoi sfruttare per fare girare le tue applicazioni, come gli App Service e le Azure Function.
Le Function consentono di creare un’architettura ancora più moderna e scalabile, senza server e con la possibilità di fare deploy veramente capillari, volendo addirittura uno per ogni endpoint.
Quindi ricapitolando, con ASP.NET Core implementi tutti gli aspetti cruciali con framework e pattern solidi e testati, che ti permettono di progettare e comporre la tua architettura senza mai dover reinventare la ruota e trovarti ad un certo punto nei pasticci.
In particolare:
- L’accesso ai dati, lettura e scrittura tramite ORM e framework
- Validazione dei dati automatizzata
- Autenticazione e autorizzazione
- Unit testing
- Pubblicazione e continuous deployment
2. Applicazioni SPA
Non si può fare tutto con un framework lato server, giusto? Le applicazioni web ormai sono esplose, è possibile creare applicazioni sempre più complesse, con quasi tutte le funzioni delle applicazioni desktop.
I vari framework come Angular, React e Vue grazie alla separazione di layout e codice applicativo ci permettono di scrivere i nuovi Gmail e Facebook, sei d’accordo?
Hanno però bisogno di un web server che eroghi il codice HTML, i CSS, i file JavaScript, le immagini e in generale tutte le risorse statiche.
3. Siti pubblici con ASP.NET Core
Possono servire alla tua azienda o ai tuoi clienti, a comunicare con i visitatori che non sono ancora clienti ma ai quali vuoi fornire contenuti o servizi gratuiti per attrarli e introdurli nei cosiddetti funnel.
Cioè portarli in squeeze page in cui inseriscono i loro dati, in particolare nome, cognome e email, per potergli inviare email, offerte, contenuti informativi e tracciarli con i sistemi di remarketing e retargeting, come Google Ads e Facebook.
Sai qual è il mostro in grado di divorare i tuoi sforzi di sviluppare un sistema che generi lead, ossia il potenziale cliente che ti lascia i suoi dati?
Beh, più che di un solo mostro, possiamo parlare di un Hidra, hai presente il mostro leggendario a più teste in cui devi sconfiggere tutti i demoni di cui è fatta, per poter uscire vittorioso dalla battaglia? In questo caso le teste da tagliare sono almeno 3.
La lentezza: è il primo vero spauracchio di ogni sviluppatore, perché anche se il sistema sembra veloce durante lo sviluppo, e sul proprio PC (sindrome “Works on my machine”), con un utente, tutto fila liscio come l’olio, quando vai in produzione e pubblichi il sito, magari su Azure per sfruttare la potenza del cloud, inizia ad essere usato e fa acqua da tutte le parti, ti è mai capitato?
Oppure, il sito va veloce anche in produzione, ma poi inizia a rallentare inesorabilmente, e dalla Ferrari che era, si trasforma in una Panda fatta di lamiera, con in più una grossa fregatura, lo fa come i volti nei programmi di morphing, con un degradamento così lento da essere impercettibile, finché un giorno ti accorgi di essere passato da 250ms di caricamento di una pagina, risultato che ti rendeva fiero come il cavaliere dell’ordine dei templari, a 10 secondi, risultato degno della velocità con cui parlava Morla, la tartaruga millenaria ne “La storia infinita”.
2) Errori non gestiti: hai presente quelle simpatiche pagine per gestire gli errori 404 o peggio i 500, dove ci sono le scimmiette che battono i piatti e dicono “Ops, qualcosa è andato storto” o Homer che esclama D’Oh?
Ecco, gli utenti le odiano! Non le trovano simpatiche e nemmeno intelligenti. Denotano solo scarsa professionalità e poca organizzazione nel correggere gli errori, che ovviamente possono capitare ed è impossibile avere software 100% bug free, ma devi a gestirli correttamente in due modi:
- Loggare tutte le eccezioni, .NET e JavaScript, su un sistema di tracking in cloud che ti permetta di essere sempre un passo avanti all’utente e conoscere tutti i problemi del tuo software.
- Avere un sistema di intercettazione degli errori che ti consenta di ridirigere l’utente verso una risorsa utile nel caso di un 404 e di una pagina di assistenza in caso di altro tipo di errore.
3) Layout non responsive: questo problema oggi è imperdonabile, gli utenti lo sai, visitano i siti (anche) da mobile, fra poco i telefoni saranno più potenti dei PC e già ora hanno schermi migliori. Ignorare il traffico da cellulare è un errore grossolano, non puoi non considerarlo adeguatamente.
Anche qui, se utilizzi correttamente Boostrap e progettazione ad-hoc per il mobile, risolvi egregiamente all’inizio, ma le grane possono sorgere dopo, perché è facile creare siti responsive all’inizio, ma poi con l’aumento delle pagine e delle diverse configurazioni di layout, un adattamento dei CSS per alcuni scenari può romperlo in altri punti.
La soluzione in questo caso è fare test manuali, test di UI, utilizzare tool come Google Search Console che fanno l’analisi della navigabilità da telefono automatica e analisi comportamentale.
Contattaci per aiutarti a sconfiggere il mostro a più teste ed evitare errori fatali, grazie al nostro corso su ASP.NET ti affiancheremo per vincere questa difficile ma avvincente battaglia.