Il commit / il check-in nel codice di tutti i giorni è una buona pratica?


63

Ho letto la nota di Martin Fowler sull'integrazione continua ed elenca come un must "Tutti si impegnano quotidianamente sulla linea principale".

Non mi piace impegnare il codice a meno che la sezione su cui sto lavorando non sia completa e che in pratica commetto il mio codice ogni tre giorni: un giorno per indagare / riprodurre l'attività e apportare alcune modifiche preliminari, un secondo giorno per completare le modifiche e un terzo giorno per scrivere i test e ripulirlo ^ per l'invio. Non mi sentirei a mio agio a inviare il codice prima.

Ora, estraggo le modifiche dal repository e le integro localmente di solito due volte al giorno, ma non lo commetto spesso a meno che non riesca a ritagliare un lavoro più piccolo.

Domanda: commettere ogni giorno una buona pratica che dovrei cambiare il mio flusso di lavoro per adattarlo, o non è consigliabile?

Modifica: Immagino che avrei dovuto chiarire che intendevo "impegnare" nel significato di CVS (noto anche come "push") poiché questo è probabilmente ciò che Fowler avrebbe significato nel 2006 quando ha scritto questo.

^ L'ordine è più arbitrario e dipende dal compito, il mio punto era quello di illustrare il lasso di tempo e le attività, non la sequenza esatta.


20
È possibile eseguire il commit del codice se viene compilato ed esegue una logica utile. Meglio eseguire il commit del codice in brevi cicli se si lavora in un ambiente di squadra.
EL Yusubov,

4
Martin Fowler sta assumendo un VCS che non è distribuito?
user16764

4
Nota la data in quell'articolo: 1 maggio 2006. Git e Mercurial non erano nemmeno iniziati fino all'aprile 2005, e la mia impressione è che abbiano davvero iniziato a farsi strada nel 2008. Non riesco a trovare alcun articolo sul sito di Fowler che faccia riferimento a uno di essi prima del 2009. Quindi questo articolo del 2006 assume chiaramente un sistema di controllo centralizzato delle fonti come SVN. Il consiglio non è applicabile ai team che usano un DVCS.
Kyralessa,

2
@Kyralessa: L'articolo afferma persino che "Subversion è il moderno [sistema di controllo della versione]".
Che

4
Prima il codice e poi i test?

Risposte:


43

Non sono d'accordo con questa regola e sono d'accordo con quanto affermato da Mason Wheeler . Vorrei aggiungere alcune idee.

Cerco di impegnarmi ogni volta che ho una modifica significativa da impegnare: questo può essere più volte al giorno se correggo diversi piccoli bug, o una volta alla settimana se sto lavorando su un software più grande che non può essere utilizzato dal resto di il codice in qualsiasi modo significativo fino a quando non raggiunge uno stato coerente.

Inoltre, interpreto il commit come pubblicazione di una revisione significativa che contribuisce con nuove funzionalità alla base di codice. Penso che si dovrebbe provare a ripulire il codice prima di impegnarsi in modo che altri sviluppatori possano capire il significato e lo scopo del cambiamento quando guardano la cronologia delle revisioni. Meno cambiamenti vedono altri sviluppatori nella storia, meglio è: quando guardo la cronologia delle revisioni voglio vedere incrementi che aggiungono alcune funzionalità significative; Non mi interessa ogni piccola idea che ogni sviluppatore aveva e voleva provare prima di raggiungere la soluzione.

Inoltre, non credo sia una buona idea usare il server SVN (o qualunque sistema di controllo versione) come una funzione di backup in cui è impegnata l'istantanea corrente del codice (a condizione che sia compilata): è possibile utilizzare una chiavetta USB o un'unità USB esterna o un disco di rete per eseguire il mirroring del codice corrente in modo da non perderlo in caso di guasto del computer. Controllo delle revisioni e backup dei dati sono due cose diverse. La pubblicazione di una revisione non equivale a salvare un'istantanea del codice.

