Articolo originale: https://www.freecodecamp.org/news/how-to-learn-programming/

Il solo pensiero di imparare a programmare può spaventare. La parola codice è misteriosa per definizione e implica una forma di comunicazione tecnica destinata a essere compresa dai computer e non dalle persone.

Un modo in cui molte persone iniziano a imparare a programmare è prendendo un linguaggio di programmazione popolare, tuffandocisi di testa senza meta. Ciò può avvenire tramite corsi di programmazione online, un tutorial per un progetto o un libro acquistato a caso su un argomento specifico.

Di rado gli aspiranti sviluppatori iniziano con un piano d'azione – una vista panoramica sul mondo della programmazione che delinei un insieme di concetti, linguaggi e strumenti importanti che quasi il 100% degli sviluppatori utilizza ogni giorno.

In questo articolo, proporrò una tabella di marcia di questo tipo, costituita da 14 punti – discutendo in ognuno di essi di un concetto, linguaggio o strumento essenziale – di cui gli sviluppatori esperti fanno uso per scrivere codice, collaborare e creare progetti professionali.

Ho scelto meticolosamente questi 14 punti sulla base del mio percorso personale nell'apprendimento della programmazione, che abbraccia quasi 20 anni.

Ho impiegato molto tempo per sentirmi a mio agio come sviluppatore anche perché ho imparato dei concetti specifici senza avere un contesto più ampio del mondo della programmazione.

Ognuno dei punti in questo articolo tratta l'essenziale – qualcosa la cui esistenza ritengo sia cruciale da conoscere all'inizio del tuo viaggio nella programmazione.

Una nota finale prima di elencare i punti della tabella di marcia: naturalmente, leggere questo articolo non ti renderà un programmatore esperto. Non è pensato per questo. Lo scopo di questo articolo è renderti consapevole dell'esistenza di ognuno di questi argomenti e, auspicabilmente, darti un'idea basilare dei principi di ognuno di essi, in modo da proseguire sapientemente partendo da questa base.

La tabella di marcia per aspiranti sviluppatori in 14 passi

  1. Familiarizzare con l'architettura dei computer e i dati
  2. Imparare come funzionano i linguaggi di programmazione
  3. Capire come funziona Internet
  4. Fare pratica con la riga di comando
  5. Acquisire abilità da editor di testo con Vim
  6. Affrontare un po' di HTML
  7. Affrontare un po' di CSS
  8. Iniziare a programmare con JavaScript
  9. Continuare a programmare con Python
  10. Approfondire le conoscenze con Java
  11. Tenere traccia del codice usando Git
  12. Archiviare dati usando dei database e SQL
  13. Informarsi sui framework web e MVC
  14. Sperimentare con i gestori di pacchetti

Senza altri indugi, iniziamo!

1) Familiarizzare con l'architettura dei computer e i dati

Una delle cose meravigliose dei moderni linguaggi di programmazione è che ci consentono di creare applicazioni sofisticate senza doverci preoccupare dei dettagli che riguardano l'hardware dietro le quinte (per la maggior parte dei casi).

Ciò è detto astrazione – l'abilità di lavorare con strumenti di alto livello (in questo caso, i linguaggi di programmazione) che semplificano e riducono l'estensione richiesta per le nostre conoscenze e abilità.

Tuttavia, ciò non vuol dire che è inutile conoscere gli aspetti fondamentali dietro all'esecuzione del nostro codice. Conoscerne almeno qualche pezzettino ti aiuterà ad affrontare le conversazioni in ambito lavorativo sull'uso di CPU e memoria.

Dunque, ecco il minimo indispensabile sull'architettura fondamentale di un computer da cui partire.

Le parti più importanti del tuo computer si trovano su dei microchip (anche detti circuiti integrati).

Per funzionare, i microchip si basano su dei componenti elettrici chiamati transistor. I transistor sono dei piccoli interruttori elettrici che, in un determinato momento, possono essere spenti (0) o accesi (1). Un singolo microchip può contenere milioni o miliardi di piccoli transistor integrati.

La maggior parte dei computer moderni possiede un microchip chiamato CPU (Central Processing Unit). Puoi immaginarlo come il cervello del computer, che gestisce la maggior parte dei calcoli complessi e le attività logiche svolte dal computer.

Ogni CPU ha una cosa detta instruction set, che è un insieme di comandi in binario (successioni di zero e uno) che la CPU comprende. Fortunatamente, non dobbiamo preoccuparcene, in quanto sviluppatori di software! Questo è il potere dell'astrazione.

Se la CPU è il centro logico del cervello, è utile avere una memoria per conservare informazioni, sia temporaneamente che sul lungo termine.

I computer hanno una RAM (Random Access Memory) come "memoria di lavoro" (o memoria a breve termine) per conservare informazioni che vengono usate attivamente durante l'esecuzione dei programmi.

La RAM è composta da un insieme di indirizzi di memoria, che possono essere usati per memorizzare bit di dati. Nei linguaggi più vecchi come C, i programmatori hanno accesso diretto agli indirizzi in memoria usando una funzionalità detta pointer, ma ciò è raro nei linguaggi moderni.

Infine, ecco un componente con cui hai sicuramente familiarità: il disco rigido (hard drive). Seguendo l'analogia del cervello, rappresenta la memoria a lungo termine. Un disco rigido è un dispositivo interno o esterno che memorizza i dati che devono essere conservati anche dopo lo spegnimento del computer.

Prima di passare a maggiori dettagli sui linguaggi di programmazione, spendiamo un secondo per parlare dei dati. Ma cosa significa esattamente la parola dato?

Ad alto livello, pensiamo a cose come documenti di testo, immagini, video, email, file e cartelle. Queste sono tutte strutture di dati di alto livello che creiamo e salviamo sul nostro computer ogni giorno.

Ma dietro le quinte, un chip di un computer (come la CPU o la RAM) non ha idea di cosa significhi "immagine" o "video".

Dalla prospettiva di un chip, tutte queste strutture sono conservate come lunghe sequenze di zero e uno, di cui ogni cifra è detta bit.

I bit sono memorizzati comunemente a gruppi di otto, detti byte. Un byte è semplicemente una sequenza di otto bit, come 00000001, 01100110 o 00001111. Questo tipo di rappresentare l'informazione è detto rappresentazione binaria.

2) Imparare come funzionano i linguaggi di programmazione

Nella sezione precedente, abbiamo menzionato che la maggior parte dei computer si basa su una CPU, che può comprendere uno specifico insieme di istruzioni sotto forma di una sequenza di zero e uno.

Dunque, potremmo teoricamente scrivere del codice che dice alla CPU cosa fare, mettendo insieme delle lunghe sequenza di zero e uno in una forma comprensibile dalla CPU. Le istruzioni in forma binaria come queste sono dette codice macchina.

Sembra qualcosa di orribile con cui lavorare, non è vero? Probabilmente lo è, ma non saprei, dato che uso principalmente linguaggi di programmazione di alto livello come JavaScript, Python e Java.

Un linguaggio di programmazione di alto livello fornisce un insieme di parole chiave, istruzioni e regole sintattiche leggibili da una persona che sono molto più semplici da imparare, per lavorare e fare debugging.

I linguaggi di programmazione offrono un mezzo per colmare il divario tra il modo in cui il cervello umano interpreta il mondo e il modo in cui lo fa il cervello di un computer (CPU).

Alla fine, il codice che scriviamo deve essere tradotto in istruzioni binarie (codice macchina) che la CPU può comprendere.

A seconda del linguaggio che scegli, diciamo che il codice può essere compilato o interpretato in codice macchina in grado di essere eseguito dalla CPU. La gran parte dei linguaggi di programmazione comprende un programma chiamato compilatore o un interprete che svolge il processo di traduzione.

Tanto per fare qualche esempio: JavaScript e Python sono linguaggi interpretati, mentre Java è un linguaggio compilato. Che un linguaggio sia compilato o interpretato (o una combinazione delle due possibilità) ha implicazioni per uno sviluppatore, sulla praticità, la gestione degli errori, le prestazioni e altri aspetti, ma non parleremo di questi dettagli qui.

3) Capire come funziona Internet

Qualsiasi tipo di programma aspiri a realizzare, incapperai in situazioni in cui è bene conoscere il modo in cui i computer interagiscono tra di loro. E ciò accade tipicamente attraverso Internet.

