Simple Science

Ciencia de vanguardia explicada de forma sencilla

# Informática# Ingeniería del software

Evaluando la Complejidad del Código: Ciclomática vs. Cognitiva

Este estudio compara la complejidad ciclomática y la complejidad cognitiva para evaluar la comprensibilidad del código.

― 9 minilectura


Complejidad del código:Complejidad del código:Ciclomática vs. Cognitivacódigo.complejidad en la comprensión delUn estudio que compara dos medidas de
Tabla de contenidos

Entender el Código es clave para los desarrolladores de software. Cuando modifican o corrigen código, necesitan comprenderlo bien. Si el código no es fácil de leer, puede dar lugar a errores y requiere más esfuerzo para escribir y mantener. Lo ideal es que los desarrolladores escriban código claro que sea fácil de entender sin mucho esfuerzo.

Objetivo

Este texto explora si dos medidas de complejidad, la Complejidad Ciclomática de McCabe y la Complejidad Cognitiva, pueden ayudar a predecir cuán comprensible encuentran los desarrolladores el código. La idea es averiguar cuál de las dos es mejor para evaluar la claridad del código.

Método

Para averiguarlo, realizamos un estudio con 216 desarrolladores junior. Estos desarrolladores tenían entre uno y cuatro años de experiencia en programación. Revisaron 12 clases de Java que variaban en su complejidad, usando ambas medidas: la Ciclomática y la Cognitiva.

Resultados

Se encontró que la Complejidad Cognitiva era un poco mejor que la Complejidad Ciclomática para predecir cuán comprensible era el código para los desarrolladores.

Conclusión

Esta investigación muestra que encontrar una medida sólida para la complejidad del código sigue siendo un desafío. Ni la Complejidad Ciclomática tradicional ni la más nueva Complejidad Cognitiva sirven como predictores fiables de la Comprensibilidad del código, al menos para desarrolladores junior.

Comprensibilidad del Código

La comprensibilidad del código se refiere a cuán bien los desarrolladores pueden leer y trabajar con el código. Esto incluye tanto el código que escribieron como el escrito por otros. Cuanto más fácil sea de leer el código, más fácil será encontrar y corregir problemas, hacer cambios y agregar nuevas funciones. Por otro lado, un código difícil de leer puede causar confusión, errores y llevar a una resolución de problemas más larga.

Varios factores influyen en la Legibilidad del código. Esto incluye:

  • Sintaxis clara y simple
  • Formato consistente
  • Convenciones de nombres
  • Estructura del código bien organizada
  • Buena documentación y comentarios

Cuando el código es difícil de entender, el esfuerzo necesario para trabajar con él puede aumentar más del 50%. Las malas interpretaciones también pueden interrumpir todo el proceso de desarrollo. Por eso, los desarrolladores deben esforzarse por escribir código que sea fácil de comprender.

Se han propuesto varias métricas para evaluar la complejidad del código, incluyendo la Complejidad Ciclomática y la Complejidad Cognitiva. Hoy en día, muchas herramientas permiten a los desarrolladores monitorear estas métricas en tiempo real.

La Complejidad Cognitiva fue añadida por SonarQube como una forma de entender mejor la legibilidad del código. Estudios anteriores destacaron que la Complejidad Cognitiva podría indicar comprensibilidad, con valores más altos sugiriendo menor entendimiento. Sin embargo, no consideraron cómo los desarrolladores perciben la complejidad, lo cual creemos que es esencial.

Investigaciones anteriores también señalaron que las métricas de complejidad y comprensibilidad no han sido bien estudiadas y validadas. Las métricas exactas que predicen la comprensibilidad del código aún no están claras.

Medidas de Complejidad

En esta sección, vamos a esbozar brevemente las dos medidas de complejidad que estudiamos.

Complejidad Ciclomática

La Complejidad Ciclomática es una métrica creada en 1976. Mide cuántos caminos independientes existen en el código de un programa. La idea es que más caminos independientes indican más complejidad. Esta medida se basa en un gráfico de flujo de control, que representa los caminos de ejecución en el código. Se piensa que cada camino añade complejidad.

