I. Introducción
La calidad en los productos de software es de gran importancia, principalmente, por los altos costos que implica modificar un programa si es de baja calidad [1]. Dentro de la labor de mantenimiento, los desarrolladores gastan aproximadamente 70% de su tiempo tratando de comprender el código fuente, lo cual podría disminuir si el código fuera más legible [2]. La legibilidad se refiere a la facilidad con la que una persona puede leer y comprender un fragmento de código [1, 3]. Si un producto de software es poco legible, su calidad se considera baja y, por consiguiente, el costo de mantenimiento será mayor y los desarrolladores gastarán más tiempo [1, 4]. Por ello, es importante poder identificar cuáles son las métricas para medir la legibilidad del código con el fin de automatizar su medición [1].
Aún no se cuenta con un método definitivo que permita evaluar la legibilidad de un fragmento de código fuente con confianza [2, 5]. Por lo anterior, es necesario identificar este tipo de características mediante un análisis sistemático de los trabajos relacionados con la medición de la legibilidad del código fuente, ofreciendo así una base sólida para futuras investigaciones en el área. En este contexto, este artículo presenta los resultados obtenidos mediante una revisión sistemática de literatura, entregando una recopilación de las características del código fuente que más influyen en la legibilidad, las métricas utilizadas para su medición, los métodos automáticos de medición, los retos actuales y las aplicaciones de interés. En particular, en este artículo se propone dar respuesta a las siguientes preguntas de investigación:
RQ1. ¿Cuáles son las características que permiten medir la legibilidad del código fuente de un software?
RQ2. ¿Qué métodos son utilizados para obtener el valor de medida de cada una de esas métricas de forma automática?
RQ3. ¿Cuáles son los principales retos y aplicaciones de interés en las investigaciones relacionadas con la legibilidad del código fuente?
El artículo está organizado de la siguiente manera: la Sección II presenta el proceso realizado para llevar a cabo la revisión sistemática de literatura; la Sección III presenta los resultados y discute las respuestas a cada una de las preguntas de investigación. Por último, la Sección IV concluye el trabajo.
II. Método
La revisión sistemática de literatura, abreviada como RSL (o SLR en inglés), es un método propuesto por Kitchenham, que permite realizar una síntesis de los estudios científicos de calidad sobre un tema específico o pregunta de investigación [6]. El proceso realizado en la RSL se estructuró en cuatro fases: estrategia de búsqueda, recolección de documentos, revisión de resultados de la búsqueda, y análisis y presentación de resultados.
A. Estrategia de búsqueda
Para la búsqueda se utilizaron las palabras clave: software, source code, metric, model, readability y classification. Las bases de datos bibliográficas utilizadas fueron: WoS - Web of Science, Scopus, Google Scholar, IEEExplore y ACM Digital Library. Los criterios de inclusión utilizados para la selección de documentos fueron: idioma del documento (español o inglés) y fecha de publicación (entre el 1 de enero del año 2015 y el 23 de abril del año 2019). Las cadenas de búsqueda definidas y utilizadas en la búsqueda fueron las descritas en la Tabla 1.
Por otra parte, algunos de los factores de calidad evaluados para los documentos fueron los siguientes: tiene objetivo del estudio; descripción clara del contexto del problema; tiene sección de resultados; es reproducible; describe al menos 1 métrica, 1 método o 1 característica; referencias actualizadas; responde las preguntas de investigación. El formato completo de lista de chequeo utilizado y diligenciado en el proceso de extracción de datos está disponible en el repositorio público de GitHub https://github.com/sofi876/MetricasLegibilidadSW, así como los formatos diseñados y utilizados en el proceso de extracción de datos. Para cada estudio se evaluó si cumplía con los factores de calidad, y fueron rechazados aquellos que no cumplían con el 80%.
B. Recolección de documentos
En esta fase se realizó el proceso de recolección de documentos, utilizando como guía la estrategia de búsqueda definida anteriormente. Todo el proceso de recolección se documentó de forma rigurosa, indicando la razón de exclusión o inclusión de documentos, usando el gestor de referencias Mendeley.
C. Resultados de la RSL
En la Tabla 2 se muestran los resultados obtenidos al realizar la búsqueda. La columna “Selección 1” se refiere a los documentos seleccionados en un primer filtro. La columna “Selección 2” son los seleccionados después de un segundo filtro más riguroso.
Posteriormente se eliminaron los duplicados y se obtuvieron 33 documentos únicos. Se realizó un tercer filtro más riguroso, obteniendo 24 seleccionados, pero se adicionaron 6 documentos que, pese a no cumplir con el criterio de fecha de publicación, son importantes porque se consideran trabajos seminales en el área, obteniendo así 30 documentos.
La fase final de análisis y presentación de resultados se llevó a cabo con los 30 seleccionados y se discuten en las siguientes secciones, dando respuesta a las preguntas de investigación.
III. Resultados y discusión
A. Características y métricas de legibilidad del código fuente
Las características hacen referencia a los aspectos del código fuente que tienen mayor influencia con la percepción de legibilidad. Los autores de los estudios seleccionados evaluaron un grupo de características, y propusieron unas métricas para ellas que permitieran medir la legibilidad del código fuente. En la Tabla 3 se presenta el listado de algunas características encontradas que obtuvieron mejores resultados en relación al juicio de legibilidad. El nivel de relación de la característica con la legibilidad está representado por A (alto), M (medio) y B (bajo). Ese nivel de relación proviene de los resultados obtenidos por los autores en sus estudios, y refleja la importancia de la característica con la legibilidad del código. El listado de características se presenta en orden de relevancia.
Por otra parte, las métricas de legibilidad del software se clasificaron en dos tipos: las simples, que consisten en tomar la medida por un conteo de alguna de las características presentadas; y las compuestas, que requieren de una ecuación más elaborada. Las métricas simples encontradas son: número promedio y máximo de espacios en blanco (identación), número promedio de comentarios, longitud promedio y máxima de línea, número promedio de paréntesis, número promedio de operadores aritméticos, volumen del programa, número promedio de identificadores, número de líneas de comentarios dentro de un método (LCM), número máximo de ciclos anidados, longitud de los comentarios y número promedio de palabras clave. Las métricas compuestas más relevantes se presentan en la Tabla 4.
De acuerdo con la literatura, las métricas simples que mejores resultados han reportado para medir la legibilidad del código fuente han sido: la cantidad de espacios en blanco, la cantidad de comentarios, la longitud de la línea de código y la cantidad de paréntesis. Además, las métricas de tipo compuestas que mejores resultados han obtenido son: la métrica de Posnett, abreviada como PHD, la métrica WSCR para el código fuente en lenguaje WSDL (servicios web), y la legibilidad de los comentarios (CR) propuesta por Scalabrino et al [25].
B. Métodos utilizados para medir la legibilidad del código fuente
En la Tabla 5 se presentan los métodos utilizados en las investigaciones para diferentes actividades relacionadas, directa o indirectamente, con los procesos que permiten evaluar la legibilidad en el código fuente. En la primera columna se describen los usos de estos métodos identificados en los estudios, en la segunda columna se encuentran los métodos que fueron hallados en los estudios seleccionados en la RSL.
El aprendizaje de máquina supervisado ha permitido obtener métodos para evaluar automáticamente la legibilidad del código fuente, que, a pesar de no ser métodos definitivos aún, han logrado una precisión por encima del 80%. Los investigadores interesados en continuar con los trabajos podrían usar las mismas técnicas utilizadas en la literatura, tales como random forest, redes neuronales o el aprendizaje profundo, aplicándolas de forma individual o combinadas. Se recomienda la exploración de modelos basados en redes neuronales profundas, teniendo en cuenta que el aprendizaje profundo permite el entrenamiento y clasificación sin que sea necesario seleccionar las características del código fuente de antemano. Los resultados recientes más prometedores apuntan en esta dirección. Por otro lado, si lo que se desea es continuar con la búsqueda de las características del código fuente que permiten medir su legibilidad, se pueden utilizar las técnicas de aprendizaje de máquina no supervisado, como el clustering (agrupación), o alguna de las técnicas de regresión para el análisis de la correlación entre la característica y la predicción de legibilidad.
Por otra parte, como resultado adicional de la RSL, a continuación, se listan los repositorios de software identificados que contienen fragmentos de código fuente útiles para nuevos trabajos:
Asimismo, se presentan repositorios de software que contienen herramientas computacionales utilizadas en los estudios:
Medir métricas de legibilidad ARI, SMOG, FKI, GFI, CLI, BRS (https://github.com/ipeirotis/ReadabilityMetrics)
Contar o extraer elementos del código fuente (http://se.cite.ehime-u.ac.jp/tool/)
Analizador de código estático (https://pmd.github.io/)
Evalúa el estilo y diseño del código fuente, de acuerdo con las convenciones (https://checkstyle.sourceforge.io/)
Algoritmos usados en el estudio de la carga cognitiva (https://github.com/Smfakhoury/fNIRS-and-Cognitive-Load)
Plugin para el IDE IntelliJ que permite evaluar la calidad en tiempo real (https://reticulaplugin.github.io/);
Base de datos léxica del idioma inglés (https://wordnet.princeton.edu/)
Código Python para contar las violaciones de reglas y otro para transformar el código (https://github.com/CityU-QingMi/DeepCRM)
Permite extraer métricas de estilo y generar un archivo CSV (https://github.com/robertyuyang/StylisticFingerprinting)
Modelo de legibilidad de Scalabrino et al. [25] (https://dibt.unimol.it/report/readability/)
Algoritmo para la segmentación de palabras en inglés (https://pypi.org/project/wordsegment/)
Embellecedor de código fuente online (http://prettyprinter.de/)
Embellecedor de código fuente (http://astyle.sourceforge.net/)
Calcular la legibilidad del código (https://github.com/Bowie-State-University/).
C. Retos y aplicaciones de la legibilidad del código fuente
Los autores de los estudios seleccionados en la RSL presentaron en sus investigaciones algunas aplicaciones de interés para la legibilidad del código fuente, las cuales se encuentran sintetizadas a continuación:
Modelos de legibilidad del código fuente [1, 3, 20, 21, 25, 30] .
Apoyar el aprendizaje de las buenas prácticas de legibilidad y los estilos de embellecimiento en los cursos de programación de las instituciones de educación superior [11, 15, 31].
Evaluar el impacto de las características de legibilidad del código fuente en la carga cognitiva del lector [16].
Gamificación para el aprendizaje de la legibilidad del código fuente en estudiantes universitarios [19].
Identificar el perfil de las personas en pruebas de reclutamiento de empresas de software para el cargo de programador, analizando el código fuente de sus programas, y evaluando habilidad en lenguaje y la legibilidad [23].
Asignación automática de nombres para los identificadores de clase y métodos [29].
Predecir los métodos propensos a fallas de acuerdo a la cantidad de comentarios que tienen.
Las más relevantes son el desarrollo de modelos computacionales para medir la legibilidad del código fuente de forma automática y el apoyo a las instituciones de educación superior con la enseñanza de buenas prácticas de legibilidad de software [17, 19, 27].
Por otra parte, algunos autores mencionaron deficiencias en sus propuestas, así como posibles mejoras que pueden realizar ellos u otros investigadores que deseen continuar con los estudios, los cuales serían los retos. A continuación, se presenta una síntesis de los retos.
Desarrollar una herramienta, algoritmo, o un plugin de apoyo para que un programador pueda medir la legibilidad de su código fuente en tiempo de desarrollo.
Continuar las investigaciones y proponer mejores métricas para evaluar la legibilidad del código fuente; por ejemplo, tener una métrica basada en la calidad de los comentarios, analizando el contenido del mismo usando técnicas de procesamiento de lenguaje natural, no por la cantidad de líneas [5].
Diversificar los lenguajes de programación de los conjuntos de datos utilizados en los estudios, teniendo en cuenta que casi todos los fragmentos corresponden al lenguaje Java.
Probar el nuevo conjunto de datos en los modelos ya propuestos, así como en la replicación de otros estudios.
Utilizar el algoritmo de asignación automática de nombres a otros tipos de identificadores en el código fuente, aparte de la clase y el método, mejorando así la legibilidad.
Permitir la parametrización en los modelos de legibilidad para que, de acuerdo con tipo de lenguaje de programación, se ajusten las características y las métricas a evaluar.
Para los experimentos que usaron WordNet, reemplazarla por otras técnicas como DISCO y NER.
Diversificar el conjunto de participantes que ayudaron con la anotación de los datos en los estudios relacionados con los modelos de legibilidad, en cuanto a la experiencia y el origen.
Mejorar el rendimiento del modelo de legibilidad IncepCRM, ajustando parámetros.
IV. Conclusiones
La revisión sistemática de literatura realizada permitió obtener y seleccionar 30 documentos finales con información relevante de las características del código fuente relacionadas con su legibilidad, las métricas que permiten medirla, y los métodos para su evaluación automática. Adicionalmente, se identificaron los retos y aplicaciones propuestos por investigadores en el área. Las características del software identificadas como más relevantes para medir la legibilidad del código fuente son los espacios en blanco (identación), comentarios, LOC, número de paréntesis, número de operadores aritméticos, entropía, volumen del programa, número y nombre de los identificadores, estructuras de control, y número de palabras clave [1, 7, 10, 12]. Las métricas más relevantes fueron el conteo de espacios en blanco, la métrica de Posnett (PHD) [3], WSCR para el código fuente en lenguaje WSDL (servicios web) y la legibilidad de los comentarios (CR) [25] .
La mayoría de los métodos utilizados para determinar la legibilidad de software utilizaron técnicas de aprendizaje de máquina, entrenando clasificadores de forma supervisada [1, 19, 25]. Otros métodos usaron técnicas de análisis léxico, tomando al código fuente como un texto [18, 28]. No obstante, existen evidencias recientes que señalan el camino a seguir usando métodos automáticos basados en redes neuronales profundas [20], donde no es necesario proponer características. Las aplicaciones más relevantes encontradas fueron los modelos automáticos de legibilidad [20, 25] y el apoyo del aprendizaje de buenas prácticas [17, 27]. Los retos más relevantes fueron: 1) desarrollar un algoritmo que pueda ser incorporado a algún IDE para evaluar la legibilidad del código fuente en tiempo de desarrollo; 2) diversificar los lenguajes de programación usados, aparte de Java, y 3) continuar con las investigaciones, ya que aún no se cuenta con el método, las características y las métricas definitivas. Puede consultar información adicional en el repositorio: https://github.com/sofi876/MetricasLegibilidadSW/tree/master/Tablas