Internet non è nient'altro che un insieme globale di computer collegati. In altre parole, è una rete globale. Ogni computer nella rete si basa su un insieme di regole che permette loro di comunicare. Per un computer, "comunicare" significa trasferire dati.

Come discusso nelle sezioni precedenti, tutti i tipi di dati – pagine web, immagini, video, email e via dicendo – possono essere rappresentati da sequenze di zero e uno.

Dunque, puoi pensare a Internet come un insieme molto esteso di computer che possono trasferire sequenze di zero e uno tra di loro, in modo da mantenere il significato dei dati. Internet non è nient'altro che un mezzo digitale di conversazione.

Se Internet è solo una grande arena in cui conversare, definiamo i partecipanti alla conversazione.

Prima di tutto, un'analogia: le conversazioni tra persone richiedono almeno due partecipanti. Nella maggior parte dei casi, una persona inizia la conversazione e l'altra persona risponde, assumendo che siano entrambe presenti e disponibili.

Nel linguaggio di Internet, il computer che inizia la conversazione è chiamato client e il computer che risponde è chiamato server.

Ad esempio, supponi di aprire un browser e andare su "www.google.com". In questa situazione, il browser è il client. Per estensione, puoi pensare al computer su cui stai lavorando come al client.

In un senso più astratto, TU sei il client, perché sei quello che ha iniziato la conversazione. Scrivendo "www.google.com" nella barra di ricerca e cliccando <INVIO>, il tuo browser sta richiedendo di iniziare una conversazione con i computer di Google.

I computer di Google sono detti server. Rispondono mandando i dati richiesti da visualizzare in una pagina web del tuo browser. E voilà! La pagina web di Google appare davanti ai tuoi occhi. Tutti i trasferimenti di dati su Internet utilizzano questo tipo di relazione client/server.

4) Fare pratica con la riga di comando

La riga di comando può far paura a una prima occhiata. Viene spesso mostrata nei film come uno misterioso schermo nero con testo, numeri e simboli incomprensibili che scorrono. È solitamente associata all'hacker malvagio o all'aiutante genio della tecnologia.

La verità è che non serve un genio per usare o capire la riga di comando. Infatti, ci consente di svolgere molte delle azioni che ci troviamo a nostro agio a compiere puntando e cliccando con il mouse.

La differenza principale è che accetta essenzialmente input via tastiera, il che può velocizzare gli input in modo significativo, una volta che ne comprendi il funzionamento.

Puoi usare la riga di comando per navigare tra le cartelle, elencare il contenuto di una cartella, creare nuove cartelle, copiare, spostare e cancellare file, eseguire programmi e molto altro. La finestra in cui puoi digitare i comandi sulla riga di comando è chiamata terminale.

E adesso affrontiamo un breve tutorial sui comandi di navigazione di base che ti daranno un'idea di come lavorare con la riga di comando.

Una volta aperto il terminale, una tipica domanda è "Dove sono?". Possiamo usare il comando pwd (che sta per "Print Working Directory", letteralmente "stampa cartella di lavoro") per scoprirlo. Dà come output la posizione attuale nel file system da cui sappiamo in quale cartella ci troviamo.

Prova tu stesso:

Come usare la riga di comando

Se sei su un Mac, apri l'app Terminale, che è essenzialmente un terminale per riga di comando Unix.

Se sei su un sistema operativo senza una interfaccia grafica (GUI, Graphical User Interface), come Linux o Unix, dovresti essere già sulla riga di comando quando avvii il tuo computer. Se la tua versione di Linux o Unix ha una GUI, dovrai aprire manualmente il terminale.

Nel prompt, digita pwd e premi <INVIO>. La riga di comando stamperà il percorso della cartella in cui ti trovi.

Di default, la cartella attiva all'apertura della riga di comando è la cartella home dell'utente loggato. Ciò è personalizzabile nel caso volessi partire da una posizione differente.

Per convenienza, si può fare riferimento alla cartella home usando la tilde, ~. La useremo in un paio dei prossimi esempi.

Ora che sappiamo in quale cartella ci troviamo, possiamo usare il comando ls per elencare il contenuto della cartella attuale. Il comando ls sta per "list".

Digita ls e premi <INVIO>. Il contenuto della cartella attuale (file e sottocartelle) verrà stampato sullo schermo.

Riesegui il precedente comando come ls -al e premi <INVIO>. Adesso otterrai più dettagli sul contenuto della cartella, tra cui la dimensione dei file, le date di modifica e le autorizzazioni.

Il trattino nel comando precedente ci consente di impostare delle opzioni che modificano il comportamento del comando. In questo caso, il flag -a, che elenca tutto il contenuto di una cartella (compresi i file nascosti), e il flag -l, che mostra i dettagli extra dei file.

Come passo successivo, possiamo creare una nuova cartella usando il comando mkdir, che sta per "Make Directory". Qui sotto, abbiamo creato una cartella chiamata "testdir".

Digita mkdir testdir e premi <INVIO>. Poi digita ls e premi <INVIO>. Dovresti vedere la nuova cartella in elenco.

Per creare più cartelle annidate in un colpo solo, usa il flag -p e crea l'intera catena di cartelle in questo modo: mkdir -p directory1/directory2/directory3

La riga di comando non è poi così utile se possiamo stare in una sola posizione, quindi impariamo a navigare tra le diverse cartelle nel file system. Possiamo farlo tramite il comando cd che sta per "Change Directory".

Digita cd testdir e premi <INVIO>. Poi digita pwd e premi <INVIO>. Nota che l'output adesso mostra che siamo all'interno della cartella "testdir", specificata nel comando cd. Ci siamo spostati nella nuova cartella!

Digita cd .. e premi <INVIO>. .. dice alla riga di comando di tornare indietro alla cartella genitore.

Poi digita pwd e premi <INVIO>. Nota che l'output adesso mostra che sei tornato nella cartella originaria. Siamo tornati indietro!

Il prossimo passo è imparare a creare un nuovo file vuoto nella cartella corrente.

Digita touch newfile1.txt e premi <INVIO>. Puoi usare il comando ls per vedere che il nuovo file è stato creato nella cartella attuale.

Ora copieremo questo file da una cartella all'altra usando il comando cp.

Digita cp nuovofile1.txt testdir e premi <INVIO>. Ora usa i comandi ls e ls testdir per vedere che il nuovo file esiste ancora nella cartella attuale ed è stato copiato nella cartella "testdir".

Possiamo anche spostare i file invece di copiarli, usando il comando mv.

Digita touch nuovofile2.txt e premi <INVIO> per creare un nuovo file.
Poi digita mv nuovofile2.txt testdir e premi <INVIO> per spostare il file nella cartella "testdir".

Usa i comandi ls e ls testdir per avere conferma che il file è stato spostato nella cartella "testdir" (non dovrebbe più apparire nella posizione originaria in cui lo hai creato, dato che è stato spostato e non copiato).

Il comando mv può essere anche usato per rinominare i file.

Per farlo, digita touch nuovofile3.txt e premi <INVIO> per creare un nuovo file. Poi digita mv nuovofile3.txt filerinominato.txt e premi <INVIO> per aggiornare il nome del file. Usa ls per avere conferma che il file è stato rinominato.

Infine, possiamo eliminare un file o una cartella usando il comando rm.

Digita rm filerinominato.txt e premi <INVIO> per eliminare il file. Usa ls per avere conferma che il file è stato eliminato.

Digita rm -rf testdir e premi <INVIO> per rimuovere la cartella "testdir" e il suo contenuto. Usa ls per avere conferma che la cartella è stata eliminata.

Nota che occorre usare i flag -rf per eliminare le cartelle. Ciò forza l'eliminazione della cartella e di tutto il suo contenuto.

5) Acquisire abilità da editor di testo con Vim

A questo punto, abbiamo visto i fondamenti della riga di comando e qualche esempio di come possiamo lavorare con i file senza il mouse.

Sebbene sappiamo come creare, copiare, spostare, rinominare e cancellare dei file dalla riga di comando, non abbiamo visto come modificare il contenuto di file di testo da terminale.

Lavorare con i file di testo nel terminale è importante perché il codice non è nient'altro che del testo salvato in un insieme organizzato di file.

Di sicuro possiamo usare un editor di testo sofisticato come Microsoft Word (o più probabilmente degli editor di codice specializzati come Sublime o Atom) per scrivere e modificare il nostro codice, ma non è necessario. Il terminale è spesso il posto più conveniente per scrivere e modificare il codice, dato che lo abbiamo già aperto per eseguire dei comandi!

