Autor
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:
- 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.
- Determinar quién es el más adecuado para cada proceso: Decidir qué trabajo debe ser manejado internamente y cuál puede ser externalizado.
- 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. 5
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.
Autor
- Log in to post comments