Recientemente comencé a trabajar en un proyecto donde una aplicación monolítica muy antigua se está migrando a una arquitectura basada en microservicios.
La base de código heredada es muy desordenada ('código de espagueti') y, a menudo, una función aparentemente simple (p. Ej., Denominada "multiplyValueByTen") luego se revela como "miles de líneas de código de validación que involucran 10 tablas en 3 esquemas diferentes".
Ahora mi jefe (correctamente) me pide que calcule cuánto tiempo tomaría escribir la característica X en la nueva arquitectura. Pero tengo dificultades para llegar a una estimación realista; a menudo subestimo enormemente la tarea debido a las razones que he mencionado anteriormente y me avergüenzo porque no puedo terminar a tiempo.
Lo sensato puede parecer que realmente se mete en el código, anota cada rama y llamadas a otras funciones y luego estima el costo del tiempo. Pero realmente hay una diferencia minúscula entre documentar el código antiguo y escribir la nueva versión.
¿Cómo debería abordar un escenario como este?
Si bien entiendo perfectamente cómo funciona la refactorización de código heredado, mi pregunta no es sobre "¿cómo refactorizar / reescribir?" pero sobre dar una respuesta realista a "¿cuánto tiempo llevaría refactorizar / reescribir la parte X?"
fuente
Respuestas:
Lea el "Codificador limpio" de Bob Martin (y el "Código limpio" mientras lo hace). El siguiente es de la memoria pero fuertemente sugieren comprar su propia copia.
Lo que debe hacer es un promedio ponderado de tres puntos. Haces tres estimaciones para cada pieza de trabajo:
Su estimación es entonces (a + b + 2c) / 4
Editar:
Mis suposiciones cuando respondí esto:
El promedio ponderado de tres puntos funciona bien en este caso. Es rápido, comprensible para los no técnicos y, en varias estimaciones, debería promediar a una precisión cercana. Especialmente si OP toma mi consejo sobre cómo mantener registros de estimaciones y datos reales. Cuando sepa cómo se ven el "peor caso" y el "mejor caso" del mundo real, puede alimentar los datos reales en sus estimaciones futuras e incluso ajustar las estimaciones para su gerente de proyecto si el peor de los casos es peor de lo que pensaba.
Hagamos un ejemplo trabajado:
No tengas miedo de ajustar la fórmula. Tal vez la mitad de las tareas terminan en pesadillas y solo el diez por ciento son fáciles; entonces haces el estmate a / 10 + b / 2 + 2c / 5. Aprende de tu experiencia.
Tenga en cuenta que no estoy haciendo ninguna suposición acerca de la calidad del PM. Un PM malo le dará una pequeña estimación a la junta del proyecto para obtener la aprobación y luego intimidará al equipo del proyecto para tratar de alcanzar el plazo irreal al que se han comprometido. La única defensa es mantener un registro para que pueda verse dando sus estimaciones y acercándose a ellas.
fuente
Este podría ser un buen momento para introducir un enfoque casi ágil. Si en lugar de estimar en términos de horas / días, asignó una escala de tipo de Fibonacci y le dio un valor a cada tarea en función de su tamaño:
Luego, una vez que estimaste un montón de tareas como esta, trabajas en ellas. En un entorno ágil, desarrollas 'velocidad', que es una medida de cuántos puntos logras, por ejemplo, en una semana. Una vez que haya realizado algunas semanas de prueba y aprendizaje (puede vender esto a su gerente como parte del proceso: "Necesitaré unas semanas de prueba y aprender a comprender el proceso de estimación") estará tiene más confianza en cuántos puntos puede superar cada semana y, por lo tanto, puede traducir su estimación de puntos más fácilmente en el tiempo.
https://pm.stackexchange.com/questions/4251/why-would-teams-use-the-fibonacci-sequence-for-story-points
https://stackoverflow.com/questions/9362286/why-is-the-fibonacci-series-used-in-agile-planning-poker
Esto no es realmente ágil, ya que no implicaría las ceremonias, pero el OP me da la idea de que él está solo. Esperemos que este enfoque pueda dar algunas estimaciones más confiables.
fuente
Lo primero que debe hacer es comenzar a recopilar datos sobre cuánto tiempo le lleva hacer algo en este momento. Cuantos más datos tenga sobre el rendimiento de su equipo, mejor. Va a estar en todos lados, pero no te preocupes por eso ahora. Es la verdad y debes mostrarle a tu jefe la realidad.
Entonces vas a comprar algunos libros.
El libro de McConnell le dirá que comience a recopilar datos y luego le explicará cómo usarlo para obtener estimaciones más precisas. ¡Siempre da una estimación de 3 puntos! Siempre. Asegúrese de resaltar las partes del libro que hablan sobre cómo la mala calidad del código afectará sus estimaciones. Muéstraselos a tu jefe.
Explique que si las estimaciones precisas son importantes para la empresa, deberá comenzar a aplicar lo que está aprendiendo del libro de Feather. Si desea ir de manera rápida, fluida y previsible, deberá comenzar a refactorizar el código y ponerlo en un arnés de prueba. He estado justo donde estás. El tiempo de desarrollo es completamente impredecible porque no tienes idea de lo que podrías romper, ¿verdad? ... Sí. Mételo en un arnés de prueba. Un servidor de CI para ejecutar esas pruebas tampoco podría dañar.
Por último, explique a su jefe que las cosas seguirán siendo un poco impredecibles por un tiempo. Probablemente algunos años, pero ese desarrollo será más fácil a diario y las estimaciones serán más precisas a medida que tenga más datos y el código mejore. Esta es una inversión a largo plazo para la empresa. Pasé por esto recientemente, tardó casi 2 años en ser casi predecible.
Sé que hablé más sobre mejorar el código que sobre la estimación, pero la dura realidad es que sus estimaciones serán pésimas hasta que pueda domesticar la base de código heredada. Mientras tanto, use el rendimiento histórico para medir cuánto tiempo llevará. A medida que pase el tiempo, tendrá que tener en cuenta si ya ha obtenido el código según las especificaciones en sus estimaciones.
fuente
Quizás esté pensando en el cuadro de presentar una estimación. Tengo que trabajar en código heredado, y cuando hago una estimación más formal, generalmente hago dos o tres :
Las tres estimaciones tienen en cuenta lo difícil que es la característica en sí misma, cualquier experiencia que haya tenido con esa base de código general y mi intuición sobre el cambio (que he encontrado puede ser bastante preciso)
Después de que se publiquen estas estimaciones, mantengo a mi gerente actualizado con el que parece que estamos tratando. Si resulta que estamos viendo una característica abisal, entonces tendremos que sacrificarla, ya sucedió. Si su jefe no puede aceptar que existan funciones abisales para un fragmento de código heredado, les deseo buena suerte, ya que tendrán una vida muy difícil y frustrante.
fuente
Cuando me he enfrentado a este tipo de problema, me he basado en dar rangos en mis estimaciones. Me he librado de decirles a mis jefes que "es difícil hacer buenas estimaciones extravagantes en esta base de código. Si piden una, será una estimación muy amplia". Le di "3 días a 3 años" como estimación una vez. No hace falta decir que no era una estimación popular, pero es lo que di.
La clave de esto es un acuerdo de que actualizaré mis estimaciones a medida que avance el trabajo. Entonces, si me dicen "Implemente XYZ, ¿cuánto tiempo llevará?" mi respuesta podría ser "en algún lugar entre un día y 4 meses. Sin embargo, si me permite mirar el código durante unas horas, puedo reducir la incertidumbre en esa ventana". Luego miro el código y vuelvo con "2 a 4 semanas". Todavía no es una ventana ideal, pero al menos es algo que se puede administrar.
Hay algunas claves para esto:
Si tengo un jefe que no se siente cómodo con recibir un rango que se actualiza a medida que avanzo, les daré un solo número y mi metodología. Mi metodología es una combinación de una regla general que me han dicho como desarrollador joven y la ley de Hofstader .
fuente
Esta es la solución a tu problema. No puede estimar si no tiene requisitos. Dígale a su jefe que tendrá que hacer esto antes de comenzar a codificar. Después de algunas funciones y módulos, puede descubrir que todos han sido codificados de manera consistente (en este caso mal), por lo que tiene una línea de base para determinar estimaciones futuras. Solo asegúrese de ajustar su estimación si descubre que la codificación empeora.
Me doy cuenta de que su jefe quiere una estimación, pero sin saber cómo se utiliza esta información, no sabemos cuán exactas deben ser sus estimaciones. Conversa con él y descúbrelo. Si solo necesita un número para darle a su jefe, puede inflar ligeramente las estimaciones y proporcionar un número. Para los clientes que esperan pagar su código hasta que se haga esto, asegúrese de averiguar si las fechas de vencimiento de la línea dura generarán ingresos significativos.
fuente
En una situación como esta, no creo que sea posible dar buenas estimaciones. El problema básico es que a menudo una gran parte de hacerlo es descubrir exactamente lo que hay que hacer.
Manejo casos como este dando una estimación basada en lo que parece implicar, pero con el cavet que es probable que haya sorpresas. Si bien no he tenido que lidiar con mucho en el camino del código heredado, he tenido algunas sorpresas muy desagradables relacionadas con la entrada: he visto que algunas horas se convierten en un par de semanas y una vez en esto es imposible (después excavación considerable Me di cuenta de que no tenía suficientes datos en un caso determinado, de vuelta al tablero de dibujo.) Afortunadamente, mi jefe entiende cuando doy tales estimaciones.
fuente
Bueno, la estimación es una habilidad que algunas personas nunca aprenden bien. Sin embargo, no te hace inútil como desarrollador, incluso si no puedes hacer buenas estimaciones. Tal vez los compañeros de equipo o la gerencia llenen los vacíos. Soy terrible, a la mayoría de los equipos les gustaba trabajar conmigo. Mantenga la calma, haga equipo y continúe refactorizando.
La deuda técnica le ofrece pequeños desafíos, pero recuerde que una compañía / equipo que terminó produciendo deuda continuará produciendo deuda a menos que haya cambios en el espíritu de equipo o la administración. El código solo refleja los problemas sociales, así que concéntrate en los problemas reales.
Utilizamos una heurística para estimar características en un proyecto brownfield: estimamos cuánto tiempo habría sido implementar esa característica en un proyecto greenfield sin nada implementado. Luego multiplicamos esa estimación por 2 para lidiar con la limpieza de los desechos que ya existían.
Este factor depende de la cantidad de acoplamiento y del tamaño general del código, pero si realiza algunas funciones de esta manera, puede interpolar ese factor en función de la evidencia real.
fuente
Creo que deberías sentarte con tu jefe, mirarlo directamente a los ojos y decirle:
Use una gesticulación firme y firme como señalar y sentarse en su silla.
Alternativamente, podrías inventar algunos números para hacerlo feliz. Pero seamos sinceros, hasta que esté a la mitad del trabajo, sus estimaciones serán bastante inexactas.
fuente