Esistono diversi eccellenti editor di testo creati in modo specifico per questo scopo, e io consiglio di imparare le basi di uno chiamato Vim.

Vim è uno degli editor più vecchi in circolazione ed è un gioiellino collaudato nel tempo. Vim sta per "VI iMproved" (ovvero "Vi migliorato"), dato che è il successore di uno strumento chiamato Vi.

Come menzionato, Vim è un editor di testo che è stato creato per essere eseguito direttamente sul terminale, quindi non abbiamo bisogno di aprire una finestra separata in cui lavorare o usare il mouse. Vim ha un insieme di comandi e modalità che consentono di creare e modificare in modo conveniente del contenuto di testo usando solo la tastiera.

Vim non è di facile utilizzo, ma con un po' di pratica, le abilità che acquisirai daranno i loro frutti per tutta la tua carriera da programmatore.

Vim è installato di default su molti sistemi operativi. Per verificare se è installato sul tuo computer, apri la riga di comando e digita vim -v.

Se Vim si apre nel terminale e mostra la sua versione, sei pronto a partire! Altrimenti dovrai installarlo sul tuo sistema. Ricorda che puoi uscire da Vim digitando :q! e premendo <INVIO>. Per più informazioni sull'installazione di Vim vedi https://www.vim.org/.

Secondo me, il modo più semplice e veloce per imparare come usare Vim è utilizzare il tutorial integrato, VimTutor. Per eseguirlo, assicurati che Vim sia installato sul tuo sistema, apri la riga di comando, digita vimtutor e premi <INVIO>.

Se ti restano ancora energie dopo aver finito con VimTutor, dai un'occhiata a questi 7 comandi che miglioreranno notevolmente la tua produttività su Vim.

6) Affrontare un po' di HTML

Puoi pensare all'HTML – acronimo di HyperText Markup Language – come allo scheletro di una pagina web. Determina la struttura di una pagina specificando gli elementi che dovrebbero essere mostrati e il loro ordine.

Ogni pagina web che hai mai visitato nel tuo browser è associata a dell'HTML. Quando visiti una pagina web, il server web che ospita la pagina manda dell'HTML al tuo browser, il quale poi legge l'HTML e mostra la pagina.

La maggior parte delle pagine web contiene un insieme di contenuti piuttosto standardizzati, tra cui un titolo, del contenuto di testo, link a immagini, link di navigazione, intestazioni, piè di pagine e altro. Tutte queste informazioni sono conservate nell'HTML che definisce la struttura della pagina.

Una cosa da tenere a mente è che l'HTML non è tecnicamente un linguaggio di programmazione, sebbene vi si fa spesso riferimento come "codice HTML".

Come vedremo in seguito, altri linguaggi di programmazione ci permettono di scrivere del codice che fa qualcosa, come eseguire un insieme di istruzioni in sequenza. L'HTML non fa nulla. Non viene eseguito, sta semplicemente in un file e aspetta di essere inviato a un browser web, che lo mostra all'utente finale.

In effetti, l'HTML è sostanzialmente costituito da dati. Sono i dati che definiscono quale dovrebbe essere l'aspetto di una pagina, null'altro.

Quindi, come scriviamo l'HTML? L'HTML utilizza un insieme di tag standard (sostanzialmente delle etichette) per identificare gli elementi che costituiscono una pagina web. Ogni tag è definito usando delle parentesi angolate.

Ad esempio, un titolo è definito come <title>Il titolo della mia pagina</title>, mentre un paragrafo è definito come <p>Delle righe di testo.</p>.

Ogni elemento HTML è composto da un tag di apertura e da un tag di chiusura. Il tag di apertura è semplicemente l'etichetta del tag tra parentesi angolate:

<nometag>

Questo corrisponde all'inizio di un nuovo elemento HTML. Il tag di chiusura è essenzialmente lo stesso, ma ha una barra obliqua dopo la prima parentesi angolata, per segnalare che si tratta di un tag di chiusura:

</nometag>

Qualsiasi testo tra i due tag è il contenuto effettivo che verrà visualizzato sulla pagina.

Parliamo di alcuni dei tag più comunemente utilizzati. Il primo è il tag <html>. Definisce l'inizio di una pagina HTML. Il corrispondente tag </html> (nota la barra obliqua) definisce la fine della pagina HTML. Qualsiasi contenuto tra i due tag sarà parte della pagina.

Il secondo è il tag <head>, che definisce informazioni aggiuntive che il browser utilizza per comprendere la pagina. La maggior parte del contenuto di questo tag non viene mostrata all'utente. Il corrispondente tag </head> definisce la fine della sezione head.

Precedentemente, abbiamo visto il tag <title>. Definisce il titolo della pagina web, che il browser mostrerà nella scheda. Questa tag deve essere inserito all'interno della sezione <head>...</head>.

Poi c'è il tag <body>. Tutto il contenuto all'interno di questo elemento costituisce il contenuto principale della pagina web. Mettendo questi quattro tag in ordine otteniamo:

<html>
    
    <head>
        <title>Il titolo della mia pagina</title>
    </head>
        
    <body>
        <p>Delle righe di testo.</p>
    </body>

</html>

Il semplice snippet HTML qui sopra rappresenta una pagina web con un titolo e un singolo paragrafo come contenuto del body.

Questo esempio ci porta a un punto che non abbiamo menzionato nella scorsa sezione. I tag HTML possono essere annidati l'uno dentro l'altro. Ciò vuol dire semplicemente che i tag HTML possono essere posizionati all'interno di altri tag HTML.

L'HTML fornisce molti altri tag per offrire un ricco insieme di contenuti agli utenti del web. Non ne parleremo in dettaglio qui, ma qui sotto c'è una breve lista come riferimento:

  • <p>: un paragrafo di testo che inizia su una nuova riga.
  • <h1>: un'intestazione di pagina generalmente usata per i titoli.
  • <h2>: un'intestazione di sezione generalmente usata per i titoli di sezione.
  • <hx>: con x compreso tra 3 e 6, per intestazioni più piccole.
  • <img>: un'immagine.
  • <a>: un link.
  • <form>: un modulo contenente campi o input per gli utenti da compilare e inviare.
  • <input>: un campo di input per consentire agli utenti di inserire informazioni, solitamente in un modulo.
  • <div>: usato per raggruppare insieme altri elementi per questioni di spazio.
  • <span>: un altro elemento di raggruppamento, ma usato per racchiudere del testo e applicare una formattazione specifica a una parte del contenuto di testo.

7) Affrontare un po' di CSS

Una pagina web senza CSS – o Cascading Style Sheets – è come una torta senza glassa: adempie al suo scopo, ma non è invitante!

Il CSS ci permette di associare delle proprietà di stile come il colore di sfondo, la dimensione del carattere, la larghezza, l'altezza e molto altro, agli elementi HTML.

Ogni proprietà di stile dice al browser di presentare sullo schermo l'effetto desiderato. Come l'HTML, il CSS non è tecnicamente un linguaggio di programmazione. Non ci consente di eseguire delle azioni, ma ci fa semplicemente aggiungere degli stili allo scheletro HTML.

Vediamo come associare degli stili CSS agli elementi HTML. Ci sono tre pezzi in questo puzzle:

  • Il selettore CSS – usato per identificare l'elemento o gli elementi di cui vogliamo definire lo stile
  • Il nome della proprietà CSS – il nome specifico della proprietà di stile che vogliamo aggiungere a degli elementi HTML
  • Il valore della proprietà CSS – il valore della proprietà di stile che vogliamo applicare

Ecco un esempio di come si uniscono questi pezzi per impostare il colore e la dimensione del carattere di un paragrafo:

p {
  color: red;
  font-size: 12px;
}

Iniziamo dal principio, prima delle parentesi graffe. È qui che va il selettore CSS. In questo caso, è la lettera p che indica il tag HTML <p> (paragrafo). Ciò significa che gli stili all'interno delle parentesi graffe saranno applicati a tutti i tag <p> sulla pagina web.

Passiamo a quello che va all'interno delle parentesi graffe – gli stili che vogliamo applicare agli elementi selezionati.

