¿Qué aprenderá?
¿Qué hará?
¿Cuáles son los prerrequisitos?
Inicio 1
Contexto 2
OpenCms 2
CodeScene 3
Salud del código (Code Health) 5
Hotspots 6
Distribución del conocimiento(Knowledge distribution) 7
Estadísticas de actividad 8
Mapas de flujo(Flow maps) 9
Visualizaciones de riesgo(Risk visualizations) 9
Estrategia del tutorial 10
Configuración del ambiente CodeScene 11
Hacer fork del proyecto OpenCms 12
Crear cuenta en CodeScene 12
Lanzar un análisis de código fuente en CodeScene 15
Navegar visualizaciones Hotspots y Code Health 21
Navegar Hotspots 21
Navegar Code health 24
Navegar visualizaciones de arquitectura 25
Definir componentes de arquitectura en CodeScene 27
Lanzar un análisis para los componentes de arquitectura definidos 31
Visualizar los resultados del análisis 33
Cierre 36
Créditos 36
Versión 1.0 36
Material de consulta complementario 37
En este tutorial analizaremos el código fuente del proyecto OpenCms. OpenCms es un Sistema de Gestión de Contenidos (CMS por sus siglas en inglés) de código abierto hecho en Java. El sistema permite la creación, gestión y publicación de contenido en sitios web de manera eficiente y sencilla. Entre sus características principales se encuentran: la capacidad de trabajar con múltiples sitios web, la gestión de permisos y roles de usuarios, la integración con sistemas de comercio electrónico, la personalización del contenido según el perfil del usuario y la integración con sistemas de búsqueda y estadísticas. OpenCms cuenta con una comunidad activa de desarrolladores y usuarios que ofrecen soporte y recursos para su uso y mejora continua. Además, es compatible con estándares como JSP, XML y XHTML, lo que permite una fácil integración con otros sistemas y aplicaciones. Para más información sobre el sistema usted puede ir a https://demo.opencms.org/livedemo/overview/.
OpenCms sigue una arquitectura basada en capas, compuesta por:
CodeScene es una plataforma de análisis de software que ayuda a los desarrolladores y equipos de desarrollo a mejorar la calidad de su código y optimizar su proceso de desarrollo. La herramienta utiliza algoritmos avanzados de aprendizaje automático y herramientas de visualización de datos para proporcionar información sobre cambios en el código, deuda técnica y rendimiento del equipo. CodeScene es capaz de identificar patrones y tendencias que indican posibles problemas, como áreas de alta complejidad, bad smells en el código o silos de conocimiento. Esta información es muy valiosa para ayudar a los desarrolladores a tomar decisiones sobre cómo mejorar el código fuente y cómo trabajar de manera más eficiente dentro del equipo. En general, CodeScene tiene como objetivo ayudar a los equipos de desarrollo a crear mejores productos de software con menos esfuerzo y errores.
Existen otras herramientas con funcionalidades similares a CodeScene, una de las más usadas es, por ejemplo, SonarQube. Ambas herramientas analizan código fuente estático ayudando a los desarrolladores a mejorar la calidad del software y a detectar problemas potenciales, pero existen algunas diferencias significativas entre CodeScene y SonarQube. Por un lado, SonarQube es una herramienta open source de análisis de código fuente que evalúa la calidad del código, la seguridad y el rendimiento. Ofrece un conjunto de reglas predefinidas y personalizables que permiten a los desarrolladores identificar problemas comunes en el código, como vulnerabilidades de seguridad, errores de codificación, duplicación de código y violaciones de buenas prácticas de programación. Además, SonarQube proporciona una interfaz de usuario web fácil de usar que muestra los resultados de las pruebas y el progreso en la solución de los problemas. Por otro lado, CodeScene es una herramienta de análisis de código que se enfoca en la gestión del conocimiento del software. Utiliza IA para analizar el código fuente y ayudar a los desarrolladores a identificar áreas problemáticas y a entender cómo se relacionan los diferentes componentes del sistema (es decir, la arquitectura). CodeScene también proporciona una perspectiva histórica del código, lo que permite a los desarrolladores ver cómo ha evolucionado el software con el tiempo. En general, si comparamos ambas herramientas, mientras que SonarQube se enfoca en la calidad y seguridad del código, CodeScene se enfoca en la comprensión y gestión del conocimiento del software.
CodeScene usa un modelo de 4 factores (4 Factor Model) para evaluar la mantenibilidad del código fuente, este modelo está basado en los principios del Twelve-Factor App, una metodología para construir aplicaciones de Software como Servicio (SaaS). El modelo de los 4 factores está compuesto por:
Al evaluar el código en función de estos cuatro factores, CodeScene proporciona información sobre mantenibilidad de código y ayuda a identificar áreas en las que el equipo de desarrollo debe prestar más atención o áreas en donde se debería trabajar para mejorar la salud del código. Para esto, CodeScene proporciona varias métricas y tipos de visualizaciones.
En cuanto a las métricas incluye clásicas (por ej., número de archivos, LOC, número de commits, etc. ) y otras más sofisticadas (por ej., esfuerzo CodeScene y salud del código) que explicaremos más adelante. En cuanto a los tipos de visualizaciones, sigue una descripción general de las visualizaciones que CodeScene obtiene para el código de OpenCms.
Es un gráfico de radar que muestra la salud del código fuente, incluyendo unas estadísticas (por ej., frecuencia de cambio del código escrito, pérdida del conocimiento, etc.) y una representación del estado de salud de las clases usando los colores del semáforo, yendo del rojo al verde,donde el rojo representa a una clase con muchos bad smells (por ej., complejidad ciclomática, duplicaciones) y verde con muy pocos. A continuación, se describen las componentes de interacción (acciones) que permite esta visualización:
Es un mapa de calor que muestra las áreas del código fuente que son más propensas a defectos y deuda técnica. Esta gráfica incluye también los filtros de "Code health filter" y "Commit frequency filter", al igual que una función llamada "Combine Aspects", que permite resaltar en la gráfica los "Hotspots", los puntos con baja salud "Low Code Health", puntos con "Defects" (issues reportados) y costos "Costs" (habilitada si existe integración con otras herramientas que permiten saber costos aproximados de desarrollo).
Es una visualización que muestra cómo se distribuye el conocimiento entre los miembros del equipo y los riesgos potenciales asociados con los silos de conocimiento.
Es una visualización que muestra cómo ha evolucionado el código fuente a través del tiempo en términos del número de commits y autores.
Son visualizaciones que muestran cómo fluyen los cambios de código a través del tiempo, destacando cuellos de botella y áreas de baja eficiencia. Estas vistas están incluidas en la versión enterprise. Por ejemplo, en la captura que sigue se muestra la gráfica "Lead time for changes" la cual tiene en el eje X las semanas y en el eje Y" el tiempo que se ha tomado el equipo para hacer algún tipo de cambio en el código. Por ejemplo, la gráfica obtenida para OpenCms muestra que, a la 2° semana de julio de cierto año, el tiempo para aplicar cambios en el código ha sido de 20 días. Adicionalmente, la gráfica muestra una tendencia creciente en ese número de días lo que puede indicar problemas organizativos/de planificación/deuda técnica creciente.
CodeScene incluye diferentes visualizaciones que muestran riesgos a nivel de los individuos, por ejemplo, es posible ver si existe riesgo de pérdida de conocimiento si un desarrollador va a dejar de trabajar en el proyecto y reconocer si desarrolladores actuales son islas de conocimiento en algunas partes del código.
En esta vista es posible filtrar por desarrollador o equipo, en el campo "Filter by authors and teams" y ver si existe algún tipo de riesgo en algunas partes del código debido a que un equipo o desarrollador es una isla de conocimiento en partes específicas del código o si existen múltiples desarrolladores activos y no hay riesgos de fuga de conocimiento. La figura anterior muestra los archivos en los que el/la desarrollador (a) gWestenberger es quién más ha hecho contribuciones, por tanto hay un riesgo de pérdida de conocimiento si él/ella deja el proyecto. Esto puede motivar decisiones, por ej., que otros desarrolladores se familiaricen con el código previamente desarrollado por gWestenberger.
La primera parte de la estrategia del tutorial consiste en crear una cuenta en CodeScene y lanzar un análisis inicial. Para lanzarlo, es necesario contar con un repositorio de código open source en nuestra cuenta de Github, nosotros usaremos el repositorio de OpenCms, por lo cual, también explicaremos cómo hacer fork del proyecto en Github. En la segunda parte, usted navegará las principales visualizaciones proporcionadas por CodeScene y explicaremos cómo estas pueden ayudar a entender el estado del código fuente, por último, explicaremos la funcionalidad de componentes de arquitectura ofrecida por CodeScene, que permite definir grupos de archivos, ver cómo estos grupos evolucionan en el tiempo y el estado del código fuente en términos de la salud del código, puntos de atención o distribución del conocimiento. Cada uno de estos pasos se estructuran en secciones. Las secciones pueden tener asociadas vídeos que muestran el paso a paso. Al principio de cada sección hay una anotación que aclara lo que se espera que el/la estudiante haya logrado al terminar la sección.
CodeScene, en su versión community, acepta el análisis de código fuente open source conectándose directamente a GitHub, por lo cual, usted deberá realizar una copia del código de OpenCms haciendo fork al siguiente repositorio en GitHub: https://github.com/alkacon/opencms-core
Este repositorio tiene actividad desde el 2001, por lo que CodeScene podrá darnos diferentes vistas para entender la evolución del repositorio, esto gracias a que la herramienta analiza todos los commits de los diferentes contribuidores.
Para abrir una cuenta en CodeScene usted deberá ingresar a la página de la plataforma en https://codescene.com/community-edition. Enseguida, de clic en "Start Community Edition".
En el siguiente paso loguéese en la cuenta de Github con la que hizo fork del repositorio de OpenCms.
Una vez se haya logueado, CodeScene lo redireccionará a una ventana de autorización en la que debe escoger la opción "Authorize codescene-saas" (ver la siguiente captura).
Para continuar es necesario que, como se muestra en la siguiente captura, confirme que acepta los términos de servicios y ha leído la política de privacidad de CodeScene. Adicionalmente, oprima el botón "Continue".
Será redirigido a la página que se muestra en la siguiente captura, donde debe dar clic, en la viñeta de "Use the Community Edition", al botón "Start Now".
Para realizar el análisis de un repositorio, usted deberá dar clic en el botón "Create your first project" de la viñeta con título "Run your first analysis".
Una vez se haya logueado, CodeScene lo redireccionará a una ventana de autorización en la que debe escoger la opción "Authorize codescene-saas". Esto con el fin de que CodeScene tenga acceso de lectura al repositorio (ver la siguiente captura).
Enseguida, CodeScene mostrará una lista de los repositorios disponibles en la cuenta de Git asociada. Escoja en la lista el repositorio de OpenCms al que le hizo fork y de clic en "Continue" (ver siguiente captura).
En la siguiente pantalla coloque un nombre al proyecto y de clic en "Save and run analysis". (ver siguiente captura).
El análisis puede tardar algunos minutos, CodeScene le informará cuando el proceso haya culminado.
Una vez realizado el análisis, tendrá disponible una serie de visualizaciones dentro de la plataforma. Para ver el resultado del análisis diríjase al proyecto en la página principal de su cuenta de CodeScene y dé clic en ‘'Dashboard" (ver siguiente captura). La página de entrada mostrará un resumen de algunas de las métricas y vistas relacionadas con el modelo de 4 factores.
Diríjase ahora en el menú a "Scope", "System Trends". Aquí veremos una serie de gráficas con tendencias generales del sistema. Centraremos nuestra atención en una gráfica en especial, la gráfica de "Change frequency of files", para eso diríjase a la pestaña de "Change Frequency Distribution" (ver siguiente captura).
La gráfica de "Change frequency of files" en CodeScene muestra la frecuencia con la que se han realizado cambios en los archivos de un repositorio de código durante un período de tiempo determinado. En la gráfica, el eje X representa cada archivo del repositorio (sin distinguir su nombre) y el eje Y representa la frecuencia de cambio que ha sufrido ese archivo.
Esta gráfica exponencial decreciente, es común en la mayoría de repositorios de código, describiendo dos comportamientos. Primero, al principio se agregan archivos de código que no son alterados en el futuro. Segundo, en la marcha y evolución del proyecto aparecen otros archivos que cambian constantemente, y por ende, son puntos de atención para análisis ya que los picos de actividad podrían estar relacionados con problemas de mantenibilidad del código, introducción de errores, etc. De esta gráfica, podemos extraer el número de cambios más alto que han sufrido los archivos del repositorio, para usarlo como filtro en otras vistas dentro de CodeScene. Esto nos permitirá ver cuáles son esos archivos que más cambios han sufrido y conocer con más detalle su salud.
Diríjase en el menú de CodeScene a "Code" y luego al submenú "Hotspots".
Se abrirá la gráfica de "Hotspots"
La gráfica de "Hotspots" en CodeScene muestra los archivos o secciones de código en un repositorio que tienen el mayor impacto en la calidad y mantenibilidad del sistema. En la gráfica, los archivos se representan como círculos, y el tamaño de cada círculo indica su tamaño en términos de líneas de código. El color de cada círculo indica el nivel de complejidad y riesgo del archivo, según la métrica de "hotspot" utilizada por CodeScene. La métrica de "hotspot" también se llama "CodeScene Effort". CodeScene Effort mide el esfuerzo necesario para mantener un archivo de código en el tiempo, teniendo en cuenta las siguientes propiedades:
Al combinar estos factores, "CodeScene Effort" puede calcular el esfuerzo necesario para mantener un archivo de código en el tiempo. Los archivos con un alto valor en esta métrica son los que tienen un mayor impacto en la calidad y mantenibilidad del sistema, y por lo tanto, pueden requerir más atención y esfuerzo por parte de los desarrolladores.
Además, en la vista, los círculos se agrupan en clusters, indicando que los archivos están relacionados entre sí porque se encuentran en una misma carpeta y por ende pueden requerir atención conjunta. La gráfica de Hotspots puede ayudar a los desarrolladores a priorizar su trabajo en las áreas más críticas del sistema, como los archivos con alta complejidad y riesgo, y también puede ayudar a identificar áreas de código que requieren una reestructuración para mejorar la calidad y mantenibilidad del sistema en general.
En la gráfica de "Hotspots" de CodeScene, se pueden aplicar diferentes filtros para enfocarse en áreas específicas del código. Algunos de los filtros más comunes son:
Estos filtros se pueden combinar para enfocarse en áreas específicas del código y obtener una comprensión más profunda de la calidad y mantenibilidad del sistema.
Diríjase ahora al tab "Code Health". Se abrirá la siguiente gráfica:
Al igual que en la gráfica de "Hotspots", los archivos se representan como círculos, y el tamaño de cada círculo indica su tamaño en términos de líneas de código. En este caso, el color de cada círculo indica la salud del archivo en tres niveles de salud o sin nivel:
La salud del código (o Code Health) es una métrica cuyo valor va desde 10 (código saludable que es relativamente fácil de entender y evolucionar) hasta 1 (lo que indica código con graves problemas de calidad). CodeScene calcula el estado del código mediante una combinación de propiedades del código y factores organizativos (antipatrones, distribución del conocimiento, sobrecarga de los desarrolladores, objetos todopoderosos, etc.). Los factores se correlacionan con mayores costos de mantenimiento y el riesgo de defectos. CodeScene pondera y califica los hallazgos de acuerdo con un amplio conjunto de datos de referencia de bases de código del mundo real para generar la métrica de salud de código normalizada. CodeScene utiliza las siguientes propiedades del código:
Todas estas métricas y análisis se combinan para calcular la salud general del código fuente en la gráfica de Code Health de CodeScene. La gráfica proporciona una visión general de la calidad del código, lo que puede ayudar a los desarrolladores a identificar áreas que necesitan mejoras y a priorizar el trabajo en consecuencia.
En CodeScene, la definición de componentes de arquitectura sirve para ayudar a los desarrolladores y arquitectos de software a comprender la estructura y complejidad del código fuente asociados a los diferentes componentes. Para CodeScene un componente de arquitectura es un bloque lógico dentro del sistema. Si lo que tenemos es una arquitectura de microservicios, podríamos definir cada microservicio como un bloque lógico. De manera similar, si nuestro código está compuesto por capas, por ejemplo, las capas de los patrones MVC, MVP, MVVM, etc., cada capa sería un bloque lógico dentro de CodeScene.
Los límites que determinan que está contenido dentro de un componente de arquitectura dependen de las necesidades de análisis del código que uno tiene. Por ejemplo, si tenemos un proyecto en donde estamos interesados en la coevolución del código de nuestra aplicación frente al código de pruebas, debido a que sospechamos que se dedica demasiado esfuerzo para mantener las pruebas actualizadas, podríamos definir solo dos componentes arquitectónicos: código de aplicación y pruebas automatizadas.
A continuación, se describen los pasos para definir los componentes de arquitectura y luego obtener las métricas y visualizaciones asociadas.
En el menú izquierdo, diríjase a "Configuration"y luego a "Architectural Components" (ver las dos siguientes capturas).
En esta ventana de clic en "Architectural Component Editor" (señalado en rojo en la captura anterior). Se abrirá una gráfica de radar con los paquetes, subpaquetes y archivos del sistema. Aquí definiremos los componentes arquitecturales de nuestro sistema. Para lograr esto, hay que especificar por cada componente una o más expresiones regulares simples que se aplican sobre los nombres de archivos. Si hay correspondencia (match) los archivos se ubicarán dentro de ese componente. Por ej., en OpenCms el interés es agrupar los artefactos de software por las capas a las que corresponden, entonces se han definido las siguientes expresiones regulares por componente:
Componente Presentation
opencms-core/test-gwt/**
opencms-core/webapp/**
opencms-core/src-gwt/**
opencms-core/src/jsp/**
opencms-core/src/ui/**
Componente Business
opencms-core/src/**
opencms-core/test/**
opencms-core/src-modules/**
Componente Data Layer
opencms-core/src/db/**
Componente Utilities
opencms-core/src-setup/**
opencms-core/gradlew.bat
Componente System
opencms-core/**
Lo primero será verificar que se encuentra ubicado en el directorio apropiado, para ello debe dirigirse en el "Architectural Component Editor" a la pestaña "Files" y allí debe asegurarse de no apuntar a "System" sino a "opencms-core".
Para crear un componente architectural dé clic en "Select a component" y luego en "Create a new component" (ver captura siguiente).
Luego en ventana modal, escriba el nombre del componente y en el campo "Pattern" escriba uno de las expresiones que harán parte de este componente.
El componente aparecerá en la parte inferior de la página y desde allí podrá agregar otros Patterns dando clic en el botón "Add pattern manually".
Los análisis ejecutados por CodeScene, son realizados contemplan un periodo de tiempo específico que se puede definir en "Configuration" -> "General". El valor por defecto para el análisis relacionados con Hotspots y Code Health es el que vemos en la siguiente gráfica en el ítem de "Hotspot analysis time span (sliding window)" y corresponde a un año.
Hay dos formas de lanzar un análisis de los componentes: de manera inmediata y de manera programada.
Para correr un análisis de manera inmediata, diríjase al Dashboard de su CodeScene y listado bajo "Software Portfolio" encontrará el proyecto de OpenCms. Debe hacer click en los tres puntos y seleccionar la opción que dice "Run Analysis" (ver captura siguiente).
Para correr un análisis de manera programada, diríjase nuevamente al menú de "Configuration", pero esta vez de clic en "Analysis schedule". En está ventana defina un cronograma de análisis diario y de clic en "Save". CodeScene lanzará el análisis, teniendo en cuenta los componentes de arquitectura definidos, en la hora establecida en el cronograma (ver siguiente captura).
Una vez corrido el análisis, usted podrá dirigirse al menú de "Architecture" y dar clic en "System Health"
Aquí verá una tabla con estadísticas sobre la salud del código para cada uno de los componentes definidos. La tabla nos mostrará cuál es la salud promedio de los "Hotspots" identificados en el componente, cuál es la salud promedio del componente en general, cuál es la salud del peor archivo dentro del componente y qué tan familiarizados están los desarrolladores con el código dentro del componente.
Diríjase ahora al menú de "Hotspots", allí veremos una gráfica similar a la que vimos anteriormente en "Hotspots" para todo el sistema, con la diferencia que ahora los círculos no son los elementos de la jerarquía de archivos (paquetes, clases, interfaces, scripts, etc.) sino los componentes definidos previamente en donde se encuentran agregadas las métricas de los elementos más finos. Por ejemplo, si el componente Utilities tiene las clases A, B, C, entonces el tamaño del círculo de Utilities depende de la suma de las líneas de código de las clases A, B y C.
Diríjase ahora al menú de "Code Health", al igual que ocurrió para los "Hotspots", la gráfica de Code Health nos mostrará la salud del código para los componentes de arquitectura previamente definidos.
CodeScene es una herramienta que permite a los ingenieros de software analizar la complejidad y calidad del código a partir de visualizaciones y métricas. Además, brinda información sobre cómo evolucionan los componentes de código y cómo el conocimiento fluye durante el desarrollo. Esto contribuye a entender el estado del código fuente y así tomar decisiones sobre partes del sistema que podrían necesitar mantenimiento o modernización, además de ayudarnos a entender cuales son los desarrolladores que tienen el conocimiento sobre cada parte.
Kevin Sánchez, Kelly Garcés | Autores |
Miguel Peña, David Valderrama | Revisores |