¿Qué factores psicológicos explican la legibilidad del código?

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.

Una cosa que frecuentemente inhibe la legibilidad es la desviación de los patrones comunes. Cuando alguien itera sobre alguna colección, pero comienza con el segundo elemento, eso se pasa por alto fácilmente y puede hacer que el código "se sienta" más complejo de lo que realmente es.
La desviación de los patrones comunes también influye cuando se compara "mi" código con "su" código: usted está acostumbrado a sus propios patrones.
No hay referencias directas en Code Complete en 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?
Hay investigaciones sobre métricas relacionadas con la legibilidad del código fuente del software, basadas en métricas de legibilidad para lenguajes naturales: Buse y Weimer , Buse y Weimer , Dorn . Sin embargo, estos no discuten las raíces psicológicas, pero pueden ayudar a abordar su segundo párrafo sobre la aplicación de métricas de legibilidad al código fuente, cómo determinar si el código es legible y cómo hacer que el código sea legible.
Un enlace relacionado, sobre seguimiento ocular al leer código: blog.theincredibleholk.org/blog/2012/12/18/how-do-we-read-code
No entiendo el término "correlato neural" en este contexto. Para mí, su pregunta se traduce como: ¿En qué se diferencia el estado cerebral de experimentar un código como legible del estado cerebral de experimentar un código como ilegible? Esa es una pregunta sin sentido, porque no dice nada sobre lo que hace que el código sea legible.

Respuestas (3)

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.

Este. Odio cuando la gente dice que la verbosidad del código no importa porque IDE lo escribe o alguna otra excusa. ¿Qué pasa con el lector que tiene que vadear todas esas líneas mientras trata de encontrar una señal del ruido?
Gran respuesta, que describe la dificultad subyacente de definir qué es "legibilidad"
Un factor principal que hace que el código sea legible para mí son los nombres de las variables, por ejemplo, $ffrente a $first_names.
@qué: Bueno, sí. Si tomo un fragmento de texto en inglés y reduzco todos los sustantivos y adjetivos a una sola letra, es posible que a usted también le cueste leerlo.
La reducción de código es una práctica común, especialmente en sitios con mucho tráfico. Mire el código JavaScript en una página de Google: todas las variables son una o dos letras, y casi no hay espacios en blanco (sin saltos de línea, sin espacios, sin tabulaciones). Ese es un código ilegible. Por lo tanto, crear un código legible podría implicar crear un código legible y luego reducir su volumen mediante la búsqueda y el reemplazo antes de ponerlo en línea.
@what ¡Esto es lo que buscaba! Supongo que no solo la longitud es importante para la "legibilidad", sino también lo que dice el identificador, por lo que su semántica (compare la antigua broma "#define TRUE FALSE // Happy Debugging"). Descubrí que, por ejemplo, el código F # a menudo se lee como matemáticas y es completamente ilegible, pero muy razonable. Esto se debe principalmente a su abstracción e identificadores muy concisos.

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.

Bienvenido al sitio. Gracias por compartir tu experiencia.
Hola user2925, gracias por tu respuesta. Yo también estoy planeando un experimento en este momento y me preguntaba si podrías compartir algunas más de tus experiencias.
Hola @cessor. Estaré feliz de compartir mis experiencias. ¿Qué tipo de experimento estás planeando?
@MichaelHansen ¡Creo que sería mejor discutir esto en privado! ¿Me podría enviar un correo electrónico a la dirección en mi perfil? :)
Actualización : publiqué un artículo sobre el experimento mencionado en mi respuesta en arXiv .
Creo que esto necesita un seguimiento que tenga en cuenta las convenciones del lenguaje y los efectos de la legibilidad desde el punto de vista de las convenciones. Aún más interesante sería centrarse en lenguajes de sintaxis C como Java, C# y JavaScript, que tienen más sintaxis destinada a delinear bloques que ayudan con la fragmentación. ¿Qué sucede cuando comienza a eliminar esa sintaxis o la usa de formas no convencionales? Por ejemplo, persiguiendo "Menos líneas es mejor".

¿Qué significa "legibilidad" en el contexto de las ciencias cognitivas? Los efectos medibles de la "legibilidad" incluirían:

  • velocidad de procesamiento cognitivo (cuánto tiempo le toma a un lector entender lo que hace el código)
  • comprensión completa (¿cuánto de lo que hace el código puede explicar un lector después de leerlo?)
  • esfuerzo de comprensión (cuán agotados están los recursos cognitivos del lector, medible mediante una prueba de poder de procesamiento de seguimiento)

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 ;-)

¡Gracias por su respuesta! Creo que el "procesamiento cognitivo" es demasiado abstracto. La velocidad del acceso al léxico por ejemplo (recuperar lo que significa una palabra de tu léxico mental) es un constructo bien estudiado que explica tu respuesta ( $fvs. $first_name) con el efecto de superioridad de palabra. ¡Estoy buscando construcciones como esta!