Qui troviamo coppie di proprietà CSS e valori, separati da due punti. Le proprietà (in questo caso "color" e "font-size") sono sulla sinistra. I valori di queste proprietà (in questo caso "red" e "12px") sono sulla destra. Un punto e virgola segna la fine di ogni coppia proprietà/valore.

Probabilmente hai capito come funziona. Lo snippet di codice CSS qui sopra dice al browser di usare il rosso (red) e una dimensione di 12px per tutto il testo posizionato all'interno dei tag <p>.

Ma come fa una pagina HTML a sapere di dover includere questi stili CSS? Qui entra in gioco il tag HTML <link>. Di solito, gli stili CSS sono creati in file (.css) separati dall'HTML. Ciò vuol dire che dobbiamo importarli nel file HTML in modo che il browser sappia che esistono.

Il tag <link> esiste per questo scopo. Il tag <link> va incluso nella sezione <head> del file HTML e ci permette di specificare i file CSS esterni da importare:

<head>

    <title>Il titolo della mia pagina</title>

    <link rel="stylesheet" type="text/css" href="/home/style.css">

</head>

In questo esempio stiamo importando gli stili CSS specificati dall'attributo href, in questo caso il file /home/style.css.

Nelle prossime 3 sezioni, ci tufferemo (finalmente) in veri linguaggi di programmazione!

Vedremo una panoramica generale di JavaScript, Python e Java, così come affronteremo alcuni concetti di programmazione essenziali e comuni ai 3 linguaggi. Confronteremo le caratteristiche di questi linguaggi e vedremo degli esempi di codice in modo da ottenere auspicabilmente una comprensione completa dei loro fondamenti.

8) Iniziare a programmare con JavaScript

Iniziamo rispondendo alla seguente domanda: se possiamo usare l'HTML per costruire la struttura di una pagina web e il CSS per abbellirla, perché abbiamo bisogno di JavaScript?

La risposta è che, tecnicamente, non ne abbiamo bisogno. Se siamo felici con un sito statico che ha un bell'aspetto e resta lì dov'è, siamo a posto solo con HTML e CSS.

La parola chiave qui è "statico". Invece, se vogliamo aggiungere delle caratteristiche dinamiche alle nostre pagine web, come cambiare contenuto e altre interazioni più complesse con l'utente, abbiamo bisogno di usare JavaScript.

Cos'è JavaScript?

Quindi cos'è esattamente JavaScript? JavaScript è un linguaggio di programmazione creato in modo specifico per i siti web e Internet. Come menzionato nella sezione 2, i linguaggi di programmazione sono per lo più compilati o interpretati, e i programmi vengono eseguiti tipicamente in modo indipendente.

JavaScript è in qualche modo unico a questo riguardo, in quanto è stato progettato per essere eseguito direttamente nel browser. Consente di scrivere codice che rappresenta un insieme di azioni che saranno eseguite sulle pagine web per rendere i siti più dinamici.

È possibile scrivere del codice JavaScript in file di testo con estensione .js o all'interno di tag <script> direttamente nell'HTML.

Per molti anni, il codice JavaScript è stato essenzialmente relegato all'esecuzione nei browser web, ma il progetto Node.js ha cambiato questo paradigma creando un ambiente JavaScript autonomo eseguibile ovunque.

Invece di essere intrappolati in un browser (ovvero il lato client), Node.js può essere installato localmente su qualsiasi computer per permettere lo sviluppo e l'esecuzione del codice JavaScript. Puoi anche installare Node su dei server web, in modo da poter usare JavaScript come backend per delle applicazioni, invece di usarlo semplicemente come codice frontend.

Ora che abbiamo visto un po' il contesto, passiamo ai fondamenti del linguaggio JavaScript.

Variabili e assegnazione in JavaScript

Le variabili rappresentano probabilmente il concetto più importante nella programmazione. Una variabile è semplicemente un nome o un segnaposto che viene usato per fare riferimento a un particolare valore.

La parola variabile comporta che il valore memorizzato possa cambiare durante l'esecuzione del programma.

Puoi usare delle variabili per memorizzare numeri, stringhe di testo, liste e altre strutture di dati di cui parleremo in un attimo.

Tutti i linguaggi di programmazione usano le variabili, ma la sintassi varia tra i vari linguaggi.

Le variabili sono utili, dato che possiamo fare riferimento ai loro valori nel nostro codice. Ciò ci consente di controllare i loro valori quando necessario e svolgere diverse azioni a seconda di come cambia il valore di una variabile.

In JavaScript, dichiariamo le variabili usando la parola chiave let, così: let x;.

In questo modo abbiamo dichiarato x come una variabile che possiamo usare nel nostro codice. Nota che abbiamo aggiunto un punto e virgola alla fine della riga. In JavaScript (e in molti altri linguaggi), i punti e virgola sono usati per specificare il termine di ogni istruzione di codice.

Ora che abbiamo creato una variabile x, possiamo assegnarle un valore usando il segno uguale, anche chiamato operatore di assegnazione: x = 10;

Qui abbiamo assegnato il numero 10 alla variabile chiamata x. Ora, ogni volta che usiamo x nel nostro codice, il valore 10 vi verrà sostituito.

La dichiarazione e l'assegnazione possono essere fatte in una sola riga, come segue:

let x = 10;

Tipi di dato in JavaScript

Nell'ultima sezione, abbiamo memorizzato un numero intero in una variabile chiamata x. Possiamo anche memorizzare dei numeri decimali, o numeri in virgola mobile (floating-point numbers) come sono conosciuti. Ad esempio, potremmo scrivere: let x = 6.6;.

I diversi tipi di valori che possiamo memorizzare nelle variabili sono detti tipi di dato. Finora abbiamo visto solo tipi di dato numerici (interi e numeri in virgola mobile), ma stiamo appena scalfendo la superficie. Possiamo anche memorizzare dati di testo.

Nella terminologia della programmazione, una porzione di testo è chiamata stringa. Possiamo memorizzare un valore di stringa nella nostra variabile x, circondandolo con virgolette singole o doppie:

let x = 'Hello there!';

let y = "Hey bud!";

Il prossimo tipo di dato di cui parleremo è il booleano. Un booleano può contenere un valore tra true (vero) e false (falso) – devono essere minuscoli. In JavaScript, true e false sono due parole chiave usate in modo specifico come valori per variabili booleane:

let x = true;

let y = false;

Nota che i valori true e false non appaiono tra virgolette come le stringhe. Se circondati da virgolette, il loro tipo diventa una stringa e non booleano.

Usiamo spesso i booleani per controllare il flusso dei programmi all'interno di istruzioni condizionali (if/else), che impareremo a conoscere nella prossima sezione.

Istruzioni di controllo in JavaScript

Ora che sappiamo cosa sono le variabili e quali sono i tipi di dato fondamentali in JavaScript, diamo un'occhiata ad alcune cose che possiamo fare con loro.

Le variabili non sono così utili se non siamo in grado di dire al nostro codice di usarle in qualche modo. Per farlo possiamo usare delle istruzioni.

Le istruzioni sono parole chiave speciali che ci consentono di svolgere delle azioni con il nostro codice, spesso sulla base del valore di una variabile che abbiamo definito. Le istruzioni ci permettono di definire il flusso logico dei nostri programmi, così come molte azioni utili che ne determinano il funzionamento.

Istruzioni if / else

La prima istruzione di cui parleremo è l'istruzione if. L'istruzione if ci consente di svolgere delle azioni solo quando una condizione desiderata è vera. Eccone un esempio:

let x = 10;

if ( x > 5 ) {
    console.log('X è maggiore di 5!');
} else {
    console.log('X non è maggiore di 5!');
}

Abbiamo definito una variabile chiamata x impostandone il valore a 10. Poi arriva l'istruzione if. Dopo la parola chiave if, abbiamo delle parentesi che contengono la condizione da valutare, in questo caso, x > 5. Abbiamo definito x uguale a 10, quindi sappiamo che questa condizione è vera in questo esempio.

Dato che la condizione tra parentesi è vera, il codice nelle parentesi graffe sarà eseguito e vedremo il testo "X è maggiore di 5!" stampato sullo schermo (non abbiamo parlato del significato di console.log(), quindi per ora sappi che stampa sullo schermo il valore compreso tra parentesi).

Nello stesso esempio, abbiamo incluso un'istruzione else, che consente di eseguire del codice specifico nel caso in cui la condizione sia false.

Loop while

