• Ms Tech / Advent of Code

Il puzzle di Natale piace ai programmatori

Entro il 25 dicembre, migliaia di persone in tutto il mondo stanno cercando di venire a capo di Advent of Code, una sfida annuale tra informatici per risolvere mini problemi di programmazione proposti sulla falsariga del calendario dell’Avvento.

di Siobahn Roberts 20-12-21
A mezzanotte del 1° dicembre 2015, quando Eric Wastl ha lanciato per la prima volta Advent of Code, si sono iscritte 81 persone. Più o meno il numero di partecipanti a cui aveva pensato. Ma Wastl, un ingegnere del software che lavora come architetto senior per TCGPlayer, un mercato online per giochi di carte collezionabili, non poteva immaginare come i social media avrebbero modificato la situazione. In 12 ore i partecipanti erano saliti a 4.000. Il server è quasi andato in crash. Dopo 48 ore, ci si era attestati sui 15.000 e alla fine dell'evento, il 25 dicembre, il totale complessivo era di 52.000. L'anno successivo, ha spostato l'operazione su Amazon Web Services e da allora i numeri hanno continuato a crescere.

L'anno scorso, forse a causa della pandemia, l'evento ha visto un aumento del traffico del 50 per cento, con oltre 180.000 partecipanti in tutto il mondo. E anche quest'anno, migliaia di programmatori da un capo all'altro del mondo, studenti, ingegneri del software e programmatori competitivi, stanno facendo il conto alla rovescia per il Natale con Advent of Code (AoC). Mentre i calendari dell'Avvento tradizionali offrono regali quotidiani di cioccolato o giocattoli (e alcune versioni alternative offrono dolcetti per cani, Jack Daniel's, mattoncini Lego o persino sorprese digitali tramite app), chi partecipa ad AoC si trova davanti a problemi matematici e scrive mini-programmi per computer per risolverli.

Il divertimento sta in parte nella “magia” consacrata dal tempo di un rituale festivo e in parte nel tipo di sfide proposte. Peter Norvig, il direttore della ricerca di Google, lo trova divertente perché ha fiducia nelle capacità di Wastl di rendere stimolante il gioco, senza andare oltre un limite accettabile di difficoltà.
 
La gioia di programmare

A mezzanotte, ora della costa orientale degli Stati Uniti (Wastl risiede a Buffalo, New York), ogni notte dall'1 al 25 dicembre, un nuovo pezzo del puzzle si accende su adventfcode.com, incorporato in una narrativa natalizia abilmente composta, anche se palesemente pretestuosa.

L'evento di quest'anno è iniziato con gli elfi di Babbo Natale che hanno perso le chiavi della slitta. Il contesto narrativo del primo problema è il seguente: “Stai tranquillamente in mare su una nave quando scatta l'allarme! Corri a vedere se puoi aiutare. A quanto pare uno degli Elfi è inciampato e ha accidentalmente fatto volare le chiavi della slitta nell'oceano!”. Fortunatamente, gli Elfi avevano un sottomarino a portata di mano proprio per queste emergenze, e da lì i partecipanti sono partiti per una ricerca subacquea di 25 giorni. Cercano di risolvere due enigmi al giorno (il secondo più complesso), la cui soluzione fa guadagnare una stella dorata e qualche lode.

Il primo giocatore che ottiene una stella riceve 100 punti, il secondo 99 e così via. Per salvare il Natale si devono ottenere tutte e cinquanta le stelle entro il 25 dicembre. Lo scopo di AoC è risolvere gli enigmi usando il linguaggio di programmazione preferito (Python è il più popolare). Per venire a capo dei problemi, i partecipanti si appoggiano a strumenti come "Excel madness" e un numero sorprendente utilizza Minecraft.

Ma la motivazione varia da giocatore a giocatore. Alcuni  trattano il gioco come una messa a punto annuale per le loro capacità di programmazione, altri lo vedono come l'occasione perfetta per imparare a programmare o provare un nuovo linguaggio. José Valim, creatore del linguaggio di programmazione Elixir, trasmette in live streaming le sue soluzioni AoC su Twitch.

In cima alla classifica dei 100 giocatori con il punteggio totale più alto, i programmatori competitivi come Brian Chen (il suo nome è "betaveros") e Andrew He ("ecnerwala") sono interessati alla velocità. Ingegnere del software di sicurezza che lavora alla crittografia end-to-end presso Zoom, Chen si è classificato primo l'anno scorso (e l'anno prima), mentre He è arrivato secondo. "Andare veloce è importante", dice Chen, "per ottimizzare processi che prevedono feedback abbastanza immediati”. 