Aunque se usa mucho, la Complejidad Ciclomática no aborda todos los problemas del código, especialmente en escenarios complejos. Tiene problemas con condiciones y bucles anidados. A pesar de ser una medida común para evaluar la propensión a errores de un código, no es tan útil para entender la claridad del código.

En herramientas como SonarQube, la Complejidad Ciclomática aumenta con cada punto de decisión en un fragmento de código, pero cómo se calcula puede variar ligeramente entre diferentes lenguajes de programación.

Complejidad Cognitiva

La Complejidad Cognitiva se centra en el aspecto humano de entender el código. No todos los puntos de decisión en un programa son iguales; algunos son más fáciles de entender que otros. Esta medida asigna pesos a los puntos de decisión según su dificultad. Las decisiones más complejas reciben pesos más altos.

La Complejidad Cognitiva se creó para abordar algunos problemas de la Complejidad Ciclomática. Su objetivo es proporcionar una mejor comprensión de cuán complejo es realmente un fragmento de código al considerar el esfuerzo mental necesario para entenderlo.

Las reglas para calcular la Complejidad Cognitiva incluyen:

  • Ignorar estructuras que simplifican el código, facilitando su lectura.
  • Agregar complejidad cuando se rompe el flujo del código.
  • Tener en cuenta cuán profundamente anidadas están las estructuras de control.

El Estudio Empírico

Nuestro estudio tenía como objetivo comparar la Complejidad Ciclomática y la Complejidad Cognitiva para ver cuál refleja mejor cómo los desarrolladores perciben la complejidad del código Java. Aquí están los pasos involucrados:

Selección de Código

Elegimos clases de Java que contenían varios problemas que afectaban la comprensibilidad. Un grupo de evaluadores identificó clases con problemas que todos aceptaron.

Medición de Complejidad

Calculamos la Complejidad Ciclomática y la Complejidad Cognitiva de estas clases usando SonarQube.

Selección de Desarrolladores

Seleccionamos a desarrolladores junior como participantes porque a menudo son quienes deben lidiar con código no familiar. Involucramos a 216 desarrolladores junior familiarizados con Java, todos con al menos un año de experiencia en programación.

Inspección de Código

Los participantes inspeccionaron las clases manualmente para evaluar cuán comprensible era el código. Llenaron un cuestionario dividido en cuatro secciones:

  • Antecedentes del encuestado, incluyendo su nivel de experiencia.
  • Inspección del código donde calificaron la comprensibilidad en una escala del 1 al 5 (1 siendo muy fácil y 5 siendo muy difícil).
  • Identificación de problemas en el código y su gravedad percibida, también calificada en una escala del 1 al 5.

Análisis de Datos

Los datos recopilados se analizaron observando cómo los desarrolladores calificaron la comprensibilidad del código. Se examinaron las correlaciones entre la comprensibilidad percibida y las dos medidas de complejidad utilizando métodos estadísticos.

Resultados

Reunimos datos de 216 participantes. La mayoría de ellos calificó la mayoría de las clases como ni fáciles ni difíciles de entender.

La Complejidad Cognitiva parece ser un mejor indicador de la comprensibilidad del código. Los desarrolladores en su mayoría coincidieron en su utilidad en comparación con la Complejidad Ciclomática. Cuando las clases eran menos complejas, se consideraban más fáciles de entender, apoyando la idea de que una menor complejidad conduce a una mejor legibilidad. Sin embargo, niveles altos de complejidad llevaron a opiniones variadas sobre la comprensibilidad.

El análisis estadístico reveló hallazgos significativos, indicando que la Complejidad Cognitiva se correlaciona mejor con las percepciones de los desarrolladores que la Complejidad Ciclomática.

Identificación de Problemas y Severidad

El estudio también involucró examinar si los desarrolladores podían identificar problemas en el código de las clases. La mayoría de los participantes identificó correctamente al menos un problema, lo que sugiere que los desarrolladores notan problemas de diseño al revisar el código.