Infine, penso che non dovrebbe essere un problema impegnarsi di tanto in tanto (cioè solo quando si è veramente soddisfatti dello stato attuale del codice) ed evitare conflitti di unione non è una buona giustificazione per impegnarsi (troppo) spesso. Molti conflitti di unione si verificano quando persone diverse lavorano contemporaneamente sugli stessi file, il che è una cattiva pratica (vedere ad esempio questo articolo , punto 7). Unire i conflitti dovrebbe essere ridotto suddividendo un progetto in moduli con interfacce chiare e il minor numero possibile di dipendenze e coordinando il lavoro degli sviluppatori in modo che il codice su cui lavorano si sovrapponga il meno possibile.

Solo i miei 2 centesimi.

MODIFICARE

Un altro motivo per cui mi è venuto in mente un impegno prematuro è che una versione (molto) buggy non può essere testata. Se stai impegnando sul bagagliaio e il tuo team di test sta eseguendo test ogni giorno, potrebbero non avere una versione testabile per alcune ore (o per un giorno). Anche se non provi a correggere il bug e ripristini le modifiche, una ricostruzione può richiedere un paio d'ore. Con, diciamo, cinque tester che lavorano nella tua squadra, hai perso 5 x 2 = 10 ore di tempo della squadra a causa dell'inattività. Mi è successo una volta, quindi cerco davvero di evitare il più presto possibile i commit prematuri in nome del commit .


23
Un 'commit' non è una 'pubblicazione'. 'Commit' significa 'istantanea'; 'pubblicare' si chiama 'push' in scm-lingo. Naturalmente, SVN unisce semplicemente entrambi i concetti in uno, rendendo impossibili molti flussi di lavoro sensibili, ma questa è una limitazione dello strumento, non dei flussi di lavoro di controllo del codice sorgente in generale.
martedì

3
Revision control and data backup are two different thingsSì, mi sento sicuramente così.
Slitta

1
@tdammers: intendevo pubblicare in modo informale: fintanto che il codice è sul mio computer, sono le mie modifiche private al codice comune. Non appena lo commetto, viene pubblicato, noto al resto del team e parte della storia ufficiale del progetto.
Giorgio,

1
In tal caso, "commit" è probabilmente la parola sbagliata. Molti SCM consentono impegni locali e la condivisione del codice con il resto del team è un'azione separata, generalmente chiamata "push". Ancora una volta, SVN raggruppa i due concetti insieme, ma questo è un limite dello strumento e, se ostacola il flusso di lavoro, considera di passare a un altro SCM.
martedì

@tdammers: fare una chiara distinzione tra commit locale e pubblicazione sarebbe un passo avanti. In SVN posso usare un ramo separato per quello però. Ma ancora una volta, mi chiedo perché vorrei tenere traccia di una revisione che non ha molto senso per me? Non sono convinto di volere una nuova revisione (anche privata) solo perché sono le 5 e sto tornando a casa. Preferisco invece fare un backup.
Giorgio,

107

Commetto codice più volte al giorno . Ogni volta che raggiungo un punto in cui il codice è abbastanza completo da compilare e non rompe altre cose, entra.

Dovresti cercare di interrompere il tuo lavoro in modo da poter effettuare il check-in in sicurezza un paio di volte al giorno.

I razionali per questo sono due:

  1. Qualsiasi lavoro non archiviato potrebbe andare perso - il tuo computer potrebbe avere un errore catastrofico. In questo caso, più a lungo aspetti, più lavoro perdi.
  2. Più lavoro fai senza fare il check-in, più codice gli altri dovranno integrare quando deciderai finalmente che viene eseguito. Ciò introduce maggiori possibilità di conflitti e si fondono problemi.

2
Se hai un problema serio con conflitti e problemi di unione, significa che il tuo project manager non sta facendo il suo lavoro. Casi multipli che coinvolgono funzionalità simili dovrebbero andare allo stesso sviluppatore, precisamente in modo da non avere due o più programmatori che ostacolano il lavoro reciproco.
Mason Wheeler,

