Il mio collega si impegna e spinge senza prove


113

Quando il mio collega pensa che non sia necessario un test sul suo PC, apporta modifiche, si impegna e quindi spinge. Quindi verifica sul server di produzione e si rende conto di aver commesso un errore. Succede una volta alla settimana. Ora vedo che ha eseguito 3 commit e che ha inviato la distribuzione al server di produzione in 5 minuti.

Gli ho detto alcune volte che non è così che si fa un buon lavoro. Non voglio essere di nuovo scortese con lui ed è nello stesso stato con me in compagnia e ha lavorato più di me qui.

Voglio che questo comportamento sia punito in qualche modo o lo renda spiacevole il più possibile.

Prima di iniziare, la società distribuiva utilizzando metodi antichi, come FTP, e non c'era controllo della versione.

Ho costretto loro / noi a usare Git, Bitbucket, Dploy.io e HipChat. La distribuzione non è automatica, qualcuno deve accedere a dply.io e premere il pulsante di distribuzione.

Ora, come posso forzarli a non eseguire test sul server di produzione? Qualcosa come il bot HipChat può avvertire che ci sono ripetute modifiche sulla stessa linea e inviare un avviso al programmatore.


1
I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Ingegnere mondiale,

5
Dato che sei su Git, usa le richieste pull per imporre le revisioni del codice prima di unirle in master e distribuirle alla produzione. Inoltre, rimuovere le sue credenziali per accedere al server di distribuzione. Centralizza questa autorità in un non sviluppatore. (A proposito, la conformità PCI applicata dall'industria delle carte di credito lo richiede.)
Barett,

3
Dal punto di vista del posto di lavoro, se sei un collaboratore con questa persona e non in qualche modo il suo supervisore, è improbabile che tu possa ottenere alcuna trazione "punendoli". Concentrati sulla garanzia della qualità del codice, non sulla punizione per gli standard lassisti del tuo collega.
Zibbobz,

2
Una spinta al repository "centrale" provoca sempre una distribuzione della produzione? Non dovrebbe assolutamente.
jpmc26,

3
Ho letto la domanda e mi sono detto che il ragazzo deve essere turco e il gioco è fatto :) controlla questo fratello: nvie.com/posts/a-successful-git-branching-model . Devi avere almeno due rami: master e dev in cui gli sviluppatori spingono solo per dev e dopo il test ti unisci per master e deploy.
Cemre,

Risposte:


92

È necessario un processo di controllo qualità (QA) adeguato.

In un team di sviluppo software professionale, non si spinge dallo sviluppo alla produzione. Hai almeno tre ambienti separati: sviluppo, stadiazione e produzione.

Quando pensi di avere qualcosa che funzioni nel tuo ambiente di sviluppo, spingi prima alla messa in scena, dove ogni commit viene testato dal team QA e solo se quel test ha esito positivo, viene portato alla produzione. Idealmente, lo sviluppo, il collaudo e la promozione della produzione vengono effettuati da persone separate. Ciò può essere garantito configurando il sistema di automazione della compilazione in modo tale che gli sviluppatori possano implementare dallo sviluppo alla gestione temporanea e che il team addetto al controllo qualità possa implementare solo dalla gestione temporanea alla produzione.

Quando non riesci a convincere il management ad assumere qualcuno per fare il tuo QA, allora forse uno di voi può svolgere quel ruolo per l'altro. Non ho mai lavorato con diploy.io, ma alcuni sistemi di automazione della build possono essere configurati in modo tale che un utente possa distribuire sia dallo sviluppo alla gestione temporanea che dalla gestione temporanea alla produzione, ma non fare entrambi per lo stesso build, quindi una seconda persona è sempre richiesto (ma assicurati di avere alcune persone di backup per le volte in cui uno di voi è assente).

Un'altra opzione è che il personale di supporto faccia il controllo qualità. Questo potrebbe sembrare un lavoro aggiuntivo per loro, ma assicura anche che siano a conoscenza di eventuali modifiche all'applicazione che possono proteggerli in qualche modo nel lungo periodo.


