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.
fuente
Respuestas:
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?
Del Capítulo 4 de Estimación de Software:
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.
fuente
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 .
fuente
Yo sugeriría que probar algo a medio camino entre las respuestas de tylerl y MichaelT con lo siguiente:
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.
fuente
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.
fuente
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.
fuente