Entrambi ex studenti di informatica del MIT, Chen e He sono buoni amici che hanno gareggiato insieme in sfide di programmazione nel corso degli anni, nello stesso team all’International Collegiate Programming Contest (ICPC) e come concorrenti a Codeforces e Codice Jam di Google. Anche quest'anno Chen sta battendo He. "Ad essere onesti, è leggermente più bravo di me, soprattutto nell’uso di implementazioni che ottimizzano la velocità", dice He, un ingegnere fondatore della startup Modal, che si occupa di infrastrutture e strumenti per i team di dati.

Un gioco assai competitivo

La classifica finale è fuori portata per la maggior parte dei partecipanti, soprattutto perché i puzzle diventano più difficili di giorno in giorno. Kathryn Tang, che gestisce un team di operazioni di ingegneria presso Shopify, si è classificata 36ima il primo giorno ed era ancora 81ima al terzo giorno, ma sapeva che la sua posizione in classifica non sarebbe durata a lungo. "Lo sto facendo per divertimento usando i fogli di Google", dice.

I quesiti del concorso, tuttavia, vengono riproposti a Shopify e Google e in molte aziende grandi e piccole, con classifiche private e canali di chat dedicati in cui i giocatori condividono soluzioni e si confrontano sui problemi. "La competitività aiuta l'impegno", ha affermato l'ingegnere Alec Brickner, commentando in un canale Slack su Primer.ai, una startup di elaborazione del linguaggio naturale a San Francisco. John Bohannon, direttore scientifico di Primer, ama anche la storia "stupida" che ospita i problemi, anche se la trama ha poca o zero utilità. "I risolutori preda del demone della velocità ignorano completamente la storia, concentrandosi sulle variabili del problema da risolvere”, spiega.

Nora Petrova, data scientist e ingegnere presso l'ufficio di Primer a Londra, ama partecipare. “Per esempio”, racconta, “il quarto giorno, un calamaro gigante si è attaccato al sottomarino per giocare a bingo. L'input del problema era un insieme casuale di 100 tabelloni da bingo e la sfida consisteva nel prevedere il tabellone vincente e darlo al calamaro.


La motivazione principale di Wastl nella creazione di Advent of Code è stata quella di aiutare le persone a diventare programmatori migliori. "La metrica del successo per la maggior parte delle persone dovrebbe essere 'Quante cose nuove ho imparato?', non 'sono una delle persone più veloci al mondo a risolvere questo enigma'".

Russell Helmstedter, un insegnante di scuola media presso la De Anza Academy of Technology and the Arts, a Ventura, in California, sta usando Advent of Code per insegnare Python ai suoi studenti di prima, seconda e terza media. Hanno affrontato i primi due problemi insieme come classe. Dal punto di vista dell'insegnamento, i problemi sono esercizi efficaci perché se si fallisce, si può semplicemente riprovare, proprio nello spirito dello sviluppo del software basato sui test. Helmstedter ha scoperto che alcuni dei suoi studenti si sono trovati in difficoltà di fronte alla duplice sfida: decifrare il problema e codificare una macchina per risolverlo, ma la maggior parte non si è tiratoi indietro. 

