Come essere un grande programmatore

Cosa distingue i programmatori davvero eccezionali?

Come tutti sappiamo, i grandi programmatori creano funzionalità, siti Web, app e simili straordinari. Ma cosa hanno in comune?

Nella mia ricerca, non si tratta solo di conoscere molto bene una lingua o di avere un particolare background educativo. È che i programmatori davvero talentuosi hanno imparato i fondamenti. Quella base è ciò che consente loro di costruire grandi cose e trovare idee innovative.

Pensa a una piramide. Ha una base larga, ma diventa gradualmente più piccola e sottile verso l’alto. L’apprendimento dei fondamenti della programmazione costituisce quella base. Tutto parte da lì.

Quindi quali sono questi fondamentali? Sulla base della mia esperienza e dei programmatori di cui ho fatto ricerche, vedo i fondamentali della programmazione come un approccio in due parti.

Straordinario risolutore di problemi

In primo luogo, devi essere un risolutore di problemi efficace. Questo è un punto importante da cui iniziare poiché la programmazione è per la risoluzione di problemi.

Sebbene ci siano molti modi per risolvere un problema, ci sono alcune parti del processo che mi hanno colpito. I programmatori che sono anche grandi risolutori di problemi distillano un problema nella sua essenza, al fine di identificare il loro scopo generale e iniziare un problema con uno scopo. Quindi, suddividono ogni problema in parti piccole e gestibili, attaccando ciascuna parte a turno e talvolta in termini visivi disegnando un’immagine per renderla “mondo reale”.

Il processo è più difficile di quanto sembri. Quando ho iniziato a programmare ho sbattuto contro un muro: come tanti, non ho mai imparato a risolvere i problemi a scuola; è un’abilità che non viene insegnata prontamente. Mi è stato dato un problema impostato durante la lezione di matematica e mi sono tuffato, che è quello che ho fatto quando ho iniziato a programmare. Non sorprende che stavo facendo girare le ruote inutilmente e ho incontrato blocchi stradali nel più semplice dei problemi.

Le cose hanno iniziato a cambiare quando ho iniziato a conoscere il processo di risoluzione dei problemi e come risolverli in modo efficace. Ora inizio un problema con l’intento. Devo ringraziare il libro di George Polya, Come risolverlo per questo consiglio.

Ho adattato alcune delle idee di Polya alla programmazione, come capire il problema. “Il problema deve essere compreso”, scrive Polya. Ciò include la capacità di “evidenziare le parti principali del problema, l’ignoto, i dati e la condizione”. Per ogni problema tiro fuori un foglio di carta e scrivo le risposte a queste domande: cosa sto risolvendo o cercando di trovare? (sconosciuto); cosa mi viene dato? (dati); e di quali vincoli o dettagli devo essere a conoscenza? (condizione).

Comprendere il problema può sembrare ovvio, ma l’ovvio è facilmente trascurato. In più di un’occasione, ho investito ore in un problema solo per rendermi conto molto più tardi di aver perso un piccolo ma critico dettaglio nell’affermazione del problema. Scrivere i dettagli del problema mi rallenta mentalmente e mi aiuta a pensare esattamente a ciò che devo fare, che è metà della battaglia.

Da lì, preparo un piano, che è un altro dei suggerimenti di Polya. Ha senso. Scrivo uno schema prima di scrivere un articolo. Un artista fa uno schizzo del dipinto prima di lavorare sul dipinto stesso. Un costruttore utilizza disegni e progetti per costruire una casa. Non è diverso con la programmazione. Invece di affrettarmi a fare , devo iniziare pensando a ciò che intendo fare e fare un piano di attacco.

Ci sono molti modi per farlo. A volte delineo i passaggi che devo compiere in ordine numerico: prima fai questo, secondo fallo. Altre volte faccio visivamente il problema. Quando stavo imparando a conoscere i cicli for, ho tirato fuori una manciata di mandorle e ho ripetuto fisicamente la pila. È un esempio sciocco, ma mi ha aiutato a riflettere sul problema.

