1 puntos por GN⁺ 2024-05-27 | 1 comentarios | Compartir por WhatsApp
  • Un estudio del MIT muestra que la comprensión de código depende más de la red de demanda múltiple, usada para resolver problemas complejos, que del procesamiento del lenguaje
  • En un experimento con fMRI donde se leía código en Python y ScratchJr, la red lingüística del hemisferio izquierdo, incluida el área de Broca, casi no respondió
  • La lectura de código usa la misma red que las tareas de matemáticas y lógica, pero las subregiones activadas dentro de ella no fueron exactamente las mismas
  • ScratchJr activó un poco más la red de demanda múltiple derecha, y los investigadores lo compararon con el sesgo hacia el hemisferio derecho en tareas de navegación espacial
  • Más que enseñar programación solo como matemáticas o como lenguaje, se necesitan métodos de enseñanza propios adecuados para aprender código

Leer código muestra una actividad cerebral distinta a leer lenguaje

  • Aprender programación se parece al proceso de aprender un nuevo idioma
    • Hay que aprender nuevos símbolos y términos
    • Hay que organizar correctamente el código para indicar lo que debe ejecutar la computadora
    • Hay que escribirlo con suficiente claridad para que otros programadores puedan leerlo y entenderlo
  • Pero al leer código de computadora, las áreas del cerebro dedicadas al procesamiento del lenguaje no se activaron
  • En cambio, se activó principalmente la red de demanda múltiple (multiple demand network), usada en tareas cognitivas complejas
    • Esta red también participa en tareas como problemas matemáticos o crucigramas
  • Leer código tampoco fue exactamente igual a resolver problemas de matemáticas o lógica
    • Incluso dentro de la red de demanda múltiple, el patrón mostró una mayor dependencia de partes distintas a las usadas en tareas de matemáticas y lógica
  • Anna Ivanova considera que comprender código de computadora se parece más a “algo propio”, que no es lenguaje ni matemáticas/lógica

¿La programación se parece más al lenguaje o a las matemáticas?

  • El equipo de Evelina Fedorenko ha estudiado la relación entre el lenguaje y otras funciones cognitivas
  • La pregunta central era si otras funciones dependen de la red lingüística del cerebro
    • Esta red lingüística incluye el área de Broca y otras áreas del hemisferio izquierdo
  • Estudios previos del laboratorio de Fedorenko mostraron que la música y las matemáticas no activan esta red lingüística
  • Como la programación de computadoras es una invención relativamente reciente, era difícil pensar que los humanos tuvieran un mecanismo innato dedicado a programar
  • Las perspectivas sobre el aprendizaje de programación se dividían en dos grandes posturas
    • La idea de que para programar bien hay que ser bueno en matemáticas
    • La idea de que, por las similitudes entre programar y el lenguaje, la capacidad lingüística podría estar más relacionada

Experimento con fMRI: leer código en Python y ScratchJr

  • Los lenguajes usados en el experimento fueron Python y ScratchJr, conocidos como lenguajes de programación de alta legibilidad
  • ScratchJr es un lenguaje de programación visual diseñado para niños de 5 años en adelante
  • Los participantes eran adultos jóvenes con dominio del lenguaje en el que se los evaluaba
  • Los participantes vieron fragmentos de código dentro de un escáner de resonancia magnética funcional (fMRI)
  • La tarea consistía en predecir qué comportamiento produciría ese código

Resultados: la red de demanda múltiple fue central, no las áreas del lenguaje

  • Las áreas lingüísticas del cerebro respondieron poco o nada al código
  • Las tareas con código activaron principalmente la red de demanda múltiple
    • La actividad de esta red se distribuye por el lóbulo frontal y el lóbulo parietal
    • Suele activarse en tareas que exigen mantener varias piezas de información en la mente al mismo tiempo
    • Está relacionada con la capacidad de realizar diversas tareas mentales
  • Ivanova afirma que esta red participa en casi todo lo que es cognitivamente desafiante y exige “pensar mucho”
  • Estudios previos mostraron que los problemas de matemáticas y lógica dependen principalmente de áreas de demanda múltiple del hemisferio izquierdo
  • Se sabe que las tareas de navegación espacial activan más el hemisferio derecho que el izquierdo

