Prototipazione vs. Clean Code nelle prime fasi


43

Sto programmando di lavorare / iniziare alcuni progetti personali che potrebbero finire come il mio lavoro quotidiano. Mi ha fatto pensare, da che parte dovrei iniziare?

  • Solo un prototipo: scrivi solo codice di base funzionante che potrebbe costare tonnellate di tempo per l'ottimizzazione e il refactoring per una facile espansione.

  • Scrivi codice pulito, ottimizzato e documentato fin dall'inizio, tenendo presente che se dopo qualche tempo non sarà conveniente, verrà eliminato.

Aggiornamento: Combinare YAGNI con sunpech e le risposte di M.Sameer ha perfettamente senso per me :) grazie a tutti per l'aiuto.


1
vedi anche: Quando refattare
moscerino

Risposte:


39

C'è una terza opzione ... scrivere codice pulito tramite lo sviluppo guidato dai test per implementare i requisiti che sono necessari oggi perché YAGNI.

La tentazione di scrivere codice che non è necessario al momento ma che potrebbe essere in futuro soffre di diversi svantaggi ... da te non ne avrai bisogno :

  • Il tempo impiegato viene impiegato per aggiungere, testare o migliorare le funzionalità necessarie.
  • Le nuove funzionalità devono essere sottoposte a debug, documentate e supportate.
  • Qualsiasi nuova funzionalità impone vincoli su ciò che può essere fatto in futuro, quindi una funzione non necessaria ora può impedire l'implementazione di una funzione necessaria in un secondo momento.
  • Fino a quando la funzionalità non è effettivamente necessaria, è difficile definire completamente cosa dovrebbe fare e testarla. Se la nuova funzionalità non è definita e testata correttamente, potrebbe non funzionare correttamente, anche se alla fine è necessaria.
  • Porta a codice gonfio; il software diventa più grande e più complicato. A meno che non ci siano specifiche e un qualche tipo di controllo di revisione, la funzione potrebbe non essere nota ai programmatori che potrebbero farne uso.
  • L'aggiunta della nuova funzionalità può suggerire altre nuove funzionalità. Se anche queste nuove funzionalità saranno implementate, ciò potrebbe tradursi in un effetto a palla di neve verso il featurism strisciante.

Di conseguenza, non dovresti limitarti a prototipare ... né scrivere codice pulito, ottimizzato e documentato sin dall'inizio, tenendo presente che se entro un certo periodo non sarà conveniente, verrà eliminato.

Scrivi il codice di cui hai bisogno ora sapendo che sarai in grado di soddisfare al meglio le esigenze di oggi e di domani.


4
Anche se non sono un fan di TDD in piena regola, questo è sempre un buon consiglio poiché seguire TDD ti costringerà a scrivere codice pulito e ben documentato.
Wayne Molina,

1
Penso che intendesse dire che avrebbe lasciato cadere l'intero progetto se non fosse uscito. Se questo è vero, questa risposta non sembra diversa da "scrivi codice pulito".
Jeremy,

@Jeremy, sei un presupposto giusto sulla mia risposta. Ma questa risposta non è la stessa. Si basa su un modo di programmazione rigoroso in cui l'altro si basa sull'esperienza, sicuro che in alcuni casi sembrano simili, ma non è lo stesso :) beh almeno dal punto in cui lo vedo :)
JackLeo

1
@JackLeo Penso che il punto sia che una volta raggiunto un certo livello di esperienza, smette di fare la differenza tra "codice su cui ho lavorato molto" e "codice che ho appena scritto".
Formica P

@AntP In effetti. È interessante riflettere su questa domanda 6 anni dopo :)
JackLeo,

16

come di solito...

Dipende

Se stai prototipando per mitigare un rischio o esporre uno sconosciuto, basta codificarlo e aspettarti di buttarlo via quando hai finito

Se stai prototipando per un perfezionamento iterativo, basta codificarlo e aspettarti di modificarlo e riformattarlo frequentemente

Se stai iniziando a scrivere il prodotto reale ma lo chiami prototipazione in modo da poter essere pigro , allora non essere pigro e scriverlo bene la prima volta


2
+1 Great Post! Aggiungerei che, sebbene possa sembrare inutile dopo aver sviluppato quella funzione, MAI buttare via i tuoi prototipi. Controllo sempre ogni prototipo su cui lavoro perché a volte mi riferisco a loro per suggerimenti e consigli.
maple_shaft

1
@maple_shaft: sì, "buttare via" è metaforicamente, come in "non cercare necessariamente di riformattarlo, pensa di riscriverlo"
Steven A. Lowe,

2
Dico di essere pigro e scriverlo bene la prima volta in modo da non dover tornare indietro e rivederlo più tardi.
Blrfl