Il prossimo tipo di istruzione che discuteremo è il loop while. I loop ci permettono di ripetere un blocco di codice quante volte desideriamo, senza dover copiare e incollare il codice ancora e ancora.

Ad esempio, supponiamo di dover stampare sullo schermo una frase cinque volte. Potremmo farlo così:

console.log('Questo è un messaggio molto importante!');
console.log('Questo è un messaggio molto importante!');
console.log('Questo è un messaggio molto importante!');
console.log('Questo è un messaggio molto importante!');
console.log('Questo è un messaggio molto importante!');

Questo funziona se sono solo 5 messaggi, ma se fossero 100 o 1000? Ci serve un modo migliore per ripetere pezzi di codice più volte, e i loop ci permettono di farlo. Nella terminologia della programmazione, la ripetizione di una porzione di codice più volte è detta iterazione.

Il seguente loop while continua a eseguire il blocco di codice al suo interno finché la condizione specificata è vera:

let x = 1;

while ( x <= 100 ) {
    
    console.log('Questo è un messaggio molto importante!');
    
    x = x + 1;
    
}

In questo esempio, abbiamo inizializzato x con il valore 1. Poi scriviamo un loop while. In modo simile all'istruzione if, aggiungiamo una condizione tra parentesi. In questo caso la condizione è x <= 100. Questa condizione sarà true finché x è minore o uguale a 100.

Poi specifichiamo il blocco di codice da eseguire nelle parentesi graffe. Prima stampiamo il messaggio sulla console e poi incrementiamo x di 1.

A questo punto il loop rivaluta la condizione per vedere se è ancora true. La variabile x ora ha il valore 2, dato che è stata incrementata durante la prima esecuzione del loop. La condizione è ancora true dato che 2 è minore di 100.

Il codice nel loop si ripete finché x viene incrementato al valore 101. A questo punto, x è maggiore di 100, la condizione adesso è false e il codice nel loop smette di essere eseguito.

Il tag HTML <script>

Ora che abbiamo introdotto JavaScript, vediamo come aggiungere dei file con codice JavaScript a una pagine HTML. Possiamo farlo usando un tag HTML di cui non abbiamo ancora parlato – il tag <script>.

Questo è simile all'elemento <link> che abbiamo usato per aggiungere i file CSS all'HTML, eccetto che l'elemento <script> è specifico per JavaScript.

Supponiamo di aver salvato uno dei precedenti esempi di JavaScript in un file chiamato customscript.js nella stessa cartella del file HTML. Possiamo aggiungere il file JavaScript all'HTML aggiungendo il seguente tag HTML nella sezione <head>...</head> dell'HTML:

<script type="text/javascript" src="customscript.js"></script>

In questo modo, il codice JavaScript sarà caricato dal file e verrà eseguito quando la pagina web viene visualizzata nel browser.

Una volta che ti senti sicuro delle tue abilità JavaScript, puoi provare a fare pratica con qualcuno di questi progetti adatti a principianti.

9) Continuare a programmare con Python

Ora che hai imparato alcune basi di JavaScript, sarà utile passare a un altro linguaggio di programmazione – Python.

Molti linguaggi di programmazione offrono un set simile di funzionalità, tra cui variabili, operatori aritmetici, istruzioni if/else, loop e funzioni.

È utile  vedere come i diversi linguaggi di programmazione implementano funzionalità simili. I concetti sono solitamente molto simili, ma la sintassi (il modo in cui il codice è scritto) varia da linguaggio a linguaggio.

Cosa è Python?

Per iniziare, parleremo un po' delle informazioni generali su Python. Come JavaScript, Python è un linguaggio di programmazione di alto livello che dà priorità alla facilità di sviluppo più che alla rapidità di esecuzione.

Secondo me, Python è uno dei migliori linguaggi di programmazione da imparare per i principianti. La sintassi è pulita e intuitiva ed è un linguaggio molto popolare sia nell'ambito commerciale che dell'open source.

Precedentemente abbiamo parlato dei linguaggi compilati e di quelli interpretati. Python è un linguaggio interpretato. Ogni volta che vogliamo eseguire un programma in Python, l'interprete Python elabora attivamente il nostro codice e lo esegue riga per riga sulla macchina.

È molto diverso dai linguaggi compilati, nei quali occorre usare prima un compilatore per elaborare il codice in una forma più ottimizzata (un eseguibile) da eseguire successivamente.

A differenza di JavaScript, Python non è stato progettato per essere eseguito direttamente all'interno del browser. Python è stato creato per essere un linguaggio di scripting pratico – un linguaggio che può essere usato per scrivere codice per attività arbitrarie, solitamente eseguito su un computer in locale.

Il codice Python può essere eseguito su qualsiasi computer che ha installato l'interprete Python. È ancora un linguaggio di scripting comune ma è anche ampiamente utilizzato per applicazioni in scienza dei dati e per il lato server.

Variabili e assegnazione in Python

Come JavaScript, Python ci consente di definire variabili. In Python possiamo semplicemente usare il segno uguale per creare e assegnare variabili al bisogno:

x = 10
y = "cheese"

Ci sono due differenze tra la sintassi per definire variabili in Python e JavaScript. In Python, non abbiamo bisogno della parola chiave let così come del punto e virgola alla fine di ogni riga.

Python utilizza un insieme di regole sintattiche basate sugli spazi e l'indentazione. Ciò elimina il bisogno di caratteri come il punto e virgola per terminare una riga e le parentesi graffe per definire un blocco di codice.

Tipi di dato in Python

Anche Python ha un insieme di tipi di dato che possiamo assegnare alle variabili. Questi includono interi, numeri decimali (float), stringhe, liste e dizionari.

Interi, float e stringhe sono essenzialmente equivalenti alle loro versioni in JavaScript, quindi non ne riparlerò qui.

In Python, i booleani sono molto simili a quelli in JavaScript, eccetto per il fatto che le parole chiave True e False iniziano con la maiuscola:

x = True

y = False

Istruzioni di controllo in Python

Come JavaScript, Python ha un insieme simile di istruzioni di controllo, ma con una sintassi leggermente diversa.

Istruzioni if / else

Questo è l'equivalente in Python dell'esempio if/else che abbiamo visto nella sezione su JavaScript:

x = 10

if ( x > 5 ):
    print('X è maggiore di 5!')
    
else:
    print('X non è maggiore di 5!')

Abbiamo definito una variabile chiamata x impostandone il valore a 10, con un'istruzione if a seguire. Dato che la condizione tra parentesi è True, il codice indentato dopo l'istruzione if verrà eseguito e vedremo la stringa 'X è maggiore di 5!' stampata sullo schermo.

In Python, usiamo la funzione print() per stampare informazioni sullo schermo.

Nota anche l'istruzione else qui sopra, che stampa una stringa alternativa se la condizione è False.

Ci sono due differenze principali tra il codice Python qui sopra e quello JavaScript visto in precedenza. Python utilizza i due punti invece delle parentesi graffe per indicare l'inizio del corpo dell'istruzione if.

In aggiunta, l'indentazione della funzione print() è importante in Python. In JavaScript, l'indentazione o lo spazio tra le istruzioni non hanno importanza, dato che JavaScript identifica i blocchi di codice usando le parentesi graffe e la fine delle istruzioni usando i punti e virgola. Ma in questo esempio con Python, non ci sono punti e virgola o parentesi graffe!

Questo perché Python fa uso dello spazio e dei caratteri nuova riga per identificare la fine delle istruzioni e dei blocchi di codice.

I due punti dicono all'interprete Python che il blocco if sta iniziando. Il codice che costituisce il blocco if deve essere indentato (4 spazi è la convenzione) affinché l'interprete Python sappia che è parte del blocco. La riga non indentata successiva segna il termine del blocco if.

Loop while

Adesso parleremo dei loop while in Python. Il loop while in Python è sostanzialmente lo stesso che abbiamo visto in JavaScript, ma con la sintassi Python:

x = 1

while ( x <= 100 ):
    print('Questo è un messaggio molto importante!')
    x = x + 1

print('Questo non è il loop!')

Le differenze tra questo loop while e la versione JavaScript sono:

  • Abbiamo rimosso la parola chiave let per definire le variabili.
  • Abbiamo rimosso il punto e virgola al termine della riga.
  • Abbiamo sostituito le parentesi graffe con due punti.
  • Abbiamo indentato il codice nel loop con 4 spazi.

