project-management - tamaño - cuanto debe pesar un bebe de 1 mes y medio
Necesito este bebé en un mes. ¡Envíame nueve mujeres! (16)
Agregar desarrolladores tiene sentido cuando la productividad aportada por los desarrolladores adicionales excede la pérdida de productividad para la capacitación y la administración de esos desarrolladores.
¿Bajo qué circunstancias, si hay alguna, agregar programadores a un equipo realmente acelera el desarrollo de un proyecto que ya está retrasado?
Creo que agregar personas a un equipo puede acelerar un proyecto más que agregarlos al proyecto en sí.
A menudo me encuentro con el problema de tener demasiados proyectos simultáneos. Cualquiera de esos proyectos podría completarse más rápido si pudiera enfocarme solo en ese proyecto. Al agregar miembros del equipo, pude hacer la transición de otros proyectos.
Por supuesto, esto supone que ha contratado desarrolladores capaces y automotivados, que pueden heredar proyectos grandes y aprender de forma independiente. :-)
Cuando ya se usa un equipo para emparejar la programación, agregar otro desarrollador que ya sea experto en el emparejamiento no puede ralentizar el proyecto, particularmente si el desarrollo avanza con un estilo TDD.
El nuevo desarrollador lentamente se volverá más productivo a medida que comprenda más la base de códigos, y cualquier malentendido será atrapado muy temprano por su par, o por el conjunto de pruebas que se ejecuta antes de cada check-in (e idealmente debería haber un cheque en al menos cada diez minutos).
Sin embargo, los efectos de los gastos generales de comunicación adicionales deben tenerse en cuenta. Es importante no diluir demasiado el conocimiento existente del proyecto.
De acuerdo con el Mythical Man-Month, la razón principal por la que se agrega gente a un proyecto tardío hace que sea más tarde la sobrecarga de comunicación O (n ^ 2).
He experimentado una excepción principal a esto: si solo hay una persona en un proyecto, casi siempre está condenada. Agregar un segundo lo acelera casi todo el tiempo. Esto se debe a que la comunicación no está sobrecargada en ese caso; es una oportunidad útil para aclarar sus pensamientos y cometer menos errores estúpidos.
Además, como obviamente sabías cuando publicaste tu pregunta, el consejo de Mythical Man-Month solo se aplica a los últimos proyectos. Si su proyecto no llega tarde, es muy posible que agregar personas no llegue más tarde. Suponiendo que lo haces correctamente, por supuesto.
En lugar de agregar programadores, uno puede pensar en agregar ayuda administrativa. Cualquier cosa que elimine las distracciones, mejore el enfoque o mejore la motivación puede ser útil. Esto incluye el sistema y la administración, así como cosas más prosaicas como conseguir almuerzos.
Las circunstancias exactas son, obviamente, muy específicas para su proyecto (por ejemplo, equipo de desarrollo, estilo de gestión, madurez del proceso, dificultad del tema, etc.). Para poder ampliar esto un poco mejor para que podamos hablar de ello en cualquier cosa que no sea simplificaciones excesivas, voy a replantear su pregunta:
¿Bajo qué circunstancias, si hay alguna, puede agregar miembros del equipo a un proyecto de desarrollo de software que se está ejecutando tarde como resultado una reducción en la fecha de envío real con un nivel de calidad igual a eso si el equipo existente permitiera trabajar hasta su finalización?
Hay varias cosas que creo que son necesarias , pero no suficientes, para que esto ocurra (sin ningún orden en particular):
- Las personas propuestas para ser agregadas al proyecto deben tener:
- Al menos una comprensión razonable del dominio del problema del proyecto
- Ser competente en el lenguaje del proyecto y las tecnologías específicas que usarían para las tareas que se les darían
- Su dominio debe / no / ser mucho menos o mucho mayor que el miembro existente más débil o más fuerte, respectivamente. Los miembros débiles drenarán a su personal existente con problemas terciarios, mientras que una persona nueva que sea demasiado fuerte perturbará al equipo con la forma en que todo lo que hicieron y lo que están haciendo es incorrecto.
- Tener buenas habilidades de comunicación
- Esté altamente motivado (por ejemplo, ser capaz de trabajar independientemente sin presionar)
- Los miembros del equipo existentes deben tener:
- Excelentes habilidades de comunicación
- Excelentes habilidades de gestión del tiempo
- La dirección / gestión del proyecto debe tener:
- Buenas habilidades de priorización y asignación de recursos
- Un alto nivel de respeto por parte de los miembros del equipo existentes
- Excelentes habilidades de comunicación
- El proyecto debe tener:
- Una especificación de diseño de software buena, completa y documentada
- Buena documentación de cosas ya implementadas
- Un diseño modular para permitir que los pedazos claros de responsabilidad sean tallados
- Procesos automatizados suficientes para el aseguramiento de la calidad para el nivel de defecto requerido. Estos pueden incluir elementos tales como: pruebas unitarias, pruebas de regresión, implementaciones automatizadas de compilación, etc.
- Un sistema de seguimiento de fallas / características que está actualmente en uso y en uso por el equipo (por ejemplo, trac, SourceForge, FogBugz, etc.).
Una de las primeras cosas que se debe discutir es si se puede deslizar la fecha de envío, si se pueden cortar las características y si algunas combinaciones de las dos le permitirán satisfacer la liberación con su personal existente. Muchas veces es un par de características que realmente están acaparando los recursos del equipo que no entregarán valor igual a la inversión. Por lo tanto, revise seriamente las prioridades de su proyecto antes que nada.
Si el resultado del párrafo anterior no es suficiente, entonces visite la lista anterior. Si detecta el retraso del cronograma anticipadamente, la adición de los miembros correctos del equipo en el momento adecuado puede salvar el lanzamiento. Desafortunadamente, cuanto más se acerca la fecha de envío esperada, más cosas pueden salir mal al agregar personas. En un momento, cruzará el "punto sin retorno" donde ninguna cantidad de cambio (aparte del envío de la rama de desarrollo actual) puede salvar su lanzamiento.
Podría seguir y seguir, pero creo que alcancé los puntos principales. Fuera del proyecto y en términos de su carrera, el éxito futuro de la compañía, etc., una de las cosas que definitivamente debe hacer es descubrir por qué llegó tarde, si algo pudo haber hecho, alertarlo antes, y qué medidas necesita. tomar para prevenirlo en el futuro. Un proyecto tardío generalmente ocurre porque usted era:
- Llegamos tarde antes de empezar (más cosas que el tiempo) y / o
- resbaló 1 hora, 1 día a tiempo.
¡Espero que ayude!
Obviamente, cada proyecto es diferente, pero se puede asegurar que la mayoría de los trabajos de desarrollo tengan una cierta cantidad de colaboración entre los desarrolladores. Donde este es el caso, mi experiencia ha sido que los recursos frescos pueden ralentizar involuntariamente a las personas de las que dependen para ponerlas al día y en algunos casos esta puede ser su gente clave (por lo general, es gente ''clave'' que tomaría el tiempo para educar a un nuevob). Cuando se ponen al día, no hay garantías de que su trabajo se ajuste a las ''reglas'' o ''cultura de trabajo'' establecidas con el resto del equipo. Entonces, de nuevo, puede hacer más daño que bien. Así que, aparte, estas son las circunstancias en las que podría ser beneficioso:
1) El nuevo recurso tiene una tarea apretada que requiere un mínimo de interacción con otros desarrolladores y un conjunto de habilidades que ya se ha demostrado. (es decir, portar código existente a una plataforma nueva, refactorizar externamente un módulo inactivo que actualmente está bloqueado en la base de código existente).
2) El proyecto se gestiona de tal manera que otros miembros del equipo de mayor antigüedad pueden compartir el tiempo para ayudar a que el recién llegado se ponga al día y ser mentores en el camino para garantizar que su trabajo sea compatible con lo que ya se hizo.
3) Los otros miembros del equipo son muy pacientes.
Si el recurso adicional se complementa con su equipo existente, puede ser ideal. Por ejemplo, si está a punto de configurar su hardware de producción y verifica que la base de datos esté realmente ajustada, en lugar de simplemente devolver buenos resultados (que su equipo conoce como expertos de dominio), tome prestado el tiempo de un buen dba que trabaje en el siguiente proyecto tuyo puede acelerar el equipo sin mucho costo de entrenamiento
Si los programadores existentes son totalmente incompetentes, entonces agregar programadores competentes puede ayudar.
Me puedo imaginar una situación en la que tenías un sistema muy modular, y los programadores existentes ni siquiera habían comenzado en un módulo muy aislado. En ese caso, asignarle solo esa porción del proyecto a un nuevo programador podría ayudar.
Básicamente, las referencias del Mes del Hombre Mítico son correctas, excepto en casos inventados como el que inventé. El Sr. Brooks hizo una investigación sólida para demostrar que, después de cierto punto, los costos de comunicación y redes de agregar nuevos programadores a un proyecto superarán cualquier beneficio que obtenga de su productividad.
Simplemente pon. Todo se reduce a comparar el tiempo restante y la productividad que obtendrá de alguien que excluye la cantidad de tiempo que le toma a los recursos adicionales alcanzar velocidad y ser productivo y restar el tiempo invertido en enseñarlos con los recursos existentes. Los factores clave (en orden de importancia):
- Qué tan bueno es el recurso para recogerlo. Los mejores desarrolladores pueden ingresar a un sitio nuevo y ser productivos solucionando errores casi instantáneamente con poca ayuda. Esta habilidad es rara pero se puede aprender.
- La segregabilidad de las tareas. Deben poder trabajar en objetos y funciones sin tropezar con los desarrolladores existentes y ralentizarlos.
- La complejidad del proyecto y la documentación disponible. Si se trata de una aplicación ASP.Net de buenas prácticas y de escenarios empresariales comunes y bien documentados, un buen desarrollador puede quedarse atrapado de inmediato. Este factor más que cualquier otro determinará cuánto tiempo tendrán que invertir los recursos existentes en la enseñanza y, por lo tanto, el impacto negativo inicial de los nuevos recursos.
- La cantidad de tiempo restante. Esto a menudo también se estima erróneamente. Con frecuencia, la lógica será que solo nos quedan x semanas y tomará x + 1 semanas para poner a alguien al tanto. En realidad, el proyecto va a fallar y, de hecho, le quedan 2 semanas de desarrollo y le será útil obtener más recursos más temprano que tarde.
Solo ayuda si tiene un proyecto basado en recursos.
Por ejemplo, considera esto:
Debes pintar un póster grande, digamos 4 por 6 metros. Un cartel tan grande, probablemente puedas poner a dos o tres personas frente a él y hacer que pinten en paralelo. Sin embargo, colocar a 20 personas en frente no funcionará. Además, necesitarás personas capacitadas, a menos que quieras un póster de mierda.
Sin embargo, si su proyecto es rellenar sobres con letras impresas (¡como PODÍA haber ganado! ), Cuanto más personas agregue, más rápido será. Hay algunos gastos generales en repartir montones de trabajo, por lo que no puede obtener beneficios hasta el punto en que tenga una persona pr. sobre, pero puede obtener beneficios de mucho más que solo 2 o 3 personas.
Entonces, si su proyecto se puede dividir fácilmente en pequeños grupos, y si los miembros del equipo pueden ponerse al día rápidamente (como ... instantáneamente), agregar más personas lo hará ir más rápido, hasta cierto punto.
Tristemente, no muchos proyectos son así en nuestro mundo, por lo que el consejo de docgnome sobre el libro Mythical Man-Month es un muy buen consejo.
Solo cuando tenga en esa etapa tardía algunas tareas independientes (casi el 0% de interacción con otras partes del proyecto) no se han abordado aún por nadie y puede traer al equipo a alguien que sea especialista en ese dominio. La adición de un miembro del equipo tiene que minimizar la interrupción para el resto del equipo.
Supongo que agregar personas hacia el final del trabajo podría acelerar las cosas si:
El trabajo puede hacerse en paralelo.
La cantidad ahorrada por los recursos adicionales es más que la cantidad de tiempo perdido al hacer que las personas con experiencia en el proyecto expliquen las cosas a los que no tienen experiencia.
EDITAR: Olvidé mencionar, este tipo de cosas no sucede con demasiada frecuencia. Por lo general, es bastante sencillo, como las pantallas de administración que hacen CRUD simple a una mesa. En la actualidad, estos tipos de herramientas se pueden autogenerar de todos modos.
Sin embargo, tenga cuidado con los gerentes que confían en este tipo de trabajo para repartir. Suena genial, pero en realidad no es suficiente recortar un tiempo significativo del proyecto.
Tal vez si se aplican las siguientes condiciones:
- Los nuevos programadores ya entienden el proyecto y no necesitan ningún tiempo de arranque.
- Los nuevos programadores ya son competentes con el entorno de desarrollo.
- No se necesita tiempo administrativo para agregar a los desarrolladores al equipo.
- Casi no se requiere comunicación entre los miembros del equipo.
Te lo haré saber la primera vez que veo todo esto a la vez.
- Módulos autónomos que aún no se han iniciado
- A falta de herramientas de desarrollo que puedan integrar (como un administrador de compilación automatizado)
Principalmente estoy pensando en cosas que les permitan mantenerse alejados de la forma en que las personas se están desarrollando actualmente. Estoy de acuerdo con Mythical Man-Month, pero también creo que hay excepciones para todo.
- Si las personas nuevas se enfocan en las pruebas
- Si puede aislar características independientes que no crean nuevas dependencias
- Si puede ortogonalizar algunos aspectos del proyecto (especialmente tareas no codificadoras como diseño / diseño visual, ajuste / indexación de base de datos o configuración del servidor / configuración de red) para que una persona pueda trabajar en eso mientras que los demás continúan con el código de la aplicación
- Si las personas se conocen entre sí, y la tecnología, los requisitos del negocio y el diseño, lo suficientemente bien como para poder hacer cosas con el conocimiento de cuándo se pisarán los pies y cómo evitar hacerlo (esto, por supuesto, es bastante difícil de arreglar si no es el caso)