¿Cómo puede estimar el tiempo para tareas que consisten principalmente en resolver un problema?

56

Si bien es relativamente posible que un desarrollador experimentado calcule cuánto tiempo llevará implementar el código cuando se comprenda bien el patrón y el problema que está resolviendo el código, ¿cómo puede hacer una buena estimación cuando, mientras se comprende bien el objetivo final, el la implementación es 95% teórica / resolución de problemas y tiene muy pequeñas cantidades de implementación?

Mi trabajo a menudo consiste en tareas para lograr objetivos bien definidos, sin embargo, tengo que encontrar la manera de alcanzar ese objetivo y hasta que no entienda la solución, no está claro qué barreras adicionales puede haber. Más específicamente, a menudo estoy trabajando en la generación de código o en herramientas automatizadas de manipulación de código. Una vez que la solución esté completamente resuelta y la herramienta perfeccionada, realizará directamente el 95% de los cambios reales muy rápidamente. Sin embargo, no tengo ninguna manera de estimar cuántos problemas adicionales deben resolverse para que la herramienta de generación o análisis aborde casos límite imprevisibles.

Para fines de planificación, mi empresa quiere tener una mejor idea de cuánto tiempo llevará, pero como no sé cuántos problemas adicionales pueden surgir al resolver cada paso de la solución. No estoy seguro de cómo puedo acercarme a una mejor estimación.

AJ Henderson
fuente
¿Qué tipo de estimaciones estás dando? Si le pregunto "Quiero una función que haga XYZ para el cliente ABC", ¿qué tipo de respuesta me da? Tenga en cuenta que cualquier respuesta que doy está fuertemente influenciada por la Estimación de software: Desmitificando el arte negro
Estoy tratando específicamente de estimar la cantidad de tiempo que llevará completar la tarea. Por lo tanto, sería algo como "Eliminar todo tipo de código en particular" o "Cambiar todo el código que hace algo como XYZ para que se comporte como ABC".
AJ Henderson
Ok ... así que si te pido que "Cambies la funcionalidad de XYZ para que haga ABC" ... ¿qué tipo de respuesta me das? ¿Dices "Tal vez una semana" o dices "5 días" o dices "entre 1 día y 10 días, dependiendo de lo que encuentre cuando lo investigue?"
Normalmente trato de hacer una estimación de entre 4 días y 8 días (el tipo de precisión deseado), aunque a menudo sería más realista decir algo así como 4 días y 3 semanas. Estoy tratando de encontrar formas de reducir el rango.
AJ Henderson
1
@gnat Gracias por la explicación, sin embargo, creo que mi pregunta ya está clara, ya que otras respuestas parecen entender lo que se está preguntando y, sinceramente, no veo ninguna forma de deducir que la pregunta sea un engaño de la pregunta marcada. Por lo tanto, creo que un comentario es suficiente y una mayor alteración no beneficiaría la pregunta.
AJ Henderson

Respuestas:

41

Antes de llegar demasiado lejos, permítanme decir que la Estimación de software: desmitificar el arte negro es un recurso excelente para las personas que miran y piensan en las estimaciones. Las dos imágenes a continuación son de ese libro y son el núcleo de las ideas que se presentan a continuación.

Como ha notado, las estimaciones son una parte importante para poder predecir y planificar el trabajo con precisión. No tener estimaciones hace que el negocio se quede ciego sobre cuánto tiempo tomará algo. No es raro que las empresas tengan una idea completamente equivocada sobre cuánto tiempo tomarán las cosas: lo que piensan que es fácil lleva de seis a ocho semanas y lo que se cree que es difícil es un truco del viernes por la tarde.

Lo primero es dar una estimación. Una estimación en sí misma no es un número único, eso es un compromiso. "Cuánto tiempo tomará ABC" -> "Aproximadamente 5 días" significa que son aproximadamente 5 días. Sin embargo, una buena estimación es un rango en el que tiene un 90% de confianza de que lo tendrá en ese rango. Si quiere decir "Estoy 90% seguro de que tomará entre 1 y 5 días", dígalo. No trabaje desde "Creo que tomará entre 1 y 10 días, por lo que 5 días es probablemente el promedio", eso no es una estimación y se equivocará el 50% del tiempo.

Bueno, el 50% o más de las veces, los programadores son notorios subestimadores para los tiempos de tareas.

Considere el cono de incertidumbre:

Imagen de http://www.construx.com - artículo completo en http://www.construx.com/Thought_Leadership/Books/The_Cone_of_Uncertainty/

Tenga en cuenta que la primera estimación en ese rango es 16x. Esto es similar a decir "Creo que tomará entre una tarde y dos semanas", pero aún no lo sabes. A medida que avanza un poco con el diseño, el rango se reduce a 4x. Esto no significa que tomará una semana, significa que en su lugar estaría diciendo "después de ver esto un poco, tomará entre tres semanas" - sí, la estimación aumentó, pero también el rango de la estimación se fue abajo.

