Quali sono i modi per mitigare gli effetti di Mythical Man Month?


16

Legge di Brooks: l' aggiunta di manodopera a un recente progetto software lo rende più tardi.

Nel suo libro No Silver Bullet - Essence and Accidents of Software Engineering Frederick Brooks definisce il concetto di Mythical Man Month :

L'ipotesi di Brooks è che progetti di programmazione complessi non possano essere perfettamente suddivisi in compiti discreti su cui lavorare senza comunicazione tra i lavoratori e senza stabilire una serie di complesse interrelazioni tra compiti e lavoratori che li eseguono .

Dal 1982 siamo sicuramente andati avanti e abbiamo acquisito un po 'più di esperienza nel mitigare questo problema. Quali sono alcune delle soluzioni che hai applicato con successo sul tuo lavoro per aggiungere risorse a un progetto senza creare più problemi.


5
Sto votando per chiudere questa domanda come fuori tema perché si adatta meglio a Software Engg. SE ( softwareengineering.stackexchange.com ) e anche perché non è strettamente specifico di
Devops

2
Questa è una domanda specifica per DevOps. Si riferisce direttamente al processo di consegna del software. Sei sicuro di capire davvero cosa significa DevOps?
Jiri Klouda

3
Continui a dire DevOps, non penso che significhi ciò che pensi significhi.
Jiri Klouda

3
@ Dawny33: Per favore, leggi uno dei libri fondamentali di DevOps - The Phoenix Project. Non troverai una sola menzione di AWS, Docker, Jenkins o altri strumenti. L'intero libro parla di processo, gerarchia organizzativa e struttura, il modo di lavorare in gruppo. DevOps è un modo per portare le idee scientifiche che hanno migliorato la produzione in Giappone e successivamente negli Stati Uniti nel processo di sviluppo del software. Idee basate sul lavoro di Edward W. Deming e Eliyahu M. Goldratt. Quello che vedi come DevOps è solo la superficie, gli strumenti, i risultati. Le parti superflue di esso.
Jiri Klouda

5
@ Dawny33 Questa domanda non è adatta per l'ingegneria del software. Sebbene questo argomento generale sia, la domanda è troppo ampia. Sta cercando opinioni piuttosto che tentare di risolvere un problema. Per favore, non suggerire altre comunità se non capisci quali tipi di domande accettano. Se questa domanda dovesse essere pubblicata su Software Engineering, verrebbe votata, chiusa e probabilmente cancellata molto rapidamente. Ciò porta a una scarsa esperienza utente.
Thomas Owens,

Risposte:


18

Cos'è l'MMM

Innanzitutto voglio spiegare il contesto della legge di Brook. Qual è stato il presupposto che lo ha portato a crearlo nel 1975?

Un mese-uomo è un'ipotetica unità di lavoro che rappresenta il lavoro svolto da una persona in un mese; La legge di Brooks afferma che è impossibile misurare il lavoro utile in mesi-uomo.

fonte: https://en.wikipedia.org/wiki/The_Mythical_Man-Month

Ai giorni nostri, complessi progetti di programmazione avrebbero significato grandi sistemi monolitici. E Brooks afferma che questi non possono essere perfettamente suddivisi in compiti discreti su cui è possibile lavorare senza comunicazione tra gli sviluppatori e senza stabilire una serie di complesse interrelazioni tra i compiti e le persone che li svolgono.

Questo è molto vero nei monoliti software altamente coesivi. Indipendentemente dalla quantità di disaccoppiamento, il grande monolito richiede ancora tempo per i nuovi programmatori per conoscere il monolito. E un overhead di comunicazione aumentato che consumerà una quantità sempre crescente del tempo disponibile.

Ma deve essere davvero così? Dobbiamo scrivere monoliti e mantenere i canali di comunicazione n(n − 1) / 2dov'è nil numero di sviluppatori?

Sappiamo che ci sono aziende in cui migliaia di sviluppatori stanno lavorando a grandi progetti ... e funziona. Quindi ci deve essere qualcosa che è cambiato dal 1975.


Possibilità di mitigare MMM

Nel 2015 PuppetLabs e IT Revolution hanno pubblicato i risultati del Rapporto 2015 sullo stato di DevOps . In quel rapporto, si sono concentrati sulla distinzione tra organizzazioni ad alte prestazioni e non ad alte prestazioni.