All'Università di Lubiana, in Slovenia, l'informatico Janez Demšar utilizza i problemi AoC sia come professore che per affinare le proprie competenze (è nel core team di Orange, un toolbox open source per l'apprendimento automatico e la visualizzazione dei dati). "Devo esercitarmi regolarmente",  spiega. Demšar insegna Programmazione 101 a un gruppo eterogeneo di oltre 200 studenti. "La mia più grande preoccupazione", dice, "è come mantenere coloro che già sanno qualcosa di programmazione interessati e occupati. Le attività di AoC sono fantastiche perché richiedono varie abilità”, dalla pura codifica agli algoritmi.

Gregor Kikelj, uno studente universitario di matematica del terzo anno, ha partecipato per la prima volta ad AoC nel 2019. Ha fatto abbastanza bene da ottenere uno stage presso Comma.ai (lavorando su Openpilot, il suo software per i sistemi di guida semi-automatici), poiché anche il fondatore dell'azienda era in competizione. E Kikelj ha migliorato il suo voto nel corso di programmazione (con un altro professore), poiché ogni problema risolto valeva punti extra per l'esame finale, più punti bonus per il posizionamento in classifica.

Kikelj si è classificato 52imo in classifica generale, accumulando un totale di 23 punti d'esame extra. "Dopo quella volta, hanno messo il limite al tetto di punti che si possono ricevere a 5", ricorda. Quest'anno il suo miglior piazzamento, il quinto giorno, è stato 25imo e punta a rimanere tra i primi 100. "Vedremo come andrà quando i problemi si faranno più difficili", dice Kikelj.

Come scalare la classifica

La concorrenza è spietata e i giocatori aspettano come un falco che il puzzle appaia su Lickety-Split per scaricarlo. Il subreddit di AoC, una delle tante comunità su Internet, è pieno di riferimenti su come prevalere nella competizione, con soluzioni e altre forme di aiuto. Ma la risorsa migliore è forse il post sul blog di Bria Chen, con una lunga serie di consigli: "Non scrivere bug e se li scopri, correggili immediatamente"; "cercare di scrivere il codice il più rapidamente possibile; simulare hack; codice copia-incolla; codifica fissa; modificare i dati senza riserve; utilizzare le eccezioni per il flusso di controllo; convertire i booleani in numeri interi e usarli come indici; rappresentare i dati come stringhe anche quando non si dovrebbe; essere audace".

Chen vuole sottolineare che "normalmente non lo si dovrebbe mai fare nel codice di produzione", cioè, codice pensato per alimentare un prodotto per un cliente. Ma per AoC, la linea di fondo è che si ha solo bisogno di codice abbastanza buono. Non deve essere robusto o bello: le scorciatoie hacky brillanti fanno il lavoro. Quando scrive il suo codice, Peter Norvig tiene a mente il principio YAGNI "Non ne avrai bisogno".

Come negli anni passati, Norvig sta pubblicando tutte le sue soluzioni per la prima e la seconda parte dei puzzle su GitHub (non è in competizione per i punti, ma solo per divertimento). Questi post inevitabilmente suscitano consensi su Hacker News e siti simili. "Parte dell'idea di AoC", spiega il direttore della ricerca di Google, "è che sono necessarie alcune scelte progettuali per risolvere la prima parte e poi vedere la descrizione della seconda parte. Quindi c'è una pressione nell’arrivare a risolvere la prima parte per fornire componenti generali che potrebbero essere riutilizzati nella seconda parte, senza perdere tempo.

Oltre a fare tutto il possibile per programmare in modo rapido e pulito, il consiglio più importante di Chen è elementare, anche se non banale: "Non fare altro quando si cerca di risolvere il puzzle". Nel 2018, è venuto a capo di un enigma mentre era al karaoke con gli amici. "Mi sono messo in un angolo con il mio laptop e poi sono tornato a cantare", dice. "Certo, il fatto che fossi veloce mi ha aiutato", anche se alla fine quell’anno si è piazzato secondo. Nel 2019, ha fatto lo stesso durante un volo da San Francisco a Taipei e ne ha risolto un altro mentre partecipava al matrimonio di un parente.

"E’ un mostro!" afferma il rivale Geoffry Son, un ingegnegre del software di Dropbox a sua volta in lizza per il primo posto. Alla ricerca di un vantaggio, a volte Song usa un gioco di battitura online (TypeRacer) per riscaldare i muscoli delle dita in anticipo. Tutti i giocatori seri impostano la sveglia per mettersi alla tastiera con diversi minuti di anticipo. Anche in questo caso, però, le cose possono andare male. Quest'anno il secondo giorno, Andrew He, che vive nella Bay Area, è saltato su quando la sua sveglia è suonata alle 20:55. Si è distratto e ha iniziato alle 9:05. A quel punto era tutto finito. Chen aveva risolto gli enigmi della giornata rispettivamente in 66 e 39 secondi

E’ sceso di nuovo in campo a metà dicembre, che è anche il momento in cui i giocatori iniziano a calare di numero. A volte succede perché gli enigmi stanno diventando più difficili da risolvere, ma altre perché, come notato su un thread di Hacker News, le festività natalizie occupano il tempo libero delle persone. "Di certo non perderò l’occasione di incontrare gli amici e la famiglia per dedicarmi alla soluzione di alcuni problemi extra di AoC", ha detto un commentatore. La risposta è arrivata tagliente: "La colpa sarà solo tua se sbagli a definire le priorità".

(rp)
  • Ms Tech / Advent of Code
  • Ms Tech / Advent of Code