L'idea che Support esegua il QA in cui comporta il rilascio in produzione sembra conveniente, ma non volerà per il motivo della separazione delle funzioni. Il supporto che è responsabile del supporto oltre la fine del "test dei programmatori" dovrebbe renderli consapevoli dei cambiamenti È davvero difficile con quattro sviluppatori e nessun altro :-) Se cambi risposta rispondi per applicare direttamente al setup del PO, allora è non sarà molto utile a nessun altro ...
Bill Woodger,

1
@BillWoodger perché? Per loro è un sistema di "modifiche e rollback imminenti". Non solo ottengono il vantaggio di vedere cosa sta per succedere prima che "diventi reale", ma è anche un modo per tornare facilmente all'ultima versione se le cose vanno male. Non dimenticare che la messa in scena env è il test di fine programma.
gbjbaanb,

1
@gbjbaanb perché mette Support nella stessa posizione e ripristina il problema originale. Il supporto avrebbe generalmente accesso di emergenza alla produzione. Se hanno anche un altro accesso, hai problemi di controllo (se questo è importante). Se qualcuno può cambiare qualcosa, allora c'è un problema. Ovviamente il supporto dovrebbe sapere tutto, non dovrebbe essere in grado di fare tutto. Questo è ciò che dice ogni auditor con cui sono mai stato coinvolto, e mi hanno convinto molto tempo fa.
Bill Woodger,

@BillWoodger Non sono sicuro di quello che stai dicendo. I team di produzione che conosco di solito hanno i loro processi di implementazione che includono un ambiente di test (solo per verificare prima gli errori sciocchi). In un piccolo team, non c'è motivo per cui questo sistema di test non possa essere condiviso da sviluppatori e supporto. Non sono consentiti cambiamenti ad esso - è popolato da dev tramite automazione e consumato dal supporto. Non è diverso dal dare loro una zip dello stesso codice. I revisori si occupano dei processi, non dell'attuazione di tali processi (tranne per il fatto che sono seguiti, ovviamente)
gbjbaanb

1
Gli auditor di @gbjbaanb si preoccupano delle persone che hanno accesso a tutto. Se un tecnico dell'assistenza può modificare un programma in Sviluppo e farlo entrare in produzione senza alcun intervento da parte di qualcun altro, il sistema viene esposto. Certo, con le quattro persone di OP non esiste un "Supporto" separato, e una divisione soddisfacente delle funzioni sarà complicata.
Bill Woodger,

54

Probabilmente vorrai ottenere un server di sviluppo, e preferibilmente anche un ambiente di gestione temporanea. Nessuno dovrebbe mai spingere da locale a produzione tranne per il proprio sito Web personale. Il processo di distribuzione dovrebbe supportare solo dev-> staging-> prod. Probabilmente vuoi qualcuno responsabile della firma di nuove uscite - a seconda dell'organizzazione, questo può essere un lead di progetto, un QA dedicato o un dovere che ruota ogni settimana (con un promemoria tangibile, ad esempio solo la persona con il giocattolo soffice quella settimana arriva a spingere). Tuttavia, discutilo prima con il tuo team per ottenere il buy-in (vedi sotto).

Voglio che questo comportamento sia punito in qualche modo o lo renda spiacevole il più possibile.

Potresti avere la tua suite di test (ne hai una, vero?) Che include un controllo che determina se sei su un server di produzione e, in tal caso, invia a tutti in ufficio un messaggio di posta elettronica Looks like $username is testing on prod, watch out. Forse vergognare pubblicamente il tuo collega sarebbe spiacevole. Oppure potresti creare restrizioni tecniche come l'IP-vietare al tuo team di guardare prod (che puoi sollevare ma devi giustificare).

Non lo consiglio, però, sembreresti il ​​problema, non la persona che sta testando il pungolo e potresti renderti molto impopolare con le persone del team a cui non importa.

Sicuramente quello che vuoi davvero non è che questo comportamento sia punito, ma che si fermi ?

Li ho costretti / noi ad usare [...]

È fantastico che tu stia sostenendo miglioramenti del flusso di lavoro, ma sembra che tu non pensi molto ai tuoi colleghi e / o che tu non abbia il loro pieno supporto. Ciò può comportare l'interazione accesa a metà dei colleghi con il flusso di lavoro, facendo il minimo necessario per ottenere il codice nella produzione e non seguendo realmente lo spirito del flusso di lavoro, il che significherebbe più tempo speso a chiarire. E quando passi sempre più tempo a chiarire i risultati di un'interazione inadeguata con il flusso di lavoro (perché a nessuno importa, giusto?) Tutti gli altri metteranno in discussione il flusso di lavoro stesso.