14
@MasonWheeler - Dopo 3 giorni di lavoro non impegnati, ci sono ottime possibilità che uno abbia toccato il codice che altri hanno contemporaneamente. Se hai un sacco di programmatori che lo fanno, l'evento il miglior project manager non può evitare che si verifichino conflitti.
Oded,

3
@Oded: Forse. Suppongo che la mia risposta sia colorata dalla mia esperienza su una base di codice abbastanza grande che i nostri sviluppatori (circa una dozzina di programmatori nel team) tendono tutti ad avere responsabilità non sovrapposte. Non sono sicuro di quanto diverso sarebbe su progetti più piccoli.
Mason Wheeler,

3
@ArtB - Cosa succede se c'è qualcuno come te che controlla solo ogni 3 giorni? O una volta alla settimana? Fai affidamento sul fatto che gli altri facciano la cosa giusta.
Oded,

3
Quando ho letto la domanda, la mia risposta è stata "è come chiedere se è una buona idea fare la doccia ogni settimana"?
Andrew Grimm,

39

Aderire in modo slavato a qualsiasi metodologia o pratica senza comprendere i motivi alla base non è mai una buona idea. Ecco da dove viene la programmazione cargo-cult.

Pertanto, "dovrei impegnarmi ogni giorno perché lo diceva Martin Fowler" è semplicemente stupido. E a volte è anche poco pratico. Se stai lavorando su una nuova funzionalità complicata, potresti non raggiungere un punto in cui valga la pena effettuare il check-in fino a quando non ci hai già lavorato per alcuni giorni.

Questo non significa che dovresti assicurarti che tutto sia perfetto prima di registrarlo. È un buon modo per perdere lavoro se qualcosa va storto. La cosa giusta da fare è sviluppare e usare il buon senso in materia. Le regole empiriche possono solo aiutarti così tanto.


1
Quindi se si tratta di integrazione / sviluppo di funzionalità complesse, è ancora una grande perdita non impegnarlo, forse non nel trunk, ma almeno in un ramo per questa funzionalità, ecco a cosa servono i rami!
Vincent B.

2
Cosa intendi con "vale la pena fare il check-in"? Se non infrange il codice di qualcun altro, perché non dovresti registrarlo?
Kirk Broadhurst,

2
"Cosa intendi per" vale la pena fare il check-in "? Se il codice di qualcun altro non si rompe, perché non lo fai?": Perché non voglio conservare vecchie copie del codice solo perché esistevano in alcuni punto nel tempo. Voglio anche conservare una vecchia copia del codice se contiene alcune informazioni utili che potrei voler recuperare in futuro. Altrimenti sto solo producendo rumore inutile nella cronologia delle revisioni.
Giorgio,

3
+1. Una volta ho lavorato in una squadra in cui dovevamo controllare ogni giorno il codice nel vcs, anche se il codice era un picco o un'indagine inutile. Si è rivelato inefficiente e dispendioso, soprattutto perché ha richiesto una manutenzione periodica per ripulire il sistema. Era dovuto alla combinazione di paranoia sul rischio potenziale di perdere un po 'di tempo per rifare qualcosa, e perché il manager aveva letto in un libro che dovresti impegnarti ogni giorno. Un esempio estremo forse, ma seriamente, se non hai il giudizio di sapere se vale la pena fare un check in, probabilmente non sei adatto al lavoro.
S.Robins,

14

Oded ha fornito due importanti motivi per impegnare il codice il più frequentemente possibile. Ne aggiungerò altri:

  1. Mentre lavori sul tuo pezzo di codice, altri potrebbero aver bisogno di alcune funzioni su quel codice. Non dovrebbero aspettare 6 giorni per ottenerlo. In questo caso i miei colleghi di solito creano un prototipo nel mio pezzo di codice, lo commetto, aggiungo il corpo e lo commetto di nuovo. E questo di solito viene fatto in poche ore.

  2. Il codice "comune" è per tutti di vedere ogni cambiamento il più presto possibile. Se il pezzo di codice su cui stai lavorando è totalmente separato dal lavoro degli altri e non li farai aspettare, allora si consiglia di creare un ramo su cui lavorare, quindi, se tutto ha successo, uniscilo a la linea principale.


