Perché un team di sviluppo dovrebbe insistere sul fatto che l'utilizzo di un'unica soluzione per più progetti in Visual Studio "accresca la complessità dell'interdipendenza"?

24

Sto aiutando a gestire un team esterno che sta iniziando a sviluppare nuove versioni di alcuni prodotti esistenti. Storicamente, questo team ha sempre utilizzato un modello di un singolo progetto in un'unica soluzione per circa 30 moduli in Visual Studio che si uniscono per produrre una build distribuibile.

Questo ha un impatto negativo sull'affidabilità e sulla qualità degli edifici, perché non sempre ci inviano il codice sorgente più aggiornato. Stiamo cercando di comprimerli per unificare tutti i codici di riferimento in un'unica soluzione, ma stiamo ottenendo una certa resistenza - in particolare continuano a parlare dell'interdipendenza tra i moduli (leggi "progetti" in Visual Studio) aumentati se tutto viene inserito in un singolo file di soluzione. Nessuno del codice nelle soluzioni separate viene utilizzato altrove.

Insisto che questo non ha senso e che i buoni schemi di sviluppo eviteranno qualsiasi problema di questo tipo.

Il team in questione esegue anche bugfix e lo sviluppo di nuove funzionalità su un prodotto esistente, la cui esperienza è stata a dir poco irta e soffre esattamente dello stesso problema di suddivisione su più soluzioni. Ci è stato negato l'accesso al loro controllo del codice sorgente ( TFS ), e l'approccio che stiamo adottando per unificare il codice è per provare e almeno ridurre il numero di aggiornamenti mancanti e più di regressioni occasionali (sì, i bug corretti vengono reintrodotti nel prodotto) dicendo "inviaci un ZIP dell'intera cartella della soluzione in modo che possiamo decomprimerlo, aprirlo in Visual Studio e premi F5 per il test ". In termini di struttura generale e qualità, il codice è piuttosto scarso e difficile da supportare. Questa esperienza è il motivo per cui sono intento a ottenere i processi di lavoro il prima possibile nel ciclo di sviluppo possibile.

C'è qualcosa che mi manca? C'è mai una buona ragione per separare tutto quel codice? Per i miei soldi dovrebbe essere una ragione così convincente che sarebbe di dominio pubblico, ma sono più che disposto a concedere che non so tutto.

    
posta DrMistry 02.12.2016 - 15:34
fonte

4 risposte

53

Non è necessario dir loro come strutturare i loro progetti. Piuttosto, è necessario che tu possa creare il sistema dal sorgente eseguendo un singolo script, senza ottenere alcun errore. Se gli script eseguono Visual Studio o Msbuild o altri strumenti e se vengono chiamati una volta, 50 o 100 volte non dovrebbero avere importanza.

In questo modo, si ottiene lo stesso "test di completezza" del codice come si otterrebbe mettendo tutto in un'unica soluzione. Ovviamente, questo script non ti dice se il team ha veramente controllato l'ultima versione dal loro controllo sorgente, ma avere l'intero codice in una soluzione non lo controlla,

Come risposta a "l'interdipendenza tra i moduli aumentati se tutto è collocato in un unico file di soluzione" - questa è una dimostrabile assurdità, poiché aggiungere progetti a una soluzione non non modificare nessuna delle dipendenze tra i progetti, le dipendenze sono il risultato di un file di progetto che fa riferimento a un altro, che è completamente indipendente da quale soluzione fa riferimento a quale file di progetto. Nessuno impedisce a quel team di avere entrambi - una soluzione unica che fa riferimento a tutti i progetti, e anche soluzioni individuali, ciascuna delle quali fa riferimento a un solo progetto.

Tuttavia suggerirei di aggiungere uno script di compilazione. Ciò ha benefici anche quando esiste un solo file di soluzione. Ad esempio, consente di eseguire una build VS con una configurazione preferita, di copiare i file finali per la distribuzione (e nient'altro) in una cartella "deploy" e di eseguire altri strumenti e passaggi per completare la compilazione. Vedi anche F5 non è un processo di compilazione! , e Il test di Joel .

    
risposta data 02.12.2016 - 15:46
fonte
3

Dipenderà da quanto vengono riutilizzati gli assembly compilati. Se non viene riutilizzato l'assemblaggio, non vi è alcun motivo reale per tenere separati i "moduli". In effetti nella mia esperienza questo è più di un ostacolo.

Nel team di sviluppo di cui faccio parte abbiamo librerie indipendenti che abbiamo scritto utilizzate in più prodotti come soluzione separata, che in questo caso ha senso altrimenti dovremmo compilare l'applicazione A per mantenere l'applicazione B in su fino ad oggi, che potrebbe essere necessario per mantenere l'applicazione C aggiornata.

Ogni prodotto è mantenuto nella propria soluzione, anche se ci sono più progetti che compongono il prodotto. In questo modo dobbiamo solo costruire la soluzione Libreria per mantenere aggiornato il suo codice condiviso in tutti i prodotti sviluppati.

    
risposta data 02.12.2016 - 18:05
fonte
1

Ogni azienda di software per la quale ho lavorato ha avuto un team di sviluppo principale che ha fornito il ramo principale che copre i casi d'uso fondamentali dei prodotti dell'azienda.

Gli sviluppatori di filiali che utilizzano il repository principale sono responsabili della scoperta dei miglioramenti e dell'invio delle richieste di pull al ramo principale per la revisione. Questo è solitamente il modo in cui uno diventa uno sviluppatore principale, mostrando che si può dare un contributo migliore rispetto al semplice fiammeggiare le fiamme di un conflitto architettonico.

È probabile che la tua azienda semplicemente non disponga delle risorse per "unificare tutti i codici di riferimento con un'unica soluzione". Suggerire di farlo senza comprendere i propri vincoli di budget è (almeno) probabile che impedisca a uno di diventare un ingegnere di base.

Quindi formuli la tua visione generale in poche e devastanti richieste di attrazione verso il nucleo, e preparati a difenderti in revisione!

    
risposta data 03.12.2016 - 02:02
fonte
0

C'è un nucleo di verità nell'affermazione "L'uso di una singola soluzione per più progetti aumenta la complessità dell'interdipendenza".

Una singola soluzione fa riferimento a un progetto da un altro progetto (cioè riutilizzando il codice di un progetto a.k.a. "introducendo la complessità di interdipendenza") più semplice:

  • invece di sfogliare l'intero file system / cache di assembly globale per l'assembly di riferimento, è possibile selezionare il progetto da una serie limitata di progetti rilevanti nella soluzione; e,
  • durante la lettura del codice sorgente è molto più semplice passare a un progetto di riferimento nella soluzione piuttosto che a un assembly arbitrario (binario).

Quindi nelle mani di un team indisciplinato che utilizza più progetti in un'unica soluzione può portare a molte dipendenze trascurate. Tuttavia, un team può provare meglio ad apprendere la disciplina necessaria per gestire attentamente le dipendenze e quindi utilizzare la facilità di riutilizzo che utilizza l'offerta di soluzioni.

    
risposta data 03.12.2016 - 12:18
fonte

Leggi altre domande sui tag