Quindi inizia con una conversazione.

Scopri perché sta succedendo (la macchina del tuo collega non è adatta ai test? Il tuo collega è incerto con i rami delle funzionalità o bloccato in una mentalità svn in cui commit e push sono gli stessi?), Spiega perché è un problema per te che il codice non testato vada su dev / staging / prod, e vedi se riesci a fare qualcosa per cambiare il motivo per cui accade (il tuo collega farà più probabilmente quello che vuoi se hai appena reso più bello il test a livello locale che se li hai appena rimproverati).

Se non riesci a risolverlo e si riduce davvero a una differenza di opinione, organizza una discussione a livello di team nella prossima riunione retrospettiva, vedi cosa fanno i tuoi colleghi e pensano. Fai il tuo caso, ma ascolta il consenso. Forse il tuo team dice che va bene non testare le correzioni testuali localmente, e hai solo una regola che nessuna grande funzionalità va su dev non testata. Annotare nella riunione e leggere ciò che si decide collettivamente su ciò che è consentito in ciascuno degli ambienti. Stabilisci una data tra un paio di mesi per esaminarla, magari in una retrospettiva.


10
+1 per la conversazione. Ci deve essere una comprensione condivisa che questo è un problema e perché è un problema. Solo allora può esserci successo con una soluzione tecnica.
Patrick,

9
+1 per ottenere server dev / ambienti di gestione temporanea. Fino a quando non c'è un posto reale al di fuori della propria macchina per spingere le cose questo comportamento non è interamente colpa del collaboratore. C'è solo così tanto che una persona può fare sulla propria macchina e, se non altro, l'ambiente extra aiuta spesso con un cambiamento nel processo di pensiero / atteggiamento nei test.
Joel Coehoorn,

20

Al lavoro, lo evitiamo usando Gerrit . Gerrit è un sistema di revisione del codice che funge da gate per il tuo ramo Git principale / di produzione che è convenzionalmente chiamato "master". Hai recensioni di codice, giusto? Sembra che tu li faccia personalmente eccezionalmente. Con Gerrit, spingi verso una sorta di ramo di gestione temporanea che, dopo che tu e il tuo collega avete eseguito in modo soddisfacente il processo di revisione del codice, Gerrit si unisce quindi al ramo principale. Puoi persino collegare Gerrit a un server CI per eseguire unit test prima che qualcuno riceva un'email per rivedere una modifica. Se non si dispone di un server su cui è possibile impostare uno strumento CI, Codeship ha un bel piano gratuito da utilizzare come prova di concetto.

L'ultimo, ovviamente, è quello di automatizzare le distribuzioni di produzione solo da prodotti di costruzione sanzionati che sono sopravvissuti alla revisione del codice e ai test delle unità. Ci sono alcune tecnologie interessanti in arrivo per questo, che non menzionerò per paura che sarebbe un'esca di fiamma.

Vai dal tuo capo con una soluzione. Questo vale anche per te ed è un modo per migliorare la qualità del codice di tutti, non solo per punire il tuo collega.


17

Vedo questo come un problema in gran parte umano: il processo è lì e gli strumenti ci sono, ma il processo non viene seguito.

Sono d'accordo con ciò che altri hanno detto qui, sulla possibilità che sia abbastanza possibile che lo sviluppatore in questione sia semplicemente bloccato in una mentalità SVN e potrebbe benissimo pensare che stia seguendo il processo.

Trovo che il modo migliore per affrontare questo tipo di problema, specialmente dove potrebbe non esserci un chiaro superiore, non ruota attorno alla punizione o alla rimozione dell'accesso - questo porta solo a risentimento e siccome sembra che tu sia il forte sostenitore di seguire il processo (ce n'è sempre uno, e in precedenza sono stato "quel ragazzo"), sei tu quello che probabilmente tratterà più calore. Ruota intorno portando le persone a concordare prima il processo.

