Trataré de ilustrar algunos aspectos que no han sido abordados por otras respuestas y que, en mi opinión, son importantes.
El problema básico es este: algunos desarrolladores están motivados principalmente por la alegría de realizar un trabajo difícil, pensar en un diseño, pensar en problemas potenciales y luego resolver el problema pieza por pieza, con una interacción mínima con otros, durante un período prolongado período de tiempo. Generalmente completan el trabajo a un alto nivel de calidad y de manera oportuna; su trabajo es mantenible y se ajusta a la arquitectura general.
Este tipo de desarrolladores puede tener dificultades para adaptarse a un entorno ágil y su actitud a menudo se descarta como "falta de voluntad para cambiar", posiblemente relacionada con el ego o con el pasado de moda.
Lo que a menudo se ignora es que, para resolver problemas complejos, se necesita manejar mucha información, y esto puede requerir mucho análisis, pensar, intentar, esbozar una solución, desecharla, probar otra. Un problema tan complejo puede requerir de unas pocas horas a unas pocas semanas de trabajo enfocado hasta que tenga una solución final.
Un enfoque es que un desarrollador toma la especificación del problema, va a su habitación y regresa dos o tres semanas después con una solución. En cualquier momento (cuando sea necesario), el desarrollador puede iniciar alguna interacción con otros miembros del equipo o con las partes interesadas (haciendo preguntas sobre temas específicos), pero la mayoría del trabajo lo realiza el desarrollador al que se le asigna la tarea.
¿Qué sucede en un escenario ágil? El equipo divide el problema en pequeños fragmentos (historias de usuarios) después de un análisis rápido (preparación). La esperanza es que las historias de los usuarios sean independientes entre sí, pero a menudo este no es el caso: para dividir un problema complejo en fragmentos realmente independientes, necesitaría un conocimiento que normalmente solo obtiene después de trabajar en él durante varios días. En otras palabras, si puede dividir un problema complejo en pequeñas partes independientes, significa que básicamente ya lo ha resuelto y que solo le queda trabajo de diligencia. Para un problema que requiere, digamos, tres semanas de trabajo, este probablemente será el caso durante la segunda semana, no después de un par de horas de preparación al comienzo del sprint.
Entonces, después de planear un sprint, el equipo trabaja en diferentes partes de un problema que probablemente tengan dependencias entre sí. Esto genera una gran sobrecarga de comunicación al tratar de integrar diferentes soluciones que pueden ser igualmente buenas pero que, bueno, son diferentes entre sí. Básicamente, el trabajo de prueba y error se distribuye entre todos los miembros del equipo involucrados, con una sobrecarga de comunicación adicional (que aumenta de forma cuadrática). Creo que algunos de estos problemas se ilustran muy bien en este artículo de Paul Graham, en particular el punto 7.
Por supuesto, compartir el trabajo entre los miembros del equipo reduce el riesgo relacionado con que un miembro del equipo abandone el proyecto. Por otro lado, el conocimiento sobre el código se puede comunicar de otras maneras, por ejemplo, utilizando revisiones de código o dando presentaciones técnicas a los colegas. A este respecto, no creo que haya una bala de plata válida para todas las situaciones: la propiedad de código compartido y la programación de pares no son la única opción.
Además, la "entrega de la funcionalidad de trabajo en intervalos más cortos" da como resultado una interrupción del flujo de trabajo. Esto puede estar bien si la porción de funcionalidad es "agregar un botón de cancelación en la página de inicio de sesión" que puede completarse al final de un sprint, pero cuando está trabajando en una tarea compleja no desea tales interrupciones: es como tratando de conducir un automóvil 100 km lo más rápido que pueda y deteniéndose cada 5 minutos para verificar qué tan lejos ha llegado. Esto solo te va a retrasar.
Por supuesto, tener puntos de control frecuentes tiene como objetivo hacer que un proyecto sea más predecible, pero en algunos casos la interrupción puede ser muy frustrante: uno apenas puede ganar velocidad y ya es hora de detenerse y presentar algo.
Por lo tanto, no creo que la actitud descrita en la pregunta esté relacionada solo con el ego o la resistencia al cambio. También puede ser que algunos desarrolladores consideren que el enfoque para la resolución de problemas descrito anteriormente sea más efectivo porque les permite comprender mejor los problemas que están resolviendo y el código que están escribiendo. Obligar a dichos desarrolladores a trabajar de manera diferente puede reducir su productividad.
Además, no creo que algunos miembros del equipo trabajen de forma aislada en problemas específicos y difíciles va en contra de los valores ágiles. Después de todo, los equipos deben ser autoorganizados y utilizar el proceso que han encontrado como el más efectivo a lo largo de los años.
Solo mis 2 centavos.
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.
No lo estás haciendo ágil hasta que entiendas por qué lo estás haciendo.