Traccio anche immagini o diagrammi. Per un problema ricorsivo, traccerò un diagramma di ciò che sta accadendo a ciascuna chiamata ricorsiva fino a quando non raggiungerò il caso base. Quasi sempre, però, trovo un modo per semplificare il problema per renderlo più gestibile e per aiutarmi a individuare uno schema. Soprattutto, lo scopo per me è quello di affrontare un problema con uno scopo e mantenerlo per tutto il tempo.

Nonostante i migliori piani fatti, i problemi sono ancora duri e continuo a rimanere bloccato. Diventare un grande risolutore di problemi richiede tempo; è un’abilità su cui sto ancora lavorando e ne vale sicuramente la pena. È una differenza che puoi vedere.

Quando leggo il codice scritto da un grande risolutore di problemi, è chiaro e facile da capire. Le variabili sono ben denominate. Le funzioni sono brevi e nitide. Ogni riga di codice ha uno scopo specifico; la lanugine viene rimossa. La chiarezza del codice rispecchia il processo di pensiero del programmatore: posso leggere il programma dall’alto verso il basso e sapere esattamente cosa sta succedendo. È un ottimo modo per risolvere i problemi, ed è per questo che cerco.

E il tuo computer?

L’apprendimento dell’informatica è la seconda fondamentale della programmazione. Recentemente ho iniziato a studiare informatica e mi piace perché mi sto muovendo oltre il livello superficiale. Vado “dietro le quinte” per imparare cosa succede quando utilizzo una funzione incorporata, ad esempio. Sto anche imparando a conoscere la memoria e il tempo di esecuzione, tra molti altri argomenti. In breve, sto imparando perché un computer fa le cose che fa.

Conoscere il “perché” migliora la mia conoscenza contestuale e mi rende un programmatore più informato. Di conseguenza, sono più attento al codice che scrivo. Ora che conosco un po ‘il tempo di esecuzione, ad esempio, sceglierò di utilizzare una ricerca binaria invece di scorrere ogni elemento in un elenco.

Inoltre, arricchisce la mia comprensione del funzionamento dei concetti fondamentali di programmazione. Ad esempio, stavo lavorando a un problema ricorsivo e non stavo ottenendo la soluzione che avevo previsto. Dopo un attento esame, ho capito il motivo: aveva a che fare con l’esecuzione dello stack di chiamate, un’idea che mi sarebbe sfuggita solo pochi mesi fa.

Oppure segui dei corsi. Ho lottato immensamente con le lezioni per molto tempo ed ero terrorizzato all’idea di usarne uno. Sapevo come scrivere un corso, ma non ero sicuro di quando e perché ne avrei usato uno. Ciò è cambiato quando ho appreso cosa succede effettivamente nel mio computer quando creo istanze e chiamo metodi. Alla fine ha fatto clic, una volta che ho avuto un contesto. Sia per la ricorsione che per le lezioni, l’informatica ha colmato le mie lacune.

Troppo spesso i fondamentali vengono messi da parte. Il progresso può essere lento e le persone tendono a scegliere cose più “divertenti” su cui lavorare quando ne hanno la possibilità. È un peccato. I programmatori che padroneggiano i fondamenti sembrano programmare con sicurezza: conoscono il “come” e il “perché” delle loro scelte di programmazione, il che migliora il loro lavoro e costruisce la loro credibilità con gli altri.

Inoltre, una solida conoscenza dei fondamenti rende più facile l’apprendimento di nuove lingue e tecnologie. Ad esempio, dedicare del tempo alla comprensione di concetti fondamentali come iterazione, ricorsione e astrazione con una lingua aiuterà quando si impara un’altra. In poche parole, c’è molto da guadagnare e poco da perdere padroneggiando i fondamenti.

Sono uno scrittore ( amymhaddad.com ) e un programmatore principiante.