Programmare non significa schiacciare la tastiera e digitare il più velocemente possibile. Non si tratta di memorizzare religiosamente le scorciatoie da tastiera e alla fine rendere il mouse obsoleto. Non si tratta di imparare ogni singolo linguaggio di programmazione là fuori, se questo è possibile in primo luogo. Un buon programmatore non è definito dalla marca, dal prezzo, dalle prestazioni e dal sistema operativo del suo computer, né dalla sua preferenza per gli editor di codice e gli IDE: VS Code, Atom, IntelliJ IDEA, Vim, Notepad++ o altro. Contrariamente alla credenza popolare grazie a molti film di Hollywood, la programmazione non è assolutamente equivalente all’hacking.
Inoltre, va oltre la memorizzazione della sintassi e delle funzionalità integrate di un linguaggio di programmazione. Logica, condizioni, if
dichiarazioni e algoritmi – in particolare quelli di ordinamento – non dipingono un quadro completo di ciò che è veramente la programmazione. Anche la matematica, la ricorsione, l’informatica e i design pattern non le rendono giustizia. Sebbene siano una parte enorme di ciò che è la programmazione, sono solo un pezzo del puzzle.
Progettazione e pianificazione
Prima di scrivere una singola riga di codice, il design e l’architettura di un progetto sono accuratamente pianificati per assicurare o almeno aumentare la probabilità di avere un ciclo di sviluppo senza problemi. È qui che entra in gioco la progettazione del software. Catene di strumenti, pipeline, livelli di astrazione per le API pubbliche e interne, modularizzazione, relazioni tra oggetti e strutturazione del database sono tutti pianificati durante questa fase di sviluppo.
Siamo debugger viventi e respiranti
L’arte della programmazione ci richiede di pensare fuori dagli schemi e risolvere i problemi con le soluzioni più pragmatiche, efficaci e fattibili. Questo è probabilmente il motivo per cui siamo molto probabilmente il “tecnico informatico” o il “supporto clienti” della famiglia. È praticamente il nostro lavoro riparare ciò che è rotto. È come se “programmare” fosse un modo glorificato di dire “problem solving”.
In altre parole, siamo debugger viventi e respiranti dentro e fuori i nostri computer, e per questo, è importante che sappiamo come leggere e scrivere la documentazione. Una documentazione appropriata – che si presenta sotto forma di vere e proprie pagine di documentazione dettagliata, o semplice come spruzzare commenti utili al codice base – serve come una delle più importanti linee di vita di un programmatore. Senza di essa, siamo persi nel buio, incapaci di adempiere ai nostri doveri di debugger. Poco o nessun progresso può essere fatto perché la maggior parte del nostro tempo sarebbe speso per sperimentare e indagare su come funziona un framework o una base di codice legacy. Nel complesso, risulterebbe in un’esperienza terribilmente terribile per gli sviluppatori.
Considerare tutti i possibili scenari
Il debug è già abbastanza difficile così com’è. Per peggiorare le cose, l’esecuzione del codice di solito non è lineare. I grandi progetti comportano molteplici “rami” di possibili percorsi di esecuzione dovuti alla logica del programma con la dichiarazione if
. Dobbiamo tenere conto di ogni singolo scenario ed errore possibile, specialmente se coinvolge l’input dell’utente. Il carico cognitivo richiesto per tenere traccia di ogni possibile percorso di esecuzione rende la programmazione ancora più difficile.
User Experience
Sfuggendo dal mondo dello sviluppo, ci mettiamo nei panni di un utente medio. Oltre a fornire funzionalità, aggiungere nuove caratteristiche, correggere i bug e documentare il nostro codice base, ci concentriamo anche su come un utente medio interagisce con la nostra app o software. Consideriamo molteplici fattori che portano ad una grande esperienza utente come (ma non solo) l’accessibilità, l’usabilità, la facilità d’uso e di scoperta, il design dell’UI, i temi di colore, le animazioni funzionali e le prestazioni.
Prestazioni e ottimizzazione
A proposito di ciò, le prestazioni sono un enorme aspetto della programmazione in sé. Noi, specialmente quelli con un background in informatica, ci sforziamo di usare e scrivere gli algoritmi più efficienti in termini di tempo e spazio. Siamo ossessionati dall’insondabile scala temporale dei microsecondi al fine di spremere il massimo dalla nostra memoria disponibile, dalle CPU e dalle GPU.
Nel contesto dello sviluppo web, l’ottimizzazione della rete è un concetto importante da afferrare. Facciamo i salti mortali per minificare e comprimere il nostro HTML, CSS e JavaScript solo per ridurre al minimo il carico utile di una risposta dal server. Anche le immagini e altre risorse varie sono compresse e caricate pigramente per ridurre al minimo la quantità di dati che l’utente deve scaricare prima che una pagina diventi significativa e utilizzabile.
Tuttavia, ci sono momenti in cui diventiamo troppo ossessionati dalle prestazioni. L’ottimizzazione prematura diventa un problema quando ci preoccupiamo inutilmente di ottimizzare alcune parti di una base di codice invece di concentrarci su ciò che deve essere fatto per il progresso effettivo e la produttività. In questo caso, dobbiamo avere la saggezza di giudicare quali parti del codice base hanno davvero bisogno di ottimizzazione.
Sicurezza
Al di là della UI e della logica del nostro software, come programmatori, siamo responsabili della sicurezza dei nostri utenti. Nella nostra epoca in cui i dati sono molto ambiti e fortemente monetizzati, è più importante che mai assicurarsi che le informazioni personali dei nostri utenti siano al sicuro. Prendiamo misure extra per proteggere i dati privati perché i nostri utenti si fidano del nostro software. Se non sosteniamo questa responsabilità, non siamo certamente dei veri programmatori, neanche per sogno.
Non si può mai essere troppo sicuri quando ci si avvicina alla sicurezza. Come regola generale, “mai fidarsi dell’input dell’utente”. Può anche essere considerata una “best practice” per fare di tutto per sanitizzare i dati e l’input dell’utente. Non solo mettiamo il nostro software e la nostra infrastruttura a grande rischio se non stiamo attenti, ma corriamo anche il rischio di compromettere i dati sensibili degli utenti, gli stessi dati che promettiamo di proteggere come programmatori.
La sicurezza non è esclusiva dei dati e degli input degli utenti, però. Virus, worm, cavalli di Troia, adware, key logger, ransomware e altre forme di malware continuano a diffondersi e ad affliggere milioni e milioni di computer e dispositivi in tutto il mondo. Anche dopo decenni di miglioramenti tecnologici in hardware e software, non esiste un sistema invulnerabile. La sicurezza è semplicemente un mestiere che viene continuamente affinato, ma non sarà mai perfezionato perché ci saranno sempre i pochi curiosi che indagano e cercano ogni modo possibile per “violare” un sistema.
Per questo motivo, indipendentemente dal caso d’uso e dalla base di utenti, progettiamo il nostro software con la sicurezza in mente come una delle priorità principali, se non la priorità principale. Lo facciamo per proteggere i nostri utenti dalle suddette minacce che possono causare inconvenienti come la perdita di dati, la corruzione dei file e i crash di sistema, per citarne alcuni.
Il lavoro di squadra fa funzionare il sogno
Anche se non è necessariamente legato alla programmazione, il lavoro di squadra gioca un ruolo estremamente importante nello sviluppo del software. Con tutta la complessità e le parti in movimento di qualsiasi grande progetto, è impossibile per una sola persona sviluppare un software di qualità al ritmo sostenuto di iterazioni regolari o sotto le rigide scadenze e i vincoli di tempo di un cliente o di qualsiasi entità di supervisione.
Ecco perché abbiamo vari team di persone che si specializzano in uno dei tanti aspetti della programmazione. Una sola persona non avrà mai tutte le competenze e le conoscenze necessarie per incollare efficacemente e in modo coesivo ogni sfaccettatura. Un team può essere responsabile del design dell’interfaccia utente e dell’accessibilità, mentre un altro può lavorare sulla funzionalità del software stesso. Se tutte le competenze dei vari team specializzati vengono combinate, il software risultante avrà la migliore funzionalità, esperienza utente, prestazioni e sicurezza che possa avere entro i limiti finanziari e pratici.
Per la gestione del tempo e il rispetto delle scadenze, l’organizzazione del flusso di lavoro e l’automazione sono della massima importanza. Ci prendiamo il tempo per configurare correttamente i nostri strumenti di compilazione e le pipeline perché così facendo risparmieremo molto tempo in futuro. In generale, il ritorno sull’investimento aumenta con il passare del tempo.
Lavorare bene con gli altri
Per esporre l’idea del lavoro di squadra e della cooperazione, stabiliamo relazioni sane con i nostri colleghi perché alla fine, il successo di un progetto dipende molto dal successo della squadra che lo segue. Ci sforziamo di favorire un ambiente di lavoro solidale, dove i senior esperti guidano con attenzione i nuovi arrivati.
Siccome sviluppiamo software come una squadra, dobbiamo essere consapevoli degli altri che leggono il nostro codice. Per mantenere il ciclo di sviluppo sostenibile a lungo termine, la leggibilità e la manutenibilità sono considerate importanti quanto la logica e la funzionalità di un progetto. Scriviamo costantemente codice buono e leggibile, fornendo allo stesso tempo messaggi di commit informativi e documentazione, perché questi aiuteranno sicuramente noi e gli altri a capire meglio il nostro codice.
Parlando di altri che leggono il nostro codice, una revisione del codice è una grande opportunità per imparare di più sulle migliori pratiche di programmazione. È anche un altro modo di familiarizzare con una base di codice e il suo design e architettura sottostante. Anche se la critica costruttiva è spiacevole e difficile da gestire da parte di chi la riceve, è importante prenderla come un buon consiglio per migliorare come programmatori.
Programmare è difficile
La programmazione comprende molti aspetti oltre la funzionalità, come l’esperienza dell’utente, le prestazioni, la sicurezza e il lavoro di squadra. Non è sufficiente concentrarsi strettamente su un solo aspetto tralasciando gli altri. Per progetti di dimensioni e importanza notevoli, non è semplice come scrivere poche righe di codice. Richiede un sacco di attenta pianificazione, progettazione, considerazione e cooperazione di squadra per avere successo. Infatti, si passa più tempo a pensare che a scrivere quando si programma, specialmente durante le lunghe sessioni di debugging.
Alla fine, la programmazione è davvero una questione di apprendimento continuo e senza sosta. L’adattabilità e l’apprendimento costante sono le chiavi per sopravvivere in questo settore. Non possiamo aspettarci di rimanere rilevanti se non facciamo la nostra parte per continuare ad imparare. In un’industria così volatile di miglioramento tecnologico esponenziale, dobbiamo tenere il passo con il suo ritmo veloce per non finire nella polvere.
Voglio concludere questo articolo riconoscendo il duro lavoro di tutti gli sviluppatori di tutto il mondo. Per scrivere questo articolo, ho dovuto riflettere sul flusso di lavoro quotidiano di un team di sviluppatori. Ho dovuto esaminare i molti aspetti della programmazione e dello sviluppo del software che di solito passano inosservati. Da allora, ho avuto un maggiore apprezzamento per tutto il software installato nel mio computer. A tal fine, incoraggio tutti a ringraziare un programmatore oggi, indipendentemente dall’esperienza. Dove saremmo senza di loro?
Non date mai per scontato il loro duro lavoro.