Diferencias según el lenguaje de código y el efecto de la experiencia

  • El equipo del MIT, junto con Marina Bers, obtuvo resultados que muestran que leer código activa tanto el lado izquierdo como el derecho de la red de demanda múltiple
  • ScratchJr activó el lado derecho un poco más que el izquierdo
  • No se identificó ninguna región cerebral dedicada exclusivamente a la programación
  • Sin embargo, queda abierta la posibilidad de que en personas con mucha más experiencia programando se desarrolle una actividad cerebral especializada
    • Fedorenko dice que, en programadores expertos que hayan programado durante 30 o 40 años en un lenguaje específico, podría observarse especialización o cristalización de una parte del sistema de demanda múltiple
    • En personas como los participantes de este estudio, familiarizadas con la programación y capaces de realizar las tareas de forma eficiente, pero con experiencia relativamente limitada, no se observó esa especialización

Implicaciones educativas y artículo relacionado

  • Un artículo complementario de un equipo de Johns Hopkins University, publicado en el mismo número de eLife, también informó que resolver problemas de código activa la red de demanda múltiple y no las áreas del lenguaje
  • Con estos resultados por sí solos, es difícil decidir si el coding debe enseñarse como una habilidad basada en matemáticas o en lenguaje
  • En el proceso de aprendizaje de programación, pueden intervenir tanto el sistema lingüístico como el sistema de demanda múltiple
  • Pero una vez aprendida, la programación parece no depender de las áreas del lenguaje
  • Ivanova considera que los educadores de ciencias de la computación deberían desarrollar enfoques propios para enseñar código de la manera más eficaz
  • Artículo relacionado: Comprehension of computer code relies primarily on domain-general executive brain regions

