Foto de Artem Podrez

Primero, ¿qué es deduda técnica? y ¿que es es un bug?

La deuda técnica es un concepto en el desarrollo de software que refleja el costo extra que conlleva elegir soluciones rápidas y fáciles a corto plazo en lugar de utilizar un enfoque mejor y más difícil que tomaría más tiempo. Al igual que una deuda financiera, la deuda técnica acumula «intereses», lo que significa que cuanto más tiempo pase sin pagarla (o sea, sin solucionar el problema técnico), más «costoso» será resolverla en términos de tiempo y esfuerzo.

Por ejemplo, podrías optar por reutilizar un código antiguo para ahorrar tiempo en el desarrollo de una nueva funcionalidad, pero esta decisión puede generar problemas a largo plazo si el código es difícil de mantener o no es compatible con nuevas tecnologías.

Un «bug» es un error o defecto en un programa de computadora que causa un resultado incorrecto o inesperado, o se comporta de manera no deseada. Los bugs pueden ser el resultado de errores o malentendidos en el código fuente de un programa. Por ejemplo, un bug puede hacer que un programa se bloquee o produzca resultados incorrectos. Los bugs pueden ser difíciles de detectar y eliminar, ya que pueden aparecer solo en ciertas condiciones o secuencias de eventos.

Un ejemplo de un bug en C# podría ser el siguiente:

int Divide(int a, int b)  
{  
    return a / b;  
}  

En este caso, si el valor de «b» es 0, el programa devolverá un error de división por cero, lo que representa un bug. Una forma de solucionarlo sería añadir una comprobación para asegurarse de que «b» no es 0 antes de realizar la división.

Ya tenemos claro que son ambos conceptos.

En muchos proyectos, veo como se cae en la tentación de camuflar camuflar bugs como deuda técnica. A largo plazo, puede llevar a problemas más serios, afectar la calidad del producto y erosionar la confianza del equipo y los stakeholders.

Pero veamos por qué alguien cae en esta tentación:

  1. Para Evitar Responsabilidades: Algunos pueden querer etiquetar un bug como deuda técnica para evitar asumir la responsabilidad de los errores en el código, ya que la deuda técnica a menudo se percibe como una consecuencia inevitable de ciertas decisiones del proyecto.
  2. Para Posponer la Solución: Etiquetar un bug como deuda técnica puede ser una forma de posponer su solución. Los errores pueden requerir soluciones urgentes, mientras que las deudas técnicas se pueden abordar en un plazo más largo.
  3. Para Minimizar el Impacto Percibido: Los bugs pueden ser vistos como fallas más serias, mientras que la deuda técnica se puede percibir como algo menos crítico. Al camuflar un bug como deuda técnica, se puede intentar minimizar la percepción del impacto negativo en la calidad del software.
  4. Para Evitar Recursos Extra: Resolver bugs puede requerir recursos adicionales, como tiempo, personal y dinero. Al presentarlo como deuda técnica, puede ser una estrategia para evitar la asignación de estos recursos.
  5. Para Manejar Expectativas: Los bugs pueden afectar negativamente la percepción de los stakeholders sobre la calidad del proyecto. Al camuflarlos como deuda técnica, se puede intentar manejar estas expectativas.

Me inclino más por el término mimetizar en lugar de camuflar. Es como si estuviéramos en una situación compleja donde cada decisión cuenta.

Como consultor, a menudo me encuentro en entornos que pueden ser reacios al cambio, especialmente cuando se trata de reconocer y manejar bugs. Estos entornos pueden ser complicados, donde cada bug puede tener un coste asociado, ya sea debido a acuerdos contractuales con clientes u otros factores.

En este punto, es donde el concepto de mimetizar cobra relevancia. A diferencia del camuflaje, que se orienta hacia la ocultación y el disfraz, mimetizar sugiere una adaptación, una incorporación de las características del entorno para una mejor integración en él. En este contexto, mimetizar un bug como deuda técnica implica integrar este problema dentro del marco de trabajo existente, en lugar de ocultarlo. Esta puede ser una estrategia que algunos optan por adoptar en entornos reacios al cambio, dado que facilita la visibilidad del problema sin alterar significativamente el equilibrio actual.

No obstante, a pesar de la aparente conveniencia de esta táctica, es fundamental recordar que el simple hecho de reetiquetar un bug como deuda técnica no resuelve el problema en sí. Al final del día, es imprescindible abordar y resolver estos problemas para garantizar la salud y el éxito del proyecto. De lo contrario, es posible que otros lleguen y descubran los problemas que se habían escondido bajo la alfombra, lo que podría llevar a consecuencias aún más perjudiciales.

Como el artículo va destinado a la deuda técnica y no a los bug, vamos a empezar por:

Algunos factores que nos impiden reducir la deuda técnica
Cómo comunicar la deuda técnica

Explicar la deuda técnica a personas no familiarizadas con el desarrollo puede ser un desafío. Incluso cuando la gerencia confía en el equipo de desarrollo, es difícil para los gerentes entender con qué se enfrentan los ingenieros o cómo la deuda técnica ralentiza el proceso de ingeniería de software e introduce enormes riesgos de calidad cada vez que se modifica la aplicación.

