Cercherò di illustrare alcuni aspetti che non sono stati risolti da altre risposte e che, IMO, sono importanti.
The basic issue is this: Some developers are primarily motivated by the joy of taking a piece of difficult work, thinking through a design, thinking through potential issues, then solving the problem piece by piece, with only minimal interaction with others, over an extended period of time. They generally complete work to a high level of quality and in a timely way; their work is maintainable and fits with the overall architecture.
Questo tipo di sviluppatori potrebbe trovare difficile adattarsi a un ambiente agile e il loro atteggiamento è spesso ignorato come "mancanza di volontà di cambiare", probabilmente correlato all'ego o all'essere antiquati.
Ciò che viene spesso ignorato è che per risolvere problemi complessi è necessario gestire molte informazioni e che questo può richiedere molte analisi, pensare, provare, disegnare una soluzione, buttarla via, provarne un'altra.
Un problema così complesso può richiedere da poche ore a poche settimane di lavoro mirato finché non si ha una soluzione completa.
Un approccio è che uno sviluppatore prende le specifiche 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 problemi specifici) ma la maggior parte
del lavoro viene svolto dallo sviluppatore a cui viene assegnata l'attività.
Cosa succede in uno scenario agile? Il team suddivide il problema in piccoli blocchi (storie utente) dopo una rapida analisi (toelettatura). La speranza è che le storie degli utenti siano indipendenti le une dalle altre, ma spesso non è così: al fine di suddividere un problema complesso in blocchi davvero indipendenti, è necessaria una conoscenza che normalmente si ottiene solo dopo aver lavorato su di esso per diversi giorni.
In altre parole, se sei in grado di suddividere un problema complesso in piccole parti indipendenti, significa che lo hai già risolto e che hai solo un lavoro di diligenza. Per un problema che richiede, per esempio, tre settimane di lavoro, questo sarà probabilmente il caso durante la seconda settimana, non dopo un paio d'ore di toelettatura fatta all'inizio dello sprint.
Quindi, dopo che uno sprint è stato pianificato, il team lavora su diversi blocchi di un problema che probabilmente dipendono l'uno dall'altro. Questo genera un sovraccarico di comunicazione che tenta di integrare soluzioni diverse che possono essere ugualmente buone ma, beh, diverse l'una dall'altra. Fondamentalmente, il lavoro trial-and-error è distribuito su tutti i membri del team coinvolti, con un overhead di comunicazione aggiuntivo (in aumento 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 al fatto che un membro del team lasci il progetto. D'altra parte, la conoscenza del codice può essere comunicata in altri modi, ad es. usando le revisioni del codice o dando presentazioni tecniche ai colleghi. A questo proposito, non penso 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 entro intervalli più brevi" comporta un'interruzione del flusso di lavoro. Questo può essere OK se la parte di funzionalità è "aggiungi un pulsante Annulla nella pagina di accesso" che può essere completata entro la fine di uno sprint, ma quando lavori su un'attività complessa non vuoi tali interruzioni: è come provando a guidare un'auto 100 km più velocemente che puoi e fermandoti ogni 5 minuti per controllare quanto lontano hai ottenuto. Questo ti farà rallentare.
Ovviamente, avere frequenti checkpoint significa rendere più prevedibile un progetto, 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 darsi che alcuni sviluppatori considerino l'approccio alla risoluzione dei problemi sopra descritto più efficace perché consente loro di avere una migliore comprensione dei problemi che stanno risolvendo e del codice che stanno scrivendo. Costringere questi sviluppatori a lavorare in un modo diverso può ridurre la loro produttività.
Inoltre, non penso che avere membri del team che lavorano in isolamento su problemi specifici e difficili sia contro valori agili. Dopotutto, i team dovrebbero essere auto-organizzanti e utilizzare il processo che hanno trovato essere il più efficace nel corso degli anni.
Solo i miei 2 centesimi.