technical debt - ¿Cómo estima un ROI para compensar la deuda técnica?
technical-debt (7)
Actualmente estoy trabajando con un producto bastante antiguo que ha estado cargado con una gran cantidad de deuda técnica de programadores pobres y prácticas de desarrollo deficientes en el pasado. Estamos empezando a mejorar y la creación de deuda técnica se ha ralentizado considerablemente.
He identificado las áreas de la aplicación que están en mal estado y puedo estimar el costo de reparar esas áreas, pero me cuesta mucho estimar el retorno de la inversión (ROI).
El código será más fácil de mantener y se ampliará en el futuro, pero ¿cómo puedo poner una cifra en dólares en estos?
Un buen lugar para comenzar parece volver a nuestro sistema de seguimiento de errores y estimar los costos en función de los errores y las características relacionadas con estas áreas "malas". Pero eso parece llevar mucho tiempo y puede que no sea el mejor predictor de valor.
¿Alguien ha realizado tal análisis en el pasado y tiene algún consejo para mí?
+1 por el enfoque de jldupont en oportunidades de negocio perdidas.
Sugiero pensar en esas oportunidades según lo percibido por la gerencia. ¿Qué creen que afecta el crecimiento de los ingresos: nuevas funciones, tiempo de comercialización, calidad del producto? Relacionar el pago de la deuda con esos conductores ayudará a la gerencia a comprender las ganancias.
Centrarse en las percepciones de la administración le ayudará a evitar la falsa numeración. El ROI es una estimación, y no es mejor que los supuestos realizados en su estimación. La gerencia sospechará únicamente los argumentos cuantitativos porque saben que hay algo cualitativo en alguna parte. Por ejemplo, a corto plazo, el costo real de su pago de la deuda es el otro trabajo que los programadores no realizan, en lugar del costo en efectivo de esos programadores, porque dudo que vaya a contratar y capacitar a nuevo personal solo para esto. . ¿Las mejoras en el tiempo de desarrollo futuro o la calidad son más importantes que las características que estos programadores estarían agregando?
Además, asegúrese de comprender el horizonte para el que se gestiona el producto. Si la gerencia no está pensando en dos años a partir de ahora, no les importarán los beneficios que no aparecerán en 18 meses.
Finalmente, reflexione sobre el hecho de que las percepciones de la administración han permitido que este producto llegue a este estado en primer lugar. ¿Qué ha cambiado para que la empresa esté más atenta a la deuda técnica? Si la diferencia es usted : usted es un mejor gerente que sus predecesores, tenga en cuenta que su equipo de administración no está acostumbrado a pensar en esto. Tienes que encontrar su apetito para ello y concentrarte en aquellos elementos que brindarán resultados que les interesan. Si lo hace, ganará credibilidad, que puede utilizar para hacer que piensen en nuevos cambios. Pero la apreciación de las ganancias podría ser un tiempo en el crecimiento.
Creo que estás en el camino correcto.
No he tenido que calcular esto, pero he tenido algunas conversaciones con un amigo que administra una gran organización de desarrollo de software con una gran cantidad de códigos heredados.
Una de las cosas que hemos discutido es generar algunas métricas de esfuerzo aproximado al analizar los compromisos de VCS y usarlos para dividir una estimación aproximada de las horas de programación. Esto fue inspirado por la programación basada en la evidencia de Joel Spolsky.
Hacer tal extracción de datos le permitiría también identificar la agrupación en clúster de cuándo se mantiene el código y compararlo con la finalización de errores en el sistema de seguimiento (a menos que ya esté bendecido con una estrecha integración entre los dos y los registros precisos).
El ROI adecuado debe calcular el rendimiento completo, por lo que algunos aspectos a considerar son: - costo de mantenimiento reducido (obviamente) - costo de oportunidad para el negocio de tiempo de inactividad o nuevas funciones que no se pudieron agregar a tiempo para una versión - capacidad para Generar nuevas líneas de productos debido a refactorizaciones.
Recuerde, una vez que tenga una regla para derivar datos, puede tener argumentos sobre cómo calcular exactamente las cosas, ¡pero al menos tiene algunas cifras para sembrar discusión!
Los administradores se preocupan por ganar $ a través del crecimiento (primero y principalmente, por ejemplo, nuevas características que atraen a nuevos clientes) y (segundo) a través de la optimización del ciclo de vida del proceso.
Al ver su problema, su propuesta se ubica en la segunda categoría: esto sin duda quedará rezagado con respecto a la meta # 1 (y, por lo tanto, se le dará prioridad incluso si esto puede ahorrar dinero ... )).
Ahora , poner una cifra de $ en la "deuda técnica mala" podría convertirse en un giro más positivo (suponiendo que se aplique lo siguiente en su caso): "si invertimos en el componente X de reelaboración, podríamos introducir la característica Y más rápido y obtener Z más clientes ".
En otras palabras, evalúe el costo de la deuda técnica contra el costo de las oportunidades de negocio perdidas .
Podría ser más fácil estimar la cantidad que le ha costado en el pasado . Una vez que hayas hecho eso, deberías poder hacer un estimado para el futuro con rangos y lógica que incluso tus jefes puedan entender.
Dicho esto, no tengo mucha experiencia con este tipo de cosas, simplemente porque nunca he visto a un gerente dispuesto a ir tan lejos al arreglar el código. Siempre fue algo que reparamos cuando tenemos que modificar el código incorrecto, por lo que la refactorización es un costo oculto en todas las modificaciones y correcciones de errores.
Siendo un desarrollador en su mayoría solitario o en equipo pequeño, esto está fuera de mi campo, pero para mí una gran solución para descubrir dónde se pierde el tiempo es un cronometraje muy, muy detallado, por ejemplo, con una herramienta útil de barra de tareas como esta que puede incluso filtre cuando vaya al baño y puede exportar todo a XML.
Puede ser engorroso al principio, y un desafío para presentar a un equipo, pero si su equipo puede registrar cada quince minutos que pasan debido a un error, error o idea errónea en el software, acumula una base de datos impresionantes de la vida real. en qué deuda técnica está costando realmente en salarios cada mes.
La herramienta a la que me vinculé es mi favorita porque es muy simple (ni siquiera requiere una base de datos) y proporciona acceso a cada proyecto / elemento a través del icono de la barra de tareas. También se puede ingresar información adicional sobre el trabajo realizado, y el cronometraje se activa literalmente en segundos. (No estoy afiliado con el vendedor).
Solo puedo hablar sobre cómo hacer esto empíricamente en un proceso iterativo e incremental.
Necesita reunir métricas para estimar su mejor costo / punto de historia demostrado. Es de suponer que esto representa su sistema justo después del abandono de la arquitectura inicial, cuando se ha realizado la mayor parte del diseño de prueba y error, pero la entropía ha tenido el menor tiempo para causar la descomposición. Encuentre el punto en el historial del proyecto cuando la velocidad / tamaño del equipo es la más alta. Use esto como su línea de base de costo / punto (deuda cero).
Con el tiempo, a medida que se acumula la deuda técnica, la velocidad / tamaño del equipo comienza a disminuir. El porcentaje de disminución de este número con respecto a su línea base se puede traducir en "intereses" que se pagan en cada nuevo punto de la historia. (Esto es realmente interés pagado en deuda técnica y de conocimiento)
El refactoing y el recocido disciplinados hacen que los intereses de la deuda técnica se estabilicen a un valor superior al de su línea de base. Considere esto como el interés de estado estable que el propietario del producto paga por la deuda técnica del sistema. (El mismo concepto se aplica a la deuda de conocimiento).
Algunos sistemas alcanzan el punto donde el costo + el interés en cada nuevo punto de historia excede el valor del punto de característica que se está desarrollando. Esto es cuando el sistema está en quiebra, y es hora de volver a escribir el sistema desde cero.
Creo que es posible usar el análisis de regresión para separar la deuda técnica y la deuda de conocimiento (pero no lo he probado). Por ejemplo, si asume que la deuda técnica se correlaciona estrechamente con algunas métricas de código, por ejemplo, la duplicación de código, podría determinar el grado en que el interés que se paga está aumentando debido a la deuda técnica frente a la deuda de conocimiento.
Sonar tiene un gran complemento (complemento de deuda técnica ) para analizar su código fuente para buscar tal métrica. Si bien es posible que no pueda usarlo específicamente para su compilación, ya que es una herramienta de Maven, debería proporcionar algunas buenas métricas.
Aquí hay un fragmento de su algoritmo:
Debt(in man days) =
cost_to_fix_duplications +
cost_to_fix_violations +
cost_to_comment_public_API +
cost_to_fix_uncovered_complexity +
cost_to_bring_complexity_below_threshold
Where :
Duplications = cost_to_fix_one_block * duplicated_blocks
Violations = cost_to fix_one_violation * mandatory_violations
Comments = cost_to_comment_one_API * public_undocumented_api
Coverage = cost_to_cover_one_of_complexity *
uncovered_complexity_by_tests (80% of
coverage is the objective)
Complexity = cost_to_split_a_method *
(function_complexity_distribution >=
8) + cost_to_split_a_class *
(class_complexity_distribution >= 60)