Abbiamo stampato un messaggio aggiuntivo fuori dal loop per mostrare che le righe di codice non indentate non sono parte del loop e non vengono ripetute.

Per i pythonisti principianti, consiglio di dare un'occhiata a the Zen of Python (risorsa in lingua originale inglese), un insieme di 20 regole pratiche per scrivere codice in modo pythonico.

E una volta che ti senti più a tuo agio con le basi, prova a creare alcuni di questi divertenti progetti in Python adatti ai principianti.

10) Approfondire le conoscenze con Java

Ora che abbiamo visto un paio di linguaggi di programmazione di alto livello, andiamo un gradino più in basso con Java.

A differenza di JavaScript e Python, che eseguono il codice sorgente in tempo reale usando un interprete, Java è un linguaggio compilato. Ciò significa che viene usato un compilatore (invece di un interprete) per convertire il codice sorgente Java in una forma che il computer può capire.

La maggior parte dei compilatori genera uno o più file eseguibili costituiti da codice macchina pronto per essere eseguito su sistemi operativi specifici e piattaforme hardware per cui sono stati compilati.

Java invece, è in qualche modo speciale, visto che il codice sorgente Java viene compilato in una forma intermedia chiamata bytecode, diversa dal codice macchina prodotto dagli altri linguaggi compilati. Il bytecode è ideato per essere eseguito da una cosa chiamata Java Virtual Machine (JVM).

Puoi pensare alla JVM come a un programma che installi sul tuo computer, che ti permette di eseguire i programmi Java eseguendo il bytecode. Quando le persone dicono che "Java è o non è installato su un computer", di solito intendono che "la JVM è o non è installata su un computer".

La JVM svolge una funzione simile a quella dell'interprete che abbiamo discusso nei capitoli precedenti. Ma invece di prendere come input il codice sorgente (che è contenuto in file .java), prende il bytecode compilato.

Il vantaggio di questa organizzazione è che fa sì che il bytecode compilato su un particolare sistema operativo possa essere eseguito da una JVM su una qualsiasi altra piattaforma.

Ad esempio, immagina di avere un file di codice Java che è stato scritto e compilato in bytecode su un computer con un sistema operativo Windows. Questo bytecode può essere eseguito da una JVM su una qualsiasi piattaforma, tra cui Windows, Mac OS, Linux e via dicendo.

Questo non è il caso della maggior parte degli eseguibili compilati in altri linguaggi di programmazione, che possono essere eseguiti solo nell'ambiente per il quale sono stati compilati.

Variabili e assegnazione in Java

Una differenza sostanziale tra Java e gli altri linguaggi che abbiamo visto finora (Python e JavaScript) è che Java è un linguaggio staticamente tipizzato.

Vuol dire che i tipi di dato delle variabili devono essere noti e stabiliti al momento in cui il programma viene compilato.

Ogni volta che creiamo una variabile in Java, dobbiamo esplicitamente specificare il tipo di dato della variabile, come intero, stringa e così via. Ciò è detto dichiarazione di una variabile.

Una volta dichiarato il tipo di dato di una variabile, questa può contenere solo quel tipo durante tutto l'esecuzione del programma.

È molto diverso rispetto a JavaScript e Python, dove il tipo di dato di una variabile è stabilito durante l'esecuzione del programma, anche detto run time. Linguaggi come JavaScript e Python vengono quindi denominati linguaggi dinamicamente tipizzati – non occorre affermare esplicitamente il tipo di dato nel nostro codice sorgente ed è possibile riassegnare facilmente una variabile a qualsiasi tipo al volo.

In Java, creiamo variabili usando la sintassi:

tipo nome = valore;

Qui, tipo è il tipo di dato che conterrà la variabile, come intero, stringa e così via. Poi, nome rappresenta il nome della variabile che stiamo definendo in modo da poterla usare nel nostro codice. valore è il valore che stiamo assegnando alla variabile. Nota che come in JavaScript, tutte le istruzioni in Java terminano con un punto e virgola.

Tipi di dato in Java

In Java, i tipi di dato fondamentali integrati sono detti primitivi e possono sembrare molto familiari, basandoci su ciò che abbiamo visto per linguaggi di alto livello come Python e JavaScript. I principali tipi primitivi sono:

  • interi int: contiene un numero intero tra −2,147,483,648 e 2,147,483,647.
  • float float: contiene un numero decimale tra-3.4x10^38 e -1.4x10^-45 per valori negativi, e tra 1.4x10^-45 e 3.4x10^38 per valori positivi.
  • booleano bool: contiene uno dei due valori true o false.

Nota che esistono altri tipi primitivi (short, long, byte e double) di cui non parleremo dato che non sono usati così spesso come gli altri. Ecco come si inizializzano questi tipi di dato:

Interi: int x = 100;

Float: float pi = 3.14;

Caratteri: char middleInitial = 'T';

Booleani: bool isHuman = true;

Voglio ribadire che una volta che il tipo di dato di una variabile viene dichiarato, la variabile può contenere solo il tipo di dato specificato.

Ad esempio, verrebbe restituito un errore se il nostro programma provasse a memorizzare un carattere in una variabile dichiarata come intero. Non possiamo assegnare un carattere 'S' alla variabile x di tipo intero del precedente esempio.

Il prossimo tipo di dato di cui parleremo è la stringa – una sequenza di caratteri, numeri o simboli rappresentata come dati di testo.

Le stringhe in Java sono dei tipi di dato non primitivi, che vuol dire che sono costituiti da parti più piccole. Per dichiarare una variabile stringa dobbiamo usare il tipo di dato String, inserendo il valore assegnato in virgolette doppie:

String name = "Harry Potter";

Istruzioni di controllo in Java

Proprio come JavaScript, Java utilizza le parentesi graffe per definire i blocchi di codice di istruzioni if, loop e funzioni. Esamineremo le stesse istruzioni di controllo dei capitoli precedenti aggiornando gli esempi per usare la sintassi di Java.

Istruzioni if / else

Ecco un'istruzione if/else in Java che rispecchia gli esempi delle sezioni precedenti:

int x = 10;

if ( x > 5 ) {
    System.out.println("X è maggiore di 5!");
} else {
    System.out.println("X non è maggiore di 5!");
}

Questo semplice esempio di if è quasi identico alla versione in JavaScript. Le uniche differenze sono che abbiamo dichiarato il tipo di dato di x come int e che stiamo usando System.out.println() invece di console.log() per stampare il messaggio.

Loop in Java

Dato che le sintassi di Java e JavaScript sono molto simili, il loop while in Java è essenzialmente lo stesso visto in JavaScript:

int x = 1;

while ( x <= 100 ) {

    System.out.println("Questo è un messaggio molto importante!");
    
    x = x + 1;
    
}

Questo loop while stamperà il messaggio specificato 100 volte.

E con questo, si concludono le sezioni dedicate a specifici linguaggi di programmazione. Potrebbe essere stato un po' ripetitivo, dato che abbiamo affrontato gli stessi concetti in 3 linguaggi, ma auspicabilmente è stato utile per rafforzare queste nozioni fondamentali.

Ora completeremo questo articolo con qualche argomento intermedio che altrimenti potresti non iniziare a conoscere da subito.

Parleremo di uno strumento di collaborazione essenziale chiamato Git. Poi impareremo a archiviare e accedere a dati in un database, parleremo brevemente di framework per lo sviluppo web e, infine, faremo un po' di luce sui gestori di pacchetti.

11) Tenere traccia del codice usando Git

Git è il sistema di controllo di versione (Version Control System, VCS) più popolare in uso al giorno d'oggi. Consente a più sviluppatori di collaborare insieme a un software. In questa sezione, impareremo cosa è Git, come funziona e come usare i suoi comandi fondamentali.

Prima di passare direttamente a Git, vediamo alcuni concetti comuni alla maggior parte dei progetti di programmazione.

L'insieme completo di cartelle e file che costituiscono il progetto di un software è chiamato codebase. La radice (root) del progetto è la cartella di livello maggiore nell'albero di cartelle del progetto. I file di codice possono essere inclusi direttamente nella radice o organizzati in livelli multipli di cartelle.

Quando il codebase è pronto per i test o la distribuzione, può essere fatto il build del programma che verrà eseguito sul tuo computer. Il processo di build può includere più passaggi che convertono il codice scritto da persone in un eseguibile che può essere eseguito dal processore del computer.

Una volta fatto il build, il programma è pronto per essere eseguito su uno specifico sistema operativo, come Linux, Mac OS o Windows.

Col passare del tempo, gli sviluppatori aggiornano il codice del progetto per aggiungere nuove funzionalità, sistemare bug, implementare aggiornamenti della sicurezza e altro. In generale, esistono tre modi in cui gli sviluppatori possono apportare questi cambiamenti al progetto di un software:

  1. Aggiungere nuovi file e cartelle al progetto
  2. Modificare il codice in file e cartelle esistenti
  3. Eliminare file e cartelle esistenti

Man mano che il progetto cresce e vengono aggiunte nuove funzionalità, il numero di file e cartelle (così come la quantità di codice al loro interno) aumenta. Dei progetti grandi possono crescere fino a centinaia di migliaia di file contenenti milioni di righe di codice.

Per supportare questa crescita, il numero di sviluppatori nei team che si dedicano a progetti grandi, solitamente cresce fino ad arrivare anche a centinaia o addirittura migliaia di sviluppatori che lavorano tutti insieme.

Tutto ciò porta alla domanda: "Come diamine fanno tutti questi sviluppatori, che possono essere geograficamente dispersi in tutto il mondo, a tenere traccia del codice del loro progetto di software in modo da lavorare insieme su un singolo progetto?"

I team di sviluppo devono avere un modo per tenere esattamente traccia di quali cambiamenti sono stati fatti al codice, quali file o cartelle sono state interessate e chi ha apportato le modifiche. Ogni sviluppatore deve anche essere in grado di ottenere gli aggiornamenti da tutti gli altri sviluppatori.

Questo processo è chiamato controllo di versione. Gli sviluppatori usano degli strumenti speciali, chiamati sistemi di controllo di versione, per tracciare, gestire e condividere le versioni dei progetti di software. Ecco alcuni popolari sistemi di controllo di versione che vengono attivamente usato oggigiorno:

  • Git
  • Subversion (SVN)
  • Mercurial (Hg)

Tuttavia, Git ha vinto la corona come VCS preferito. È di gran lunga il VCS più popolare, usato da governi, comunità open-source e realtà commerciali in tutto il mondo.

Git forma il nucleo delle popolari piattaforme VCS basate sul web come GitHub e Bitbucket. Git è uno strumento essenziale da aggiungere alla lista delle abilità di qualsiasi sviluppatore a tutto tondo.

Comandi Git di base

Git crea e memorizza informazioni su progetti di software in una cosa chiamata repository Git. Si tratta semplicemente di una cartella nascosta sul tuo computer che Git utilizza per archiviare dati riguardanti i file di codice nel progetto di un software.

Ogni progetto di software su cui lavoriamo, ha tipicamente il proprio repository Git per contenere le informazioni correlate al progetto. In questo modo, il codice correlato a progetti diversi può essere tracciato separatamente su uno stesso computer.

Ci sono due modi principali per creare un repository Git sul tuo computer. Il primo è creare un repository Git nuovo di zecca in una cartella esistente del tuo file system.

Per farlo, apri semplicemente la riga di comando, crea una nuova cartella in un posto conveniente come il Desktop e spostati al suo interno:

cd ~/Desktop

mkdir testgit
 
cd testgit/

Ora che abbiamo creato una nuova cartella e siamo al suo interno, possiamo inizializzare un nuovo repository Git usando il comando:

git init

Dovresti vedere un output simile al seguente:

Initialized empty Git repository in /Users/me/Desktop/testgit/.git/

Tutti i comandi Git che eseguiremo iniziano con la parola git seguita da uno spazio e dallo specifico comando che vogliamo eseguire. A volte aggiungeremo anche dei flag e degli argomenti dopo il comando.

Il comando git init crea una cartella nascosta chiamata .git nella cartella corrente. Questa cartella è il repository Git che abbiamo menzionato prima e che puoi vedere con il comando ls -al.

Il secondo modo di ottenere un repository Git sul tuo computer è di scaricarne uno da qualche parte, come Bitbucket o GitHub.

Bitbucket e Github sono siti web che consentono alle persone di ospitare i propri progetti open source e che possono essere scaricati sul tuo computer.

Se vai su un progetto che trovi interessante su Bitbucket o GitHub, vedrai un pulsante "Clone". Questo pulsante ti fornisce un comando con un URL che puoi copiare e incollare nel tuo terminale. Dovrebbe essere qualcosa del genere:

git clone https://jacobstopak@bitbucket.org/jacobstopak/baby-git.git

Il comando git clone scarica il repository dall'URL specificato in una nuova cartella sul tuo computer. L'URL può essere un URL web come nell'esempio o un URL SSH come il seguente:

git clone git@bitbucket.org:jacobstopak/baby-git.git

Dopo aver eseguito il comando git clone, dovresti vedere che è stata creata una nuova cartella. Se ti sposti sulla nuova cartella, vedrai che hai scaricato tutti i file e le sottocartelle che costituiscono il progetto.

Il prossimo comando di cui parleremo è git add <nomefile.estensione>. Il comando git add viene usato per dire a Git quale file vogliamo tracciare e per aggiungere le modifiche fatte a file già tracciati all'area di staging di Git.

Una volta che i nuovi file o quelli modificati sono aggiunti all'area di staging, è possibile effettuare un commit al repository usando il comando git commit -m "Messaggio di commit". In questo modo, i cambiamenti apportati a tutti i file nell'area di staging saranno archiviati nel repository Git.

I comandi git status e git log sono utili per vedere lo stato corrente della cartella di lavoro e la cronologia dei commit del progetto.

Abbiamo appena scalfito la superficie in questo caso. Git ha molti altri comandi essenziali (risorsa in lingua originale inglese) con cui vale decisamente la pena di acquisire familiarità.

12) Archiviare dati usando dei database e SQL

Un database è un programma specificamente progettato per archiviare, aggiornare, recuperare ed eliminare efficientemente grandi quantità di dati. In poche parole, possiamo pensare a un database come a un contenitore per una serie di tabelle.

Probabilmente, hai lavorato con delle tabelle in Microsoft Excel. Una tabella è semplicemente un insieme di colonne e righe contenenti dati. Possiamo creare una tabella in un database per archiviare delle informazioni che un programma necessita per funzionare adeguatamente.

Possiamo scrivere in JavaScript, Python, Java o in qualche altro linguaggio di programmazione e dire ai nostri programmi di interagire con dei database secondo necessità.

Possiamo recuperare dei dati da un database e mostrarli agli utenti su una pagina web. Possiamo accettare un modulo web da un utente e memorizzarne le informazioni in un database per utilizzarle in un secondo momento.

I nostri programmi possono interagire con i database in tempo reale, non appena degli eventi si verificano nell'applicazione. Per farlo, la maggior parte dei database usa un linguaggio chiamato SQL, acronimo di Structured Query Language.

SQL è un linguaggio di programmazione specificamente creato per i database. Consente di dire ai database cosa fare.

Una porzione di codice SQL viene detta query. Possiamo scrivere delle query SQL per recuperare i dati di cui abbiamo bisogno in un momento particolare oppure inserire nuovi dati in una determinata tabella. A grandi linee, esistono due tipi di query SQL: le query di scrittura e di lettura.

Una query SQL di lettura recupera semplicemente dei dati da un database, per vederli o utilizzarli. Non modifica i dati presenti nel database.

D'altro canto, una query SQL di scrittura inserisce nuovi dati in una tabella, aggiorna dei dati esistenti o li elimina. In questa sezione impareremo come scrivere alcune fondamentali query SQL di scrittura.

Prima di scrivere una query, è utile sapere cosa vogliamo chiedere! I database tradizionali contengono tabelle costituite da colonne e righe. Quando scriviamo una query SQL di lettura, solitamente il nostro scopo è recuperare un sottoinsieme di quelle righe e colonne.

Ad esempio, diciamo di avere una tabella chiamata PERSON con 2 colonne, FIRST_NAME e LAST_NAME. Possiamo usare la seguente query per selezionare tutti i dati della sola colonna FIRST_NAME:

SELECT FIRST_NAME FROM PERSON;

La parola chiave SELECT comunica al database che vogliamo recuperare dei dati. È seguita dal nome della colonna – FIRST_NAME – che vogliamo ottenere.

Poi usiamo la parola chiave FROM per dire al database da quale tabella vogliamo ottenere i dati, in questo caso, la tabella PERSON. Nota che tutti i comandi SQL terminano con un punto e virgola.

