Hash Code: suggerimenti utili - GDG Torino

Suggerimenti per affrontare al meglio la competizione

Marco Terrinoni
GDG Torino
7 min readFeb 14, 2017

--

https://hashcode.withgoogle.com/

E così hai deciso di partecipare insieme al tuo team alla nuova edizione di Hash Code, la competizione sponsorizzata da Google dove vi viene richiesto di risolvere problemi reali implementando soluzioni di codice innovative?

Ottima scelta!

Sicuramente avrai già letto altri report che approfondiscono i vari termini della competizione e come si articola, mentre ora magari ti stai chiedendo se sarai in grado di superare la sfida. Beh, siamo sinceri, Hash Code non è una competizione semplice e i problemi proposti non sono sempre di immediata risoluzione (il più delle volte sono problemi NP). Il che, se ci pensate, rende ancora più interessante la sfida!

https://imgs.xkcd.com/

Tralasciando le informazioni logistiche dell’evento, passiamo in rassegna qualche suggerimento interessante che potrà tornarti utile durante le fasi concitate della competizione.

#1: costruisci il tuo team

Ok, immagino in realtà tu abbia già trovato il tuo team, per cui non dovrai cercare ancora tra amici, colleghi o vecchi compagni di corso. Tuttavia, indipendentemente dalla natura della sfida che andrete ad affrontare, è importante ricordare che la sinergia tra i membri di un team è fondamentale per ottenere buoni risultati. Organizza una o più sessioni di Team Building prima dell’evento, al termine delle quali potrete affrontare in tutta calma il problema di prova o recuperare quelli degli anni scorsi, chiudendo il tutto con una bella pizza in compagnia.

http://www.freepik.com/

Nonostante Hash Code richieda di risolvere problemi tramite l’implementazione di un algoritmo, non è fondamentale che siano tutti Ninja Coders; è importante tuttavia che ogni persona all’interno del team capisca il codice scritto, in modo tale da poter dare sempre consigli utili e riuscire a strutturare tutti i meccanismi che stanno dietro la vostra soluzione.

#2: organizza i task e gestisci il tempo

Hash Code ha una durata limitata e, come dicevo prima, i problemi non sono di immediata risoluzione. Riuscire a comprendere il problema e suddividerlo in sotto-task è fondamentale ma altrettanto importante è riuscire a gestire questi sotto-task tra i membri del team. Il tempo è tiranno, per cui ognuno deve aver compreso bene cosa deve fare; capite quali sono i sotto-task più critici e risolvete prima quelli. Avanzate per step progressivi, tenendo sempre in mente l’obiettivo finale.

Se può esserti d’aiuto, scrivi i vari task sui Post-it, oppure crea una board personalizzata con Trello.

#3: scegli il linguaggio che preferisci

https://commons.wikimedia.org/

Non importa se insieme al tuo team sceglierete di implementare la vostra soluzione usando JavaScript, Ruby o BrainF*ck, l’importante è che tutti conoscano il linguaggio di programmazione selezionato. Linguaggi come JavaScript e Python sono forse più indicati in caso di prototipazione o rilasci veloci, proprio grazie alla loro dinamicità; linguaggi come Java o C++ possono invece essere più stabili ma leggermente più complessi da gestire. Alla fine ognuno ha le sue preferenze, quindi indipendentemente dal fatto che un linguaggio sia maggiormente indicato per un ambito piuttosto che un altro, l’importante è che tu e il tuo team abbiate una buona pradonanza e sappiate usarlo più o meno bene. Io personalmente userò Java insieme a Gradle.

Se ancora te e il tuo team foste indecisi potete sempre prendere spunto dalla storia Come Salvare la Principessa in 8 Linguaggi di Programmazione!

#4: preparati un progetto di base

Una volta scelto il linguaggio di programmazione potrai cominciare a strutturare un progetto di base vuoto, in modo tale da averne uno già pronto durante le fasi iniziali di Hash Code (risparmiando così un sacco di tempo prezioso).

In realtà strutturarsi un progetto di base è cosa da poco; posso suggertirti infatti di dare un’occhiata a questa pagina StackOverflow, dove suggeriscono il comando base di Gradle da inserire per creare automaticamente un progetto, oppure lo Spring Initializr, che ti permette di creare un progetto Spring Boot; ovviamente puoi anche far eseguire questo compito al tuo IDE preferito, evitando di inserire comandi da terminale.

