Blog
Wednesday 26 January 2011
Oggi ho passato una mezza giornata a rifattorizzare il mio codice.
Sposta una classe di qua, un metodo di là, aggiusta questo e quello in modo che i campi siano pubblici solo quando è strettamente necessario e che non ci sia né troppo stato all’interno dell’oggetto né troppi parametri nelle chiamate ai metodi.
Mentre facevo questo lavoro, spesso meccanico e quasi sempre poco appagante, che ha portato il mio programma a smettere di funzionare almeno una decina di volte, maledivo me stesso per non aver seguito un design migliore fin dal principio.
Poi ho realizzato.
Una delle cose positive del lavorare quotidianamente nell’ambiente del Software Libero è che, con l’andare del tempo, acquisisci automaticamente alcune buone abitudini, come quella di utilizzare sempre un VCS, quella di scrivere codice portabile, quella di utilizzare un build system decente, quella di documentare almeno un po’ il tuo lavoro. Lavori, insomma, partendo dal presupposto che qualcuno prima o poi possa voler mettere mano al tuo codice, e cerchi di fare sì che la sua esperienza non si riveli un incubo.
Tra le altre cose, questo significa anche utilizzare un buon design. Quindi, istintivamente, quando mi sono messo al lavoro su quel progetto sono partito seguendo il miglior design che sono stato in grado di sviluppare con le conoscenze che avevo in quel momento. Il quale poi si è rivelato una mezza schifezza.
Il punto chiave è proprio il fatto che, quando ho iniziato, avevo solamente una vaga idea di quello che avrei dovuto fare per raggiungere il mio scopo: mano a mano che proseguivo ho cominciato ad aggiungere librerie, molte delle quali non avevo mai usato, ho provato vari approcci che si sono rivelati poco furbi, e in generale ho riscritto più volte praticamente ogni riga del programma. Molti di questi cambiamenti mi hanno costretto a rivedere parte della mia idea iniziale.
Arrivato a quel punto, le alternative erano due: proseguire con l’implementazione, ormai quasi completa ma figlia di un design cresciuto organicamente e disordinatamente, oppure creare un nuovo design e riorganizzare il tutto. Ho scelto la strada più scomoda, ma non me ne pento.
E ho smesso pure di maledirmi da solo, dal momento che ho capito che non sarei mai riuscito a sviluppare il nuovo, migliore design se non avessi prima implementato quasi interamente l’applicazione, cosa che (ovviamente) mi ha fatto capire molto meglio il problema che stavo cercando di risolvere.
Insomma, come dice il saggio: build one to throw away.