Cercherò di illustrare alcuni aspetti che non sono stati affrontati da altre risposte e che, IMO, sono importanti.
Il problema di base è questo: alcuni sviluppatori sono principalmente motivati dalla gioia di fare un lavoro difficile, pensare attraverso un progetto, pensare attraverso potenziali problemi, quindi risolvere il problema pezzo per pezzo, con una minima interazione con gli altri, per un periodo prolungato periodo di tempo. Generalmente completano il lavoro ad un alto livello di qualità e in modo tempestivo; il loro lavoro è mantenibile e si adatta all'architettura generale.
Questo tipo di sviluppatori può avere difficoltà ad adattarsi a un ambiente agile e il loro atteggiamento è spesso respinto come "riluttanza a cambiare", probabilmente correlata all'ego o all'antica.
Ciò che viene spesso ignorato è che per risolvere problemi complessi è necessario gestire molte informazioni e che ciò potrebbe richiedere molte analisi, pensiero, tentativi, delineare una soluzione, gettarla via, provarne un'altra. Un problema così complesso può richiedere da alcune ore a poche settimane di lavoro mirato fino a quando non avrai una soluzione completa.
Un approccio è che uno sviluppatore prende la specifica del problema, va nella sua stanza e torna due / tre settimane dopo con una soluzione. In qualsiasi momento (quando necessario), lo sviluppatore può avviare alcune interazioni con altri membri del team o con le parti interessate (ponendo domande su questioni specifiche), ma la maggior parte del lavoro viene svolto dallo sviluppatore a cui è assegnata l'attività.
Cosa succede in uno scenario agile? Il team suddivide il problema in piccoli pezzi (user story) dopo una rapida analisi (toelettatura). La speranza è che le storie degli utenti siano indipendenti le une dalle altre, ma spesso non è così: per spezzare un problema complesso in blocchi veramente indipendenti avresti bisogno di una conoscenza che normalmente ottieni solo dopo aver lavorato su di esso per diversi giorni. In altre parole, se sei in grado di spezzare un problema complesso in piccole parti indipendenti, significa che lo hai già sostanzialmente risolto e che ti resta solo il lavoro di diligenza. Per un problema che richiede, diciamo, tre settimane di lavoro, questo sarà probabilmente il caso durante la seconda settimana, non dopo un paio d'ore di toelettatura effettuata all'inizio dello sprint.
Quindi, dopo aver pianificato uno sprint, il team lavora su diversi blocchi di un problema che probabilmente hanno dipendenze tra loro. Ciò genera molte spese generali di comunicazione nel tentativo di integrare diverse soluzioni che potrebbero essere ugualmente buone ma che sono, beh, diverse l'una dall'altra. Fondamentalmente, il lavoro di prova ed errore è distribuito su tutti i membri del team coinvolti, con un ulteriore sovraccarico di comunicazione (che aumenta in modo quadratico). Penso che alcuni di questi problemi siano illustrati molto bene in questo articolo di Paul Graham, in particolare il punto 7.
Naturalmente, la condivisione del lavoro tra i membri del team riduce il rischio legato alla chiusura del progetto da parte di un membro del team. D'altra parte, la conoscenza del codice può essere comunicata in altri modi, ad esempio utilizzando revisioni del codice o dando presentazioni tecniche ai colleghi. A questo proposito, non credo che ci sia un proiettile d'argento valido per tutte le situazioni: la proprietà del codice condiviso e la programmazione delle coppie non sono l'unica opzione.
Inoltre, "la consegna della funzionalità di lavoro a intervalli più brevi" provoca un'interruzione del flusso di lavoro. Questo può essere OK se il pezzo di funzionalità è "aggiungi un pulsante Annulla nella pagina di accesso" che può essere completato entro la fine di uno sprint, ma quando lavori su un'attività complessa non vuoi tali interruzioni: è come cercando di guidare un'auto 100 km più veloce che puoi e fermandoti ogni 5 minuti per controllare fino a che punto sei arrivato. Questo ti rallenterà.
Certo, avere frequenti checkpoint ha lo scopo di rendere un progetto più prevedibile, ma in alcuni casi l'interruzione può essere molto frustrante: si può a malapena guadagnare velocità che è già tempo di fermarsi e presentare qualcosa.
Quindi, non penso che l'atteggiamento descritto nella domanda sia legato solo all'ego o alla resistenza al cambiamento. Può anche essere che alcuni sviluppatori considerino più efficace l'approccio alla risoluzione dei problemi sopra descritto perché consente loro di comprendere meglio i problemi che stanno risolvendo e il codice che stanno scrivendo. Forzare tali sviluppatori a lavorare in modo diverso può comportare una riduzione della loro produttività.
Inoltre, non credo che il fatto che alcuni membri del team lavorino da soli su problemi specifici e difficili sia contro valori agili. Dopo tutto, i team dovrebbero auto-organizzarsi e utilizzare il processo che hanno trovato essere il più efficace nel corso degli anni.
Solo i miei 2 centesimi.
There’s a great story of a manager of a Coca-Cola plant whose numbers were far better than his peers. When asked what his “secret” was, he said simply that rather than take a best practice and modify it to meet what the plant did, he instead modified the plant to match the best practice.
Non stai agendo fino a quando non capisci perché lo stai facendo.