La Inteligencia Artificial y la deuda técnica: Cómo prevenirla y manejarla

Resumen.- La deuda técnica es ineludible, pero existen estrategias que podemos poner en práctica para minimizar antes de que ocurra y resolverla una vez que existe. Estas mismas aplican también a las nuevas soluciones que utilizan  Inteligencia Artificial, pero existen algunas consideraciones adicionales que la experiencia nos está enseñando.

¿Qué es la deuda técnica? 

Cuando hablamos de deuda técnica en desarrollo de software, nos referimos a asuntos pendientes o  inconclusos de un proyecto que esperamos sean resueltos en un futuro próximo. Para tomar prestada  una metáfora apta, es como una tarjeta de crédito: inicialmente puede parecer manejable, pero el  "interés" (trabajo adicional) se acumula rápidamente. Podríamos decir que en general es el resultado de  escribir código abusando de atajos para cumplir con plazos, el desarrollo apresurado y la reutilización de  código obsoleto. 1 

En el ámbito de las nuevas soluciones basadas en Inteligencia Artificial, podemos añadir como causa que  estamos trabajando con tecnologías nuevas; algunas tan nuevas que los motores de IA se ofrecen en  versiones preview. Por lo mismo, nos abrimos camino en descubrir qué funciona mejor y más rápido y qué  no; y a veces no es posible saberlo durante el desarrollo de un proyecto determinado por tiempos de  entrega estrictos. 

Nada es gratis en la vida. Naturalmente, la deuda técnica resulta en software por debajo de un estándar  bueno, más lento, con funcionalidades limitadas y costos de mantenimiento más altos. 2 Me gustaría  revisar algunas buenas prácticas para prevenir la deuda técnica y resolverla, y reflexionar acerca de cómo  cambia el panorama con proyectos que giran en torno a la IA. 

Prevenir la deuda técnica 

Cierta cantidad de deuda técnica es inevitable, pero podemos minimizar con varias estrategias  proactivas. Lo esencial es priorizar la calidad del código; es decir, escribir código limpio, bien organizado  y documentado, lo que desde el inicio reducirá errores y facilitará su solución. Esto se debe complementar  con pruebas automatizadas: pruebas unitarias y de integración para detectar bugs temprano. Asimismo,  es importante aprovechar la experiencia del equipo de trabajo y hacer que otros desarrolladores revisen  el código antes de fusionarlo con la rama principal. También es útil hacer uso de métricas generadas por  distintas herramientas y plataformas como Sonar Cloud para medir la complejidad del código, la cobertura  de pruebas y la tasa de errores. Finalmente, estas estrategias deben siempre pasar por la consideración  de los objetivos de negocio a largo plazo. 3

Pensando a nivel organizacional, más allá de uno o varios proyectos en particular, consideremos que el  rigor, las metodologías y los procesos son fundamentales. Cualquier empresa vinculada a TI debe apegarse  a modelos de mejores prácticas o procesos como DevOps, MLOps (para el aprendizaje de máquinas, sobre  el cual he hablado en artículos anteriores), ITIL, ITSM, COBIT, TOGAF, etc. 4 

Más allá de la deuda técnica que se genera a partir de un proyecto, existen ocasiones en que nuestra  organización migra de plataforma o cambia radicalmente sus procesos, y estos cambios pueden resultar  en lo que los autores Sundar Subramanian y Mohib Yousufani llaman “deuda procesal”. Para estos casos,  cabe mencionar los siguientes puntos para la gestión de la deuda procesal: 

  1. Mapear procesos de extremo a extremo: Identificar y categorizar los procesos de la organización  según productos o flujos de valor y evaluar su necesidad y valor. 
  2. Determinar quién es el más adecuado para cada proceso: Decidir qué trabajo debe ser manejado  internamente y cuál puede ser externalizado. 
  3. Crear una "fábrica digital": Establecer un equipo con capacidades de estrategia de productos,  diseño, ingeniería de datos, ciencia de datos y automatización para reimaginar los procesos. 4. Reskilling de empleados: Capacitar a los empleados para apoyar los nuevos procesos. 5. Adoptar una mentalidad interactiva y de aprendizaje: Gestionar estos programas de cerca para  asegurar la adopción adecuada y ajustar según sea necesario.

Resolver la deuda técnica 

Ya que cierto grado de deuda técnica es inevitable, ¿qué prácticas podemos adaptar para abordarla, más  allá de la atención de bugs o hotfixes cuando ya no se pueden postergar más? 

Una buena opción sería establecer una semana de refactorización, cada cierto número de sprints para  resolver errores, evaluar la arquitectura actual y prepararla para futuras funcionalidades y características.  Esto da tiempo al equipo para mejorar el código antes de adentrarse en implementar algo nuevo. 

Esto iría de la mano de reuniones de retrospectiva para compartir conocimiento del proyecto y formar un  entendimiento compartido del código y sus limitaciones.

Como complemento, podríamos hacer uso de diversas herramientas para rastrear la deuda técnica en el  mismo editor. 6 Aunque el uso de herramientas de administración de proyectos o análisis estadístico es  popular, actualmente sólo 7% de los ingenieros utilizan herramientas de deuda técnica. 7 

Consideraciones para el ámbito de soluciones de Inteligencia Artificial

En mi experiencia en Mobiik, empresa en la que nos esforzamos por innovar y aprovechar las tecnologías  más recientes, puede ocurrir que algún recurso o método de IA no funcione como se esperaba al escalar en ambiente productivo y se tenga que evaluar el uso de algún otro para mejorar el desempeño de la  solución; por ejemplo un motor de IA para chat completo o creación y búsqueda de vectores o  embeddings. Como mencionaba, algunos de ellos son de tan recién liberación que se encuentran en  estatus de preview. Esto no significa que no sean los adecuados, pero sí nos obliga a revisarlos lo mejor  posible antes de comprometernos con ellos, debido al riesgo mismo que implica toda innovación. 

En fase de desarrollo, es también buena idea introducir logs exhaustivos para cada paso del proceso. Esto  se debe a que algunos aparentes errores se pueden deber a la “creatividad” o variabilidad de las respuestas  de la IA, lo cual es un elemento nuevo en las soluciones de TI. Debemos descartar cualquier otro fallo de  código o infraestructura antes de llegar al punto de atribuirlo al indeterminismo de la IA. Si concluimos  que algún fallo frecuente se debe a esta característica de la IA, entonces nos veremos forzados a probar  con modelos o versiones distintas de la misma. 

De modo similar, es importante vigilar desde fases tempranas de desarrollo los tiempos del flujo con  librerías de medición de tiempo, especialmente para los proyectos en los que la velocidad es importante.  Por ejemplo, un chatbot, donde el usuario espera una respuesta, no debería tardar más de unos 5  segundos, o 10 si se le solicita una tarea compleja. Lo mismo aplicaría para un proceso pensado para largo  tiempo; por ejemplo, el análisis con IA de tablas en base de datos hilera por hilera. En este caso no  esperaríamos que tardará segundos, pero si no controlamos los tiempos, se puede prolongar horas o días dependiendo del tamaño de la base de datos a procesar. 

Espero que este artículo te haya sido útil y te haya dado una mejor comprensión del tema. Si tienes alguna  pregunta o comentario, no dudes en ponerte en contacto conmigo. Me gustaría ayudarte a alcanzar tus objetivos de tecnología de la información y a brindarte soluciones innovadoras y eficaces para tus  proyectos. ¡Gracias por leer!

Imagen: Pago con tarjeta de crédito cibernética y futurista. Autor: DALL-E.