Domanda

Sto provando ad installare un repository di codice riutilizzabile. Stavo pensando di avere ogni modulo di codice riutilizzabile avere un certo rating “Maturity Livello”. Il voto vuoi essere definita come il livello al quale un codice riutilizzabile si trova all'interno di un certo insieme di requisiti. Il livello di maturità più alto sarà il più alto livello di standard per una serie predefinita di requisiti.

Ad esempio:
Livello; Requisiti; Descrizione
Livello 0; Codice è legale usare; È il codice legale da utilizzare nel settore commerciale / su più contratti / etc?
Livello 1; codeline Base e soddisfa livello 0 requisiti; Codice prototipo, 3rd strumenti di terze parti, ecc
Livello 2; Ha interfaccia e commenti funzione e soddisfa il livello 1 requisiti; documentazione sufficiente per ogni classe e la funzione; In grado di determinare le funzionalità da commenti Elenco Livello 3; Aderisce agli standard di codifica e soddisfa livello 2 requisiti; Segue standard di codifica definiti e passa il controllo del codice di prova di utilità
Livello 4; Comprende casi di test e soddisfa i requisiti di livello 3; Ha casi di test sufficiente per testare tutte le funzionalità del codice
Livello 5; Approvato dal comitato di riutilizzo e soddisfa il livello 4 requisiti; Inviato da esperti di riutilizzo e coetanei e verificato soddisfa tutti i livelli di maturità

Mi chiedo se questo livello di maturità dovrebbe essere una struttura gerarchica, in cui, al fine di passare al livello successivo è necessario per soddisfare le esigenze di tutti i livelli precedenti (come ho mostrato sopra)?

o se deve essere un sottoinsieme dei requisiti per soddisfare il livello successivo?

Per esempio, abbiamo incontrare x su requisiti y, possiamo passare al livello successivo (requisiti sarebbe la stessa come detto sopra).

Livello 0, incontra 0 su 6 requisiti
Livello 1, incontra 1 su 6 requisiti
...

Il problema che vedo con l'approccio sottoinsieme è alcuni requisiti dovrebbero avere una ponderazione più forte, e in questo approccio che non sarà preso in considerazione (a meno che io iniziare a ricevere specifico come, incontra una di B e x di y, eccetera). Ma allora si potrebbe iniziare a complicarsi.

Qualcuno ha fatto prima, e se sì, come ha fatto a configurare la vostra libreria? Avete un livello di maturità a tutti o qualche altra struttura? Qualsiasi input sarebbe molto apprezzato.

È stato utile?

Soluzione

La creazione di un repository il riutilizzo del codice è un compito difficile. La difficoltà principale non è nel modo in cui lo si imposta ma in come si comunica l'esistenza delle varie librerie nel repository. biblioteche riutilizzo buoni solo se vengono utilizzati, e vengono utilizzati solo se sono noti, e sono utilizzati solo ampiamente se la qualità del codice è alta e se soddisfa le esigenze degli utenti.

Mi piace l'idea di livelli di maturità, ma come altri hanno scritto, v'è probabilmente un po 'di setup / costruire lavoro da fare. Ho pensato a un approccio simile a build di un'applicazione - li ho chiamati livelli di fiducia. Nell'arena applicazione-build, una bassa costruire la fiducia è uno che non ha superato i test di unità; una fiducia media potrebbe includere test di passaggio di unità, ma non i test di integrazione, e così via. Questo è stato un buon meccanismo per comunicare al QA e agli utenti cosa aspettarsi. Un meccanismo simile potrebbe essere appropriata per le biblioteche.

I commenti di documentazione sono un must, e devono anche avere la stessa attenzione ha messo in loro come si mette nel codice. I commenti dovrebbero comunicare cosa, perché, dove, quando, come, che, ecc processo di generazione dovrebbe pubblicare la documentazione in una posizione ben nota (ancora una volta, la comunicazione è fondamentale).

Lungo le linee di comunicazione, non fa male a presentare di volta in volta solo quello che c'è. Ancora! comunicazione.

Quindi, come minimo vostra build di ogni biblioteca dovrebbe:

  • pubblicare la biblioteca (forse informare gli abbonati)
  • pubblicare la documentazione
  • unit test eseguiti
  • pubblicare il livello di maturità