Le organizzazioni ad alte prestazioni mostrano alcune proprietà inaspettate. Ad esempio, hanno le migliori prestazioni in scadenza del progetto in fase di sviluppo. Migliore stabilità operativa e affidabilità nelle operazioni. Così come il miglior track record di sicurezza e conformità.

Una delle cose sorprendenti evidenziate nel rapporto è la metrica delle distribuzioni al giorno. Ma non solo le distribuzioni al giorno, hanno anche misurato deploy / day / developer e qual è l'effetto dell'aggiunta di più sviluppatori in organizzazioni ad alte prestazioni rispetto alle prestazioni non elevate.

Questo è il grafico di quel rapporto -

Distribuzioni al giorno per sviluppatore

Mentre le organizzazioni a basso rendimento si allineano alle ipotesi del Mese dell'uomo mitico. Le organizzazioni ad alte prestazioni possono ridimensionare il numero di deploy / day / dev in modo lineare con il numero di sviluppatori.

Un'eccellente presentazione a DevOpsDays London 2016 di Gene Kim parla di questi risultati.


Come farlo

Innanzitutto, come diventare un'organizzazione ad alte prestazioni? Ci sono un paio di libri che parlano di questo, non abbastanza spazio in questa risposta, quindi mi limiterò a collegarmi a loro.

Per le organizzazioni software e IT, uno dei fattori critici per diventare un'organizzazione ad alte prestazioni è: attenzione alla qualità e alla velocità .

Ad esempio Ward Cunningham spiega il debito tecnico come tutte le cose che ci hanno permesso di rimanere non risolte. Questo è accettato dalla direzione perché ha sempre la promessa che verrà risolto quando c'è tempo.

Non c'è mai abbastanza tempo e il debito tecnico peggiora sempre di più.

Quali sono queste cose che fanno crescere il debito tecnico?

  • codice legacy
  • configurazione manuale degli ambienti
  • test manuale
  • distribuzioni manuali

Codice legacy Come definito in Lavorare in modo efficace con il codice legacy di Michael Feathers è un codice che non ha test automatizzati.

Ogni volta che vengono utilizzate scorciatoie per portare il codice in produzione; le operazioni sono gravate dal mantenimento di questo debito per sempre. Quindi il processo di distribuzione diventa sempre più lungo.

Gene racconta una storia nella sua presentazione di un'azienda che ha distribuzioni di sei settimane. Coinvolgere decine di migliaia di passaggi noiosi estremamente inclini all'errore, legando 400 persone, e lo farebbero quattro volte all'anno.

Uno dei principi di DevOps è che l'affidabilità deriva dal fare piccole implementazioni più frequentemente.


Esempio

Queste due presentazioni mostrano tutto ciò che Amazon ha fatto per ridurre il tempo impiegato per distribuire il codice in produzione.

Secondo Gene, l'unica cosa che è cambiata nel tempo in queste organizzazioni ad alte prestazioni è il numero di sviluppatori. Quindi, dall'esempio di Amazon, si potrebbe dire che in quattro anni hanno aumentato le loro implementazioni dieci volte semplicemente aggiungendo più persone.


Ciò significa che, in determinate condizioni, con la giusta architettura, le pratiche tecniche giuste, le norme culturali giusti, la produttività degli sviluppatori possono scalare come il numero di sviluppatori è aumentato. E DevOps è decisamente nel mezzo di tutto questo.


4

Quello che ho fatto (e questo è solo soggettivo) è il seguente:

Quando un manager che pensa a una data di scadenza desidera aggiungere persone nel mio team per ridurre il tempo necessario e sembra sotto MMM, per prima cosa discuto con lui sul perché questo potrebbe essere negativo. La mia analogia preferita per questo è ricordare loro che se una donna può avere un bambino in nove mesi, nove donne non avranno un bambino in un mese, ma avranno nove bambini in nove mesi. Il tempo non è ridotto, solo l'elaborazione parallela è migliore.

Quando la decisione viene forzata sul nostro team, di solito proviamo a dividere ulteriormente alcune attività e quando ciò non è possibile di solito facciamo affidamento sulla programmazione di coppia , in cui un programmatore è responsabile della digitazione e l'altro detta il codice (e cambia periodicamente ).