È qui che incontri strutturati, come incontri di tipo "lezioni apprese" dopo un grave incidente di produzione, possono essere molto utili. Prova a convincere tutti, compreso lo sviluppatore in questione, che la revisione del codice, i test unitari, i test completi, ecc. Devono sempre aver luogo, ogni volta (e puoi iniziare a introdurre l'idea di un ambiente di staging anche qui). Non dovrebbe essere difficile ed è molto sensato. Quindi chiedi al team di elaborare insieme alcune regole solide, su come dovrebbe essere fatto. Più lo sviluppatore che sta causando il problema contribuisce, più avranno voglia di aderire alle regole e inizieranno a capire perché il loro comportamento è stato un problema.

L'ultimo punto è non cadere mai nel "beh, è ​​meglio di prima!" trappola. C'è sempre spazio per il miglioramento. È comune per le persone del settore IT, nella mia esperienza, iniziare ad accontentarsi di ciò che hanno, dopo alcuni miglioramenti. L'insediamento quindi continua, fino a quando non sei di nuovo improvvisamente in un punto di crisi.


1
Non sono davvero chiaro come "commettere / spingere, distribuire immediatamente alla produzione e testare le tue modifiche lì e in nessun altro luogo" è una mentalità SVN ... L'unica parte di quel processo che coinvolgerebbe SVN è il commit. Anche con un singolo modello di filiale o controllo del codice sorgente, un commit non implica necessariamente una distribuzione della produzione. O almeno non dovrebbe.
jpmc26,

@ jpmc26: a rischio di una guerra alla fiamma Git / SVN: abbiamo ereditato un sistema SVN per gran parte del nostro codice "legacy" ma abbiamo usato Git per il nostro nuovo lavoro. Posso quasi garantire che non abbiamo installato SVN nel modo giusto e / o non l'abbiamo usato nel modo giusto, ma la gestione dei rami da parte di Git è molto più facile da lavorare. Sono sicuro al 100% che SVN è più che in grado di gestire una corretta distribuzione, ma posso anche vedere (dalla mia esperienza imperfetta) come SVN potrebbe "dissuaderti di meno" dal fare la cosa giusta. In ogni caso, questo sarebbe solo un fattore contributivo e l'educazione dell'utente è più importante.
TripeHound,

1
@TripeHound Nessun argomento sul fatto che il sistema git sia complessivamente migliore per la gestione delle modifiche al codice. (Le mie obiezioni con git generalmente hanno a che fare con l'alta curva di apprendimento.) Il mio punto è più che, sebbene git possa avere più capacità per aiutare a gestire il processo di rilascio, il modo in cui si configura la propria infrastruttura di costruzione è ancora il fattore principale rispetto al scelta del controllo del codice sorgente. Ho avuto un discreto successo nell'automazione della build e del rilascio in SVN da un po 'di tempo, quindi non sono molto chiaro su cosa sia una "mentalità SVN" o su come questo abbia un impatto negativo sulla tua versione.
jpmc26,

2
Solo perché ti impegni a padroneggiare non significa che dovresti distribuire alla produzione. Anche se il repository di origine / repository svn è ospitato sul server prod, ciò non implica tale cosa.
vonPetrushev,

12

Questo non è raro , in particolare nelle piccole squadre. Non fare molto, ma fai una regola informale:

Rompi la costruzione, porta le ciambelle.

1) Riceverai ciambelle due volte a settimana o 2) aderiranno allo standard.

Presentalo in una riunione. Non per accusa, non menzionare nessuno per nome, ma qualcosa di simile a "Da quando abbiamo introdotto il controllo della versione e gli standard di distribuzione, le cose sono diventate molto più semplici e il server è più attivo di quanto non fosse in passato. Questo è fantastico! Tuttavia è ancora allettante tentare di prendere una scorciatoia e inviare senza test adeguati. Tuttavia, è una scommessa e il nostro server è in linea. Suggerisco che d'ora in poi se qualcuno di noi invia codice che rompe il server, la persona responsabile porta ciambelle per la squadra il giorno successivo ".

Sostituisci qualcos'altro con le ciambelle se lo desideri, e non renderlo costoso: il pranzo per l'intera squadra sarebbe troppo, ma una scatola da $ 5 di ciambelle o vassoio di frutta / verdura, o patatine e salsa, ecc., Probabilmente sarebbe fastidioso abbastanza per farli effettivamente soppesare il rischio rispetto alla comodità di saltare i test senza renderlo un onere che li allontanerebbe dal team o dall'azienda.