Quello che veramente conta tuttavia è cominciare a scriversi dei metodi di utility che possono far risparmiare un sacco di tempo durante la competizione e che, sicuramente, serviranno per le operazioni ricorrenti. Un esempio su tutti è rappresentato dalle funzionalità di lettura e scrittura su file. Se dai un’occhiata alle prove degli anni scorsi, il problema contiene sempre una sezione iniziale in cui vengono raccolti tutti i dati di partenza; questi dati vengono poi elaborati e il risultato viene salvato su un altro file, il quale sarà di fatto lo stesso che passerai al Judge System per la validazione finale. Queste fasi di input e output sono molto comuni e si ripetono praticamente sempre in Hash Code, per cui potete sicuramente scrivervi due porzioni di codice: la prima che riesca a leggere numeri e stringhe da un file, la seconda che sia in grado di scrivere, sempre su file, il risultato della vostra elaborazione. Ovviamente col tuo team dovrete andare a modificare questi due pezzi di codice in base alle specifiche del problema di Hash Code ma sarà comunque meno dispendioso che andarsi a riscrivere tutto da capo.

Per facilitarti il compito di creare un progetto base di partenza, potrai trovare a questo indirizzo uno starter project scritto in Java, dove potrai trovare già implementate le varie parti che si occuperanno di fare I/O, oltre ovviamente alla struttura già predisposta per l’implementazione dell’algoritmo.

#5: usa GitHub

Che tu sia uno studente o un Senior Ninja Coder, saprai senza ombra di dubbio che salvare il tuo codice e poterlo gestire in tutta tranquillità è una comodità non da poco. Esistono diverse tecnologie che ti permetto di fare quello che si chiama Version Control e quella più famosa è senza dubbio Git. GitHub è una piattaforma cloud che permette di gestire i propri progetti sfruttando Git, avendo allo stesso momento la possibilità di visionare e condividere il codice sorgente tra più persone, risparmiando a te e al tuo team lo sbattone di passarvi il codice con una chiavetta USB (Nope!). Quando comincerai veramente a scrivere codice insieme al tuo team sarà fondamentale che non ci siano strani conflitti nei file e che tutti possano essere allineati sul codice scritto. Git (e quindi anche GitHub) serve proprio a questo, oltre ovviamente a darti la possibilità di avere tutto il codice in un unico posto.

https://github.com/

Anche qui in realtà, come per i linguaggi di programmazione, la scelta se usare GitHub, GitLab, Bitbucket o qualsiasi altro sistema di versionamento sta al tuo team, in base alla dimestichezza e l’esperienza complessiva che avete. Se invece siete tutti alle prime armi ti consiglio di seguire questo tutorial di GitHub, che elenca i concetti fondamentali per imparare a usarlo in scioltezza.

#6: scrivi codice in maniera chiara e semplice

Indipendentemente dal fatto che tu scriva programmi da solo o in un team, è fondamentale che il tuo codice sia il più chiaro e semplice possibile, di facile comprensione! Durante Hash Code avrai poco tempo a disposizione e sarà quindi fondamentale rispettare alcune linee guida sulla buona scrittura di codice; così facendo sarà ben chiaro a tutti qual è l’obiettivo finale di ogni metodo e lo scopo di ogni variabile dichiarata. Cerca quindi di scrivere codice in maniera lineare, intuitiva; dai dei nomi alle variabili che abbiano un senso, non solo a, b, foo o pippo.

Un forte suggerimento che posso darti è quello di seguire il principio K.I.S.S. ossia Keep It Simple, Stupid. In altre parole: non perdere tempo a cercare soluzioni troppo complesse o di difficile interpretazione; se insieme al tuo team riuscirai subito a scrivere del codice semplice e funzionante, avrai poi più tempo per cercare possibili ottimizzazioni!

http://tech.co/simplicity-2013-12

Ovviamente questa è solo una piccola parte delle best practice che potrai applicare durante la competizione; tieni presente comunque che l’importante è divertirsi e passare una serata diversa insieme al tuo team!

Bene, ora sei pronto a registrarti per Hash Code e ricorda che se sei a Torino noi del GDG abbiamo organizzato un Hub proprio per accogliere team come il tuo; selezionalo durante la fase di creazione del tuo team! Potrai chiedere consiglio a me o agli altri mentor che saranno a tua disposizione per aiuti e chiarimenti, oltre ovviamente al canale diretto con Google tramite questo indirizzo.

Ci vediamo I3P!

Un grazie a tutti coloro che mi hanno supportato durante la stesura e la revisione di questo articolo.

--

--

Marco Terrinoni
GDG Torino

Software Engineer and Software Architect at Intesa Sanpaolo Bank