Luca Leone

La Via del Codice: Dialogo 2

La Via del Codice: Dialogo 1

Il giovane programmatore è tornato nella stessa caffetteria, questa volta con un sorriso soddisfatto. L'anziano sviluppatore è già lì, come se lo stesse aspettando.

Giovane: Il mio e-commerce funziona! Ho seguito il tuo consiglio: un pezzo alla volta.

Anziano: (sorridendo) Vedo però che hai qualcosa in mente.

Giovane: Sì... Ho scritto questa funzione per gestire gli ordini, ma è... un disastro.

function gestisciOrdine(ordine) {
    // Valido l'input
    if(!ordine.email) return 'Email mancante';
    // Mi connetto al DB
    const db = connectToDatabase();
    // Controllo se l'utente esiste
    fetch('/api/users/' + ordine.userId)
    // Aggiorno l'interfaccia
    updateUI();
    // Invio email
    sendEmail(ordine.email);
    // Aggiungo una bella animazione
    $('#orderButton').fadeOut();
}

Anziano: Ah! (prende una pila di fogli dalla sua borsa) Che ne pensi di questi documenti?

Giovane: (confuso) Sono... tutti mischiati. C'è una ricetta per la carbonara tra due pagine di codice fiscale, e un listino prezzi in mezzo a un romanzo.

Anziano: Proprio come la tua funzione. Stai mischiando livelli diversi di astrazione. È come parlare di atomi mentre descrivi una partita di calcio.

Giovane: Oh... dovrei separare le cose?

Anziano: Esatto. Pensa a un ristorante. Lo chef non va personalmente a comprare ogni ingrediente mentre sta cucinando. Ragiona a livelli diversi:

// Livello alto: la strategia
function gestisciOrdine(ordine) {
    const ordineValidato = validaOrdine(ordine);
    const ordineProcessato = processaOrdine(ordineValidato);
    notificaCliente(ordineProcessato);
}

// Livello intermedio: le tattiche
function processaOrdine(ordine) {
    salvaInDatabase(ordine);
    aggiornaInventario(ordine);
    return ordine;
}

// Livello basso: i dettagli
function salvaInDatabase(ordine) {
    db.connect();
    db.insert(ordine);
    db.close();
}

Giovane: Come lo scrittore di un libro che non mischierebbe la costruzione di un paragrafo con quella di un capitolo?

Anziano: Precisamente. Ma parlami del tuo prossimo progetto.

Giovane: Devo creare un sistema di raccomandazione per i prodotti. Ho già iniziato con algoritmi di machine learning e...

Anziano: (interrompendo) Se dovessi insegnare a qualcuno a giocare a scacchi, inizieresti spiegando le strategie avanzate del gambetto di donna?

Giovane: No, inizierei con... come si muove il pedone?

Anziano: Qual è il prototipo più semplice possibile del tuo sistema di raccomandazione?

Giovane: Mmh... "Chi ha comprato X ha comprato anche Y"?

Anziano: Ancora più semplice.

Giovane: "Ecco i prodotti più venduti"?

Anziano: (annuendo) Inizia da lì. Ma come organizzi il ragionamento quando affronti un nuovo problema?

Giovane: Di solito mi butto sul codice e...

Anziano: (prende un pennarello e disegna su un tovagliolo) Un architetto inizia a costruire senza un progetto?

Giovane: No, fa degli schizzi, dei disegni...

Anziano: Esatto. Ecco il nostro schizzo:

function trovaProdottiPiuVenduti(listaOrdini):
  prendi lista ordini
  per ogni ordine:
    estrai prodotti
    incrementa contatore per ogni prodotto
  ordina prodotti per contatore
  restituisci i primi 5

Giovane: È come una ricetta!

Anziano: Una ricetta che possiamo seguire, modificare, discutere, ancora prima di scrivere una riga di codice. Ma cosa fai quando una soluzione non funziona?

Giovane: (orgoglioso) Ora so di non dover insistere con la stessa strada!

Anziano: Ma?

Giovane: Ma... spesso non so che strada alternativa prendere.

Anziano: (prende una tazza di caffè) Se volessi andare da qui a casa tua, quante strade potresti prendere?

Giovane: Molte! Potrei prendere la principale, o le vie secondarie, o la metropolitana, o...

Anziano: E se trovassi lavori in corso sulla strada principale?

Giovane: Cambierei strada! Oh... come nel codice?

Anziano: Quando un approccio non funziona, non scalare il muro. Cerca un'altra strada:

// Versione 1: orientata agli oggetti
function trovaProdottiPiuVenduti(ordini):
  crea mappa conteggi = {}
  per ogni ordine negli ordini:
    per ogni prodottoId nell'ordine:
      se prodottoId esiste in conteggi:
        conteggi[prodottoId]++
      altrimenti:
        conteggi[prodottoId] = 1
  converti conteggi in array di [id, numero]
  ordina array per numero decrescente
  prendi primi 5 id
  restituisci array di id

// Versione 2: orientata agli array
function trovaProdottiPiuVenduti(ordini):
  estrai tutti i prodottoId da tutti gli ordini in un array piatto
  raggruppa array per prodottoId
  conta elementi di ogni gruppo
  ordina gruppi per conteggio decrescente
  prendi id dei primi 5 gruppi
  restituisci array di id

Giovane: Stesse destinazioni, strade diverse!

Anziano: E infine, come sai se una soluzione funziona davvero?

Giovane: La testo?

Anziano: Come uno scienziato! Qual è il metodo scientifico?

Giovane: Osservazione, ipotesi, esperimento, analisi...

Anziano: Esattamente! Guarda:

// 1. Osservazione: gli utenti non trovano i prodotti
// 2. Ipotesi: un sistema di tag aiuterebbe la ricerca
// 3. Esperimento:
function testTagSystem() {
    const prodotti = getProdotti();
    aggiungiTag(prodotti);
    // Test con un gruppo di utenti
    const risultati = misuraTempoRicerca();
    return risultati;
}
// 4. Analisi dei risultati
// 5. Nuova ipotesi o implementazione

Giovane: (illuminandosi) È come debug scientifico!

Anziano: Ogni bug è un esperimento che aspetta di essere condotto. Ogni feature è un'ipotesi da testare.

Giovane: (guardando il suo codice) Sai, prima vedevo solo sintassi e funzioni. Ora vedo... architettura, scienza, arte.

Anziano: (alzandosi) La programmazione è un specchio del pensiero umano. Organizzato su livelli come un libro ben scritto. Iterativo come un esperimento scientifico. Adattabile come un viaggiatore che trova strade alternative.

Giovane: E tutto inizia con un semplice prototipo.

Anziano: (sorridendo) E con una tazza di buon caffè. La prossima la offro io.

Giovane: A proposito di livelli di astrazione... questa è una metafora per il prossimo incontro o un vero invito per un caffè?

Anziano: (ridendo mentre si allontana) Mantieni il dubbio. È un ottimo esercizio di astrazione.

Domande?

Hai domande, commenti, idee? Scrivimi a luca@birbi.biz

Blog post più recenti

#codice #imparare