La legibilidad a menudo se sintetiza intuitivamente. Si ve algún fragmento de código, solo sabe si es legible o no. Pero, ¿cuáles son las explicaciones psicológicas y científicas reales para esto?
Existen métricas de legibilidad para el texto escrito, pero ¿se aplican también al código fuente? Por ejemplo: creo que la palabra efecto de superioridad es aplicable al código fuente. ¿Qué otros efectos se pueden encontrar durante la programación, que hacen que el código sea legible?
No busco opiniones ilustradas o ejemplos como aquí o aquí , sino correlatos neuronales o una perspectiva desde las ciencias cognitivas.
Usando el idioma inglés, dadas dos oraciones que dicen lo mismo, ¿qué hace que una sea más legible que la otra? Por lo general, la concisión conservando la claridad y eliminando la ambigüedad.
Exactamente las mismas cosas hacen que el código sea más legible. Elimine todo lo que no agregue nada, pero no elimine las cosas que sí agregan información. Y evita la ambigüedad.
En el código, tenemos la ventaja de que podemos reutilizar fragmentos de texto similares y reemplazar valores específicos dentro de ellos. Si pudiéramos hacer eso con los libros, podríamos salvar una pequeña selva tropical.
Además de la brevedad, tenemos un buen uso de la puntuación y el espaciado. ¿Alguna vez trató de leer una pieza de blog donde no hay párrafos en absoluto? Eso es lo que es leer un código que no está bien espaciado.
La psicología de esto es simple. Tu cerebro recibe todo tipo de pistas sobre lo que está leyendo. Intente tomar un texto largo e imprimirlo (con una fuente serif) sin párrafos, luego sin puntos ni comas, o tal vez cambie los signos de puntuación (? => ., ! => :, etc.), luego en un sans- fuente serif.
Verá rápidamente cuánto confía en los instintos de su cerebro cuando lee. El código es exactamente el mismo. Y aquí radica un problema, porque algunas cosas son ciertamente subjetivas. O más bien son una cuestión de costumbre.
Si está acostumbrado a ver guiones bajos antes de las variables miembro, entonces se muda a una empresa donde no hacen eso, su cerebro aún esperará las mismas sugerencias y será más difícil de leer. Pero cambiarlo arruinaría a todos los demás en el equipo. Sería como mudarse a España y decirles que dejen de usar el signo de interrogación inverso anterior porque te descoloca.
Los patrones de diseño son algo similar. Si todo el mundo sabe lo que hace un patrón de generador, agregar Builder a un nombre de clase les brinda a todos mucha información. Pero si tengo mi propio patrón de Bracksfort, esa información solo me ayuda, al menos hasta que otras personas comiencen a preguntarme, o lo documente y haga que la comunidad lo acepte.
$f
frente a $first_names
.Esta es mi área de investigación actual (soy estudiante de doctorado en ciencias de la computación y ciencias cognitivas). Como dijiste, hay una gran cantidad de métricas de legibilidad/complejidad, pero muy poca investigación que intente cuantificar qué hace que una pieza de código sea psicológicamente compleja. Para obtener más información sobre estudios y modelos cualitativos , recomiendo enfáticamente el libro de 2001 Software Design: Cognitive Aspects .
He estado realizando algunos experimentos recientemente con el objetivo de desarrollar un modelo cognitivo que pueda "leer" el código como un ser humano. La inspiración para mi modelo proviene en gran medida de un artículo de 1995 de Simon Cant et. Alabama. . En el documento, establecen una base (incompleta) para un modelo matemático que "divide" pequeños bloques de código en la memoria y "rastrea" a otras partes del programa para resolver las dependencias. Tengo un artículo de taller titulado "Arquitecturas cognitivas: un camino a seguir para la psicología de la programación" que sugiere que podemos construir un modelo de este tipo sobre una arquitectura cognitiva como ACT-R.
Actualmente estoy escribiendo los resultados de uno de mis experimentos. Una vez que esté listo, lo publicaré en mi blog (synesthesiam.com). En resumen, tuvimos programadores de diferentes niveles de experiencia que predijeron el resultado de 10 programas de Python (cada programa tenía 2 o 3 versiones). Algunos de ellos hicieron el experimento frente a un eye-tracker, que será otro artículo algún día (con suerte) pronto. El resto eran de Mechanical Turk, y observamos interesantes diferencias de velocidad/precisión que no siempre favorecían a los programadores más experimentados.
¿Qué significa "legibilidad" en el contexto de las ciencias cognitivas? Los efectos medibles de la "legibilidad" incluirían:
Sería fácil probar variantes "legibles" diferentes del mismo código. La investigación de muestra se puede encontrar a través de una consulta de Google Scholar . Soy demasiado perezoso para leer y resumir esos documentos para ti ;-)
$f
vs. $first_name
) con el efecto de superioridad de palabra. ¡Estoy buscando construcciones como esta!
Joaquín Sauer
MadKeithV
StuperUsuario
34.3 Write Programs for People First, Computers Second
. ¿Ha echado un vistazo a la extensa bibliografía de ese libro en busca de fuentes relevantes?Tomas Owens
Piotr Migdal
usuario1196