1 comentarios

 
GN⁺ 2024-05-27
Opiniones de Hacker News
  • Parece que falta el enlace al paper; probablemente sea https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7738192/pdf/eli...
    Trata de programadores que, dentro de un escáner fMRI, miraban fragmentos de código y predecían qué comportamiento produciría ese código, pero la capacidad de escribir código y la capacidad de entender código escrito por otra persona parecen ser habilidades distintas

    • Esto se siente parecido a leer un cuento y preguntar “cuántas veces cruzó un puente”, “qué tenía en la mano al final” o “dónde estaba la manzana cuando terminó”
      Más que entender lo escrito, se acerca más a la tarea de inferir qué significa lo escrito
    • Leer código puede activar las mismas áreas que al leer prosa en inglés, pero ejecutar código en la cabeza podría activar otras áreas del cerebro
    • Mucha gente duda de este resultado y dice “ejecutar === entender”, pero piensen en este problema: ¿cuánto gastó Bill en la tienda de comestibles?
      Bill y Tom fueron a una zapatería; Bill compró unos zapatos negros de 23.56 dólares y Tom compró unos zapatos rojos de 40.30 dólares. Después fueron a la tienda de comestibles; Tom compró pan de 3.50 dólares y leche de 5.99 dólares, y Bill también compró pan, pero no compró leche.
      La actividad cerebral para responder esta pregunta específica es distinta de la que responde “¿qué hicieron Tom y Bill?”, y si se quiere modificar la historia existente, como “agrega que Bill pasó por la barbería después de la zapatería”, hay que parsear la gramática y mantener la coherencia, así que eso también es algo totalmente distinto
      panorama general !== detalles !== escritura !== edición de contenido existente, y si el estudio no preguntó de manera equivalente esos cuatro tipos de comprensión tanto para historias como para código, se siente incompleto
    • Son distintos, pero no completamente distintos; ambos usan el mismo tipo de razonamiento sobre el comportamiento de un programa
      El artículo tampoco trata sobre escribir código en sí, sino que lo conecta con la escritura solo en la medida en que otros deben poder entenderlo
    • Entonces, más bien, eso apoya la tesis. Porque construir lenguaje natural y entenderlo también se superponen bastante
  • Me sorprende más que alguien con experiencia en lenguajes de programación realmente pensara que podía salir un resultado así
    Hacer que un lenguaje de programación se parezca superficialmente a un lenguaje humano es uno de los errores de principiante típicos en el diseño de lenguajes. Basta ver el paradigma “do what I mean” de Perl y el caos posterior
    La diferencia importante es que un lenguaje de programación, más que comunicación, se parece a construir algún objeto. Se parece a crear fórmulas, algoritmos, estructuras de datos o arquitecturas de varios componentes, y por eso gran parte del pensamiento al programar está más atado a las propiedades implícitas de lo que se está construyendo que a detalles sintácticos
    Con el lenguaje humano también se pueden hacer cosas parecidas, como recetas, documentos legales, definiciones matemáticas, reglas de juegos de mesa o instrucciones para LLM, pero el lenguaje humano también puede usarse para formas de comunicación con propósitos completamente distintos
    Sería más interesante comparar la actividad cerebral al leer código y lenguaje humano formalizado, o al leer lenguaje humano formalizado frente a lenguaje no formal

    • Como alguien que conoce y usa varios lenguajes de programación, y también conoce y usa varios lenguajes humanos a distintos niveles, tiendo a verlos como cosas completamente distintas
      Aprender un lenguaje de programación se parece a aprender otra habilidad específica, y más que tener “cerebro de programador”, ayuda tener interés. En cambio, aprender un lenguaje humano es algo totalmente distinto y mucho más difícil; ocurre en su mayor parte de forma semiconsciente, así que el rendimiento de “estudiar” en el sentido habitual es muy bajo
    • Uno de los programadores menos productivos con los que trabajé estaba obsesionado con Groovy
    • Tengo casi 30 años de experiencia y leo el código como si fuera lenguaje humano
      La visualización que uso al imaginar estructuras de datos tampoco difiere mucho de visualizar escenas de un libro
  • Según el artículo enlazado, leer código activa áreas del cerebro que razonan cuidadosamente sobre problemas desconocidos
    También especula que quizá no se generalice a personas con 30 años de experiencia en programación; entiendo que se haga mucha investigación académica con estudiantes. Pero ¿no invalida la comparación misma con el procesamiento del lenguaje natural, algo en lo que los sujetos tienen décadas de experiencia?

    • Quizá habría que compararlo con estudiantes de segundo año que aprenden un idioma extranjero muy desconocido
      Como programador autodidacta con formación en lingüística teórica y exposición universitaria a varios idiomas bastante distintos de mi lengua materna, este resultado no me sorprende. En algunos niveles hay similitudes claras, pero la semejanza entre el lenguaje humano y el código de computadora suele exagerarse, y parece un remanente de una lingüística más primitiva que se enfocaba estrechamente en la gramática
    • Tengo mucha curiosidad por saber qué pasa cuando los sujetos ven una base de código familiar
      Aunque haya código que nunca hayan visto dentro del repositorio, la familiaridad con el estilo, las convenciones y cómo encaja ese código dentro del programa completo probablemente influya mucho en la forma de reconocerlo
    • Entiendo que con 30 años de experiencia en programación quizá se activen menos las áreas del cerebro que razonan cuidadosamente sobre problemas desconocidos
      Si uno no está familiarizado con la programación, tiene sentido que se active el área de problemas desconocidos. Sería interesante estudiar si esta área se activa porque es algo desconocido, o si sigue activándose incluso con experiencia cuando se trata el objeto “código”
      Al leer código, por lo general uno trata precisamente con algo que no conoce de entrada, así que quizá siempre tenga cierto grado de desconocimiento; o, por el contrario, leer código en sí puede volverse familiar y dejar de funcionar así
      Para una comparación justa, los sujetos tendrían que tener experiencia tanto en procesamiento de lenguaje natural como en programación, pero como es difícil encontrar personas igual de familiarizadas con ambos ámbitos, probablemente haya que conformarse con que sean “lo suficientemente familiarizadas con el código”
  • Esta es precisamente la razón por la que me asusta el futuro cuando la gente dice que “si le pides a la IA algo en lenguaje común, lo hará tal cual”
    No quiero pasar 8 horas al día conversando con texto o habla común. Suena agotador. En cambio, trabajar 8 horas con un lenguaje de programación es divertido

    • Si llega ese futuro, debería parecerse más a programación en pareja con IA, y tendría que ser posible mezclar código generado por IA con código escrito por humanos
      Deberíamos poder decir, como con unsafe en Rust: “aquí sé lo que estoy haciendo, así que no me molestes”. Luego la IA puede verificar la corrección de las partes escritas por la persona mediante tests u otros métodos
      Ya lo hacemos en cierta medida, pero ahora la persona es quien verifica el código generado por IA, y creo que todavía falta bastante para invertir esos roles
  • Lex Fridman entrevistó hace poco al lingüista Edward Gibson, y hablaron mucho sobre cómo el cerebro procesa el lenguaje.
    Entre otras cosas, incluyeron que leer código revela áreas del cerebro completamente distintas de las del lenguaje.
    #426 https://lexfridman.com/podcast/
    Entiendo que Evelina Fedorenko, autora de este paper, es la esposa de Edward.

    • Me parece creíble. En la primaria, mi peor calificación era en francés, y aún hoy me cuesta mucho más que a mis pares aprender chino en clases nocturnas en línea de un community college, pero programar siempre me resultó natural.
      Para mí, es un conjunto de habilidades totalmente distinto.
    • Sección relacionada [link]https://youtu.be/F3Jd9GI6XqE?t=4847
  • Tengo un canal de YouTube dedicado principalmente a leer código: https://www.youtube.com/@ants_are_everywhere
    Intento leer y entender, sin haberlo visto antes, el código de proyectos open source populares; se parece un poco a la lectura a primera vista en música.
    Me resulta plausible la explicación de que los investigadores casi no encontraron respuesta al código en las áreas del lenguaje, y que en cambio se activó principalmente la red de demanda múltiple, que abarca los lóbulos frontal y parietal. Esta red se recluta en tareas que requieren mantener varias informaciones en la mente al mismo tiempo y está relacionada con la capacidad de realizar diversas tareas mentales.
    Claro que hay lenguaje, pero puede que no se dedique tanto esfuerzo al procesamiento lingüístico en sí como para aparecer en la señal de fMRI. Muchas veces tengo que mantener simultáneamente en mente qué hace el código, qué intentaba hacer el autor, el contexto del autor, cómo funciona software similar, etc.
    Estudié matemáticas, pero esto tampoco se siente muy parecido a leer prosa ni a hacer matemáticas.

    • Por eso molesta tanto que te interrumpan.
      Toma un tiempo “cargar” esas cosas en la cabeza, y se parece a hacer equilibrio, manteniéndolas todas balanceadas para que no se derrumbe el conjunto.
      Si te interrumpen en medio, se siente como perder el equilibrio y que todo quede desordenado; después hay que volver a juntar las piezas, lo que cuesta tiempo y esfuerzo. Si pasa varias veces seguidas, es tremendamente frustrante.
      Paul Graham trata esto en su texto sobre maker schedule y manager schedule: (2009) https://paulgraham.com/makersschedule.html
    • Para mí, leer código es leer matemáticas.
      Se siente exactamente igual, y el patrón de mantener varias cosas a la vez en la cabeza también es el mismo.
    • En casos raros, pacientes en estado de coma crónico pueden recuperar la conciencia durante unas horas con el sedante-hipnótico zolpidem, y también pueden mostrar activación en el lóbulo parietal y algo en la región frontal dorsal.
      Según los criterios de la neurociencia moderna y la neuroimagen, la conclusión sería que leer código es básicamente lo mismo que recuperar la conciencia en coma mediante zolpidem.
    • Me preguntaba si habrá una correlación entre la capacidad de leer música a primera vista y la de entender código rápidamente.
      Toqué varios instrumentos de niño y adolescente, pero nunca fui bueno leyendo a primera vista. He oído que la habilidad musical y la de programación suelen estar correlacionadas, pero no habría llegado a ser músico profesional. En cambio, sí construí una buena carrera programando.
  • No me sorprende para nada. Leer código es distinto de leer prosa, distinto de hacer matemáticas, y se parece más a armar un rompecabezas en la cabeza.
    Para entender qué hace el código, hay que conectar, sustituir y traducir en tiempo real muchísimas cosas: funciones, símbolos, variables, sentencias, abstracciones, etc. Por eso leer código a veces resulta más complejo que escribirlo desde cero.

    • También se ve diferente, y la sintaxis y la semántica son muy distintas.
      En la práctica, lo único que tienen en común es que a ambas cosas se las llama “lenguaje”.
    • El código también puede verse como lo opuesto al lenguaje.
      Es un conjunto de instrucciones de máquina que especifica qué hará la computadora, y no puede ni debe ser una metáfora de otra cosa, como ocurre en las áreas del lenguaje.
  • Para mí, leer código se parece a mirar un dibujo de un conjunto de engranajes y preguntar: “¿el engranaje A gira en sentido antihorario o en sentido horario?”.
    Se siente más como analizar un mecanismo que como comprender lenguaje.

  • También se nota en que, al leer código, no hay una voz narradora en la cabeza.

    • Depende de la persona. Yo sí siento que el código tiene una voz narradora; no es exactamente igual a la de un libro, pero hay algo parecido.
      Cuando intento leer código, si hay ruido de fondo en el que puedo distinguir palabras, como habla o la música de un idioma familiar, me distrae y me irrita. Tampoco puedo hablar mientras programo; si lo hago, se me enreda el tipeo.
      Además, prefiero mucho más lenguajes cercanos a frases en inglés, como Ruby, que lenguajes con muchos símbolos como Rust o con muchas abreviaturas y operadores como Haskell. Por supuesto, a otros desarrolladores se les activarán otras rutas cerebrales.
    • Tengo una voz narradora cuando leo código. Es la misma voz que cuando leo informes técnicos o white papers.
      El código difícil de leer a menudo me cuesta procesarlo, quizá porque se rompe el ritmo de esa narración y no fluye de manera natural.
      Cuando explico cómo funciona algo, por lo general sigo el mismo ritmo de esa narración, y eso me ayuda a explicar con concisión y transmitir conocimiento rápido.
      Sin embargo, es claramente distinta de la voz narradora que tengo al leer una novela. Sospecho que se debe a la presencia o ausencia de lenguaje emocional entre ambas. Quizá sea parecido a cómo algunas personas tienen monólogo interno y otras no, o a cómo varía el nivel de detalle con el que uno puede imaginar objetos sin verlos realmente.
    • Como dato interesante, la voz narradora al comprender lengua de señas es igual que al comprender lenguaje hablado.
      Con “igual” me refiero a que funciona igual y se “oye” igual; por supuesto, la gramática y el vocabulario siguen la lengua de señas que se esté usando. De hecho, se activan las mismas áreas del cerebro.
      Esto sugiere que la voz narradora no es simplemente un “eco del sonido”, sino el proceso de comprensión en sí. Igual que al leer texto.
    • Mi diálogo interno nunca se queda en silencio.
    • Mi narrador me dice cosas como: si para los mismos argumentos el valor de retorno es el mismo; si hay efectos secundarios; cuáles son esos efectos secundarios; si esta historia puede contarse de forma independiente; si las variables se usan cerca de donde se declaran; si los bucles hacen lo que creo que hacen; si esta historia se comunica de forma eficiente; si se pueden evitar algunos efectos secundarios.
      En particular, juzgar los bucles requiere iterar modificando temporalmente el código.
  • Trabajo principalmente desde casa y, cuando programo, normalmente pongo música.
    Me gusta cantar al ritmo de la música, así que paso todo el día sentado en el escritorio programando mientras canto.
    Pero cuando leo algo, jamás podría hacer eso. Es imposible leer un texto y al mismo tiempo cantar otra canción, pero al programar me resulta muy fácil.