Cuantos commits a GeneXus Server va a tener este objeto?

Decidimos hacer un primer experimento de algoritmos de inteligencia artificial para predecir la cantidad de commits que va a tener un objeto, teniendo algunas características del mismo. 

Hicimos un programa para leer una KB y sacar para los objetos ejecutables: 


//Información del objeto
"Object", 
"Description", 
"Type", 
"Module",
                                
//Información sobre los parámetros
"#ParmIN", Cantidad de Parámetros IN
"#ParamOUT",  Cantidad de Parámetros OUT
"#ParamINOUT", Cantidad de Parámetros INOUT
"#Parameters",  Cantidad total de parámetros. (suma de los anteriores)
                                
//Información sobre código
"#Comments", Cantidad de lineas de código
"#Lines",  Cantidad de lineas del codigo
"Max Nest", Cantidad de anidaciones que tiene el código
"Longest Code Block",   Bloque de código mas grande
"Cyclomatic Complexity",  Complejidad ciclomática del código
                                
"#Rules", Cantidad de lineas en las reglas
"#FormControls", Cantidad de controles en la pantalla
"#Var", Cantidad de Variables usadas

//Cantidad de tablas 
"#ReadTables",  Cantidad de Tabla leidas
"#UpdateTables",  Cantidad de Tablas Actualizadas
"#InsertTables",  Cantidad de tablas que se hacen insert
"#DeleteTables", Cantidad de tablas en las cuales se hace delete

//Referencias
"#FromRef", Cantidad de objetos que referencian al objeto 
"#ToRef",  Cantidad de objetos referenciados por este objeto

//Esto es lo que queremos predecir. 
"#Commits", Cantidad de Commits que ha tenido este objeto

Teniendo una historia de varios años de commits, la idea es poder ver cuales son los objetos que tienen mas commits y cuales son los que tienen menos. 

Tomando los últimos (5 años aprox) 10.000 commits, pudimos hacer un modelo (una red neuronal) que tomando estas variables como entradas, prediga si el objeto puede ser muy subido en el futuro o no. 

Es solo un experimento, pero nos permitió encontrar algunas cosas interesantes. 
Tomamos un 80% de los registros para entrenar a la red neuronal y luego chequeamos con el 20% restante que precisión tiene la clasificación en 

0=Menos de 5 commits
1= Entre 5 y 20 commits
2= Mas de 20 commits. 

En un 96% clasificaba en forma correcta. 

Las dimensiones que mas influyen en el resultado son 

#Lines
Longest Code Block
#FormControls
#ToRef
Cyclomatic Complexity
#Var

O sea, los programas mas largos son los que tienen mas posibilidades de necesitar cambios. Tambien los que tienen pantallas mas complicados y el numero de objetos referenciados.

Es algo bastante obvio que los objetos mas grandes y complejos van a ser muy afectados por su entorno y va a necesitar cambiarse y subirse al server mas veces.

Para que puede usarse esto?

Podemos hacer un servicio que reciba la información de un objeto y clasifique dicho objeto. 
El desarrollador si ve que el objeto es demasiado complejo, puede elegir dividirlo o simplificarlo para que el mantenimiento sea mas fácil en el futuro. 

Es una primera prueba de como nos puede ayudar la inteligencia artificial en el desarrollo de aplicaciones. 

Comentarios

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.