Il perfezionismo è una scusa per uno sviluppatore inadeguato per non aver completato il lavoro.
Larry Wall, nel glossario della prima edizione di Programmazione Perl , note famose:
We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris.
Nella seconda edizione del libro i termini sono ulteriormente definiti:
Laziness: The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful, and document what you wrote so you don't have to answer so many questions about it. Hence, the first great virtue of a programmer. Also hence, this book. See also impatience and hubris. (p.609)
Impatience: The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to. Hence, the second great virtue of a programmer. See also laziness and hubris. (p.608)
Hubris: Excessive pride, the sort of thing Zeus zaps you for. Also the quality that makes you write (and maintain) programs that other people won't want to say bad things about. Hence, the third great virtue of a programmer. See also laziness and impatience. (p.607)
Mentre Perl non è la tazza di tè di tutti, le idee espresse nella citazione sopra si applicano alla programmazione in generale. Molto recentemente ho assegnato quello che pensavo fosse un compito facile per uno sviluppatore relativamente nuovo, e gli ho dato linee guida esplicite per saltare alcune "buone pratiche". L'attività era sensibile alle prestazioni, un processo in background che avrebbe ricevuto un enorme ammasso di XML da un webservice (che non abbiamo controllato), trasformato i dati, fare un paio di semplici verifiche e quindi memorizzarli nel nostro database. La dimensione dei dati XML era enorme e ci aspettavamo che diventasse gigantesca in un futuro molto prossimo, questa cosa doveva essere veloce. Davvero veloce.
Ciò che ha inventato, una settimana dopo, può essere descritto solo come un pezzo di merda eccessivamente ingegnerizzato (valutazione onesta). Ha funzionato, in modo impeccabile, per alcuni piccoli file XML che gli ho dato per testare le trasformazioni dei dati, ma quando sono stato collegato al servizio web effettivo che non riusciva a far fronte, le cose hanno iniziato a bloccarsi in modo casuale, come fanno di solito quando lo sfondo processo affronta problemi di prestazioni. Quando ho rivisto il suo codice ho scoperto, con mio orrore, che mi aveva completamente ignorato, il codice era pieno di ... modelli di design! Poor noob ha splendidamente descritto un esempio quasi accademico del modello di strategia per quello che era essenzialmente un istruzione switch , tra le altre cose.
Ora, non fraintendetemi, applicare i modelli non è stata la causa principale dei problemi di prestazioni che abbiamo dovuto affrontare, tuttavia ha trascorso tutta la settimana a cercare di scrivere il codice "migliore" possibile quando avrebbe dovuto rapidamente hackerare il codice in un giorno o due, e poi passare il resto del tempo a testare la dannata cosa e identificare i colli di bottiglia. E ora ho dovuto scavare migliaia di righe di codice non necessarie per iniziare a farmi un'idea di cosa stesse succedendo. Nessuna possibilità di sprecare il mio tempo in quel modo, ho appena demolito tutto e l'ho scritto da zero in poche ore.
Ho discusso il suo codice con lui e le mie conclusioni sono:
- Aveva appena scoperto alcuni dei concetti che ha applicato ed era troppo ansioso di vederli in azione, e
- Lui, inconsapevolmente, voleva impressionare (non io, ma il team in generale).
L'entusiasmo è grande, affrettarsi ad applicare concetti che potresti non comprendere ancora pienamente nel tuo codice. Anche se li comprendi pienamente, molto spesso non ne hai realmente bisogno. Uno dei principi guida di Programmazione estrema è "Non ne avrai bisogno" (YAGNI ), ed è un principio che cerco sempre di passare ai nuovi sviluppatori. Ron Jeffries, uno dei fondatori di XP, spiega :
Often you will be building some class and you’ll hear yourself saying "We’re going to need...".
Resist that impulse, every time. Always implement things when you actually need them, never when you just foresee that you need them. Here’s why:
- Your thoughts have gone off track. You’re thinking about what the class might be, rather than what it must be. You were on a mission when you started building that class. Keep on that mission rather than let yourself be distracted for even a moment.
- Your time is precious. Hone your sense of progress to focus on the real task, not just on banging out code.
- You might not need it after all. If that happens, the time you spend implementing the method will be wasted; the time everyone else spends reading it will be wasted; the space it takes up will be wasted.
- You find that you need a getter for some instance variable. Fine, write it. Don’t write the setter because "we’re going to need it". Don’t write getters for other instance variables because "we’re going to need them".
The best way to implement code quickly is to implement less of it. The best way to have fewer bugs is to implement less code.
You’re not gonna need it!
Molte delle mie risposte sui programmatori sostengono le migliori pratiche, tuttavia spero di non aver indotto in errore nessuno a pensare che l'applicazione di queste migliori pratiche sia un obiettivo in sé. L'obiettivo è quello di fare le cose, done è meglio che perfetto . Non seguire ciecamente i dogmi, senza una profonda comprensione dei concetti e delle pratiche, e un prurito per grattare ti stai solo preparando per un mondo di guai.
Rendilo semplice, stupido!
Ulteriori letture: