Digamos que acaba de comenzar a trabajar en un equipo muy pequeño en un proyecto {actualmente relativamente pequeño, aunque con suerte más grande más adelante}. Tenga en cuenta que este es un proyecto real destinado a ser utilizado por otros desarrolladores en el mundo real, no un proyecto académico destinado a ser desechado al final de un semestre.
Sin embargo, el código aún no se ha publicado a otros, por lo que aún no se ha tomado una decisión.
Las metodologías
A uno de ustedes le gusta comenzar a codificar y hacer que las piezas encajen entre sí antes de que necesariamente tenga una idea clara de cómo interactuarán exactamente todos los componentes (diseño ascendente). A otro de ustedes le gusta hacer todo el diseño primero y precisar los detalles de todos los componentes y la comunicación antes de codificar una solución.
Suponga que está trabajando en un nuevo sistema en lugar de imitar los existentes, y por lo tanto no siempre es obvio cómo debería ser el diseño final correcto. Por lo tanto, en su equipo, diferentes miembros del equipo a veces tienen ideas diferentes de qué requisitos son incluso necesarios para el producto final, y mucho menos cómo diseñarlo.
Cuando el desarrollador de abajo hacia arriba escribe un código, el desarrollador de arriba hacia abajo lo rechaza debido a posibles problemas futuros previstos en el diseño a pesar del hecho de que el código puede resolver el problema en cuestión, creyendo que es más importante corregir el diseño antes de intentar codificar la solución al problema.
Cuando el desarrollador de arriba hacia abajo intenta resolver el diseño completo y los problemas previstos antes de comenzar a escribir el código, el desarrollador de abajo hacia arriba lo rechaza porque el desarrollador de abajo hacia arriba no cree que algunos de los problemas surjan en la práctica , y piensa que el diseño puede necesitar ser cambiado en el futuro cuando los requisitos y restricciones se aclaren.
El problema
El problema que esto ha provocado es que el desarrollador de abajo hacia arriba termina perdiendo el tiempo porque el desarrollador de arriba hacia abajo con frecuencia decide que la solución que ha escrito el desarrollador de abajo hacia arriba debe descartarse debido a una falla de diseño, lo que resulta en la necesidad de volver a -escribe el código.
El desarrollador de arriba hacia abajo termina perdiendo el tiempo porque, en lugar de paralelizar el trabajo, el desarrollador de arriba hacia abajo ahora se sienta con frecuencia para elaborar el diseño correcto con el desarrollador de abajo hacia arriba, serializando los dos hasta el punto en que incluso puede ser más rápido para 1 persona para hacer el trabajo que 2.
Ambos desarrolladores quieren seguir trabajando juntos, pero no parece que la combinación esté realmente ayudando a ninguno de los dos en la práctica.
Los objetivos
Los objetivos comunes son obviamente maximizar la eficacia de la codificación (es decir, minimizar el desperdicio de tiempo) y escribir software útil.
La pregunta
En pocas palabras, ¿cómo resuelve este problema y hace frente a esta situación?
La única solución eficiente que se me ocurre que no pierde el tiempo es dejar que cada desarrollador siga su propio estilo para el diseño. Pero esto es más difícil de lo que parece cuando revisa el código y realmente necesita aprobar los cambios de los demás, y cuando está tratando de diseñar un marco coherente para que otros lo usen.
¿Hay una mejor manera?