1
Perché questa risposta con (IMO) è l'unica risposta corretta e accurata (punto 2) così bassa ?! Naturalmente questo è il punto di un ramo! @Mason Wheeler: Quindi ti piace programmare diversi giorni in un raw senza impegnarti una sola volta? Allora perché usare un sistema di controllo versione ?!
Vincent B.

2
Questa è la risposta corretta Se l'attività è di molti giorni di lavoro prima che sia utilizzabile, quindi diramare. Altrimenti ti impegni ogni volta che funziona per garantire che i membri del team abbiano l'ultima versione, possano testare che funzioni e identificare le funzioni aggiunte / mancanti al più presto.
Kirk Broadhurst il

"Quindi ti piace codificare diversi giorni in un raw senza eseguire il commit una sola volta? Allora perché utilizzare un sistema di controllo della versione?!": Perché alla fine vuoi impegnare una revisione, anche se non sei costretto a impegnarti ciecamente ogni giorno. Piuttosto, sta a te decidere se impegnarti più volte al giorno o se lavori tre giorni di fila senza impegnarti. Davvero non vedo il punto nel commettere alcune funzionalità incompiute che nessuno può usare: basta fare un backup, il giorno dopo puoi finirlo e impegnarlo.
Giorgio,

8

Sono fermamente convinto a commettere ogni cambiamento logico che vale la pena mantenere. Effettuare il commit spesso e se il codice non vale la pena conservare, ripristinarlo in uno stato pulito. Più attendi per inviare / pubblicare il codice, più è difficile da implementare e maggiori saranno i problemi. Riceverai anche feedback sui tuoi contributi molto più rapidamente:

  • rompono la costruzione?
  • stai duplicando gli sforzi di un altro membro del team?
  • stai facendo qualcosa di sbagliato?
  • o la gente ti sta aspettando qualcosa?

Le piccole modifiche sono molto più facili da gestire.

Inoltre, vale la pena notare la differenza tra i diversi sistemi di controllo della versione. Alcuni, come Git (distribuito), ti permetteranno di eseguire il commit e il controllo dell'intera cronologia a livello locale, spingendo solo quando sei pronto per la pubblicazione. Altri, come SVN (centralizzato), combineranno i due passaggi rendendo i piccoli commit molto inefficienti.

Non dimenticare che i tuoi commit sono essenzialmente documenti di modifica. Quando le cose andranno male, sarai felice di avere più storia che non abbastanza. Un singolo impegno per settimane di lavoro mi sembra inutile. Finirei per leggere ogni singola riga di codice modificata anziché il riepilogo di ogni blocco logico.


5

Penso che la maggior parte delle risposte qui manchi uno dei punti principali nella dichiarazione di Martin Fowlers. Questo è legato all'integrazione continua . Il codice che non è archiviato (inserito / pubblicato / unito) nella linea principale non viene testato.

Questo non dovrebbe essere letto come un incoraggiamento a impegnare tutto il codice che hai nel tuo computer locale ogni volta che è il momento di lasciare l'ufficio. Come sottolineato da molti altri qui che sarebbe male, avrebbe rotto la build e causato una linea principale instabile.

Tuttavia, è incoraggiante cercare di apportare le modifiche in piccoli passaggi che possono essere registrati sulla linea principale senza causare problemi. Questo incoraggia l'evoluzione del codice invece di strappare tutto e riscrivere.