Con cada estimación que brinde, debe estar 90% seguro de que la estimación está dentro de ese rango. Puede estar equivocado: el 10% del tiempo caerá fuera de ese rango.

Hay muchas formas de estimar el tamaño de los proyectos. Comparándolo con proyectos pasados, usando un proxy (creo que tomaría 1000 líneas de código que tomarían tanto tiempo para escribir), usando puntos de función (para convertir a LOC ...), obteniendo estimaciones de varias personas y luego refinándolo iterativamente ... algunos funcionan para algunos proyectos, algunos funcionan para otros proyectos.

Un capítulo muy importante en este libro que mencioné en la parte superior es el n. ° 23 que se ocupa de las políticas de estimación y de gerentes y ejecutivos.

La clave para una estimación es el proceso iterativo de refinarlo después de trabajar un poco en él.

Dar una estimación demasiado precisa demasiado pronto en el proceso puede ser muy propenso a errores. Si no está seguro al respecto, brinde la estimación amplia y luego regrese con otra estimación después de un período de tiempo para una mayor introspección del problema y posiblemente describiendo cómo lo hará, observando cuánto código lo escribió El último problema similar y otros factores que afectarán la estimación.


Las estimaciones requieren un poco de reflexión: no emitir las estimaciones de puño. Estos a menudo tienen grandes errores asociados con ellos en comparación con lo que se necesita cuando lo piensas un poco.

De cómo responder cuando se le pregunta por una estimación?

Qué decir cuando se le pide un presupuesto

Dices "volveré a llamarte".

Casi siempre obtiene mejores resultados si ralentiza el proceso y pasa algún tiempo siguiendo los pasos que describimos en esta sección. Las estimaciones dadas en la máquina de café (como el café) volverán a atormentarte.

Del Capítulo 4 de Estimación de Software:

Figura 4-8 Error promedio de estimaciones fuera del manguito

Tenga en cuenta que en esto, las estimaciones después de un poco de revisión son sistemáticamente menos salvajes y propensas a errores que las estimaciones fuera de lugar. No te salgas de las estimaciones. Siéntese y piense en la tarea y calcúlela después de pensar un poco en ella.

Glorfindel
fuente
1
Esta respuesta es interesante y tiene mucho mérito, pero probablemente está respondiendo una pregunta sobre la estimación de más tareas basadas en la implementación, en lugar de la pregunta de cómo estimar cuánto tiempo tomará tener una onda cerebral ...
Michael Shaw
@Ptolemy de cualquier manera, ya sea implementación o concepto, es una estimación. Puedo estimar cuánto tiempo llevará de tal manera que estoy 90% seguro de que el rango cubre cuál será el resultado final. Puede ser un rango muy amplio, pero eso también es una estimación, demasiadas personas dan estimaciones de "6-8 semanas" y luego pierden esa estimación porque era demasiado estrecha, dieron una confianza del 30% en lugar del 90%. Se trata de la habilidad para estimar, refinamientos iterativos y dificultades comunes para estimar cualquier tarea, ya que esas son las primeras habilidades necesarias para resolver el problema.
15

Jefe : AJ, tenemos 3 perros, 2 conejos, una catapulta y una monja. Necesitamos encontrar una manera de llevar a los 7 (sí, la catapulta también) sobre una pared de 20 pies y al lago al otro lado sin que los perros coman conejos y sin ahogar a la monja. ¿Cuánto tiempo te llevará encontrar la solución?

Verán, el problema para estimar cuánto tiempo llevará resolver un problema es que a diferentes personas les lleva una cantidad de tiempo diferente. Si tiene un historial de resolución de problemas similares, puede estimar en función de cuánto tiempo le ha llevado en tiempos anteriores. Si no lo hace, entonces no está estimando, solo está adivinando.

Además, el problema puede no tener una solución aceptable. O tal vez la solución requerirá una autorización adicional que podría anular todo el proyecto. O tal vez la solución cambia toda la naturaleza percibida del problema de tal manera que la solución se vuelve completamente innecesaria.

La moraleja de la historia es que si no tiene suficiente información para hacer una estimación razonable, entonces no la tenga . Aún no. Obtener mas informacion. Investigue más. Por lo general, está perfectamente bien decir: "Te responderé en 2 días con algunos números más sólidos".

Al diseñar una solución para mi cliente, no firmaré un contrato hasta que tenga suficiente del diseño general completo para saber cómo se verá la solución y cuánto tiempo llevará el proyecto. Esto significa que estoy en riesgo de haber realizado un trabajo de diseño inicial por el que no me pagan (si el proyecto no se lleva a cabo), pero eso es mejor que estar en riesgo de facturar significativamente por el trabajo realizado .

tylerl
fuente
99
Sin embargo, en este caso, el diseño parece ser el 90% del trabajo. Y decir "Te daré una estimación después de haber hecho el 90% del trabajo" rara vez hace feliz a alguien.
Más
1
¿Qué tal "El diseño es el 90% del trabajo y no sabré cuánto tiempo tomará hasta que el diseño esté terminado. Ahora puedo darle un rango aproximado, comenzar el diseño y mantenerlo actualizado sobre los cambios en la estimación a medida que aprendo más sobre la solución? "
Rob Baillie
Al decir 'es un problema complejo, estamos trabajando en algunas ideas para resolverlo. Como equipo, revisaremos estas ideas la próxima semana y, como parte de esa revisión, se establecerán plazos para las diferentes soluciones. ¿Te gustaría estar en esa reunión técnica?
Michael Shaw
4

Yo sugeriría que probar algo a medio camino entre las respuestas de tylerl y MichaelT con lo siguiente:

  • dividir el trabajo a realizar en 3 o 4 fases. Las fases deben ser:
    1. Análisis del problema
    2. Solución de prototipos
    3. Solución del mundo real
    4. Evaluación de salida (prueba)
  • proporcione una estimación solo para la fase 1 (análisis) basada en su experiencia, o en las fases 1 + 2 (análisis + prototipo) a su gerencia. Luego, proporcióneles una estimación para las fases 3 + 4 cuando las fases problemáticas 1 y 2 estén terminadas (o al menos lo suficientemente avanzadas para que pueda confiar en su estimación).

La razón detrás de esto es que usted sabe por experiencia que necesita X días para analizar una base de código dada (probablemente dependiendo de su tamaño) y tener un conjunto de herramientas básicas o scripts ejecutándose (y tal vez fallando). Luego, el número de errores debería proporcionarle información sobre la dificultad real de la tarea en cuestión.

Puede que esto no sea exactamente lo que la gerencia quiere, pero creo que siempre es mejor elaborar estimaciones que realmente se cumplirán.

sansuiso
fuente
+1 Puede que aún no sepas cuánto tiempo tomará algo, pero puedes decir "Dale a X mi tiempo para pensarlo y te responderé": una hora, un día, una semana, lo que sea.
Rory Hunter
1

Como esta pregunta se trata principalmente de tipos de trabajo de investigación, preguntar a los desarrolladores de software es un enfoque valiente, una medida común es que el desarrollador de software tarda dos veces más que su estimación es probablemente un buen desarrollador. Sin embargo, dicho esto, las tareas de investigación (y diseño de arquitectura) son una parte importante de la programación y, a menudo, se omiten / minimizan. También son a menudo difíciles de estimar.

La primera pregunta que me haría, ¿ es este un problema que se puede resolver? Esto no es un intelecto o un problema de poder cerebral, sino uno de realidad práctica. A menos que usted está en el mundo de los lanzamientos a la luna de Google, donde el fracaso es un resultado esperado, la dura realidad es que se esperará para entregar este , sea cual sea esta resulta ser. Parece ser una regla general aproximada: ¿ya sabemos cuál debe ser el 90% de la solución?

La segunda pregunta que haría, ¿qué más sería útil saber al pensar en la solución? Esta es realmente una forma de verificar dos veces si realmente sabemos lo suficiente como para llegar a una solución que sea aceptable. Puede generar una serie de tareas de búsqueda de hechos que ayudan a definir mejor cuál debe ser la solución, cada una de las cuales suele ser bastante fácil de definir y estimar.

La tercera pregunta es, ¿ quién es el más adecuado en el equipo para este tipo de problema? Quien tenga esta tarea saboreará el resultado con su propio estilo. Darle este tipo de problema a un programador que tiene 10 millones de preguntas al comienzo de una tarea, y luego se va y entrega algo por primera vez (aunque lentamente) puede ser una mejor opción que darle el programador que descarta la implementación rápidamente , pero cuando hay un problema, solo se descubre al final del proceso.

Entonces, la tarea real sería pensar en posibles soluciones, implementaciones y enfoques, y tener una escala de tiempo fija en la que necesiten informar.

Cuando informan, usted tiene la opción de obtener un conjunto más amplio de posibles soluciones, dar el visto bueno a la implementación de una solución o reflexionar, ya que la solución aún no está suficientemente definida.

Michael Shaw
fuente
1

Con preguntas de investigación en las que no está claro que haya una respuesta, y mucho menos una idea clara de lo que hay que hacer, generalmente propongo dedicar x cantidad de tiempo para comenzar.

"No tengo idea si esto es posible, pero podría pasar dos días investigándolo. Eso probablemente no nos dará una solución, pero tal vez pueda descartar algunas cosas y probablemente tenga una idea cuáles podrían ser los próximos pasos concretos y qué tipo de inversión de tiempo significarían. Entonces podemos decidir si tiene sentido dar otro paso ".

Por lo tanto, coloque la incertidumbre en la otra dirección: la estimación es muy precisa (pasaré dos días), es muy poco especificado lo que se logrará para entonces.

Timeboxing, básicamente.

RemcoGerlich
fuente