Sto lavorando a un progetto software di grandi dimensioni che è altamente personalizzato per vari clienti in tutto il mondo. Ciò significa che abbiamo forse l'80% del 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 è stato avviato un nuovo progetto (abbiamo pochi ma grandi clienti) abbiamo creato un altro repository basato su qualunque progetto passato abbia la migliore base di codice per le nostre esigenze. Questo ha funzionato in passato, ma abbiamo riscontrato diversi problemi:
- I Bug che sono corretti in un repository non sono 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 "funzione" in un altro).
- Funzionalità e miglioramenti apportati per un progetto, che potrebbero essere utili anche per un altro progetto sono persi o se vengono utilizzati in un altro progetto spesso causano grossi grattacapi che li uniscono da un codice base all'altro (poiché entrambi i rami potrebbero sono stati sviluppati indipendentemente per un anno).
- Rifiniture e miglioramenti del codice fatti in un ramo di sviluppo sono persi o causano più danni che benefici se devi unire tutte queste modifiche tra i rami.
Stiamo ora discutendo su come risolvere questi problemi e finora abbiamo trovato le seguenti idee su come risolvere questo problema:
-
Mantieni lo sviluppo in rami separati ma organizzandoti meglio con un repository centrale in cui le correzioni di errori generali vengono unite e tutti i progetti uniscono le modifiche da questo repository centrale a quelle su un normale ( base giornaliera). Ciò richiede una grande disciplina e un grande sforzo per fondersi tra le filiali. Quindi non sono convinto che funzionerà e possiamo mantenere questa disciplina, soprattutto quando la pressione del tempo si fa sentire.
-
Abbandona i rami di sviluppo separati e disponi di un repository di codice centrale in cui tutto il nostro codice vive e realizza la nostra personalizzazione grazie a moduli e opzioni di configurazione collegabili. Stiamo già utilizzando i contenitori di Dependency Injection per risolvere le dipendenze nel nostro codice e stiamo seguendo lo schema MVVM nella maggior parte del nostro codice per separare in modo pulito la logica di business dall'interfaccia utente.
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à strongmente tipizzate. Non vedo come possiamo gestire le proprietà che sono richieste per un cliente ma inutili per un altro cliente senza ingombrare il nostro modello di dati. Stiamo pensando di risolverlo nel database utilizzando le tabelle satellite (con una tabella separata in cui le nostre colonne aggiuntive per un'entità specifica vivono con una mappatura 1: 1 all'entità originale), ma questo è solo il database. Come gestisci questo codice? Il nostro modello di dati risiede 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 nel trovare così poco materiale sull'argomento.
Quindi le mie domande sono le seguenti:
- Che esperienza hai con un software altamente personalizzato, quale approccio hai scelto e come ha funzionato per te?
- Quale approccio consigli e perché? C'è un approccio migliore?
- Ci sono buoni libri o articoli sull'argomento che puoi raccomandare?
- Hai raccomandazioni specifiche per il nostro ambiente tecnico (.NET, Entity Framework, WPF, DI)?
Modifica
Grazie per tutti i suggerimenti. La maggior parte delle idee corrisponde a quelle che avevamo già nel nostro team, ma è davvero utile vedere l'esperienza che hai avuto con loro e suggerimenti per migliorarle.
Non sono ancora sicuro in che direzione andremo e non prenderò la decisione (da solo), ma passerò questo nella mia squadra e sono sicuro che sarà utile.
Al momento il tenore sembra essere un unico repository utilizzando vari moduli specifici del cliente. Non sono sicuro che la nostra architettura sia all'altezza di questo o di quanto dobbiamo investire per adattarlo, 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!