Ora, cosa c'è di buono in questo modo di lavorare?

  1. Non impegnare grossi blocchi di codice o cambiamenti rivoluzionari riduce la possibilità di interrompere la build.
  2. Se il tuo commit interrompe la build, è abbastanza banale identificare quali sono i problemi, ripristinarlo e quindi eseguire il commit di una versione fissa rapidamente.
  3. Assicurandoti che tutti i test vengano eseguiti su ogni piccola modifica nel codice, ti assicuri di non introdurre bug o regressioni sottili che possono derivare dalla crescita del codice al di fuori dello schema di integrazione continua.

Naturalmente non tutti i cambiamenti si prestano a questo approccio. Come altri hanno sottolineato, nessuna regola è assoluta. Tuttavia, per i cambiamenti che dovrebbero rimanere fuori dalla linea principale per lungo tempo, impostare una linea principale alternativa con il proprio schema di integrazione continua e seguire lo stesso approccio nei suoi confronti. Con i VCS distribuiti di oggi è una cosa abbastanza facile da fare.


+1: "Naturalmente non tutti i cambiamenti si prestano a questo approccio." Penso che questo sia il punto. Trovo il consiglio di Fowler OK, ma uno dovrebbe giudicare caso per caso. Invece, questo consiglio è spesso generalizzato a una regola assoluta e seguito senza ulteriori considerazioni.
Giorgio,

@Giorgio, sono assolutamente d'accordo con te su questo. Nessun consiglio dovrebbe essere preso come regole assolute, non importa chi c'è dietro.
Harald,

Qualche idea in più su questo. "Il codice che non è registrato (spinto / pubblicato / unito) nella linea principale non è testato.": Sono d'accordo che questo è un buon principio e non si dovrebbe aspettare settimane prima del check-in e fare testare il proprio codice. Tuttavia, l'applicazione cieca di questo principio può portare a un'applicazione interrotta che non può nemmeno essere testata (l'ho visto dal vivo: l'intero team di test rimane inattivo per giorni e non può testare nulla fino a quando il codice non viene riportato in uno stato utilizzabile). Forse ciò che altri utenti hanno scritto è applicabile ad alcune situazioni ma non è in generale.
Giorgio,

1
Il controllo nel codice instabile non è mai ok. Un commit che rompe l'IC dovrebbe essere ripristinato. Se si commettono spesso piccole modifiche incrementali, ci sono meno possibilità di introdurre tale rottura rispetto a se si ha una grande modifica che non è stata testata per molto tempo. Potrebbe anche essere più semplice ripristinare se si rompe la build. Ma come dici tu, a volte non c'è modo al di fuori di un cambiamento dirompente. Quindi lucidalo il più bene possibile e testalo accuratamente prima di impegnarlo. Il punto non è seguire le regole, ma capire da dove viene il consiglio.
Harald,

3

Argomenti per il check-in tutti i giorni:

  • Il codice viene archiviato e sottoposto a backup in caso di guasto del disco rigido
  • L'attività può essere registrata nelle note di commit ( cosa ho fatto giovedì ...? )
  • L'integrazione con la base di codice esistente avviene prima e in blocchi più piccoli, sperando di identificare conflitti o unire i problemi prima
  • Il tuo team ha visibilità su ciò su cui hai lavorato
  • I tuoi colleghi possono lavorare prima con le tue interfacce, dando loro più tempo per integrarsi con il tuo "grande bit di codice complesso"
  • Il tuo codice verrà testato nel mondo reale prima o almeno esposto a un uso maggiore di quello che fornirai, portando a una precedente identificazione di bug o omissioni.

Argomenti contro il check-in tutti i giorni:

  • Non è necessario o non si desidera
  • Non ho ancora "ripulito" il mio codice, è un casino
  • Non ho tempo

Non credo che ci siano buone ragioni per effettuare il check-in meno del quotidiano a parte la pigrizia o la disorganizzazione. Niente di peggio di vedere il codice in esecuzione nell'ambiente di sviluppo non corrisponde al codice nel ramo di sviluppo perché qualcuno "non ha ancora finito" e quindi non ha effettuato il check-in.

