Un buon modo per capire se un programmatore è davvero valido è osservarne le azioni ed i risultati, ossia codice e programmi.
E’ indubbio che ogni linguaggio di programmazione, framework o tecnologia in genere o altro tendano ad avere proprie best practices, favorire un certo stile di programmazione, ma il bravo programmatore sostanzialmente opera sempre nello stesso modo, deterministicamente ripetitivo.
Come fare le cose Vs cosa usare per farle
Non sto dicendo che un bravo programmatore è in grado di e vuole annullare le differenze proprie di ogni tecnologia con cui opera, cioè, per esempio, non “traveste” codice Javascript come se fosse C++ e viceversa.
Vi parrà banale come affermazione ma, per esempio, fissarsi nell’usare solamente le “stringhe C” (array di caratteri) quando si sta programmando in C++ è un esempio di “travestimento” altamente discutibile, per non dire rischioso.
Un bravo programmatore ha piuttosto un suo stile personale, costruitosi nel tempo, e che in un modo o nell’altro affiora sempre. Può essere il modo di pensare, organizzare il codice, strutturarlo, documentarlo, rivederlo e perfino difenderlo quando necessario.
Sono ormai dell’avviso che:
“Un buon programmatore si riconosce anche dall’ordine, dal determinismo con cui fa le cose che non nel modo particolare con cui le fa.”
Determinismo?
L’esempio più banale, ma anche più comune, si verifica prendendo in mano il codice scritto da una persona in un certo linguaggio. Solo perchè è stata quella persona a scriverlo e prescindere dal linguaggio in sè, dopo pochi istanti “ci si trova a casa“.
Sbalorditivo alle volte: non sai cosa fa un programma ma conoscendo anche solo vagamente “come ragiona $TIZIO” ecco che dopo pochi istanti lo intuisci e potresti perfino spergiurare di saperci già mettere le mani!
Il sogno di ogni programmatore che deve manutenere codice altrui: il determinismo, concetto intimamente legato alla prevedibilità ed alla ripetibilità delle azioni.
E’ un concetto chiave dell’informatica, soprattutto parlando di algoritmi:
In computer science, a deterministic algorithm is an algorithm which, in informal terms, behaves predictably. Given a particular input, it will always produce the same output, and the underlying machine will always pass through the same sequence of states. Deterministic algorithms are by far the most studied and familiar kind of algorithm, as well as one of the most practical, since they can be run on real machines efficiently.
Un altro esempio: dopo moltissimo tempo riprendete mano del vostro codice. Se siete stati bravi e avete fatto le cose in un certo modo, ci metterete davvero poco a riprenderne coscienza.
Ricordo di svariati casi in cui, trovandomi a dover estendere codice di anni prima, non solo ci sono riusciuto relativamente in fretta ma addirittura sono riuscito ad “identificare” in qualche modo il mio livello di esperienza in quel momento:
“Ah, sì, ecco… Ora ricordo! Questo codice lo devo aver scritto per forza prima di aver letto $LIBRO. All’epoca facevo le cose in questo modo.”
Il determinismo nel codice come riflesso e traccia della propria maturazione professionale.
Che ne pensate?
Succede anche a me e sono sempre ipercritico nei confronti di me stesso. Frasi del tipo
“ma che avevo in mente quando ho scritto questa porcata?”
sono all’ordine del giorno
. Dato che programmo solo da un paio di anni cambio ancora abbastanza spesso il modo di fare.
@Joel: beh, serve tempo per “stabilizzarsi” e, comunque, si continua a crescere e cambiare, per cui credo sia normale… ^^’