Imparare a programmare: Guida introduttiva per principianti


luca.terribili avatar
Luca Terribili

In un precedente articolo abbiamo dato dei consigli per diventare un programmatore, ma chiaramente non basta leggere un articolo informativo per diventare uno sviluppatore senior. Quindi oggi facciamo un passo avanti, con questa guida introduttiva dove faremo una panoramica sui primi passi per imparare a programmare.

Se vuoi diventare un programmatore professionista, ci sono alcune cose che devi sapere e in questo blog post cercheremo di chiarire le idee su cos'è la programmazione e come è possibile impararla. 

Cos'è la programmazione e a cosa può servire

La programmazione è un processo per creare un insieme di istruzioni che un computer esegue al fine di svolgere un compito specifico. Può essere utilizzata per creare qualsiasi processo computazionale, da piccoli programmi a grandi applicazioni. La programmazione è essenziale per automatizzare attività, rendendo possibile l'esecuzione le varie operazioni che le compongo, con poche righe di codice. 

Può anche essere utilizzata per creare applicazioni interattive, come videogiochi o siti web, o per controllare dispositivi robotici e droni. Man mano che la tecnologia progredisce, gli ambiti di applicazione aumentano in maniera esponenziale e l’unico limite è l’immaginazione.

Come il programmatore interagisce con il computer

Il codice scritto dal programmatore, per funzionare, deve essere eseguito dal processore del computer. Ma umani e macchine parlano due linguaggi differenti, quindi quando un programma viene eseguito, le istruzioni vengono memorizzate nella memoria del computer in un formato noto come codice assembly che viene decodificato dalla CPU in codice binario. Ogni unità di 1 o 0 è chiamata bit e se si raggruppano otto numeri binari (00000000), si ottiene il cosiddetto byte.

I tipi di operazioni che possono essere eseguite dalla CPU includono semplici funzioni matematiche come addizione, sottrazione, moltiplicazione e divisione, ma il processore può anche eseguire confronti tra oggetti di dati per determinare se sono uguali. 

In tutto questo processo, il linguaggio che l’informatico ha utilizzato viene classificato come linguaggio ad alto livello, mentre il linguaggio macchina che il processore decodifica in codice binario è classificato come linguaggio a basso livello.

Ma come si arriva dall’alto livello al basso livello? Ci sono due strade, intrinseche nella natura stessa del linguaggio di programmazione utilizzato. Eh si, perché quando si parla di linguaggi di programmazione, esistono due categorie principali: linguaggi interpretati e linguaggi compilati

Un linguaggio compilato è un tipo di linguaggio di programmazione che viene convertito in linguaggio macchina prima di essere eseguito dal processore. Ad esempio, un'operazione di addizione "+" che abbiamo scritto nel nostro programma ad alto livello, sarà tradotta nell'istruzione ADD (00000010)  del linguaggio macchina.

Nel linguaggio interpretato, invece, le istruzioni non vengono eseguite direttamente dalla macchina di destinazione, ma vengono lette ed eseguite da un altro programma, solitamente scritto nel linguaggio della macchina nativa. Ad esempio, la stessa operazione "+" verrebbe riconosciuta dall'interprete in fase di esecuzione, richiamando la propria funzione "add(a,b)" con gli argomenti appropriati, che eseguirà poi l'istruzione ADD in linguaggio macchina.

Flusso programma 

Normalmente i linguaggi compilati sono più veloci ed efficienti rispetto ai linguaggi interpretati. Tuttavia, poiché il codice deve essere convertito prima di essere eseguito, i linguaggi compilati possono essere più complicati da debuggare e richiedono più tempo per essere sviluppati. 

I diversi tipi di linguaggi di programmazione e il loro utilizzo

Le differenze tra i vari linguaggi di programmazione non si esauriscono a quanto abbiamo appena detto. Non esiste il linguaggio di programmazione "migliore", ma esiste il linguaggio giusto per un determinato compito. Per questo motivo, è importante che i programmatori conoscano una serie di linguaggi diversi, in modo da scegliere lo strumento migliore per il lavoro da svolgere.

Sebbene ogni linguaggio abbia una propria sintassi e semantica, a grandi linee possono essere classificati in alcune categorie principali.

Linguaggi dichiarativi (o logici)

