Torna al corso

Corso preparatorio per colloquio sugli algoritmi

Realizato da

Pubblicato il

programmazione

colloquio

hackerrank

algoritmi

strututre

dati


Ciao a tutti e benvenuti in questa nuova serie di mini tutorial su come risolvere vari coding challenge come quelli visti su: Hackerrank, TopCoder, LeetCode, ProjectEuler, etc..

Se avete mai fatto domanda per una posizione di lavoro da sviluppatore o avete partecipato a qualche torneo di programmazione competitiva, probabilmente avete ricevuto un qualche tipo di sfida sotto forma di coding challenge da risolvere entro un tot di tempo. Risolvere questi problemi non è facile, e molti si arrendono senza prima provare. Ma con la giusta pratica e con della dedicazione, qualsiasi persona può imparare a risolvere i più difficili dei problemi. Il segreto risiede nella mentalità dello sviluppatore e nella sua esperienza. Per questo bisogna fare molta pratica, risolvendo almeno 3 o 4 challenge a settimana se non di più.

Lo scopo di questa serie di guide è quello di dare a voi lettori un’idea migliore su come approcciare questi tipi di problemi e su come sviluppare il tipo di mentalità adatto per risolvere vari tipi di problemi di programmazione in modo efficace.

Come risolvere un coding challenge

- Conoscenza

La vostra automobile si è fermata in mezzo all’autostrada non avete il telefono con voi e non sapete come uscire fuori da questa situazione. Quando andate ad ispezionare meglio il motore notate che vi sono cavi fuori posto e fumo ovunque. Non avete mai studiato la meccanica e non avete idea di come funziona un’automobile, e vi fate prendere dal panico.

Anche se aveste i giusti attrezzi con voi, aggiustare il motore della macchina sarebbe quasi impossibile dato che non avete le conoscenze basilari e non sapreste da dove cominciare.


Questo esempio anche se banale, può rendere un’idea di come si può sentire uno sviluppatore quando gli viene posto davanti un problema di programmazione competitiva il quale non è in grado di risolvere. Il motivo per cui la maggior parte dei programmatori falliscono nel trovare una soluzione per un coding challenge sta nel fatto che queste persone molto probabilmente non hanno una conoscenza approfondita di concetti come: algoritmi e strutture dati.


Una delle idee più sbagliate, ma abbastanza comune tra i sviluppatori, è che questi tipi di problemi possono essere risolti con un minimo intelligenza generale ed una mente logica. Si, è vero che bisogna essere una persona analitica e capace di pensare in maniere logica, ma questo non basta. Almeno che questa persona non sia un genio con una intelligenza particolarmente acuta, la maggior parte delle persone non saranno in grado di risolvere un coding challenge di un certo livello senza aver studiato precedentemente. 

Per questo è necessario studiare e conoscere in dettaglio il funzionamento di vari algoritmi e strutture dati e saper implementarli dove sono richiesti.


- Comprensione 


Potete anche conoscere perfettamente la complessità spazio-temporale dietro ad ogni algoritmo, ma se non avete esperienza pratica con questi algoritmi non sarete mai in grado di sviluppare un senso di comprensione totale. Quante volte avete pensato di comprendere il funzionamento di un algoritmo o un processo che avete letto in qualche articolo, per poi andare ad implementare il codice e trovarvi persi nella sua complessità? 

Per questo bisogna implementare questi concetti il più possibile, che sia nella forma di un coding challenge o qualcosa di più concreto come un progetto completo. 

Un altro modo per imparare a pieno i concetti dell’informatica sta nell'insegnare il concetto stesso a qualcun altro. Se siete in grado di spiegare il funzionamento di un algoritmo o struttura dati ad un vostro amico in modo da farglielo capire, molto probabilmente avete una conoscenza profonda di questo concetto.


- Analisi


Analizzare un problema è forse la parte più difficile da imparare. Per fare ciò, lo sviluppatore ha bisogno di imparare ad osservare un problema da vari punti di vista e di essere in grado di pensare fuori dagli schemi. Molto spesso un problema apparentemente impossibile da risolvere diventa quasi ovvio quando viene osservato da un punto di vista diverso. 

Ho letto una volta un problema su un libro molto affascinante e consigliato da Bill gates chiamato:  I numeri non sbagliano mai: Il potere del pensiero matematico

In questo libro viene raccontata una storia che a mio parere spiega molto bene la linea di pensiero che deve essere assunta da uno sviluppatore.

Ecco il problema:

Abraham Wald, un matematico che lavorava per il governo Americano durante la seconda guerra mondiale viene approcciato da un ufficiale che gli dice: “Abbiamo un problema: i nostri aerei tornano dalla battaglia con i motori in perfette condizioni ma con la coda piena di buchi. Se mettiamo troppa armatura sulla coda, l’aereo diventa troppo pesante per volare. Puoi aiutarci a trovare una soluzione per rinforzare le code dei nostri arei in modo efficace?” 

Abraham risponde: “No

Quando Abraham vede lo sguardo confuso dell’ufficiale si presta a dargli una spiegazione: 

L’armatura va messa dove non ci sono buchi! Chiaramente gli aerei che vengono colpiti nella coda fanno ritorno alla base militare. Il tuo problema sta negli aerei che vengono colpiti nel motore, questi sono quelli che non fanno ritorno!


Questa storia mostra come un programmatore dovrebbe affrontare un problema e come alcuni punti di vista possono portarci sulla strada sbagliata.

Nelle prossime parti del corso andremo ad analizzare alcuni tipi di problemi presi da HackerRank per darvi un’idea del processo da seguire per risolvere questi tipi di coding challenge per la programmazione competitiva.

Ci vediamo alla prossima :)