Mas leido
Building Stories
Modo Rua: Redefiniendo el desarrollo de aplicaciones mediante iteración centrada en el usuario Ago 23
Building Stories
NuStories: Adaptación de productos para clientes fanáticos en varios países Oct 30
Culture & Values
Cómo los valores y la cultura de Nu dan forma a los productos que creamos Ago 7
Carreras
Reunimos a grandes mentes de diversos orígenes que permiten la discusión y el debate y mejoran la resolución de problemas.
Conoce más sobre nuestras carreras



Asegurar la calidad en sistemas distribuidos, vivos y en constante evolución es uno de los compromisos centrales de ingeniería en Nubank. En este entorno, donde Clojure es ampliamente adoptado y los equipos trabajan con código que cambia continuamente, Raíssa Barreira, Desarrolladora de Software en Nubank, encontró el punto de partida para unir la práctica y la investigación: entender cómo la inteligencia artificial puede apoyar la generación de pruebas unitarias de manera responsable.
El proyecto aborda una necesidad muy real en el desarrollo diario y empuja las fronteras de un límite aún en gran parte inexplorado dentro de los lenguajes de programación funcional. La investigación se está llevando a cabo en LABES (Laboratorio de Ingeniería de Software) del ICMC/USP, bajo la guía del Prof. José Carlos Maldonado y en colaboración con el Prof. Auri Vincenzi, actualmente investigador en la Universidad de Oporto, fortaleciendo aún más el puente entre la academia y la industria.
Dónde comienza la investigación
Raíssa se unió a Nubank en 2023, y fue aquí donde tuvo su primer contacto con Clojure. De esa experiencia surgió la curiosidad por entender cómo mejorar la calidad de las pruebas en el lenguaje que impulsa gran parte de los sistemas de Nu.
En los últimos años, ha habido un progreso significativo en el uso de modelos de lenguaje para generar pruebas automáticamente, pero Clojure rara vez aparece en esas investigaciones. Esta brecha inspiró la pregunta que guía su investigación: cómo integrar la IA en el proceso de creación de pruebas unitarias en Clojure de una manera reflexiva, incremental y que pueda compararse directamente con el trabajo escrito por humanos.
Descubre las oportunidades
Cómo funciona la estrategia incremental
La idea central es construir pruebas de forma progresiva. En lugar de crear un único conjunto de pruebas y analizarlo todo a la vez, el proceso evoluciona en pequeñas capas. Cada capa ayuda a revelar brechas, refinar las pruebas existentes y preparar el entorno para evaluaciones más rigurosas. Este enfoque permite identificar puntos frágiles antes de que se conviertan en problemas mayores.
En Clojure, esta estrategia resulta especialmente útil, ya que el lenguaje favorece la expresividad y la composición, lo que aumenta la necesidad de una verificación cuidadosa a través de múltiples rutas de ejecución..
La función de las pruebas de cobertura y de mutación
La prueba de cobertura mide qué cantidad del código es realmente ejercitada por las pruebas. Ayuda a revelar caminos olvidados, ramificaciones raras y partes del sistema que nunca se ejecutan.
Aunque no garantiza directamente la calidad lógica de las pruebas, muestra rápidamente dónde están las brechas. En la estrategia incremental, esta métrica funciona como un termómetro inicial para guiar lo que debe crearse o revisarse.
Después de alcanzar un nivel sólido de cobertura, la estrategia pasa a una etapa más exigente: la prueba de mutación (mutation testing). Esta crea versiones ligeramente alteradas del código original y verifica si las pruebas pueden detectar que algo está mal. Cuando se identifica el problema, se dice que el ‘mutante’ ha sido ‘eliminado’ (killed). Cuando todo pasa silenciosamente, señala fragilidad. Esta técnica proporciona una visión más profunda de cuán capaces son realmente las pruebas de capturar comportamientos incorrectos.
El costo computacional es mucho más alto, pero la ganancia en confianza también lo es.
Cómo entra la inteligencia artificial en este proceso
Los modelos de lenguaje son especialmente útiles al comienzo de la construcción del conjunto de pruebas. Entienden instrucciones textuales, infieren el comportamiento a partir de funciones y producen código de prueba en Clojure rápidamente. Esto reduce el esfuerzo manual y acelera la creación de una base de pruebas inicial.
Al mismo tiempo, la IA presenta desafíos que no pueden ignorarse. Los modelos pueden ‘alucinar’ comportamientos inexistentes, producir pruebas superficiales y depender en gran medida de la claridad de la entrada. También carecen de mecanismos formales para garantizar la corrección. Esto significa que las pruebas generadas deben ser analizadas, revisadas y comparadas continuamente.
La estrategia incremental surge como una forma de equilibrar este escenario. En lugar de depender por completo de la IA, el proceso crea espacio para la validación, la comparación directa con pruebas escritas por humanos y las iteraciones sucesivas que elevan la calidad general del conjunto.
El pipeline presentado en la investigación
El ciclo comienza con la creación de dos conjuntos de pruebas: uno escrito por desarrolladores y otro generado por IA. Ambos se evalúan mediante la cobertura. Si la cobertura está por debajo de las expectativas, se crean nuevas pruebas y el proceso continúa hasta alcanzar un nivel aceptable.
Una vez que esa etapa madura, el ciclo pasa a la prueba de mutación (mutation testing), donde ambos conjuntos se evalúan y se expanden de nuevo. Con el tiempo, es posible observar cómo evoluciona cada conjunto y comprender dónde la IA se acerca o se diverge de la calidad humana.
Lo que muestran los primeros resultados
En los primeros escenarios, las pruebas generadas por IA lograron superar a las pruebas escritas manualmente, tanto en velocidad como en la eliminación de mutantes (‘killing mutants’). La conclusión es prometedora, pero aún limitada, ya que este experimento inicial todavía no representa la complejidad real de los sistemas de producción.
La siguiente etapa del estudio implica aplicar la estrategia a un conjunto más amplio y diverso de programas Clojure. El objetivo es evaluar el volumen de pruebas producidas, la cobertura alcanzada, el número de mutantes eliminados, el esfuerzo computacional involucrado y el consumo de tokens de los modelos de IA. Estos indicadores ayudarán a determinar el costo y beneficio reales de adoptar esta forma de automatización en entornos reales.
La investigación de Raíssa refuerza la importancia de acercar la academia y la industria. Nubank opera sistemas de gran escala, distribuidos y de misión crítica. Por esta razón, cualquier avance que aumente la calidad y reduzca el riesgo es significativo.
La estrategia incremental asistida por IA abre caminos para evolucionar bases de pruebas heredadas (legacy), reducir el esfuerzo en refactorizaciones importantes y fortalecer la confianza del equipo en cada cambio desplegado a producción.
De manera más amplia, el estudio enriquece la conversación sobre la adopción responsable de la IA en el ciclo de vida del desarrollo. No como un reemplazo, sino como parte de un sistema que permite la validación, la comparación y la mejora continua.
La estrategia aún está en desarrollo, pero ya muestra potencial. Con más experimentos, una base de código más amplia y ciclos de evaluación adicionales, puede convertirse en una herramienta relevante para mejorar la calidad del software en Clojure.\.
Descubre las oportunidades