In un linguaggio di programmazione logica, il programmatore specifica una serie di regole, senza specificarne l’ordine, che il computer può poi utilizzare per dedurre nuovi fatti o soluzioni. 

Si tratta di linguaggi caratterizzati da un debugging molto semplice, in quanto il programmatore deve semplicemente dichiarare ciò che vuole che accada e lasciare che il computer capisca come farlo accadere. 

Alcuni popolari linguaggi di programmazione logica includono Prolog e Lisp. Molte applicazioni di AI sono scritte in linguaggi di programmazione logica, in quanto consentono una facile manipolazione di basi di conoscenza complesse.

Linguaggi imperativi

I linguaggi di programmazione imperativi utilizzano comandi per modificare lo stato del computer. Questo contrasta con la programmazione dichiarativa, che utilizza espressioni per descrivere il risultato desiderato senza specificare come raggiungerlo. Esempi comuni di linguaggi imperativi sono C, Cobol e Pascal

In generale, i linguaggi imperativi sono più flessibili di quelli dichiarativi, in quanto consentono al programmatore di controllare l'ordine di esecuzione delle operazioni. Tuttavia, questa flessibilità ha il costo di una maggiore complessità e i linguaggi imperativi sono spesso più complessi da leggere e comprendere rispetto ai dichiarativi. 

Linguaggi funzionali

I linguaggi di programmazione funzionale si basano sul concetto delle funzioni matematiche. Si tratta di un paradigma di programmazione dichiarativo, il che significa che la programmazione viene eseguita con espressioni o dichiarazioni invece che con affermazioni. 

Nel codice funzionale, il valore di uscita di una funzione dipende solo dagli argomenti che vengono inseriti nella funzione, per cui chiamando due volte una funzione f con lo stesso valore per un argomento x, si otterrà ogni volta lo stesso risultato f(x).

I linguaggi di programmazione funzionale tendono a supportare funzioni di ordine superiore, cioè funzioni che prendono altre funzioni come argomenti o le restituiscono come risultati. Questi costrutti linguistici consentono ai programmatori di applicare le funzioni in modi che non sono possibili nei linguaggi imperativi. 

La programmazione funzionale affonda le sue radici nel lambda calculus, un sistema formale sviluppato negli anni '30 per studiare la definizione di funzioni, l'applicazione di funzioni e la ricorsione. Un altro noto paradigma dichiarativo è la programmazione logica; alcuni linguaggi funzionali ne hanno preso in prestito le idee. Spesso i linguaggi funzionali sono utilizzati come un modo per garantire uscite corrette o evitare effetti collaterali indesiderati da codice scritto in altri stili. Per esempio, il codice Scheme (un dialetto di lisp) può essere incorporato nei programmi C++ per controllare i dati inseriti dagli utenti e assicurarsi che soddisfino i criteri specificati prima di essere utilizzati nell'ambito di operazioni potenzialmente non sicure eseguite dal resto del programma.

Linguaggi orientati agli oggetti

I linguaggi di programmazione orientati agli oggetti (OOP) sono progettati per incapsulare il codice all'interno degli oggetti. Questo incapsulamento consente un riutilizzo più efficiente del codice e la modularità, di conseguenza, i linguaggi OOP sono spesso più facili da leggere e mantenere rispetto ai linguaggi procedurali. 

I linguaggi OOP più comuni sono Java, C++ e Python e sebbene ognuno ha la propria sintassi e le proprie convenzioni, tutti condividono lo stesso principio di base dell'incapsulamento del codice. I linguaggi OOP sono particolarmente adatti per i progetti che richiedono strutture di dati complesse.

I linguaggi orientati agli oggetti consentono ai programmatori di creare anche gerarchie di ereditarietà, che possono rendere il codice più modulare e più facile da mantenere. Inoltre, i linguaggi orientati agli oggetti di solito forniscono un supporto per il polimorfismo, che consente agli oggetti di essere utilizzati in una varietà di contesti diversi. 

Linguaggi di scripting

I linguaggi di scripting (anche detti linguaggi batch) hanno lo scopo di automatizzare compiti lunghi e ripetitivi. Attraverso un batch è possibile salvare una serie di comandi all’interno di un file che viene eseguito come comando composto. I primi linguaggi di scripting sono stati quelli delle shell Unix, successivamente, molti altri programmi interattivi hanno cominciato a permettere il salvataggio e l'esecuzione di file contenenti liste di comandi.