La terza frase ha reso la mia giornata.
Christopher Francisco,

10

Se stai prototipando, perché stai pensando al codice pulito? L'idea stessa del prototipo è che ha lo scopo di dimostrare un concetto o un'idea e di essere gettato via in seguito.

Non sono d'accordo con la maggior parte di tutti qui dicendo che se stai già pensando alla scelta tra scrivere codice pulito o fare qualcosa in fretta per la prototipazione, scegli quest'ultimo. Soprattutto quando si parla di sviluppo nella fase iniziale. Non sto dicendo di non scrivere mai un codice pulito, sto dicendo di tirar fuori l'idea, vedere che è la direzione da seguire, quindi tornare a ripulirlo-- refactor.

Come sviluppatori software, siamo così presi dal fare le cose giuste e pulite la prima volta, che non riusciamo a renderci conto che non è il codice che stiamo offrendo, è una soluzione a un problema .

Penso alla codifica come scriverei un articolo:

Quando scriviamo un documento, iniziamo da qualche parte, abbozziamo idee, contorni, ecc. Non conterrà tutti i dettagli o non avrà alcun aspetto finale: è essenzialmente una prima bozza, seguita da una seconda e così via. Molto verrà riscritto, sostituito e / o addirittura rimosso lungo la strada per una carta più raffinata e finita. (Ovviamente questa analogia non arriva fino al punto di dire che il codice è mai veramente mai finito o finito come un giornale.)


+1 Risposta molto buona :) Mi è successo molto nei primi giorni, quindi saltare su grandi progetti può causare lo stesso ... ecco di cosa ho paura.
JackLeo,

"Come sviluppatori software, siamo così presi dal fare le cose giuste e pulite la prima volta, che non riusciamo a renderci conto che non è il codice che stiamo offrendo, è una soluzione a un problema." Direi che è il contrario: "Non abbiamo mai il tempo di farlo bene, ma abbiamo sempre il tempo di farlo".
Christopher Francisco,

6

Esistono due tipi di prototipazione:

  • Prototipo evolutivo che continua a evolversi attraverso miglioramenti e correzioni per diventare il prodotto finale.
  • Prototipo usa e getta che esiste solo per rendere più efficiente la raccolta dei requisiti e il feedback dei clienti nelle prime fasi del progetto, per poi essere completamente abbandonato e lo sviluppo del prodotto finale inizia da zero.

Secondo Capers Jones, i prototipi evolutivi producono prodotti finali di bassa qualità che richiedono molto più sforzo e più tempo per raggiungere la stabilità.

Quindi, se stai pensando alla prototipazione in modo che il cliente possa vedere qualcosa il più rapidamente possibile per aiutarti a ottenere un'idea migliore e maggiori dettagli sui requisiti, è meglio essere un prototipo usa e getta e fare lo sviluppo su codice pulito in seguito. Se non puoi permetterlo, scrivi un codice pulito dall'inizio e mantienilo attentamente, ma come altri hanno suggerito non ottimizzare eccessivamente e non aggiungere cose finché non ne hai bisogno.


Ottimo punto, questo è per mostrare diversi tipi di prototipazione, non ci ho pensato :) Cibo per un pensiero per me qui :)
JackLeo

D'accordo con il punto!
Richard Topchiy,

Il grande rischio del prototipo usa e getta è che la gestione avrà difficoltà a capire perché la versione di produzione dovrebbe richiedere così tanto tempo rispetto al prototipo e perché il lavoro sul prototipo dovrebbe essere “sprecato”. Ovviamente, se è la tua potenziale startup, non esiste una gestione del genere, il che rende tutto molto più semplice.
Jan Hudec,

5

Sono riluttante a scusare la programmazione sporca per qualsiasi motivo. Nella mia esperienza, le persone che dichiarano di essere pronte e sporche come una scusa per la prototipazione hanno questo atteggiamento nei confronti di qualsiasi codice, compresa la produzione. Se qualcuno crea un prototipo disordinato, crea disordine in qualsiasi codice. La prototipazione non significa codifica sporca, ma presupposti semplificati per testare i casi d'uso più importanti. Il codice potrebbe non essere testato formalmente o prendersi cura di tutti i dettagli, ma dovrebbe essere ancora ben progettato e ben implementato. La pulizia è un segno di competenza, i programmatori competenti provano naturale disgusto per il codice disordinato, indipendentemente dal suo scopo.


Solo una cosa che ho dimenticato di menzionare. L'ho visto più volte che le persone scrivevano in modo rapido e sporco per scopi di "prototipazione" ed è diventato doloroso e brutto per scopi di produzione. Da quando ha finito e funziona, le persone continuano ad aggiungere bende, accumulando confusione su disordine.
Gene Bushuyev,