2
Funziona solo con un ufficio. Qual è il concetto equivalente per quando hai un team distribuito di sviluppatori remoti che lavorano tutti da casa?
aroth,

2
@aroth Per alcuni team, è sufficiente una semplice e-mail a livello di team della persona che ha rotto la build. Pianificalo come un "obiettivo di miglioramento continuo del processo" e chiedi che l'e-mail contenga abbastanza informazioni che gli altri possano vedere cosa è andato storto, perché è andato storto e cosa cambierà quella persona sul suo processo o su cosa sta suggerendo al team di cambiare il processo, per evitare che accada di nuovo. La maggior parte delle persone odia i rapporti e i rapporti, ed è di nuovo abbastanza fastidioso che possano essere più attenti a non rompere la costruzione in futuro.
Adam Davis,

8

Ora, come posso forzarli ...

Invece di forzare i tuoi colleghi, prova a far vedere loro le cose dalla tua prospettiva. Questo renderà le cose molto più facili per tutti. Il che mi porta in ...

Voglio che questo comportamento sia punito in qualche modo o lo renda spiacevole il più possibile.

Perché è un dolore per te con problemi sul server live, ma non per questo ragazzo? Sai qualcosa che lui non sa? Cosa puoi fare per fargli vedere le cose come fai tu?

Se ci riuscirai, tirerai fuori il meglio da lui e lui troverà soluzioni al problema che non hai mai pensato.

In generale, prova a collaborare con le persone per risolvere i problemi piuttosto che forzarli in processi che non comprendono.


6

Qual è il peggio che potrebbe succedere? Hai backup abbastanza buoni da poter correggere un bug che modifica record casuali nel tuo database ripristinando una versione precedente?

