project planning - ¿Cómo se hacen estimaciones muy rápidas(y sucias) para las tareas de codificación?
project-planning estimation (17)
En momentos como estos, recuerdo la regla del hermano McKenzie sobre la conversión a la métrica: "Duplícalo y agrega treinta".
Por lo general, pienso qué tan rápido pensé que tomaría hacer una cosa, luego lo doblé porque siempre estoy subestimando, y luego agregué 30 para probar, dependiendo de las unidades que estoy usando.
Entonces, The Boss te acaba de poner en el lugar. Tienes 15 minutos para obtener una estimación del sobre por el agregado de alguna característica nueva. Su jefe (afortunadamente) reconoce que no puede proporcionar una estimación precisa en ese momento, por lo que espera algo que esté en el orden correcto de magnitud.
La pregunta es ¿cómo se puede hacer una estimación en el marco de tiempo que sea precisa para un orden de magnitud?
Tenga en cuenta que esto pretende ser una estimación rápida y sucia, no algo que podría esperarse de preguntas como esta
La mejor manera es intentar un desglose rápido de todos los subcomponentes principales, por ejemplo
- Actualizar el script del modelo de datos (3 elementos en 2 tablas)
- Cambiar la pantalla de entrada (3 nuevas entradas)
- Entrada de verificación (3 nuevas entradas)
- Actualizar datos.
- Mostrar resultados, etc.
- Prueba de unidad de compilación
Asigne una estimación aproximada de cada uno de estos y si no puede pensar en uno, deje al menos 2 horas, porque incluso el elemento más simple probablemente demorará al menos una hora, pero el 2x permitirá la incertidumbre.
Al menos habrás pensado en todos los elementos que tendrás que hacer para que esté en el orden correcto de magnitud como se solicitó.
No puedo imaginarme una situación en la que realmente no pueda hacer una estimación en absoluto; más a menudo existe el caso donde puedo imaginar múltiples escenarios que darían como resultado plazos de tiempo muy diferentes para el proyecto, dependiendo de varias cosas que podrían razonablemente arriba. Y no quiero mentir: lo peor que puedes hacer con tu jefe es inventar cosas.
Entonces explico cada una de las posibilidades. Por supuesto, esto solo funciona con un jefe comprensivo, pero si su jefe es tan ignorante o insensato que se niega a escuchar la explicación completa, usted tiene otros problemas.
Por ejemplo, así es como lo hice para un caso reciente en el que realmente tuve que hacer exactamente esto.
x264, el codificador de video en el que trabajo, implementa una forma muy primitiva de codificación entrelazada elegida únicamente porque es muy fácil de implementar. Queríamos implementar la forma completa de esta codificación, pero no tenía idea de cuántas de las suposiciones hechas para la versión simplificada fallarían en tal caso.
Así que pensé en los diversos niveles de cosas que podrían tener que cambiarse, e hice un cálculo aproximado, bueno, en el mejor de los casos, podría estar casi funcionando, pero eso es dudoso. Y en el peor, hay una tonelada de cosas que deben cambiarse. Así que, le dije a mi jefe, probablemente era mejor asumir lo peor aquí, ya que la especificación era muy complicada y, a pesar de no saber nada de esa complejidad, sospeché que dada la gran falta de código relacionado en el programa, casi nada de esa complejidad fue realmente implementada. Al final tenía razón, los cambios requeridos terminaron siendo bastante complicados, y subcontrataron el proyecto a un contratista con más experiencia en las complejidades de la codificación entrelazada H.264.
Piensa en tareas similares que has hecho en el pasado y cuánto tiempo te tomaron.
Si no ha hecho nada similar antes, intente dividir la tarea en subtareas, luego baje cada subtarea, hasta que no quede ninguna subtarea que suene como que tomará más de 1 a 2 días para prototipar de la manera más ingenua posible. camino; si no puede dividir una tarea con una estimación de más de 3 días, esto generalmente implica que no sabe realmente lo que implica hacer esa tarea; hacer una investigación rápida. Una vez que todo esté lo suficientemente dividido, sume el total, duplique el resultado y délo como su presupuesto.
Si no sabes cómo abordar un problema lo suficiente como para hacer lo anterior, y tu jefe te está aliviando el cuello para que no sientas que puedes investigar allí mismo, en su lugar intenta darle a tu jefe un estimado de cuánto tiempo lo llevará a hacer la investigación requerida para comprender el problema lo suficiente como para darle una estimación adecuada.
Recientemente he estado leyendo Agile Estimating and Planning , y no puedo recomendarlo lo suficiente.
Si me veo forzado a proporcionar estimaciones sin suficiente tiempo para investigar adecuadamente el tema en cuestión, tiendo a sobreestimar masivamente. La solución es casi siempre más difícil de lo que creo que va a ser. Si creo que algo tomará un día, entonces digo dos días. Si digo que algo tomará una hora, entonces digo un día. Lo que estoy tratando de ilustrar con estos comentarios es que para todas las tareas menos mundanas como los errores de ortografía, incluso un pequeño cambio de código puede explotar en un día completo. Para cualquier cosa que creo que podría tomar un día o más doblo la estimación. Sé que puede ser difícil hacer esto. La gerencia quiere números pequeños. Quieres lucir inteligente y capaz frente a otro desarrollador. Ver también Scotty Factory .
Incluso si tiene miembros del equipo de control de calidad que probarán su código, debe recordar que también es su trabajo probar el código. Asegúrese de incluir eso en cualquier estimación. Eso es algo que he visto a muchos desarrolladores dejar fuera de su proceso de estimación.
Usualmente desgloso la tarea en pocas partes, pero no estimo para este tipo de cosas en bloques de tiempo más pequeños que medio día. Siempre que haya al menos 5 o 6 piezas en la función después del colapso, creo que los errores se equilibran en su mayor parte (algunas tareas tardan menos de una hora, etc.)
Por supuesto, la división de tiempo mínima y el número de piezas requeridas para cierto nivel de comodidad debe variar según el dominio del problema: al menos 5 o 6 partes de medio día parecen ser las correctas para las cosas que me han preguntado últimamente, pero eso necesita ser revisado cada pocos meses.
Cuando me piden que haga una estimación en nombre de otra persona, me resisto un poco más y sigo una práctica similar con un sistema de relleno generoso ("doblar y agregar x" como se mencionó anteriormente es probablemente una buena aproximación)
Yo personalmente rechazo este tipo de cosas. Pero luego trabajo para mí, así que no respondo a un jefe. Solo un cliente, pero es más fácil hacerles entender que es difícil hacerlo en el momento.
El factor n. ° 1 es lo desconocido, y tienes razón, no puedes conocerlos a todos. Sin embargo, generalmente sabrá algunas preguntas importantes que nadie puede responder por usted en ese momento.
El factor n. ° 2 es la dificultad percibida y la disponibilidad de herramientas y recursos disponibles.
Resultado = aproximadamente el doble de su estimación
Si realmente necesita una estimación muy rápida , puede hacer la estructura de desglose del trabajo con cada tarea durante 1-2 días o menos y después de esto estimar cada tarea proporcionando valores estimados mínimos y máximos.
la suma de los valores mínimos y máximos especifica el intervalo para toda la tarea. Esto le da información sobre los riesgos a su jefe, lo cual siempre es muy útil.
Obtendrá algún intervalo, por ejemplo, 12-15 días o 5-30 días; esto es mucho más útil que 16 días en lugar de los intervalos mencionados.
Puede ser útil para usted buen libro de Steve McConnel Estimación del software: Desmitificar el arte negro .
Divida la tarea en partes y asigne a cada parte un tiempo
Trabaja en unidades de no menos de 1/2 por día. Esto evitará la micro-programación
El gran problema con la estimación del proyecto es la subestimación. Si conoce bien la tarea y casi puede ver el código, pondere la tarea por 1. Si hay alguna incertidumbre o la tarea requiere una tecnología desconocida, multiplíquela por un factor más alto, según el nivel de incertidumbre.
No se preocupe demasiado por la precisión de cada parte. Los errores tienden a cancelarse ya que lo único que realmente importa es la duración total
Siempre queda el viejo recurso de tomar la escala de tiempo optimista y multiplicarla por PI. ¡Funciona más a menudo de lo que debería!
Además del desglose necesario: un consejo que aprendí de los programadores pragmáticos es expresar estimaciones de más de 15 días en semanas y estimaciones de más de 8 semanas en meses; para que la unidad refleje la precisión de la estimación. Ten mucho cuidado durante 30 semanas.
También puede basar sus estimaciones en tareas similares que ya haya realizado.
Coloque el dedo en la boca, lame, agite en el aire e invente un número basado en la experiencia pasada. Entonces doblarlo.
Realmente, es solo una experiencia que cuenta. Imaginas lo que la tarea te obliga a hacer, y sabes cuánto tiempo te llevará hacer eso. Duplícalo para artículos no anticipados. Esta es también la razón por la que nunca le preguntas a los programadores junior por tales estimaciones.
Para estimar en el orden correcto de magnitud, necesita:
- no hay introducción de nueva tecnología o marco para la característica deseada;
- para separar su estimación en tiempo de desarrollo puro y la disponibilidad de los desarrolladores (y el cliente y el probador ...;
- para obtener retroalimentación sobre sus estimaciones anteriores;
- un tamaño de función en su rango de estimación segura (no 2 veces más grande con 2 veces más personas)
- un equipo de desarrollo estable.
- no hay gastos generales de inicio del proyecto.
- solo estimar el trabajo que haces tú mismo.
Piense en un número, duplíquelo y luego vuelva a doblarlo (es decir, cuatro veces el primer número que aparece en su cabeza)
Cuando un jefe dice "cuánto tiempo completar" un proyecto, se refiere al momento en que se completa y se implementa en vivo para los usuarios. Un programador (por supuesto) solo pensará en el tiempo necesario para completar la programación (el tiempo para escribir físicamente la solución al problema), por lo que normalmente se estima por debajo de lo previsto.
Una regla de oro sería:
El ''primer número'' es el número de días que cree que le llevará completar la tarea según el alcance de la tarea que se acaba de describir. (Pero por supuesto, no te han dicho todo).
El primer múltiplo es el tiempo extra necesario para recodificar después de la primera demostración / prototipo que se le dio al jefe y él dice "Bien, genial. Pero ¿puedes agregar ...?"
El segundo múltiplo es el tiempo necesario para recodificar el recodificación hasta el estándar correcto para la producción.
El tercer múltiplo es el momento de las pruebas, la documentación y la implementación, y todas las otras cosas de administración que necesita hacer para realmente sacar el producto y vivirlo.
Y el cuarto múltiplo es su contingencia para lo anterior.
Esto debería darle una estimación segura. Por supuesto, debe insistir en que se realice un ejercicio de planificación y estimación más exhaustivo.
Creo que la respuesta siempre es "de seis a ocho semanas".
"seis a ocho semanas" funciona realmente bien, otra cosa que funciona se basa en el modelo de datos.
Imagine el número de tablas de bases de datos (o similares) necesarias para la aplicación, multiplique eso por el número de días que necesita codificar los modelos, CRUD, UI, etc. para cada tabla y agregue entre 30% y 50% de tiempo en la parte superior de ese.