Esta es una pregunta que a menudo me hago cuando trabajo con desarrolladores. Hasta ahora he trabajado en cuatro empresas y me he dado cuenta de la falta de atención para mantener el código limpio y lidiar con la deuda técnica que dificulta el progreso futuro en una aplicación de software. Por ejemplo, la primera compañía para la que trabajé había escrito una base de datos desde cero en lugar de usar algo como MySQL y eso creó un infierno para el equipo al refactorizar o extender la aplicación. Siempre he tratado de ser honesto y claro con mi gerente cuando discute las proyecciones, pero la gerencia no parece interesada en arreglar lo que ya está allí y es horrible ver el impacto que tiene en la moral del equipo.
¿Qué piensa sobre la mejor manera de abordar este problema? Lo que he visto es gente empacando y saliendo. La compañía se convierte en una puerta giratoria con desarrolladores entrando y saliendo y empeorando el código. ¿Cómo se comunica esto a la gerencia para que se interese en resolver la deuda técnica ?
fuente
Respuestas:
Cuando me reuní con mi jefe para discutir esto, dijo que debería incluir la refactorización en todas mis estimaciones. Dijo que no es un problema en el que quiera pensar. En cambio, debería manejarlo.
Este no es un problema en el que la gerencia en general quiera pensar. Ellos no son los ingenieros, tú eres. Simplemente haga de esto una parte tácita de todas sus estimaciones, y verá que la deuda técnica disminuye.
Sin embargo, nunca será perfecto. La deuda técnica, como la deuda de la tarjeta de crédito, es una inversión para hacer que los clientes sean más rápidos y ganar cuota de mercado sobre sus competidores más rápido. Al igual que el crédito, si se gestiona adecuadamente, puede ser bastante exitoso.
fuente
Es como dijo Gandhi cuando se le preguntó si su táctica funcionaría con alguien como Hitler. Él dijo: "Sería difícil". Pero creo que hay un argumento justo de que la respuesta realmente es "No". Lamentablemente, no creo que se pueda hacer lo que intentas hacer. No es que trate de ser pesimista, sino que trato de ser honesto.
El problema para mí no es que los gerentes necesiten convencer. Los mejores ya entienden que la deuda puede ser mortal si no se gestiona. Pero ya sea que lo entiendan o no, ya sean buenos gerentes o malos, todos enfrentan la presión de cumplir, y sus jefes juzgan esa entrega contra una fecha. La calidad solo importa si es extremadamente mala, en cuyo caso es culpa de los desarrolladores, o extremadamente buena, en cuyo caso es la brillantez de la administración lo que lo hizo posible. La calidad solo necesita ser "suficientemente buena".
Creo que me gusta lo que dijo Renesis en su respuesta, porque es uno de los pocos que entiende que la gerencia piensa de manera muy diferente a la ingeniería. Y creo que todos hemos visto la progresión de las empresas para convertirse en fechas y más proyectos gestionados en lugar de centrados en el cliente y la calidad. Con esto, me refiero a compañías típicas, no a las realmente firmes que tienen las agallas para decir "Se hará cuando esté hecho" (como Apple Computer o id Software, y sí, entiendo que a veces las personas no están en libertad para tomar ese enfoque).
Pero aquí está la cosa: las empresas que adoptan el enfoque de calidad primero ... ¿qué notas sobre ellas? Así es, están a cargo de ingenieros, no de vendedores, vendedores, gerentes de proyectos o contadores. Piense en HP, Apple, id, Google, Microsoft e IBM. Todo comenzó y fue exitoso por ingenieros, no por vendedores, aunque los vendedores ciertamente jugaron un papel, y estoy seguro de que muchos debatirían si Microsoft está asociado con la calidad :). Y de esos, los que fueron cuesta abajo se alejaron del liderazgo impulsado por la ingeniería. Sin embargo, hay una gran cantidad de argumentos en esa declaración, ya que hay muchas compañías técnicas que finalmente fracasaron debido a la incapacidad de adaptarse a los tiempos cambiantes y administrar su propio crecimiento. No veo el liderazgo basado en ingeniería como la causa de esos fracasos, para mí eso ' Es un problema de habilidades y perspicacia comercial que son independientes de que alguien sea desarrollador o contador. Sin embargo, en términos generales, creo que hay una dedicación en la ingeniería a los rigores de la responsabilidad y la disciplina que beneficia a las empresas donde la ingeniería es un componente.
En serio, mira a tu alrededor. Falta el liderazgo de TI. El enfoque siempre está en el costo y el tiempo, y rara vez en la calidad, siempre que sea lo suficientemente bueno. Los líderes de TI rara vez se reportan al CEO, ahora siempre es el CFO. TI está atrapado en el soporte de producción y está cada vez más en deuda con los gerentes de proyecto cuyo enfoque está en trozos más pequeños, más digeribles y medibles, no en cambios significativos de valor revolucionario (no es que esto sea necesariamente incorrecto; dividir y conquistar es algo bueno, pero la visión necesita estar allí para el panorama general).
Lamento tomar tanto tiempo en esta publicación, pero al final creo que su pregunta, sobre cómo hacer que la administración se preocupe por la deuda técnica, a menudo se resuelve mejor al encontrar el líder correcto, en lugar de cambiar el existente. Explicar la deuda técnica a los pensadores estándar significa cambiar el enfoque al dinero y al costo, como dijo Renesis, y creo que eso pierde mucho en la traducción; incluso si tuvieras éxito en ello, solo importaría si el líder líder de la compañía lo comprara. Convencer a su gerente intermedio de que haga lo correcto probablemente solo lo despedirá.
fuente
Lo primero que debe hacer es cambiar la redacción. Llamarlo "deuda técnica" le da a la gerencia la idea de que permitirlo es una inversión de algún tipo, cuando en realidad es más como un virus. (Soy como el Dave Ramsey de la deuda técnica).
Permitir que no se pague tiene un costo enorme que no se puede ver ni cuantificar fácilmente.
Enumere problemas como los siguientes para la administración:
fuente
Mi administración realmente ha comenzado a hacer un esfuerzo serio para abordar la deuda técnica, que es una de las razones por las que me gusta trabajar allí, pero es un esfuerzo a largo plazo y nunca está de más recordarles por qué vale la pena el esfuerzo.
Una de las formas en que mantengo la presión es cuando me solicitan un presupuesto, y podría haberse ahorrado tiempo si no tuviera que lidiar con problemas técnicos específicos de la deuda, lo incluyo en mi presupuesto . Por ejemplo, " este error me llevará 2-3 días para localizarlo, pero si ya hubiéramos abordado estos otros 2 errores de 'baja prioridad' que han estado en la cola para siempre, probablemente tomaría menos de uno " . la respuesta será seguir adelante y arreglar esos otros mientras lo haces.
También estoy de acuerdo con otras respuestas sobre solo considerar las mejoras como parte de su trabajo y hacerlas a medida que avanza si no es demasiado perjudicial. Mi tarea actual consiste en hacer adiciones a un código muy mal diseñado. En lugar de aumentar el desorden escribiendo mi nuevo código para que coincida, paso un poco de tiempo consolidando la funcionalidad común, por lo que enviar un paquete se convierte en una llamada de función de una línea en lugar de repetir constantemente 15 líneas de copiar y modificar ligeramente pegar repetitivo.
Sé que de hecho va a salvar la cordura de algunos mantenedores más adelante. Lo sé porque hoy soy ese mantenedor. Sin embargo, también creo que va a acelerar mi propia tarea actual de obtener y depurar esta característica ahora.
Otra técnica que he usado en el pasado y que debería volver a hacer es mantener una rama DVCS refactorizadora en un árbol de trabajo separado para ese tiempo de inactividad cuando compila, espera una prueba larga o simplemente necesita un cambio de ritmo para un poco cuando estás agotado por un error. Siempre y cuando ocasionalmente se fusione de manera ascendente para no divergir demasiado, puede demorar todo el tiempo que desee en refactorizar los cambios con muy poco esfuerzo marginal. 15 minutos aquí y allá por día realmente pueden sumar con el tiempo.
fuente
Podrías probar la analogía de la tarjeta de crédito. Pregúnteles "¿se siente cómodo dejando sin pagar los extractos de su tarjeta de crédito durante un período prolongado de tiempo?"
Los gerentes entienden los costos y beneficios, pero (generalmente) no los términos técnicos utilizados por nosotros los desarrolladores. El término "deuda técnica" ya se inventó para ayudar a superar esta barrera de comunicación, pero es posible que deba articularlo más claramente. La mayoría de los gerentes saben muy bien (a menudo por experiencia propia) que los pagos vencidos con tarjeta de crédito crecen con una tasa de interés horrible, por lo que duele dejarlos sin pagar. Esto puede ayudarlos a comprender la gravedad del problema relacionado con la entropía del software.
Pero si esto no los convence, intente reunir evidencia objetiva y hacer algunos cálculos. Por ejemplo, cuánto le cuesta a la empresa, tanto en efectivo como en tiempo perdido, reemplazar a un empleado que se va.
fuente
Nadie dará dinero para reemplazar algo que funciona con algo que (con suerte) también funciona.
Lo que puede hacer es proponer reemplazarlo por algo que haga más, es decir, agrupar el servicio de la deuda tecnológica en una actualización que brinde beneficios comerciales instantáneos y tangibles.
Por supuesto, debe ser abierto al respecto, no estamos hablando de "introducirlo" en un nuevo proyecto aquí.
Me parece que el otro lado, el de los desarrolladores, es más difícil de manejar. Básicamente, todo se reduce a esto: para algunos desarrolladores, asegurarse de que su código sea el mejor código posible es un orgullo profesional. Para otros, este es solo otro trabajo y el objetivo es hacerlo rápidamente e irse a casa.
Ninguna cantidad de convincente cambiará esa situación, y si introduce un estándar de calidad de código obligatorio, sus desarrolladores de nueve a cinco encontrarán una manera de trabajar el sistema, mientras que sus desarrolladores dedicados inevitablemente se molestarán por todo el procedimiento (que no es No apuntas a ellos, pero no puedes decir que el desarrollador X debe obedecer las reglas, mientras que Y puede hacer lo que quiera).
Lo que funciona, pero aún puede ser muy frustrante es tener a sus desarrolladores más dedicados y conocedores supervisando la base de código, probablemente una buena compensación entre seguir adelante y ordenar lo que hay allí.
fuente
El hecho es que, en muchas empresas, particularmente dada la situación económica actual, cada hora debe facturarse a alguien.
O bajan, rápido .
A menos que los clientes existentes estén dispuestos a pagar por la refactorización, lo cual es muy poco probable a menos que venga con un rendimiento o características significativamente mejorados. Entonces no sucederá en las bases de código más antiguas. Es posible que pueda incluirlo en el presupuesto para proyectos más nuevos, si los clientes tienen mucho dinero, pero a menos que no necesite cambiar las API en la refactorización, no será útil para proyectos más antiguos y bien podría introducir un situación en la que la compañía admite dos bases de código, lo que causa más dolores de cabeza y costos.
Como ingeniero, me encantaría refactorizar el código antiguo, que ya no es realmente adecuado para su propósito, cada vez que algo queda obsoleto o en desuso. Pero como mis doctores en todas las compañías en las que he trabajado me han dicho: "¿Quién pagará?"
fuente
Siempre trato de limpiar a medida que avanzo. No he terminado hasta que el código esté limpio. El problema con la deuda técnica es que la mayoría de la gente no lo entiende. La mejor manera de abordarlo es no acumular nada. Si sus gerentes confían en sus desarrolladores para decidir cómo resolver un problema, puede hacer que la higiene del código sea parte de cada tarea de programación. Si nunca registra un código incorrecto, no acumula deudas. Si también sigue la Regla de Boy Scout (siempre deje el código más limpio de lo que lo encontró) su deuda existente desaparecerá lentamente.
No veo la refactorización como una tarea separada de la implementación de características. Es una parte integral de esto.
fuente
Si está tratando con gerentes no técnicos, sería útil si puede convertir su discusión en términos que ellos entiendan. Si puede construir un caso realista para un ROI positivo en el trabajo dedicado a pagar la deuda técnica, podría llegar a algún lado. Ese ejercicio dependerá de sus circunstancias, pero un ejemplo podría ser algo como esto:
Analice la cantidad de tiempo que los desarrolladores se ven obligados a pasar ayudando al Soporte técnico con problemas de producción, luego haga el caso de que arreglar un código antiguo no adecuado A. reduciría la cantidad de problemas de soporte técnico, B. facilitaría que el Soporte resuelva los problemas sin escalar al Desarrollo, y C. reducir el tiempo que el desarrollo gasta en problemas de producción cuando surgen. Póngalo en términos de dólares ahorrados al no tener a los desarrolladores atados haciendo trabajo de soporte. También señale que cada hora que un desarrollador pasa dando soporte es un "doble golpe" porque no solo le está pagando a un desarrollador para que brinde soporte, sino que está quemando el costo de oportunidad de lo que ese desarrollador podría estar haciendo (agregando nuevas características, etc. .)
Sí, algunos de los números serán vudú / humo y espejos ... eso está bien, el secreto sucio de la administración es que saben que la mayoría de los números que arrojan son BS totales siempre y cuando les des algo aparentemente concreto para trabajar, para que puedan tenerlo en la cabeza, tienes una oportunidad de pelear.
fuente
Después de esta explicación de la deuda técnica, su gerencia debería estar convencida de pagarla:
La cocina es su código, la comida es su producto y comer es vender su producto.
Si pueden darse el lujo de esperar más tiempo para que se implemente un cambio, sin una red segura de pruebas unitarias, entonces hay algo mal en su empresa.
fuente
Tiene que ser un argumento muy convincente, en términos del producto original y el caso comercial, que no podría usar ese dinero ahora para hacer algo más importante para mí. Nos guste o no, su gerencia o sus clientes están pagando por esto y usted necesita poder vender para convencerlos.
Reformulemos esto para posicionarse como cliente. Buen viejo juego de roles.
Como cliente, ¿cuál comprarías tú mismo?
¿Y qué creen los ingenieros de Acme Deluxe que es la mejor respuesta?
fuente
La " deuda técnica " puede ser un tema difícil de presentar a la gerencia, ya que es posible que no vean la necesidad. La pregunta podría enmarcarse como si hay un campeón en la compañía que diga: "Mire, estamos tomando X% de tiempo para trabajar en la deuda técnica aquí. Danos 3 meses para mostrarle que esto funciona bien" o algo así. similar. Hay un reclamo hacia la autonomía allí, pero también un marco de tiempo ya que, de lo contrario, la gerencia puede preguntarse cuánto tiempo hasta que vean algunos resultados, que es un territorio bastante peligroso.
Sin embargo, el primer punto es si ven esto o no como un problema. Si la persona con mala visión no sabe nada de anteojos y qué tipo de cambios puede proporcionar, ¿cómo van a entender por qué una prueba ocular podría ser valiosa? La misma idea aquí donde el tema es bastante técnico y desafortunadamente no se cuantifica fácilmente.
fuente
Deberías dejar de quejarte al respecto.
Este es el por qué:
Entonces, el mejor camino a seguir es:
fuente
Supongo que nunca ha estado involucrado en un proyecto para reescribir / reemplazar o incluso actualizar el sistema existente.
Estos son algunos de los proyectos más difíciles de completar con éxito. Algunos de los problemas que encontrará son:
Le insto a evitar cualquier proyecto de reescritura / refactorización como la peste, pueden ser algunas de las experiencias más desalentadoras en la carrera de cualquier profesional.
Hay mucha sabiduría en la frase "Si no está roto, no lo arregles".
fuente
Por mi vida, no puedo entender por qué algunas personas temen ciegamente el cambio: huele a falta de confianza en tus propias habilidades.
Anoche vi un espectáculo en el Parque Nacional de Yosemite y se observó que desde 1940 hasta finales de los 90 no brotó ningún árbol Sequoia nuevo. Se descubrió que la razón era que existía una política estricta contra la quema de incendios forestales y que los conos de pino Sequoia necesitaban el calor del fuego para abrirse y liberar sus semillas.
Usted ve, un incendio cada diez años más o menos era saludable. Eliminó toda la madera muerta y zarzas acumuladas para mantener saludables los árboles (procesos) existentes y dejar espacio para otros nuevos (características).
Estoy en un proyecto en este momento que tiene un caso claro para la reconstrucción: el software heredado fue escrito completamente usando formularios web .NET. Casi toda la lógica de negocios se combina con la lógica de vista de etiquetas HTML / servidor y no puede extenderse a otras aplicaciones ahora que el negocio ha crecido.
La administración está detrás de la tarea porque tienen una cantidad adecuada de confianza en sus desarrolladores, lo cual, me doy cuenta, es un lujo raro.
Sí, pregúntese si una reconstrucción es realmente necesaria. Haz tu mejor esfuerzo para reutilizar el código existente que funciona donde puedas. Integre ese código en la reconstrucción si es necesario. Simplemente no dejes que nadie te convenza de que tener miedo de hacer cambios audaces es la única forma de existir como desarrollador de software.
¡Buena suerte!
fuente
Debe darle a su administración una razón financiera para lidiar con la deuda técnica y un marco para administrar la reducción de esa deuda técnica.
Mantener una hoja de ruta tecnológica es uno de esos marcos. Comenzar con una hoja de ruta lo ayudará a evitar que acumule deudas técnicas y también puede ayudarlo a reducir la deuda existente.
Muchos proyectos exitosos a largo plazo tienen comités directivos y hojas de ruta asociados para guiar el desarrollo. Estos son especialmente útiles cuando hay múltiples equipos de desarrollo e interesados involucrados.
Mi sugerencia es que discuta esta estrategia con sus gerentes (y si es posible con aquellos que toman decisiones sobre dónde se gasta el dinero).
El enfoque general para crear y administrar una hoja de ruta es sencillo, pero requiere el apoyo de su equipo de administración. Primero, define una meta. Defina los elementos de la deuda técnica y desarrolle una arquitectura de sistema objetivo que reduzca los elementos de su deuda técnica. Recuerde, no tiene que ser perfecto, solo viable y mejor de lo que es actualmente. Tenga en cuenta el software, las herramientas de desarrollo, las plataformas de hardware, las principales características nuevas que se pueden agregar al sistema. Haz un análisis de costos. Si tiene la arquitectura deseada, ¿cuáles son los beneficios tangibles de realizar la refactorización? (Los beneficios incluirían un tiempo de prueba reducido, productos de software más confiables, ciclos de desarrollo más predecibles, etc.) Si puede mostrar suficientes beneficios para realizar la refactorización, puede obtener soporte de administración.
Una vez que tenga una hoja de ruta y soporte de administración, desarrolle una serie de pasos (también llamados plan) que debe seguir para llegar a este estado deseado. Puede ser una buena idea reunir un comité directivo que mantenga la hoja de ruta, capacite y eduque a los equipos de desarrollo en la hoja de ruta, y revise periódicamente los cambios para la integridad arquitectónica.
Las hojas de ruta son realmente útiles, y quizás la decimotercera pregunta en la Prueba de Joel debería ser "¿Tiene una hoja de ruta?"
Aquí hay un video de la primera hora de una sesión reciente de hoja de ruta de Red Hat Linux .
fuente
Después de haber estado involucrado en una reescritura importante (no solo de refactorización), puedo estar de acuerdo en que hacer que los financieros estén de acuerdo con el proyecto fue uno de los principales obstáculos. Superar ese obstáculo me obligó a escribir, presentar y defender un informe que señalaba una serie de problemas que significaban que el negocio de las empresas iba a estar muerto en el agua a corto y mediano plazo.
Factores clave para lograr que el acuerdo avance:
El informe detalla los problemas, con estimaciones de los costos en curso, y ofrece 3 opciones:
Después de obtener la tercera opción, mi contrato de 3 meses se convirtió en 3 años de trabajo muy duro, tanto en el desarrollo del nuevo software como en el hardware, pero con un muy buen resultado.
Para los casos con una deuda técnica menos extrema, tiendo a adoptar lo que llamo refactorización de guerrilla:
Cuando hay un problema con un módulo específico:
fuente