Una delle esigenze più comuni che abbiamo con i dati, è doverli filtrare. Filtrare vuol dire restringere il gruppo dei risultati in base a una condizione specifica.

Ad esempio, potremmo voler selezionare delle righe dalla tabella PERSON con le persone chiamate "PHIL". Possiamo applicare un filtro alle query SQL usando la parola chiave WHERE:

SELECT * FROM PERSON WHERE FIRST_NAME = 'PHIL';

Questa query restituisce tutte le colonne nella tabella PERSON, dato che abbiamo usato l'asterisco * nella clausola SELECT invece di elencare dei nomi specifici di colonne. Solo le righe nella tabella PERSON dove FIRST_NAME è impostato su "PHIL" saranno richiamate.

Infine, parliamo di ordinamento. Esistono molti casi in cui desideriamo vedere i risultati delle nostre query ordinati secondo un particolare ordine. Per questo possiamo usare la clausola ORDER BY:

SELECT *
FROM PERSON
ORDER BY LAST_NAME;

Questo restituirà tutte le colonne nella tabella PERSON ordinate alfabeticamente secondo LAST_NAME.

Di default, i risultati saranno ordinato in ordine ascendente, dalla A alla Z, Possiamo aggiungere le parole chiave opzionali ASC o DESC, per specificare di ordinare in ordine ascendente o discendente:

SELECT *
FROM PERSON
ORDER BY LAST_NAME DESC;

13) Informarsi sui framework web e MVC

Spesso ci troviamo a scrivere del codice per tipi di applicazioni molto comuni. Le applicazioni web sono applicazioni che si affidano a Internet per funzionare. Le app web sono i tipi di applicazioni software creati più comunemente.

Una app web è essenzialmente una versione di un sito web più funzionale e robusta. Le app web implementano per lo più del codice backend che risiede in un server web e svolge qualche tipo di logica dietro le quinte per supportare le funzionalità dell'applicazione.

I linguaggi di programmazione comuni da utilizzare per il codice backend di una app web comprendono Python, Java e JavaScript, tra gli altri.

Alcune funzionalità comuni alla maggior parte delle app web sono:

  • fornire un modo conveniente per alterare in modo dinamico il contenuto delle pagine web
  • eseguire un'autenticazione utente sicura tramite una pagina di accesso
  • fornire caratteristiche robuste per la sicurezza dell'app
  • leggere e scrivere dati in un database

Un framework web è un insieme di librerie di codice che contengono funzionalità comuni pronte all'uso per tutte le app web. I framework web forniscono un sistema per gli sviluppatori per creare le proprie app senza doversi preoccupare di scrivere il codice per molte delle azioni da svolgere dietro le quinte in tutte le app web.

Occorre solo utilizzare le parti del framework che soddisfano le necessità di una app web.

Ad esempio, se non vogliamo connetterci a un database in una particolare app web, possiamo semplicemente ignorare le caratteristiche che riguardano il database e usare quelle che ci servono.

Abbiamo comunque la possibilità di personalizzare completamente le pagine web che costituiscono la nostra applicazione, il flusso dell'utente e la logica di business. Puoi pensare a un framework web come a una suite di strumenti di programmazione che puoi usare per creare app web.

Ogni linguaggio di programmazione che abbiamo trattato in questo articolo ha uno o più framework web popolari attualmente in uso. È fantastico perché dà ai team di sviluppatori la flessibilità di usare il framework del linguaggio con cui sono più abili.

Java ha il framework Spring, che è reso particolarmente pratico attraverso Spring Boot. Python ha il framework Django. JavaScript ha l'ambiente runtime Node.js con più framework e opzioni tra cui Express.js e Meteor.js. Questi framework sono tutti gratuiti e open-source.

14) Sperimentare con i gestori di pacchetti

L'ultimo argomento che tratterò in questa guida è costituito dai gestori di pacchetti. A seconda del contesto, un pacchetto può rappresentare un programma indipendente, pronto da installare su un computer, oppure una libreria esterna di codice che vogliamo sfruttare in uno dei nostri progetti di software.

Dato che le applicazioni spesso dipendono da queste librerie esterne, spesso vi facciamo riferimento con il termine dipendenze.

Un gestore di pacchetti è un programma che ci aiuta a gestire le dipendenze di un sistema o di un progetto software. Con gestire intendo installare, aggiornare, elencare e disinstallare le dipendenze secondo necessità.

A seconda del contesto, i gestori di pacchetti di cui parleremo possono essere usati per gestire i programmi che abbiamo installato sul nostro sistema operativo o per gestire le dipendenze di un progetto di software.

Mac OS X: Homebrew

Homebrew è il gestore di pacchetti più popolare per il sistema operativo Mac OS X. Offre un modo pratico di installare, aggiornare, tracciare, elencare e disinstallare pacchetti e applicazioni su un Mac.

Molte applicazioni che possono essere installate scaricando file .dmg possono anche essere scaricate e installate usando Homebrew.

Ecco un esempio di installazione del pacchetto wget con Homebrew:

brew install wget

Linux: Apt e Yum

Dato che Linux è stato creato attorno alla riga di comando, non è una sorpresa che i gestori di pacchetti costituiscono il modo predefinito per installare programmi.

Molte delle versioni tradizionali di Linux sono dotate di un gestore di pacchetti integrato. Advanced Package Tool (APT) è il gestore di pacchetti nativo per le distribuzioni di Linux basate su Debian e Ubuntu. Yellowdog Updater, Modified (YUM) è il gestore di pacchetti nativo per la distribuzione di Linux RedHat.

Ecco un esempio di installazione di Vim tramite APT:

sudo apt-get install vim

E usando Yum:

sudo yum install vim

JavaScript: Node Package Manager (NPM)

Ora che abbiamo visto come funzionano alcuni gestori di pacchetti al livello di sistema operativo, diamo un'occhiata ad alcuni gestori di pacchetti specifici per linguaggio di programmazione. Possono aiutarci a gestire le librerie di software da cui dipendono molti dei nostri progetti. Node Package Manager (NPM) viene installato di default con Node.js.

Una differenza tra NPM e il gestore di pacchetti precedente è che NMP può girare in modalità locale o globale. La modalità locale è usata per installare un pacchetto in uno specifico progetto o cartella su cui stiamo lavorando, mentre la modalità globale è usata per installare il pacchetto sul sistema.

Di default, i pacchetti sono installati localmente, ma puoi usare il flag -g per installare un pacchetto globalmente:

npm install request -g

Python: Pip

Anche Python possiede un gestore di pacchetto, chiamato Pip. Pip potrebbe già essere installato sul tuo sistema dato che è in dotazione con le versioni recenti di Python. Pip ci consente di installare pacchetti dal Python Package Index usando il comando pip install <nome-pacchetto>:

pip install requests

Java: Apache Maven

Apache Maven (di solito chiamato semplicemente Maven) è una suite di strumenti gratuita e open-source che include la gestione delle dipendenze.

Maven è principalmente usato per i progetti Java sebbene supporta anche altri linguaggi. Maven può fare molte cose e il suo utilizzo è un po' più complesso, quindi non proseguirò oltre qui.

Sommario

In questo articolo, ho introdotto una serie di concetti di programmazione essenziali con l'intento di offrire una visione panoramica dello sviluppo software che avrei desiderato avere quando ho iniziato a imparare a programmare.

Ho trattato vari argomenti, tra cui Internet, alcuni linguaggi di programmazione, sistemi di controllo di versione e database, con lo scopo di descrivere come si incastrano insieme i vari pezzi di questo puzzle.

Prossimi passi

Se ti è piaciuto questo articolo, ho scritto un libro chiamato Coding Essentials Guidebook for Developers (risorsa in lingua originale inglese) che ha 14 capitoli, ognuno dei quali tratta gli argomenti discussi in questo articolo.

Nel libro mi addentro nei dettagli per ognuno dei 14 argomenti, quindi potrebbe essere una buona risorsa se hai trovato valido questo articolo.

Dopo aver letto questo questo articolo, potresti sentirti attratto da un particolare linguaggio, strumento o concetto. Se è così, ti incoraggio a scavare più a fondo in quell'ambito per imparare di più.

Se hai domande, suggerimenti, oppure dubbi su questo libro, sarò felice di ascoltarti all'indirizzo jacob@initialcommit.io.