Deuda técnica como riesgo

Esta forma de comunicarlo es la que usa un amigo mio y que suelo usar. He aprendido que aunque la gerencia tiene problemas para entender la deuda técnica, hay algo que comprenden mucho mejor: el riesgo.

La mejor manera de ayudar a la gerencia a entender la deuda técnica es presentándola en términos de gestión de riesgos.

Cada aspecto de la deuda técnica en su sistema tiene tanto una probabilidad como un impacto.

La probabilidad de una parte de la deuda técnica es la posibilidad de que esa deuda técnica afecte al equipo de desarrollo durante el desarrollo o cuando la aplicación se está ejecutando en producción.

El impacto es cuánto daño causará la deuda técnica si afecta a los desarrolladores o a las aplicaciones implementadas.

Por ejemplo:

Conviertete en un vendor/a

Hemos discutido cómo podemos medir y priorizar los problemas pendientes en nuestro trabajo, y cómo la participación de la gerencia en el proceso de seguimiento de estos riesgos puede ayudar a construir confianza y comprensión. Pero hablemos de situaciones en las que los líderes del proyecto necesitan «convencer» a la gerencia de la necesidad de una revisión importante de nuestro trabajo.

Estas conversaciones pueden ser estresantes y representar un momento decisivo en nuestros proyectos. En estas conversaciones de alto riesgo, tu objetivo es comunicar de manera clara y respetuosa los siguientes puntos:

  • El problema al que se enfrenta el equipo y qué pasará si no se resuelve
  • La solución propuesta (o varias soluciones a considerar)
  • El costo de la revisión en términos de horas de trabajo
  • El cronograma de la revisión
  • Lo que te gustaría que haga la gerencia

Ten en cuenta que tu objetivo aquí no es que acepten lo que estás proponiendo. Tu objetivo es que comprendan el problema y colaboren contigo para determinar cuándo y cómo debe resolverse.

Muy importante:

Cuando tu enfoque está en obtener lo que quieres a toda costa, esto puede resultar en una pérdida de confianza, aumentar las tensiones entre el equipo y la gerencia, y la sensación de que el equipo no puede pensar en términos de las necesidades del negocio.

Por el contrario, si ves a tus socios en la gerencia como personas con una visión válida y valor para agregar a la organización, la conversación puede convertirse en algo diferente: una colaboración donde el equipo y la gerencia trabajan juntas para las necesidades a largo y corto plazo del negocio.

Prepara la reunión

Antes de poder iniciar un diálogo sobre un desafío que estás enfrentando, necesitas poder describir claramente el problema y las posibles soluciones.

Esto requerirá algo de reflexión y organización. No necesitas tener un plan de proyecto detallado, pero sí debes considerar el alcance del desafío, los elementos que necesitarán modificarse y las personas que deberán estar involucradas.

Además, deberás tener en cuenta los proyectos actuales de tu equipo y lo que las personas que buscas involucrar están haciendo ahora, o lo que se espera que hagan pronto.

Recuerda que para que tu organización diga «sí» a tu esfuerzo por mejorar, tendrán que decir «no» a algo más mientras dure tu proyecto de mejora.

Una vez que tengas una comprensión clara del desafío y su solución, debes presentarlo a la gerencia. Esto puede hacerse en el marco de una reunión regular entre los líderes del equipo y la gerencia o en una reunión específica.

La forma en que propongas la reunión dependerá de la persona a la que te dirijas.

Algunos líderes pueden estar dispuestos a que pases por su oficina o les envíes un mensaje directo diciendo algo como «Tengo algunas inquietudes sobre el proyecto. ¿Tienes unos minutos para hablar de esto con más detalle?» Por otro lado, otros líderes querrán tener la conversación tan pronto como menciones el tema. Por esta razón, te recomiendo que te prepares para la conversación.

Al presentar tus preocupaciones y opciones a la gerencia, debes tener en cuenta las posibles preguntas u objeciones que podrían plantear. Prepárate para detallar tanto el problema actual como las soluciones propuestas. Es común que la gerencia quiera detalles sobre los plazos del proyecto, incluyendo cuánto tiempo llevará el esfuerzo de reestructuración y cuánto tiempo puede esperar el proyecto para comenzar. Recuerda que la mayoría de las organizaciones tienen proyectos importantes programados al menos para el próximo trimestre, por lo que emprender un esfuerzo de reestructuración generalmente requiere reorganizar el trabajo actual y planificado en otras áreas.