Mi piacerebbe sbagliarmi su questo, quindi per favore fatemi sapere qualsiasi argomento legittimo contro il check-in giornaliero.


"Non credo che ci sia una buona ragione per fare il check-in meno del quotidiano a parte la pigrizia o la disorganizzazione.": Credo il contrario esattamente per lo stesso motivo. Posso prendere il tempo per esaminare lo stato corrente del codice e decidere se contiene alcune informazioni pertinenti che vale la pena ricordare o, se sono pigro e disorganizzato, posso semplicemente registrarlo (e produrre revisioni extra con poche informazioni contenuto) purché venga compilato.
Giorgio,

1
Capisco il punto che non si dovrebbe essere pigri e ripulire il loro codice ogni giorno in modo che possa essere archiviato. D'altra parte, quando si lavora su un codice complesso, questo è difficile da ottenere perché la pulizia può richiedere diverse ore e non puoi passare diverse ore al giorno solo per ripulire il codice.
Giorgio,

@Giorgio Quindi passi qualche giorno a ripulire il tuo codice? Ho fornito alcuni buoni motivi per effettuare il check-in tutti i giorni - il tuo motivo è che dovrai ripulire il codice? Basta scrivere il codice più pulito verso l'alto.
Kirk Broadhurst,

Questo non è sempre possibile, ad esempio se sto sviluppando da zero un codice complesso (> 4000 LOC) che necessita di molta sperimentazione per avere ragione. È possibile che alla fine della giornata il codice sia un po 'confuso e non voglio ripararlo fino a quando non raggiungo uno stato coerente, che è un paio di giorni dopo. Sfortunatamente non sono così intelligente che ho in mente forme di codice perfette e perfette e posso sempre avere tutto scritto in poche ore (cioè alla fine di un giorno). Ho avuto un'esperienza del genere ultimamente e il ciclo di sviluppo tipico (da uno stato coerente a quello successivo) è stato di 2, 3 giorni.
Giorgio,

@Giorgio non hai un ramo di sviluppo che stai controllando? Il codice deve essere registrato in modo che anche altre persone possano esaminarlo e testarlo.
Kirk Broadhurst,

2

Se intendi "impegnare" come "unire in mainline", sicuramente non dovresti farlo ogni giorno su un progetto software che viene rilasciato ai clienti. Dovresti unire le modifiche apportate e testate, in modo che la linea principale sia sempre funzionante e rilasciabile, e non in uno stato interrotto con funzionalità semifinite.

Tuttavia, il lusso di lavorare con il controllo della versione distribuita di oggi è che puoi mantenere stabile la linea principale e allo stesso tempo fare git/hg/whatever committutto ciò ogni volta che senti di voler preservare lo stato delle cose. Lo faccio una volta ogni poche ore e sicuramente alla fine di ogni giorno.

Con DVCS puoi pubblicare il tuo lavoro, collaborare con altri nel tuo team e tenerlo aggiornato con le modifiche nel ramo principale. Puoi fare tutto ciò senza inquinare la stabilità del codice da cui dipendono i tuoi clienti e / o altri team.

In tempi in cui Subversion era la tecnologia più recente e non c'era modo di biforcarsi e unire i rami delle caratteristiche senza il dolore estremo, avere una linea principale in cui diverse caratteristiche erano in costruzione simultanea avrebbe potuto essere l'approccio migliore. Ma questa superiorità non si estende oltre il 2010.


2

In Team Foundation Server puoi 'Shelve' che non è lo stesso di un check-in, ma effettua solo un backup del tuo codice in modo che se la tua macchina muoia non hai perso le modifiche.

Ho anche visto case di software che hanno una "linea di sviluppo" e una "linea principale". Gli sviluppatori sono liberi di accedere alla linea degli sviluppatori ogni volta che lo ritengono opportuno e solo il caposquadra ha accesso alla linea principale, quindi sono responsabili della copia del codice dallo sviluppatore alla rete principale quando è pronta per la produzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.