Per quanto riguarda livelli di maturità, vorrei definirli con un "nome del livello" e una descrizione di ciò che significa il livello. Pubblicare i criteri per ciò che significa spostarsi verso l'alto o verso il basso di un livello. In realtà, ora che ci penso, forse si vuole una serie di criteri ortogonali: un livello per il codice, un livello per la documentazione, l'uso-politiche (cioè deve avere una licenza per XYZ), e altri attributi. Vi consiglio si avvicina a questo in piccoli incrementi però. Alla fine della giornata, offrendo funzionalità per gli utenti finali è ciò che conta.

È necessario comunicare anche una mentalità di spingere naturalmente bit riutilizzabili nel repository. Gli sviluppatori devono avere incentivo a fare questo di solito. strumenti di codice di controllo statico che cercano recensioni duplicazione e tra pari che andare così lontano. Qualcuno ha a che fare in realtà il lavoro di spostare il codice nel repository.

Infine, vi consiglio di utilizzare il supporto strumento il più possibile nella messa a punto, costruire, la manutenzione, e la comunicazione del repository. In caso contrario, come un qualsiasi manufatto non il codice, si dovrà affrontare una certa quantità di entropia che abbassa il valore del non-codice di manufatto viene datato.

Altri suggerimenti

Penso che sarà difficile per garantire che l'intero team di sviluppo segue queste linee guida con sufficiente precisione. Soprattutto quando tali orientamenti possono essere interpretate in un modo o nell'altro. Inoltre, sarà un grande dolore se qualcuno migliora una parte del codice con l'aggiunta di test e improvvisamente ha di passare a un altro progetto. Più probabile che no, tale codice rimarrà nel progetto è stato originariamente messo in, e nel tempo i livelli di maturità sarà priva di significato.

Un approccio che ho visto lavorare bene in una grande azienda è questa:

  • Tutte le librerie di terze parti si impegnano a una directory speciale e sempre includono un numero di versione.
  • Le nostre librerie comuni sono divisi sulla base dei riferimenti che hanno da altre cose. Per esempio. se il codice di utilità fa riferimento alla libreria Infragistics allora questa porzione di codice di utilità va in una libreria InfragisticsUtils.
  • Le nostre librerie comuni che formano "unità" chiaramente identificabili andare in librerie separate. Ad esempio, una libreria di codice che si occupa di titoli di pricing è un progetto separato.
  • Tutto il codice riutilizzabile che non soddisfa una di queste va in un catch-all progetto Utilities.
  • Le nostre librerie sono compilati e rilasciati in una posizione condivisa in cui i progetti di loro possono fare riferimento. Spetta ai team di sviluppo dei progetti di decidere se vogliono fare riferimento a un binario compilato o semplicemente comprendono il progetto di utilità nella loro soluzione.

Ovviamente la qualità del codice che trovate nella catch-all biblioteca Utilities può variare in modo significativo. Per alleviare questo abbiamo semplicemente assicurato che due persone provenienti da diversi team di sviluppo esaminato tutte checkins a Utilities. Questo erbacce fuori un sacco di cose che non ha posto lì!

Credo che un repository grande codice dovrebbe includere uno strumento CM e uno strumento Wiki. Lo strumento CM deve essere strutturato con l'idea di livello (come proposto), in quanto le strutture il codice di qualità. Il wiki dovrebbe agire come un "annuncio" di ciò che il software può fare e come può aiutarti. Questo wiki potrebbe anche mantenere le informazioni come, quali progetti stanno usando il codice, valutazione di come utilizzabile sia, ed esempi di come usarlo. Se qualcuno è preoccupato per il team di sviluppo seguendo le linee guida di livello, va sottolineato come funziona di auto di polizia e dare l'esempio di come funziona con i wiki.

Ora, la strutturazione dello strumento CM è importante. È stato progettato per trasmettere la qualità del codice, in modo da sapere ciò che si ottiene in quando lo si utilizza. Ad esempio, se si scrive una semplice classe con appena eventuali commenti e in realtà non sostieni di codifica standard (forse un prototipo) allora sarebbe entrato in \ sw_repository \ level0 \ ExamplePrototype.

Forse qualcuno poi prende quel pezzo di codice e commenti aggiunti e lo porta fino a standard. Allora quella persona sarebbe metterlo in \ sw_repository \ level1 \ ExamplePrototype.

Poi quella stessa persona, un po 'più tardi, crea unit test per l'ExamplePrototype. Questo sarebbe poi andare a level2 e così via.