En cuanto a la severidad percibida de los problemas identificados, los desarrolladores los calificaron como al menos de severidad media en promedio. Esto significa que los desarrolladores tomaron en serio los problemas que encontraron.

Amenazas a la Validez

Se consideraron varias amenazas a la validez del estudio:

Validez de Construcción

Seleccionamos cuidadosamente las tareas para asegurarnos de que las clases analizadas fueran del mismo entorno, evitando malentendidos en cómo se percibían las complejidades.

Validez Interna

La selección de desarrolladores junior tuvo como objetivo mantener el enfoque del estudio. Sin embargo, esto podría introducir sesgos, ya que estos desarrolladores podrían tener niveles de formación variados.

Validez Externa

La generalización de los resultados puede ser una preocupación, ya que el estudio utilizó un conjunto específico de clases. Se podrían necesitar más estudios en diferentes contextos de codificación para llegar a conclusiones más amplias.

Validez de Conclusión

El diseño del estudio buscó asegurar que las tareas estuvieran estrechamente relacionadas con los resultados observados, y se realizaron evaluaciones de expertos para confirmar la validez de las encuestas.

Trabajo Futuro

Los futuros estudios podrían incluir un grupo más grande de desarrolladores y pedirles que sugieran acciones de refactorización para abordar problemas. Además, comparar las percepciones de la comprensibilidad del código entre desarrolladores junior y senior podría proporcionar más información. También se podrían explorar otros lenguajes de programación para ver si estas tendencias se mantienen en diferentes entornos de codificación.

Reflexiones Finales

Entender cómo los desarrolladores perciben la complejidad del código es esencial. Aunque ni la Complejidad Ciclomática ni la Complejidad Cognitiva proporcionaron indicadores perfectos de la comprensibilidad del código, la Complejidad Cognitiva mostró potencial. A medida que las prácticas de desarrollo evolucionan, la investigación continuará afinando nuestra comprensión de lo que hace que el código sea claro y fácil de trabajar.

Fuente original

Título: Early Career Developers' Perceptions of Code Understandability. A Study of Complexity Metrics

Resumen: Context. Code understandability is fundamental. Developers need to understand the code they are modifying clearly. A low understandability can increase the amount of coding effort, and misinterpreting code impacts the entire development process. Ideally, developers should write clear and understandable code with the least effort. Aim. Our work investigates whether the McCabe Cyclomatic Complexity or the Cognitive Complexity can be a good predictor for the developers' perceived code understandability to understand which of the two complexities can be used as criteria to evaluate if a piece of code is understandable. Method. We designed and conducted an empirical study among 216 early career developers with professional experience ranging from one to four years. We asked them to manually inspect and rate the understandability of 12 Java classes that exhibit different levels of Cyclomatic and Cognitive Complexity. Results. Our findings showed that while the old-fashioned McCabe Cyclomatic Complexity and the most recent Cognitive Complexity are modest predictors for code understandability when considering the complexity perceived by early-career developers, they are not for problem severity. Conclusions. Based on our results, early-career developers should not be left alone when performing code-reviewing tasks due to their scarce experience. Moreover, low complexity measures indicate good understandability, but having either CoC or CyC high makes understandability unpredictable. Nevertheless, there is no evidence that CyC or CoC are indicators of early-career perceived severity.Future research efforts will focus on expanding the population to experienced developers to confront whether seniority influences the predictive power of the chosen metrics.

Autores: Matteo Esposito, Andrea Janes, Terhi Kilamo, Valentina Lenarduzzi

Última actualización: 2024-07-15 00:00:00

Idioma: English

Fuente URL: https://arxiv.org/abs/2303.07722

Fuente PDF: https://arxiv.org/pdf/2303.07722

Licencia: https://creativecommons.org/licenses/by/4.0/

Cambios: Este resumen se ha elaborado con la ayuda de AI y puede contener imprecisiones. Para obtener información precisa, consulte los documentos originales enlazados aquí.

Gracias a arxiv por el uso de su interoperabilidad de acceso abierto.

Más de autores

Artículos similares