Supponiamo che tu abbia un bug in cui usi un ID record e, per errore, l'importo di una fattura in centesimi viene archiviato in una variabile utilizzata per l'ID record. Quindi, se pago $ 12,34, il record con ID 1234 verrà modificato. Puoi recuperare da questo, se il software viene eseguito per alcune ore fino a quando il bug non viene rilevato? (Se vengono aggiornati sia il record corretto che il record 1234, questo verrà rilevato solo quando viene utilizzato il record 1234, quindi potrebbe non essere rilevato per un bel po ').

Ora chiedi al tuo sviluppatore altamente motivato cosa ne pensa. Ovviamente non può affermare di non aver mai commesso errori, perché lo ha fatto in passato.


"Hai dei backup abbastanza buoni" - e, anche in questo caso, il tuo collega vuole essere il rapinatore che deve ripristinare il backup perché ha rotto il server? Forse, in linea di principio, vorrebbe testarlo prima della distribuzione, ma poiché non esiste un ambiente di test, sta prendendo l'opzione più semplice attualmente disponibile. Quindi fare il caso per un server di prova dovrebbe essere facile. A proposito, i bug che non vengono rilevati "per un bel po '" supereranno i test fino alla distribuzione poiché il problema per tali bug è la qualità dei test, non dove vengono eseguiti i test.
Steve Jessop,

Non solo disponi dei backup, ma anche la tua azienda può permettersi i tempi di inattività durante il ripristino? E può permettersi di perdere minuti, ore o persino giorni di informazioni perché è necessario eseguire un rollback del database? Direi in quasi tutti i casi non banali, la risposta è un clamoroso "no". E anche in casi insignificanti, non vuoi che "ripristina un backup" sia il modo in cui gestisci il check-in del codice non testato. Ci deve essere qualcosa che assicuri che il test avvenga tra il check-in del codice e il raggiungimento della produzione.
aroth,

Completamente d'accordo, ecco perché ho detto "chiedi al tuo sviluppatore cosa ne pensa". O è totalmente illuso e crede che il suo codice sia privo di bug, o non si rende conto del danno che può causare. O terza possibilità, lo sa e non gliene importa.
gnasher729,

3

Comprendi chiaramente i vari processi e soluzioni tecniche possibili. Il problema è come gestire il collega.

Questo è essenzialmente un esercizio di gestione del cambiamento.

In primo luogo, avrei una parola tranquilla con il fondatore per assicurarmi che sia d'accordo con il tuo punto di vista. Se si verifica un'interruzione della produzione, mi aspetto che il fondatore sia molto preoccupato per questo e desideri un cambiamento.

In secondo luogo, lavori in un piccolo team e probabilmente vale la pena provare a coinvolgere l'intero team nel miglioramento dei processi.

Impostare retrospettive di processo regolari (ad esempio settimanali). Avere l'intera squadra:

  • Identificare i problemi
  • Idee di volontariato per migliorare le pratiche di lavoro
  • Impegnarsi nell'attuazione di tali pratiche

Dovrebbe seguire naturalmente che l'intero team aiuta anche a garantire il rispetto delle pratiche migliorate.


Una retrospettiva è un ottimo modo per affrontare e, si spera, cambiare tale comportamento in modo costruttivo!
greenSocksRock

1

Penso che tu abbia identificato un paio di problemi:

  1. Sembra che qualsiasi codice che viene controllato possa essere banalmente spinto in produzione da chiunque abbia i diritti per eseguire il check-in del codice.

Francamente penso che l'installazione sia semplicemente folle. Come minimo, le persone che possono attivare manualmente una spinta alla produzione dovrebbero essere limitate all'insieme di persone di cui ci si può fidare completamente per rivedere e testare accuratamente tutte le modifiche in uscita (indipendentemente da chi ha creato le modifiche) prima di attivare la spinta. Dare a chiunque con il permesso di archiviare il codice il potere di innescare arbitrariamente una spinta alla produzione è solo chiedere problemi. Non solo da sviluppatori disattenti e / o incompetenti, ma anche da quelli scontenti o da terze parti dannose che capita di compromettere uno dei tuoi account.

E se hai intenzione di utilizzare una procedura a pulsante per distribuire tutte le modifiche che vengono archiviate, devi disporre di una suite completa di test automatizzati e premere il pulsante per eseguirli (e interrompere la distribuzione se eventuali test falliscono!). Il tuo processo non dovrebbe consentire al codice che non è stato nemmeno testato superficialmente di raggiungere il punto in cui viene distribuito in primo luogo al sistema di produzione.

Il tuo collega ha commesso un grosso errore in termini di controllo del codice senza prima verificarlo. La tua organizzazione ha commesso un errore molto più grande adottando un processo di distribuzione che consente al codice non testato di raggiungere la produzione in qualsiasi circostanza.

Quindi il primo ordine del giorno è quello di riparare il processo di distribuzione. Limitare chi può innescare una spinta alla produzione o incorporare una quantità ragionevole di test nel processo di distribuzione automatizzata o entrambi.

  1. Sembra che potresti non aver fissato standard / principi di sviluppo chiaramente definiti.

In particolare, sembra che ti manchi una " definizione di fatto " chiara e / o utilizzi una che non includa "il codice è stato testato" come fattore di gating nel controllare il codice / distribuire il codice in produzione. Se avessi questo, invece di sottolineare che "il buon codice non viene prodotto in questo modo" potresti dire "questo codice non soddisfa gli standard minimi che tutti abbiamo concordato, e deve essere migliore nella futuro".

Dovresti cercare di stabilire una cultura che comunichi chiaramente ciò che ci si aspetta dagli sviluppatori e gli standard e il livello di qualità che devono sostenere. L'impostazione di una definizione di done che includa almeno test manuali (o preferibilmente, testcase automatizzati che possono essere eseguiti come parte del processo di compilazione / distribuzione) sarà di aiuto. Come può avere conseguenze per rompere la build. O conseguenze più gravi per la rottura del sistema di produzione. Si noti che queste due cose dovrebbero essere realmente indipendenti e dovrebbe essere assolutamente impossibile interrompere contemporaneamente la build e il sistema di produzione (poiché le build interrotte non dovrebbero mai essere implementabili).


0

È necessario integrare un processo di integrazione continua + revisione tra pari all'interno dell'azienda. Bitbucket lo rende facile.

E +1 al server di sviluppo suggerito da altri utenti.

Non essere scortese con lui, farà solo male al tuo rapporto di lavoro.

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.