La scrittura del codice in sé è più lenta, ma ci sono meno errori di battitura / linting e bug durante i test a causa dell'inevitabile revisione fatta durante la scrittura. Ritengo che anche la qualità complessiva del codice sia leggermente migliore, ma non ho metriche per supportare tale affermazione.


1
Mi piace l'idea di programmazione delle coppie. Questo è in realtà qualcosa che potrebbe aiutare. Potrei essere in grado di spiegare perché, in seguito, basandomi sulla teoria su cui ho lavorato.
Jiri Klouda

per favore, aspettalo!
Peter,

4

Parlando esclusivamente dal punto di vista della CI, l'aumento del numero di sviluppatori che lavorano su un progetto si traduce in genere in più persone che lavorano nello stesso ramo.

I sistemi di CI tradizionali presentano un problema di scalabilità a questo proposito: la probabilità di rotture / regressioni / blocchi aumenta il rallentamento della velocità di integrazione e invita i team più piccoli a staccarsi e passare alle filiali secondarie (vale a dire ulteriori rallentamenti). Vedi In che modo l'integrazione continua può essere scalata per progetti / team di grandi dimensioni? . Questo si svolge proprio secondo il concetto del Mese dell'uomo mitico.

La soluzione che suggerisco nella mia risposta a questa domanda, un sistema di CI altamente scalabile consentirebbe la migrazione verso un vero CI - integrazione basata su singolo ramo / trunk per interi team più grandi (anche con dimensioni enormi).

Con tutti gli utenti della stessa pagina, utilizzando gli stessi strumenti / processi automatizzati e la stragrande maggioranza delle verifiche di controllo qualità automatizzate all'interno del sistema CI stesso, diventa molto più semplice cambiare ruolo e concentrarsi tra i membri del team. L'intero processo di sviluppo diventa più fluido, più prevedibile, più rilassato.

Portare a bordo nuove persone in un tale ambiente, renderle produttive semplicemente scaricando compiti meno difficili dai membri del team più esperti che possono quindi assumere quelli più difficili è quindi più facile.

Tutto ciò, a mio avviso, può essere visto come un effetto calmante degli effetti concettuali di Mythical Man Month.


Nelle organizzazioni ad alte prestazioni, aggiungere più sviluppatori di solito significa creare team più indipendenti che scrivono software disaccoppiato. Ciò consente a più persone di ottenere di più e più velocemente. Far sì che tutti comunichino tramite un singolo ramo di integrazione è un anti-modello e molto probabilmente rallenterà notevolmente le cose.
Evgeny

Having them all communicate via a single integration branch is an anti-pattern- perché? Se sono disaccoppiati nel senso che non avranno più bisogno di integrare il loro lavoro, allora toccheranno il ramo in modo non sovrapposto / non in conflitto. Se il loro lavoro deve ancora essere integrato, andare su ulteriori filiali ritarderà e complicherà l'integrazione deviando dalla metodologia CI e perdendo tutti i suoi vantaggi.
Dan Cornilescu,

Penso che non siamo d'accordo sul significato di "ramo". Va bene avere un repository di grandi dimensioni, con un singolo ramo (git o svn), e subire il sovraccarico di tutti coloro che lavorano sullo stesso. Va anche bene avere più repository in cui ogni repository ha un ramo che tiene traccia di quel servizio di disaccoppiamento specifico. Dipende dallo strumento, dalla quantità di overhead che aggiunge al codice di commit e di checkout.
Evgeny

Ah, scusa, sì, ci sono abituato e continuo a dimenticare che gli altri non lo sono. Per ramo mi riferisco alla rappresentazione generica di alto livello del ramo SCM, non importa quali siano le particolarità degli attuali sistemi SCM sottostanti purché gestiti insieme in modo monolitico . 1 grande repository con una maindiramazione o 10 repository side-by-side (moduli git?) Ciascuno con una maindiramazione dovrebbe essere praticamente equivalente dalla prospettiva CI.
Dan Cornilescu,

Quindi la mia affermazione del primo commento è vera. L'indipendenza non può essere fatta in una torre di babele, quando hai un monolite il sovraccarico è molto alto per tutti, quindi tutti sono gravati. È molto meglio rappresentare i progetti disaccoppiati come piccoli sistemi VCS disaccoppiati da gestire. Se ricordi abbastanza lontano, alcune aziende stavano usando ClearCase e altre VCS per gestire TUTTO il codice dell'azienda - il sovraccarico era orribile.
Evgeny
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.