Elementi comuni nei linguaggi di programmazioni

È impressionante il numero dei diversi linguaggi di programmazione, ognuno con la propria sintassi, le proprie keywords e le proprie regole. Tuttavia, nonostante la grande quantità di variazioni, ci sono anche molti punti in comune. Ad esempio, la maggior parte dei linguaggi di programmazione supporta una qualche forma di tipo di dati, come numeri interi, stringhe e valori booleani. Inoltre, la maggior parte dei linguaggi di programmazione offre un modo per controllare il flusso di esecuzione, utilizzando costrutti come le istruzioni if/then/else.

Analizziamo cinque componenti fondamentali condivisi dalla quasi totalità dei linguaggi di programmazione: variabili, operatori, cicli e funzioni.

Variabili

Le variabili sono nomi che si riferiscono a valori specifici e possono essere utilizzate per memorizzare dati o rappresentare calcoli. Ad esempio, nel programma per calcolare la retribuzione di un dipendente su base mensile, una possibile variabile sarebbe il numero di giorni che compongono il mese. Il valore sarà modificato in 28 per febbraio o 31 per giugno. 

Le variabili possono  contenere anche un insieme di dati, in questo caso parliamo di array, un tipo di struttura di dati che memorizza una collezione di valori. Ogni valore in un array è chiamato elemento e si può accedere agli elementi tramite il loro indice, che è la posizione dell'elemento nell'array. Gli array sono spesso utilizzati per memorizzare elenchi di dati, come elenchi di nomi o di numeri. 

Operatori

Gli operatori sono simboli speciali che indicano al programma di eseguire una determinata operazione su uno o più valori. Gli operatori sono tipicamente utilizzati nelle espressioni matematiche e logiche. Ad esempio, l'operatore di addizione (+) indica allo script di aggiungere due valori mentre l'operatore di divisione (/) indica al programma di dividere due valori. 

Esistono diversi tipi di operatori e ognuno ha uno scopo specifico. Gli operatori matematici sono utilizzati per eseguire addizioni, sottrazioni, moltiplicazioni e divisioni. Gli operatori logici sono utilizzati per confrontare due valori e determinare se uno è maggiore, minore o uguale all'altro. Gli operatori condizionali sono utilizzati per eseguire un determinato blocco di codice solo se una certa condizione è soddisfatta. L'operatore più comune è l'operatore di assegnazione (=), che assegna un valore a una variabile. 

Cicli

I cicli vengono utilizzati per ripetere un blocco di codice per un certo numero di volte. Ad esempio, un programma può eseguire una serie di istruzioni più e più volte fino a quando non si verifica una determinata condizione. Oppure, un programma può eseguire una serie di istruzioni in modo regolare, ad esempio ogni minuto o ogni ora. 

I cicli possono essere utili per eseguire compiti ripetitivi, come l’invio di email agli utenti iscritti ad una newsletter o la cancellazione di un certo numero di elementi. 

Condizioni

Le dichiarazioni condizionali vengono utilizzati per eseguire il codice solo se vengono soddisfatte determinate condizioni. Esistono tre tipi principali di operatori condizionali: l'istruzione if, l'istruzione switch e l'operatore ternario. L'istruzione if è la forma più elementare di operatore condizionale, verifica se una certa condizione è vera o falsa, e poi esegue una serie di istruzioni in base al risultato. L'istruzione switch è simile all'istruzione if, ma può verificare più condizioni e può eseguire diversi set di istruzioni per ciascuna condizione. L'operatore ternario è una forma più concisa dell'istruzione if, verifica una determinata condizione e restituisce un valore se la condizione è vera e un altro valore se la condizione è falsa. 

Funzioni

Una funzione è un pezzo di codice che viene scritto per eseguire un compito specifico e riutilizzato in un altro ambito del programma. Questa caratteristica rende la scrittura del codice più efficiente ed elimina la necessità di riscrivere lo stesso codice. 

Le funzioni possono anche essere utilizzate per raggruppare altre funzioni, in modo che sia più facile leggere il codice.

Imparare a programmare con i diagrammi di flusso