Definizione dei livelli dovrebbe prendere qualche pensiero. Essi in realtà dovrebbe essere un po 'sequenziale e, anche se per esempio, si era scritto unit test per il codice del prototipo, ma non soddisfaceva i commenti e standard di codifica, allora è collocato in level0 comunque. Tuttavia, sarebbe facile andare a level2 se tali osservazioni e gli standard sono stati soddisfatti.

Per la mia biblioteca, ho appena messo nel codice che ho scritto che può essere utilizzato in diverse applicazioni. Se il codice è specifico per una particolare applicazione, allora non va in biblioteca. Come più applicazioni utilizzano, i bug vengono risolti in modo non ho mai aspetto che sia privo di bug subito. Bugs saranno costantemente trovati e risolti come libreria matura e è sottolineato con applicazioni diverse. Non sarà mai privo di bug, ma nel corso del tempo si avvicinerà affidabilità. Anche quando mi rendo conto che API per alcune cose è sbagliato, non mi preoccupo a questo proposito e refactoring l'API il più presto possibile.

Qui è la mia libreria in C ++
http://code.google.com/p/kgui/

Per anni Microsoft è stato un grande sostenitore di quella che è conosciuta come software factory , una grande parte delle quali è dedicata a risolvere i problemi di riutilizzo.

Quali sono i problemi di riuso? Prima di tutto, è difficile. E 'molto difficile trovare una biblioteca e API che servirà al di là dei bisogni immediati del progetto a portata di mano. Come si fa a prevedere il futuro? Inoltre, il problema di un repository centralizzato che funge sia da base di conoscenze e una vivace comunità di pratica è molto impegnativo. Come si fa a fare qualcosa che sia molto flessibile ma facile da usare? Molti hanno provato e fallito. Entrambe le software fabbriche e linee di prodotti software tentativo di affrontare questi problemi.

In bocca al lupo!

Kit citato il problema più importante: il riutilizzo . il resto l'idea è bella, ma non è più di un dettaglio.

Voglio dire, io stesso ho problemi a mantenere la mia propria biblioteca riutilizzo. A volte faccio un'implementazione che è molto specifica per il progetto, o faccio il prototipo n-esimo per qualche idea, e nessuno di coloro che dovesse penetrare negli mia biblioteca.

se davvero riuscire ad avere una libreria di riutilizzo del codice, che viene utilizzato e mantenuto da molti sviluppatori, in modo disciplinato, oltre che è la vittoria. avete bisogno di un sistema di controllo di versione e un bug tracker, quest'ultimo usato da entrambi i proprietari e utenti del progetto. avete bisogno di comunicazione e mezzi di contributo. avendo una manciata di sviluppatori che utilizzano un progetto migliora notevolmente la qualità. implementazione migliora. viene creata la documentazione. API e design caratteristica sono su un livello molto più alto. una commissione è una bella cosa, ma non può decidere, quanto è buono dato il codice è, senza effettivamente usarlo. si può decidere se il codice è conforme agli standard specifici, ma conformi a norme non è sufficiente per buone biblioteche.

quello che devi fare del tuo meglio per essere sicuri, non si dispone di tonnellate di frammenti di codice in giro, ognuno dei quali può più o meno fare qualcosa. ok, qualsiasi decisione di progettazione ha vantaggi e svantaggi, ma credo, ha più senso iniziare con un progetto per un determinato compito, e il ramo, se proprio necessario, ma mantenere la comunicazione viva tra i team di progetto, e prendere in considerazione (in parte) la fusione indietro.

non preoccupatevi troppo di categorizzare la qualità di progetti diversi. Se un progetto è male, quindi gli utenti / sviluppatori potranno spingere ad un livello migliore. la maggior parte delle persone sono abbastanza intelligente da vedere, quando una libreria è buona, e quando non lo è. si ha realmente bisogno di mettere la vostra energia in questi effetti simbiotici, piuttosto che cercare di partecipanti onere con regole severe.

solo i miei 2 centesimi ...;)

Guarda Will Tracz "Confessioni di un Usato Programma commesso viaggiatore", e roba da riutilizzo rabbino di HP, Martin Griss.

Credo che stai pensando troppo in un non problema.

Come ho fatto a impostare la mia libreria? Facile, se si utilizza lo stesso (o quasi lo stesso) il metodo in due o più progetti, spostarlo alla biblioteca.

E 'considerato un buon approccio per avere la propria libreria, ma di mille linee di uno è una rovina!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top