Hai un buon punto - "perché riscrivere se funziona?" è un problema per molte giovani aziende, lo vedo anche nella mia attuale posizione di lavoro quando grandi aziende usano CMS di 10 anni che è doloroso per l'aggiornamento agli standard di oggi ... Ecco perché sto facendo una domanda del genere, non non voglio fare un errore qui. Anche se la tua risposta sta principalmente dicendo che sto cercando una scusa per scrivere un codice sciatto. No. Sunpech e M.Sameer hanno capito il mio punto. Il prototipo è fare qualcosa per vedere come il mondo reagirà ad esso. Se funziona, fallo bene.
JackLeo,

1

Scrivi fin dall'inizio codice pulito, ottimizzato e documentato. Non sono in grado di farlo da solo ed è un vero problema. Non sono un programmatore, ma ho lavorato per aziende di sviluppo software in ruoli manageriali rivolti ai clienti in modo equo e, dato che mi danno molte buone idee, ogni tanto costruisco un prototipo per qualcosa. Quasi ogni volta che quel prototipo veniva consegnato a uno sviluppatore che lo "ripuliva" e lo trasformava in un prodotto di spedizione. Quando controllo la fonte, sarà comunque l'80-90% del mio codice schifoso.


0

Un mio collega sostiene con entusiasmo la ripetizione della prototipazione, con l'avvertenza che si deve avere abbastanza disciplina per buttare via ogni prototipo e scrivere di nuovo da zero - e non solo, assicurarsi che non si sia influenzati dai dettagli di implementazione decisi l'ultima volta , come si finisce per scrivere più volte lo stesso prototipo in uno stile banalmente diverso. Ha suggerito semi-seriamente che se tu fossi davvero attaccato a un brillante pezzo di codice che non potevi scartare, dovresti stamparlo, eliminare il repository di controllo del codice sorgente e pubblicare la stampa per te - sarà sparito abbastanza a lungo da non poter infiltrarsi nella prossima iterazione.


questo post è piuttosto difficile da leggere (wall of text). Ti dispiacerebbe modificarlo in una forma migliore?
moscerino del

Puoi suggerire quale pensi sia il problema? Forse le frasi sono troppo lunghe, come ho appena notato, ce ne sono solo due. Qualunque altra cosa?
Tom W,

-1

Puoi sempre iniziare facendolo funzionare (a tutti), quindi rivederlo per renderlo pulito e quindi farlo veloce / piccolo se ha senso economico farlo. Vorrei iniziare con alcuni esperimenti che butti via, poi TDD ritorna in esistenza quando hai un controllo su ciò che funziona.


-1

Entrambi sono buoni. Mi piacciono entrambi. Non si contraddicono a vicenda.

Mi piace prototipare. Il prototipo sta sviluppando le mie capacità creative. Sto testando molte possibili soluzioni. Farlo velocemente mi dà la possibilità di testare molti modi possibili per risolvere il problema.

Mi piace scrivere codice pulito e ben testato. Sviluppa le mie competenze chiave. Di solito scelgo uno dei prototipi e lo perfeziono o riscrivo da zero.

Ma non dovresti mai confondere il prototipo con il codice di produzione. Il prototipo non dovrebbe mai entrare in produzione. Dovrebbe essere sempre contrassegnato come prototipo. Nella migliore delle ipotesi, esegui tutta la prototipazione nella tua filiale.


-2

Tendo a dire che gli estremi sono quasi sempre cattivi.

Consiglio di mantenere l'equilibrio tra pulito, ben documentato e prototipazione. Quando sviluppi per una libreria o piattaforma non hai esperienza con me vado più nella direzione della prototipazione. Ciò è particolarmente vero all'inizio e per le piattaforme, ad esempio Android o container, che ti mettono nel loro corsetto. Ciò significa che implementi le loro interfacce e ti chiamano.

Dalla mia esperienza la maggior parte del codice non vive molto a lungo. Detto questo, vai veloce implementando la tua funzione. Prima o poi (la maggior parte delle volte prima) è necessario rielaborare / rifattorizzare il codice esistente a causa della funzione successiva in cui vengono riordinate soprattutto le parti con cui è complicato lavorare. Prestare attenzione a disporre di test automatici adeguati per rendere possibile il refactoring senza problemi. Appartenenti alle piattaforme sopra menzionate come Android: spesso rendono i test automatizzati non facili a causa dello stretto accoppiamento e della mancanza di design per la testabilità. Quindi è possibile elevare la base di test a un livello superiore, ad esempio test di integrazione.

Ho scritto un articolo che potrebbe dare alcuni suggerimenti sull'avvio: https://medium.com/@ewaldbenes/start-lean-why-its-best-to-split-your-next-coding-project-by-feature-70019290036d

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.