Prima di buttarsi a capofitto nello studio di un linguaggio di programmazione e della sua relativa sintassi, è altamente consigliato esercitarsi sugli approcci per risolvere un problema logico. A parere di chi scrive, uno ottimo strumento per allenare la mete è il diagramma di flusso

Un diagramma di flusso è una rappresentazione grafica di un processo o flusso di lavoro, in genere utilizzato per rappresentare un algoritmo, una procedura o un sistema. Sono comunemente utilizzati in ambito aziendale, ingegneristico e nello sviluppo di software per documentare, progettare e comunicare sistemi o processi complessi.

I diagrammi di flusso possono essere creati utilizzando una varietà di forme e simboli diversi e di solito sono costituiti da una serie di fasi o nodi collegati. Un ottimo programma per utilizzarli è Diagrams.net

Diagramma di flusso

Di quali programmi abbiamo bisogno per programmare

Per programmare abbiamo bisogno di alcuni elementi. Innanzitutto, ci servirà un IDE (Integrated Development Environment  - Ambiente di Sviluppo Integrato). Si tratta di un'applicazione che fornisce un ambiente completo per lo sviluppo di software. Di solito include un editor di codice, un compilatore o interprete e un debugger

Visual Studio è una scelta popolare per molti programmatori e sviluppatori grazie alla sua ampia gamma di funzioni e alla sua facilità d'uso. Offre un potente editor di codice che può essere utilizzato per scrivere e fare il debug del codice, oltre a una serie di strumenti che possono aiutare nella gestione dei progetti e nella collaborazione. Visual Studio supporta diversi linguaggi di programmazione, il che lo rende una scelta versatile per molti sviluppatori.

Inoltre, il Marketplace di Visual Studio offre una vasta gamma di estensioni e componenti aggiuntivi che possono personalizzare ulteriormente l'ambiente di sviluppo. Nel complesso, Visual Studio è un potente IDE di sviluppo che può essere personalizzato per soddisfare le esigenze di qualsiasi programmatore o sviluppatore.

Come trovare un buon corso di programmazione e iniziare a imparare

Al giorno d'oggi esistono molti modi diversi per imparare la programmazione. Con così tante risorse disponibili, può essere difficile sapere da dove iniziare. Se stai cercando un buon corso di programmazione, ci sono alcune cose da tenere a mente. Innanzitutto, considera il tuo livello di esperienza

Se sei un principiante assoluto, devi cercare un corso che copra le basi. D'altra parte, se hai già familiarità con alcuni concetti di programmazione, potresti voler trovare un corso che tratti argomenti più avanzati. In secondo luogo, pensa al formato del corso. Alcuni corsi sono autogestiti e ti permettono di lavorare al tuo ritmo, mentre altri sono più strutturati e prevedono compiti e scadenze regolari. Scegli il formato più adatto al tuo stile di apprendimento. Infine, assicurati che il corso sia tenuto da docenti esperti in grado di rispondere alle tue domande e di aiutarti a risolvere i problemi che incontri. Tenendo a mente questi fattori, dovresti essere in grado di trovare il corso di programmazione più adatto a te.

Consigli per rimanere motivati mentre si impara a programmare

Chiunque abbia provato a imparare un linguaggio di programmazione può testimoniare che non è un compito facile. Tra la complessa sintassi e la vertiginosa serie di concetti da padroneggiare, non c'è da stupirsi che molte persone rinuncino prima ancora di scrivere una riga di codice. Tuttavia, ci sono alcune cose che puoi fare per rimanere motivato mentre impari a programmare. Innanzitutto, è importante fissare degli obiettivi realistici. Cercare di imparare troppe cose in una volta sola porterà solo alla frustrazione. Invece, suddividi il compito in parti più piccole e concentrati su una cosa alla volta. In secondo luogo, non aver paura di chiedere aiuto. Ci sono moltissime risorse disponibili, sia online che offline, che possono offrire assistenza e supporto. Infine, ricorda che gli errori fanno parte del processo di apprendimento.

Non scoraggiarti se non riesci a fare bene la prima volta: tutti sbagliano. Continua a lavorare e vedrai che alla fine ci riuscirai. 

Approfondimenti

  1. Corso di programmazione PHP
  2. Imparare a programmare con Laravel
  3. Guida per programmare con React
Condividi