È un brutto segno che spesso sto riprogettando mentre sviluppo un progetto?


39

Quando ho iniziato a programmare, ho pensato che un giorno sarei arrivato al punto in cui avrei iniziato un progetto sedendomi e disegnando un diagramma UML di tutte le classi, quindi mi sarei praticamente attenuto a questo. Sto programmando da un paio d'anni e non sta andando così. Mentre eseguo un progetto, lo dico spesso

  • "Ehi, ho bisogno di una lezione da fare _ _. Non ci avevo pensato prima."
  • "Aspetta, questa funzione dovrebbe davvero essere in quella classe invece di questa. La sposterò."
  • "In realtà dovrebbero essere due classi invece di una. Lo dividerò."
  • "Dovrei rendere queste tre classi autonome tutte ereditate da una classe astratta."
  • Etcetera, eccetera.

È un brutto segno che spesso riprogetto in questo modo mentre procedo? Questo significa che sono un programmatore scadente o è normale?

Risposte:


41

Questa è una parte normale dello sviluppo. Due dei principi fondamentali di Continuous Design è che:

  1. Non sei onnisciente, non puoi conoscere l'intero sistema dall'inizio alla fine prima di iniziare.
  2. Il design non è statico. Ciò è più frequente quando un progetto è in uso da molto tempo e i problemi che sta risolvendo non sono i problemi che stava risolvendo quando è stato scritto per la prima volta.

La mia opinione personale sulla questione è che dovresti avere una buona idea del macro design, ma consentire al micro design di evolversi. Un altro modo di esprimerlo è che il design di alto livello (che è per quanto mi riguarda con gli UML / strumenti di modellazione) molto probabilmente rimarrà piuttosto statico per tutta la durata di un progetto. La progettazione dettagliata di quali metodi fanno ciò e la gerarchia di classi devono essere liberi di essere malleabili.

Quando davvero non sai molto del problema che stai risolvendo, farai molti altri passi iniziali sbagliati. Tuttavia, dopo aver lavorato abbastanza a lungo, il design generale inizierà a stabilizzarsi e i refactoring di cui stai parlando sono tutto ciò che sarà necessario per mantenere il codice in ordine.


3
+1, questo è il motivo per cui mi arrabbio sempre quando le persone parlano di serializzare oggetti in un database -> e cosa succede se domani la tua classe è stata esplosa in più parti, come fai a deserializzare senza mantenere il vecchio codice? Preferisco di gran lunga l'alternativa Protobuf (classi dedicate per lo scambio di archiviazione / messaggi) in cui le tue classi principali sono libere di evolversi e devi solo adattare il livello di serializzazione / deserializzazione.
Matthieu M.

@Matthieu: scrivi una migrazione del database. Questo richiede raramente più di un'ora per scrivere e testare. Ruby on Rails ha una struttura molto piacevole per le migrazioni di database.
Kevin Cline,

1
@kevin: non abbiamo gli stessi database, credo che il mio contenga poche centinaia di milioni di righe. La migrazione non è un'opzione.
Matthieu M.,

+1 - essere troppo orgoglioso / testardo per ammettere di aver fatto un errore non è una buona cosa. Alcune persone vedono l'ammissione dei tuoi errori come un segno di settimana, ma la maggior parte probabilmente ti rispetterà per questo, e sicuramente se la tua strategia per affrontare un grave errore è negare che sia un errore, è molto probabile che quel secondo errore sia fatale.
Steve314,

12

Quello che stai facendo è popolarmente chiamato "refactoring". Se mai smetti di farlo, allora sei nei guai.

Il fatto è che la maggior parte del codice è complesso e gli umani, anche piuttosto intelligenti, non riescono a capirlo tutto in una volta.



5

Va benissimo (a meno che queste riprogettazioni non siano sempre importanti revisioni o ricostruzioni da zero). Non ti preoccupare. Può essere utile iniziare con un diagramma UML all'inizio del progetto, ma non scolpirlo nella pietra poiché quasi sempre scoprirai che le cose cambiano mentre lavori. Potresti imparare nuove tecniche che non conoscevi all'inizio, potresti voler migliorare alcune funzionalità in modi che non avevi pensato durante la progettazione iniziale, i requisiti aziendali cambiano, a volte ci sono incognite durante la progettazione iniziale che possono solo essere contabilizzato in seguito, ecc ...

Ciò che è importante è andare e aggiornare quei documenti UML iniziali in modo che riflettano eventuali cambiamenti significativi nella progettazione, altrimenti i futuri sviluppatori (incluso te stesso) potrebbero finire molto confusi. Questo può essere difficile e spesso richiede una buona diciplina (e tempo).

È molto, molto raro, iniziare con un design e aderire al 100% fino all'implementazione. Personalmente non ho mai visto succedere una cosa del genere, tranne che per programmi molto piccoli e banali.


6
Passaggio 1: creare il diagramma UML. Passaggio 2: scrivere il codice. Passaggio 3: getta via il diagramma UML in modo che nessuno lo veda mai e si confonda su come funziona effettivamente il codice.
Kubi,

4

Quello che stai facendo è perfettamente normale (a condizione che non ricominciare completamente da capo ogni volta). Ci sono stato per oltre vent'anni, ed è ancora un processo iterativo.

L'unica volta che sarai in grado di progettare tutto in anticipo e attenersi ad esso è se stai risolvendo lo stesso identico problema che hai risolto l'ultima volta, e anche allora probabilmente troverai spazio per miglioramenti.


2

Non sono assolutamente uno sviluppatore di grande esperienza, ma lo faccio anche io. Negli ultimi anni, la mia capacità di costruire mentalmente l'architettura necessaria è notevolmente migliorata. Tuttavia, mentre scrivo un pezzo di software, indipendentemente dalla pianificazione che faccio, ci sono sempre posti che richiedono un po 'di riprogettazione. Macchie che non avevo realizzato mi sarei ripetuto fino a quando il codice non è stato effettivamente scritto.

Il mio punto di questo post è dire che faccio tutto nella tua lista e non mi sento come se quelle cose fossero necessariamente cattive a meno che non accadessero costantemente e avessero un reale effetto negativo sulla tua produttività.


0

Questo ha chiamato processo iterativo ed è un concetto di base in tutte le moderne tecniche di sviluppo software.

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.