Supponiamo che tu abbia appena iniziato a lavorare in un team molto piccolo su un progetto {attualmente relativamente piccolo, anche se si spera più grande in seguito}. Si noti che questo è un progetto reale destinato ad essere utilizzato da altri sviluppatori nel mondo reale, non da un progetto accademico che dovrebbe essere demolito alla fine di un semestre.
Tuttavia, il codice non è ancora stato rilasciato ad altri, quindi nessuna decisione è ancora stata presa sulla pietra.
Le metodologie
A uno di voi piace iniziare a programmare e adattare i pezzi insieme man mano che si procede prima di avere necessariamente una chiara idea di come interagiranno esattamente tutti i componenti (design dal basso). Ad un altro di voi piace fare prima l'intero progetto e inchiodare i dettagli di tutti i componenti e la comunicazione prima di codificare una soluzione.
Supponiamo che tu stia lavorando su un nuovo sistema piuttosto che imitare quelli esistenti, e quindi non è sempre ovvio come dovrebbe essere il giusto design finale. Quindi, nel tuo team, diversi membri del team a volte hanno idee diverse su quali requisiti sono persino necessari per il prodotto finale, per non parlare di come progettarlo.
Quando lo sviluppatore bottom-up scrive del codice, lo sviluppatore top-down lo rifiuta a causa di potenziali problemi futuri previsti nella progettazione nonostante il fatto che il codice possa risolvere il problema a portata di mano, ritenendo che sia più importante ottenere la progettazione corretta prima di tentare di codificare la soluzione al problema.
Quando lo sviluppatore top-down tenta di elaborare l'intero progetto e i problemi previsti prima di iniziare a scrivere il codice, lo sviluppatore bottom-up lo rifiuta perché lo sviluppatore bottom-up non pensa che alcuni dei problemi insorgeranno effettivamente nella pratica e ritiene che il progetto potrebbe dover essere modificato in futuro quando i requisiti e i vincoli diventano più chiari.
Il problema
Il problema che ciò ha comportato è che lo sviluppatore bottom-up finisce per perdere tempo perché lo sviluppatore top-down spesso decide la soluzione che lo sviluppatore bottom-up ha scritto dovrebbe essere scartato a causa di un difetto di progettazione, con conseguente necessità di ri -scrivi il codice.
Lo sviluppatore top-down finisce per perdere tempo perché invece di parallelizzare il lavoro, lo sviluppatore top-down ora si siede spesso per elaborare il progetto corretto con lo sviluppatore bottom-up, serializzando i due al punto in cui potrebbe persino essere più veloce per 1 persona di svolgere il lavoro rispetto a 2.
Entrambi gli sviluppatori vogliono continuare a lavorare insieme, ma non sembra che la combinazione stia effettivamente aiutando nessuno dei due nella pratica.
Gli obiettivi
Gli obiettivi comuni sono ovviamente massimizzare l'efficacia della codifica (ovvero ridurre al minimo lo spreco di tempo) e scrivere software utile.
La domanda
In parole povere, come risolvere questo problema e far fronte a questa situazione?
L'unica soluzione efficiente a cui riesco a pensare che non perda tempo è lasciare che ogni sviluppatore segua il proprio stile per il design. Ma questo è più difficile di quanto sembri quando si rivede il codice e in realtà è necessario approvare le modifiche reciproche e quando si sta tentando di progettare un framework coerente che gli altri possano utilizzare.
Esiste un modo migliore?