Herramientas:

  • Un árbol de decisión podría ser una técnica útil en esta situación. Puede ayudar a visualizar y evaluar las posibles preguntas u objeciones que la gerencia pueda plantear, así como las diferentes opciones de solución para el problema. Además, puede ayudar a planificar los plazos del proyecto, al mostrar diferentes rutas posibles y el tiempo que podría tomar cada una. 
  • Diagramas de flujo: Similar a los árboles de decisión, estos pueden ayudar a visualizar el proceso y a identificar posibles desafíos y soluciones.
  • Análisis SWOT (Fortalezas, Debilidades, Oportunidades, Amenazas): Este tipo de análisis puede ayudarte a entender mejor el problema y a identificar posibles soluciones.
  • Matriz de riesgo: Esta herramienta puede ser útil para evaluar los riesgos asociados con diferentes soluciones y para priorizar las opciones en función de su nivel de riesgo.
  • Diagramas de Gantt: Estos pueden ser útiles para planificar y visualizar el cronograma del proyecto, incluyendo los plazos para diferentes tareas y cómo se solapan.
  • Kanban o tableros Scrum: Estas herramientas de gestión de proyectos pueden ayudarte a organizar y seguir el progreso de las tareas.
  • Herramientas de comunicación y colaboración, como Slack o Microsoft Teams: Estas pueden facilitar la comunicación con el equipo y la gerencia, y ayudar a mantener a todos en la misma página.

Como una herramienta fundamental, la comunicación merece un lugar destacado. Permíteme ofrecerte un consejo basado en mi experiencia:

He aprendido que mantener una comunicación abierta y bidireccional entre la gerencia y el equipo de ingeniería es esencial, especialmente cuando se trata de la deuda técnica. Aunque mi enfoque como ingeniero pueda estar centrado en los detalles técnicos y el código, reconozco que la gerencia puede tener su atención en las iniciativas estratégicas o en garantizar la supervivencia de la empresa. Ambas perspectivas son igual de críticas para el éxito de nuestra organización. Para que esta comunicación sea efectiva, debemos cultivar un ambiente de confianza y respeto mutuo, valorando las contribuciones que cada uno aporta. No olvides que todos estamos trabajando hacia un objetivo común.

Diferentes aproximaciones:

En resumen se trata de tener diferentes enfoques para diferentes líderes. Podrás encontrarte con personas muy analíticas y querran datos, de aquí que pongas la palabra mágica del dienero y el tiempo por delante. Y otros que podrán entender holisticamente que no se trata de dinero a corto plazo.

Con tener la visión holistica me refiero a: una visión completa o global de un problema o situación, en lugar de centrarse únicamente en sus componentes individuales. En este contexto, un líder que entiende holísticamente considera todas las partes y cómo interactúan entre sí, teniendo en cuenta tanto los aspectos cuantitativos (como los datos y las cifras) como los cualitativos (como las experiencias y emociones de las personas). Este tipo de líderes valoran el «cuadro completo», entendiendo que los elementos individuales de una situación no pueden entenderse completamente sin considerar el sistema en su conjunto.

Por ejemplo:

  • Para líderes analíticos y orientados a los datos: Podrías presentarles un informe detallado que muestre cómo el problema está afectando al rendimiento del equipo. Por ejemplo, podrías señalar que el equipo está gastando un 25% de su tiempo resolviendo problemas que se derivan de este asunto en particular. Luego, podrías hacer un cálculo de cuánto dinero está costando ese tiempo en términos de salarios. Al mostrar la conexión directa entre el problema, el tiempo y el dinero, estarías hablando el idioma que estos líderes comprenden.
  • Para líderes que piensan holísticamente: Podrías compartir historias específicas sobre cómo el problema está afectando a los miembros individuales del equipo. Por ejemplo, podrías contar la historia de un desarrollador que se siente frustrado porque pasa más tiempo resolviendo problemas que desarrollando nuevas funciones. O podrías compartir una anécdota sobre cómo un error que se produjo debido al problema llevó a un cliente a presentar una queja. Este tipo de líderes valoran el bienestar de las personas y la satisfacción del cliente, por lo que estas historias pueden ser muy impactantes. Y como esta persona entiende de forma más global el proyecto, con darle unas pinceladas económicas es más que suficiente.
Conclusión

La deuda técnica y los bugs son dos conceptos fundamentales en el desarrollo de software que pueden tener un impacto significativo en la calidad del producto y en la eficiencia del equipo de desarrollo. Es esencial entender y diferenciar estos dos conceptos para evitar prácticas perjudiciales como camuflar o mimetizar bugs como deuda técnica.

Asimismo, es crucial abordar tanto la deuda técnica como los bugs de manera oportuna para evitar consecuencias más graves a largo plazo. Esto requiere una gestión efectiva de la deuda técnica y una comunicación clara y eficaz con los stakeholders y el equipo de desarrollo.

Por otro lado, es importante recordar que el simple hecho de reetiquetar un bug como deuda técnica no resuelve el problema en sí. Por lo tanto, es imprescindible abordar y resolver estos problemas para garantizar la salud y el éxito del proyecto.

Si se gestiona correctamente, la deuda técnica puede ser una herramienta valiosa que permite tomar decisiones informadas sobre el equilibrio entre la calidad del código y la entrega oportuna de funciones. Sin embargo, para lograr esto, es esencial tener una comprensión clara de qué es la deuda técnica, cómo se acumula y cómo se puede gestionar eficazmente.