Sto lavorando a un grande progetto software altamente personalizzato per vari clienti in tutto il mondo. Ciò significa che abbiamo forse l'80% di codice che è comune tra i vari clienti, ma anche un sacco di codice che deve cambiare da un cliente all'altro. In passato abbiamo fatto il nostro sviluppo in repository separati (SVN) e quando è iniziato un nuovo progetto (abbiamo pochi, ma grandi clienti) abbiamo creato un altro repository basato su qualsiasi progetto passato abbia la migliore base di codice per le nostre esigenze. Questo ha funzionato in passato, ma abbiamo riscontrato diversi problemi:
- I bug corretti in un repository non vengono corretti in altri repository. Questo potrebbe essere un problema di organizzazione, ma trovo difficile correggere e correggere un bug in 5 diversi repository, tenendo presente che il team che gestisce questo repository potrebbe trovarsi in un'altra parte del mondo e non abbiamo il loro ambiente di test , né conoscono il loro programma o quali requisiti hanno (un "bug" in un paese potrebbe essere una "caratteristica" in un altro).
- Funzionalità e miglioramenti apportati per un progetto, che potrebbero anche essere utili per un altro progetto, vengono persi o se vengono utilizzati in un altro progetto spesso causano grossi mal di testa fondendoli da una base di codice a un altro (poiché entrambi i rami potrebbero essere stati sviluppati in modo indipendente per un anno ).
- Rifattorizzazioni e miglioramenti del codice apportati in un ramo di sviluppo vengono persi o causano più danni che benefici se si devono unire tutte queste modifiche tra i rami.
Stiamo discutendo come risolvere questi problemi e finora abbiamo trovato le seguenti idee su come risolverlo:
Mantenere lo sviluppo in rami separati ma organizzarsi meglio disponendo di un repository centrale in cui vengono fuse le correzioni di bug generali e tutti i progetti uniscono le modifiche da questo repository centrale al proprio su base regolare (ad es. Quotidianamente). Ciò richiede un'enorme disciplina e molti sforzi per la fusione tra i rami. Quindi non sono convinto che funzionerà e possiamo mantenere questa disciplina, specialmente quando la pressione del tempo aumenta.
Abbandona i rami di sviluppo separati e disponi di un repository di codice centrale in cui vive tutto il nostro codice e fai la nostra personalizzazione con moduli collegabili e opzioni di configurazione. Stiamo già utilizzando i contenitori di Iniezione delle dipendenze per risolvere le dipendenze nel nostro codice e stiamo seguendo il modello MVVM nella maggior parte del nostro codice per separare in modo pulito la logica aziendale dalla nostra IU.
Il secondo approccio sembra essere più elegante, ma abbiamo molti problemi irrisolti in questo approccio. Ad esempio: come gestire le modifiche / aggiunte nel modello / database. Stiamo usando .NET con Entity Framework per avere entità fortemente tipizzate. Non vedo come possiamo gestire le proprietà richieste per un cliente ma inutili per un altro cliente senza ingombrare il nostro modello di dati. Stiamo pensando di risolverlo nel database usando tabelle satellitari (con tabelle separate in cui le nostre colonne extra per un'entità specifica vivono con un mapping 1: 1 all'entità originale), ma questo è solo il database. Come gestisci questo nel codice? Il nostro modello di dati vive in una biblioteca centrale che non saremmo in grado di estendere per ogni cliente utilizzando questo approccio.
Sono sicuro che non siamo l'unica squadra alle prese con questo problema e sono scioccato di trovare così poco materiale sull'argomento.
Quindi le mie domande sono le seguenti:
- Che esperienza hai con software altamente personalizzati, quale approccio hai scelto e come ha funzionato per te?
- Quale approccio mi consigliate e perché? C'è un approccio migliore?
- Ci sono buoni libri o articoli sull'argomento che puoi consigliare?
- Hai raccomandazioni specifiche per il nostro ambiente tecnico (.NET, Entity Framework, WPF, DI)?
Modificare:
Grazie per tutti i suggerimenti. La maggior parte delle idee corrispondono a quelle che avevamo già nel nostro team, ma è davvero utile vedere l'esperienza che hai avuto con loro e suggerimenti per implementarli meglio.
Non sono ancora sicuro di come andremo e non prenderò la decisione (da solo), ma lo farò passare nella mia squadra e sono sicuro che sarà utile.
Al momento il tenore sembra essere un singolo repository che utilizza vari moduli specifici del cliente. Non sono sicuro che la nostra architettura sia all'altezza di questo o di quanto dobbiamo investire per adattarla, quindi alcune cose potrebbero vivere in repository separati per un po ', ma penso che sia l'unica soluzione a lungo termine che funzionerà.
Quindi, grazie ancora per tutte le risposte!