La Via del Codice: Dialogo 2
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