Parece que, en mi experiencia, hacer que los ingenieros estimen y determinen con precisión las tareas a realizar es como tirar de los dientes. En lugar de dar una estimación de botín de 2-3 semanas o 3-6 meses ... ¿cuál es la forma más sencilla de definir programas de software para que no sean tan dolorosos de definir? Por ejemplo, el cliente A quiere una función antes del 01/02/2011. ¿Cómo se programa el tiempo para implementar esta función sabiendo que se pueden necesitar otras correcciones de errores en el camino y tomar tiempo de ingeniería adicional?
software-schedules
Brian
fuente
fuente
Respuestas:
Si está elaborando un proyecto casi idéntico a otros proyectos que ha realizado, utilizando herramientas conocidas y un equipo familiar, y se le dan requisitos firmes y escritos, entonces debería ser posible hacer una buena estimación.
Estas son las condiciones que los pintores, instaladores de alfombras, paisajistas, etc., experimentan regularmente. Pero no es una buena opción para muchos (o la mayoría) de los proyectos de software.
A menudo se nos pide que calculemos proyectos que usan nuevas herramientas, tecnologías, donde los requisitos están cambiando, etc. Esto es más extrapolación a lo desconocido que interpolación sobre nuestras experiencias pasadas. Por lo tanto, es natural que la estimación sea más difícil.
fuente
Según mi experiencia personal, es exactamente lo contrario de lo que dijo Pemdas : con la práctica, he entendido que es totalmente imposible estimar cuánto tiempo requerirá una tarea. Al comienzo de mi carrera en el desarrollo de software, a menudo daba estimaciones como "45 días", "cinco semanas", etc., y luego intentaba terminar a tiempo. Unos años después, comencé a dar estimaciones menos precisas como "aproximadamente un mes", "cinco a siete semanas", etc. En realidad, trato de no dar ninguna estimación o pedirle al cliente que haga su propia estimación. o fecha límite o doy una estimación lo más aproximada posible.
¿Por qué es tan difícil tener una estimación? Porque es casi imposible saber cómo se escribirá todo el código fuente antes de escribirlo realmente, y porque su trabajo depende de cosas aleatorias a medida que otras personas trabajan, su motivación, etc. Aquí hay una lista más detallada de las posibles razones:
No es fácil saber qué se requiere exactamente para hacer un producto, y especialmente cómo hacerlo . Muy a menudo comencé algunas partes de una aplicación que, después de días de trabajo, entendí que mi primer enfoque era incorrecto y que hay una manera mejor e inteligente de hacer las cosas.
Algunos problemas pueden surgir . Por ejemplo, si, para comenzar su trabajo, debe instalar en su máquina un servidor SQL sofisticado y la instalación falla y el soporte es inexistente, puede pasar semanas resolviendo este problema.
Los requisitos a menudo no son lo suficientemente claros , pero después de leerlos al principio, cree que lo son. A veces puedes entender que significa 'A' y, después de comenzar a implementarlos, notarías que tal vez significan 'B'.
A los clientes les gusta cambiar sus requisitos exactamente cuando acabas de terminar la parte en cuestión , y realmente no entienden por qué estás solicitando dos semanas más y $ 2000 para hacer un pequeño cambio, porque no ven que este pequeño cambio requiere cambiar otras cosas, que requieren cambiar otras, etc.
No puedes estimar tu motivación . Hay días en que puedes trabajar durante horas y tener éxito. Hay semanas en las que, después de escribir diez líneas de código, cambia a Programmers StackExchange y pasa horas leyendo y respondiendo preguntas.
Las cosas se vuelven realmente malas cuando su estimación depende de otras personas . Por ejemplo, en un proyecto de 2 meses tuve que esperar a que un diseñador hiciera su trabajo para terminar el mío. Este diseñador tardó 3 meses antes de entregar un pedazo de basura inutilizable. Por supuesto, el proyecto llegó tarde.
Su estimación también depende de su cliente . Tuve clientes que pasaron semanas antes de responder su correo. Realmente puede afectar su horario cuando debe esperar su respuesta (por ejemplo, si les pide que precisen un requisito).
¿Qué puedes hacer?
Dar un horario más amplio . Si cree que puede hacer el trabajo en dos semanas, digamos que lo entregará en un mes.
Se claro . Si confía en un diseñador, otro desarrollador, etc., dígalo. En lugar de decir "entregaré el producto en tres meses", diga "entregaré el producto en dos meses después de que el diseñador me entregue los archivos PSD".
Explique que si los requisitos cambian todos los días, el proyecto difícilmente se entregará a tiempo.
Corta tu horario . Entregar partes de un gran proyecto a tiempo es más fácil.
Nunca dé una estimación cuando use un producto que no conoce bien o, especialmente, cuando trabajará en el código fuente de otra persona: nunca podrá predecir qué tan malo puede ser el código fuente y cuánto tiempo pasará entendiéndolo y pegándolo en The Daily WTF.
fuente
Una pregunta muy similar es "¿Cuánto tiempo llevará resolver este crucigrama?"
No puede responder eso hasta que lo haya visto para ver numerosas cosas como:
Como generalmente hay varias cosas nuevas en un proyecto (de lo contrario, no sería un proyecto), no puede saber cuánto tiempo tomarán resolver hasta que las haya analizado con mucho cuidado. Tal vez incluso resuelva más o menos o ellos, y entonces todavía no está seguro de que no haya una sorpresa o dos en los que no haya pensado en ellos.
También existe una fuerte presión para hacerlo de la manera más económica posible, por lo tanto, lo más rápido posible y la culpa de una estimación demasiado baja no recae en la presión del gerente del proyecto, sino en el desarrollador que da la estimación. El desarrollador no necesita muchas iteraciones para comprender esto, y aprender a estar MUY cansado de dar números absolutos.
fuente
Por supuesto, puede estimar cuánto tiempo + -2 minutos le tomará desde su hogar al trabajo. Usted sabe cómo conducir un automóvil, puede evaluar el tráfico y algunos otros factores externos.
Dime cuánto tiempo te llevará conducir de Londres a Barcelona. Sin herramientas avanzadas de planificación GPS, por supuesto. Usando el método antiguo como lo hacemos en la estimación de software. Estimación empírica y predicciones .
En software, es peor:
Es por eso que es imposible decirle a su cliente lo que podrá enviar para el 01/02/2011 con buena precisión, y olvidarse del 01/03/2011.
Para abordar todos esos problemas, le recomiendo técnicas de estimación avanzadas como Planning Poker (descargo de responsabilidad: este es uno de mi sitio web) y el Desarrollo iterativo con cálculo de velocidad .
fuente
El desarrollo de software es, por definición, un acto de descubrimiento e invención. Siempre debe involucrar algo desconocido.
La única vez que se conoce todo lo relacionado con el desarrollo de software es cuando el software está completo.
El único momento en que no hay una tecnología desconocida o una característica comercial es cuando se trata de una solución completa y empaquetada lista para descargar.
La razón por la que escribimos un nuevo software es porque tenemos una nueva característica o nueva tecnología o ambas. Nuevo significa nuevo - desconocido - impredecible.
Debido a que el desarrollo de software debe involucrar novedad, el esfuerzo de desarrollo no puede predecirse.
fuente
Honestamente, creo que solo se necesita práctica. Si finalmente escribe suficiente código, debería ser "bastante" preciso. Mi primer jefe creía que esta habilidad era lo suficientemente importante como para que me pidiera que practicara informalmente esto en cada característica / proyecto que implementé. Después de cada proyecto revisamos las estimaciones e intentamos averiguar dónde me equivoqué. Finalmente, te acostumbras.
fuente
Nunca es fácil Solo trata de mejorar en eso.
Una ventaja de dividir su código entregable en partes más pequeñas es que los clientes entiendan qué esperar y cuándo esperarlo. Ahora tiene algún tipo de línea de base para que puedan usar como referencia.
Si tienen una definición estricta de una característica que necesitan en un momento definido, deben saber que se deben asignar recursos adicionales a esta solicitud. Corren un riesgo en la gravedad de los errores que ocurren y cuánto tiempo pueden pasar sin que se solucionen. Cuando surge algo importante, vuelve al cliente y lo obliga a tomar una decisión. ¿Arreglo el error o hago la fecha límite para la nueva función? Dales suficiente información para tomar una decisión informada.
Esperemos que tenga suficiente historial de trabajo conjunto y que se haya establecido lo suficiente como para ser confiable. No puede esperar que comprendan completamente el proceso de desarrollo, pero puede hacerles sentir que está haciendo un esfuerzo honesto y no aprovecha su falta de conocimiento.
fuente
Porque hacemos el horario demasiado temprano. Vea el artículo de Construx sobre cómo hacer un borrador preliminar, luego mejor uno más adelante. Además, si no realiza un seguimiento de cómo lo hizo en estimaciones anteriores, es difícil mejorar. FogBugz hace eso [un cliente de su libre, ningún otro conflicto de intereses].
fuente
He aprendido mucho de este libro:
Estimación de software: desmitificando el arte negro
En resumen, para obtener mejores resultados de estimación, hacemos esto:
Una vez finalizada la tarea de trabajo y nuestra estimación era incorrecta, intentamos encontrar los motivos. E incorporamos este conocimiento en el próximo proceso de estimación. Hasta ahora, este es el mejor proceso que he utilizado para estimar tareas más grandes. Cuando digo tarea me refiero a trabajos que duran entre 50 y 500 horas.
fuente
Nota: Esto realmente solo se aplica a proyectos en los que factura por hora en comparación con una tarifa fija / fija.
Por lo general, trato de planificar mi horario para que consista esencialmente en un montón de Sprints SCRUM (ya sea que use SCRUM o no). Desde el principio, cuando hago el cronograma, determino cuál será la duración de cada sprint y cuáles serán las características del proyecto. Por lo general, hay algunas características que deben hacerse primero, así que trato de dar una mejor estimación (que no debe confundirse con optimista) para esas y cualquier característica que se encuentre hacia el final del proyecto tendrá estimaciones generalizadas. Después de asignar las características a los sprints, trato de agregar 1 a 2 sprints al final del proyecto para tener en cuenta las características que se deslizan hacia la derecha y las características que se pasaron por alto en la recopilación de requisitos original.
La clave para esto es que hago todo esto transparente para el cliente por adelantado para que entiendan por qué los dos últimos sprints están vacíos o escasamente poblados. Al menos hasta este punto, a los clientes con los que he trabajado les ha gustado esto, ya que saben que hay algo de amortiguación en el cronograma / finanzas, ya que la mayoría de ellos saben que las estimaciones de SW tienden a ser menos concretas. También son conscientes de que si no necesitamos el último sprint más o menos, esas son horas que no facturamos. Con la transparencia en la forma en que se construye el cronograma y la retroalimentación regular sobre el progreso durante la ejecución del proyecto, cada cliente con el que he hecho esto ha quedado extremadamente satisfecho.
fuente
Además de todas las cosas nombradas, veo estas dos cosas como algunos de los mayores problemas. Primero, estima la fecha final en función de que cada devloper esté disponible durante las 8 horas diarias 5 días a la semana. Esto es incorrecto y prácticamente garantizará al 100% que se pierda la fecha de finalización en cualquier proyecto que no sea trivial. Las personas se toman un tiempo libre, asisten a reuniones de la compañía (o no basadas en proyectos), pelean con RR.
Los siguientes desarrolladores se olvidan notablemente de estimar todas las tareas que no son de desarrollo, como reuniones y correos electrónicos relacionados con el proyecto, implementación, soporte de control de calidad, soporte de UAT, pruebas de unidades de escritura, investigación, documentación, etc. Una vez que agregamos este tipo de tarea a nuestra hoja de cálculo de estimación, nuestro Las estimaciones mejoraron mucho.
fuente
Cuando se trata de la estimación del tiempo para tareas que pueden llevar más tiempo que unas pocas horas, hago todo lo posible para usar estas reglas:
Probablemente haya más reglas que eso, pero en realidad no tengo un póster con estas reglas en mi pared. Acabo de formularlos ahora, pero provienen de mi experiencia (por lo que puede no funcionar para usted).
La única forma confiable de programar el desarrollo de software que se me ocurre (pero en realidad no lo he probado) es la programación basada en evidencia, que es básicamente el método de Monte Carlo utilizado para contar la probabilidad de una fecha de envío basada en registros históricos sobre tareas que usted ' He logrado antes. Se siente bien porque no intenta usar ninguna métrica que no sea el tiempo estimado y el tiempo real. Sin embargo, se requiere mucha experiencia para dividir las tareas grandes en otras más pequeñas de antemano y debe tener un gran conjunto de datos históricos para que funcione con la suficiente precisión.
fuente
Hay "incógnitas conocidas" y "incógnitas desconocidas". :-)
Las estimaciones a menudo se convierten en plazos.
Los requisitos cambian (a menudo de manera racional) y el programador no puede vetarlo.
El programador tiene / puede no tener control sobre factores como
fuente