O cérebro processa a leitura de código de computador de forma diferente da leitura de linguagem (2020)
(news.mit.edu)- Um estudo do MIT mostra que compreender código depende mais de uma rede de múltiplas demandas usada na resolução de problemas complexos do que do processamento de linguagem
- Em experimentos de fMRI com leitura de código em Python e ScratchJr, a área de Broca e outras partes da rede de linguagem do hemisfério esquerdo quase não responderam
- A leitura de código usa a mesma rede de tarefas de matemática e lógica, mas as subáreas ativadas dentro dela não são exatamente as mesmas
- O ScratchJr ativou um pouco mais a rede de múltiplas demandas do lado direito, e os pesquisadores compararam isso ao viés do hemisfério direito em tarefas de navegação espacial
- Em vez de ensinar programação apenas como matemática ou como linguagem, é necessário um método de ensino próprio adequado ao aprendizado de código
Ler código mostra atividade cerebral diferente de ler linguagem
- Aprender programação se parece com o processo de aprender uma nova linguagem
- É preciso aprender novos símbolos e termos
- É preciso organizar corretamente o código para instruir o computador sobre o que executar
- É preciso escrever de forma clara o bastante para que outros programadores possam ler e entender
- Mas, ao ler código de computador, as áreas cerebrais de processamento de linguagem não foram ativadas
- Em vez disso, foi ativada principalmente a rede de múltiplas demandas (multiple demand network) usada em tarefas cognitivas complexas
- Essa rede também é recrutada em tarefas como problemas de matemática ou palavras cruzadas
- Ler código também não foi exatamente o mesmo que resolver problemas de matemática e lógica
- Mesmo dentro da rede de múltiplas demandas, apareceu um padrão de dependência maior de partes diferentes das usadas em tarefas de matemática e lógica
- Anna Ivanova considera que compreender código de computador está mais próximo de “algo próprio”, e não de linguagem nem de matemática e lógica
Programação está mais perto de linguagem ou de matemática?
- A equipe de Evelina Fedorenko vem estudando a relação entre linguagem e outras funções cognitivas
- A questão central era se outras funções dependem da rede de linguagem do cérebro
- Essa rede inclui a área de Broca e outras regiões do hemisfério esquerdo
- Pesquisas anteriores do laboratório de Fedorenko mostraram que música e matemática não ativam essa rede de linguagem
- Como a programação de computadores é uma invenção relativamente recente, era difícil supor que humanos tivessem um mecanismo inato dedicado especificamente a ela
- As visões sobre o aprendizado de programação se dividiam em duas linhas principais
- A visão de que, para programar bem, é preciso ser bom em matemática
- A visão de que, por causa das semelhanças entre código e linguagem, a habilidade linguística poderia ser mais relevante
Experimento de fMRI: leitura de código em Python e ScratchJr
- As linguagens usadas no experimento foram Python e ScratchJr, conhecidas por alta legibilidade
- O ScratchJr é uma linguagem de programação visual projetada para crianças a partir de 5 anos
- Os participantes eram jovens adultos proficientes na linguagem em que foram testados
- Os participantes viram trechos de código dentro de um scanner de ressonância magnética funcional (fMRI)
- A tarefa era prever que ação aquele código produziria
Resultado: a rede de múltiplas demandas é central, não as áreas de linguagem
- As áreas de linguagem do cérebro responderam pouco ou nada ao código
- As tarefas com código ativaram principalmente a rede de múltiplas demandas
- A atividade dessa rede se distribui amplamente pelos lobos frontal e parietal
- Ela costuma ser mobilizada em tarefas que exigem manter várias informações na cabeça ao mesmo tempo
- Está relacionada à capacidade de executar diversos tipos de tarefas mentais
- Ivanova diz que essa rede está envolvida em quase tudo que é cognitivamente desafiador e exige “pensar bastante”
- Pesquisas anteriores mostraram que problemas de matemática e lógica dependem principalmente de áreas de múltiplas demandas no hemisfério esquerdo
- Tarefas de navegação espacial são conhecidas por ativar mais o hemisfério direito do que o esquerdo
Diferenças entre linguagens de código e impacto da experiência
- A equipe do MIT, junto com Marina Bers, obteve o resultado de que ler código ativa tanto o lado esquerdo quanto o direito da rede de múltiplas demandas
- O ScratchJr ativou um pouco mais o lado direito do que o esquerdo
- Nenhuma área cerebral dedicada exclusivamente à programação foi identificada
- Ainda assim, permanece a possibilidade de que pessoas com muito mais experiência em programação desenvolvam atividade cerebral mais especializada
- Fedorenko afirma que programadores profissionais com 30 ou 40 anos codificando em uma linguagem específica talvez mostrem especialização ou cristalização de parte do sistema de múltiplas demandas
- Essa especialização não apareceu em participantes como os deste estudo, que já eram familiarizados com programação e conseguiam realizar a tarefa com eficiência, mas tinham experiência relativamente limitada
Implicações educacionais e artigo relacionado
- Um artigo complementar da equipe da Johns Hopkins University, publicado na mesma edição da eLife, também relata que resolver problemas de código ativa a rede de múltiplas demandas, e não as áreas de linguagem
- Só com estes resultados ainda é difícil decidir se programação deve ser ensinada como uma habilidade baseada em matemática ou em linguagem
- No processo de aprender programação, tanto o sistema de linguagem quanto o sistema de múltiplas demandas podem estar envolvidos
- Mas, depois de aprendida, a programação parece não depender das áreas de linguagem
- Ivanova considera que educadores de ciência da computação devem desenvolver uma abordagem própria para ensinar código da forma mais eficaz
- Artigo relacionado: Comprehension of computer code relies primarily on domain-general executive brain regions
1 comentários
Opiniões no Hacker News
Parece que faltou o link do artigo; provavelmente é https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7738192/pdf/eli...
O conteúdo diz que programadores, dentro de um scanner de fMRI, viam trechos de código e previam que comportamento aquele código produziria, mas a capacidade de escrever código e a capacidade de entender código escrito por outra pessoa parecem ser habilidades diferentes
Mais do que entender o que está escrito, é uma tarefa mais próxima de inferir o que aquilo significa
Bill e Tom foram a uma loja de sapatos; Bill comprou sapatos pretos de 23,56 dólares, e Tom comprou sapatos vermelhos de 40,30 dólares. Depois foram ao mercado; Tom comprou pão de 3,50 dólares e leite de 5,99 dólares, e Bill também comprou pão, mas não comprou leite.
A atividade cerebral para responder a essa pergunta específica é diferente de responder “o que Tom e Bill fizeram?”, e é totalmente diferente de alterar a história existente, como em “acrescente que Bill passou no barbeiro depois da loja de sapatos”, porque isso exige analisar a gramática e manter a consistência
visão geral !== detalhes !== escrita !== edição de conteúdo existente; se o estudo não perguntou de forma equivalente pelos quatro tipos de compreensão tanto para histórias quanto para código, ele parece incompleto
O artigo também não trata da escrita de código em si, mas só a relaciona à escrita no sentido de que outras pessoas precisam conseguir entender
O mais surpreendente é alguém com experiência em linguagens de programação achar que um resultado desses poderia mesmo aparecer
Fazer uma linguagem de programação parecer uma linguagem humana só na superfície é um dos erros clássicos de iniciante em design de linguagens. Basta olhar para o paradigma “do what I mean” do Perl e a confusão que veio depois
A diferença importante é que uma linguagem de programação é menos uma forma de comunicação e mais algo como construir um objeto. É mais parecido com criar fórmulas, algoritmos, estruturas de dados e a arquitetura de vários componentes; por isso, muito do pensamento na programação fica preso mais às propriedades implícitas do que está sendo construído do que a detalhes gramaticais
Também é possível fazer coisas parecidas com linguagem humana, como receitas, documentos jurídicos, definições matemáticas, regras de jogos de tabuleiro e instruções para LLMs, mas a linguagem humana também pode ser usada para modos de comunicação com propósitos totalmente diferentes
Seria mais interessante comparar a atividade cerebral ao ler código e ao ler linguagem humana formalizada, ou ao ler linguagem humana formalizada e linguagem informal
Aprender uma linguagem de programação é parecido com aprender outra habilidade específica, e ajuda mais ter interesse do que ter um “cérebro de programador”. Já aprender uma língua humana é completamente diferente e muito mais difícil, acontece em grande parte de forma semiconsciente, e o retorno do “estudo” no sentido comum é muito baixo
A visualização que uso ao imaginar estruturas de dados também não é muito diferente de visualizar cenas de um livro
Segundo o artigo linkado, ler código ativa áreas do cérebro usadas para raciocinar cuidadosamente sobre problemas desconhecidos
Ele também especula que isso talvez não se generalize para pessoas com 30 anos de experiência em programação; entendo que muitos estudos acadêmicos sejam feitos com estudantes. Mas comparar esses participantes com o processamento de linguagem natural, no qual eles têm décadas de experiência, não torna a comparação inválida?
Como programador autodidata com formação em linguística teórica e que teve contato em nível universitário com várias línguas bem diferentes da minha língua materna, esse resultado não me surpreende. Em alguns níveis há semelhanças claras, mas a similaridade entre línguas humanas e código de computador costuma ser exagerada e parece um resquício de uma linguística mais primitiva, que se concentrava estreitamente na gramática
Mesmo que haja código que ele nunca viu dentro do repositório, a familiaridade com o estilo, as convenções e a forma como aquele código se encaixa no programa como um todo deve ter grande influência no modo de reconhecimento
Se a pessoa não está familiarizada com programação, faz sentido que a área de problemas desconhecidos seja ativada. Seria interessante estudar se essa área é ativada porque o domínio é desconhecido, ou se continua sendo ativada mesmo com experiência ao lidar com algo como código
Ao ler código, normalmente estamos lidando com algo que não conhecemos de antemão, então talvez ele seja sempre desconhecido em alguma medida; por outro lado, a própria leitura de código pode se tornar familiar e deixar de funcionar assim
Para uma comparação justa, os sujeitos precisariam ter experiência tanto em processamento de linguagem natural quanto em programação, mas como é difícil encontrar pessoas igualmente familiarizadas com os dois domínios, provavelmente seria preciso chegar a um compromisso como “familiaridade suficiente com código”
É exatamente por isso que fico com medo do futuro quando as pessoas dizem que “se você mandar a IA fazer algo em linguagem comum, ela simplesmente fará”
Não quero passar 8 horas por dia conversando por texto ou fala comum. Parece exaustivo demais. Por outro lado, lidar com uma linguagem de programação por 8 horas é divertido
Deveríamos conseguir dizer, como no
unsafedo Rust, “aqui eu sei o que estou fazendo, então não me atrapalhe”. Depois, a IA poderia verificar a correção das partes escritas por humanos por meio de testes ou outros métodosIsso já acontece até certo ponto, mas hoje é o humano que verifica o código gerado pela IA; acho que ainda falta muito para invertermos esses papéis
Lex Fridman entrevistou recentemente o linguista Edward Gibson, e eles falaram bastante sobre como o cérebro processa a linguagem
Isso incluiu a ideia de que ler código revela áreas do cérebro completamente diferentes das usadas para linguagem
#426 https://lexfridman.com/podcast/
Pelo que sei, Evelina Fedorenko, deste artigo, é esposa do Edward
Para mim, é um conjunto de habilidades completamente diferente
Tenho um canal no YouTube focado principalmente em leitura de código: https://www.youtube.com/@ants_are_everywhere
Tento ler e entender código de projetos open source populares sem tê-los visto antes, algo um pouco parecido com leitura à primeira vista em música
A explicação dos pesquisadores de que eles quase não viram resposta ao código nas áreas de linguagem e que, em vez disso, a multiple demand network, distribuída pelo lobo frontal e parietal, foi a mais ativada, me parece plausível. Essa rede é recrutada em tarefas em que é preciso manter várias informações na cabeça ao mesmo tempo e está ligada à capacidade de executar diversas tarefas mentais
Claro que há linguagem, mas talvez não se gaste muito esforço no processamento linguístico em si, então isso pode não aparecer no sinal de fMRI. Muitas vezes estou mantendo ao mesmo tempo várias coisas: o que o código faz, o que o autor estava tentando fazer, o contexto do autor, como softwares parecidos funcionam etc.
Estudei matemática, mas isso também não se parece muito com ler texto ou fazer matemática
Leva um tempo para “carregar” essas coisas na cabeça, e é um pouco como fazer malabarismo de equilíbrio, tendo que manter tudo estável para que o conjunto não desmorone
Se sou interrompido no meio, parece que perco o equilíbrio e tudo fica bagunçado; depois preciso juntar tudo de novo, o que exige tempo e esforço. Quando isso acontece algumas vezes seguidas, é extremamente frustrante
Paul Graham trata disso no texto sobre maker schedule e manager schedule: (2009) https://paulgraham.com/makersschedule.html
A sensação é exatamente a mesma, e o padrão de manter várias coisas na cabeça ao mesmo tempo também
Pelos critérios da neurociência moderna e de neuroimagem, a conclusão é que ler código é basicamente a mesma coisa que recuperar a consciência com zolpidem durante um coma
Toquei alguns instrumentos quando criança e adolescente, mas nunca fui bom em leitura à primeira vista. Já ouvi dizer que habilidade musical e habilidade de programação costumam estar correlacionadas, mas eu não teria conseguido ser músico profissional. Em vez disso, construí uma boa carreira em programação
Não é nada surpreendente. Ler código é diferente de ler prosa, também é diferente de fazer matemática, e está mais perto de montar um quebra-cabeça mentalmente
Para entender o que o código faz, é preciso conectar, substituir e traduzir em tempo real um monte de coisas: funções, símbolos, variáveis, instruções, abstrações etc. Por isso, ler código às vezes acaba sendo mais complexo do que escrever código do zero
Na prática, a única coisa em comum é que ambas são chamadas de “linguagem”
Porque é um conjunto de instruções de máquina que descreve o que o computador deve fazer, e não pode, nem deveria, ser uma metáfora para outra coisa, como acontece nas áreas de linguagem
Para mim, ler código é parecido com olhar para um desenho de um conjunto de engrenagens e perguntar: “a engrenagem A gira no sentido anti-horário ou horário?”
A sensação é menos de compreensão linguística e mais de analisar um mecanismo
Isso também fica claro pelo fato de que, ao ler código, não há uma voz de narração na cabeça
Quando tento ler código, ruído de fundo em que consigo entender palavras, como fala ou a musicalidade de um idioma conhecido, me distrai e irrita. Também não consigo falar enquanto programo; se faço isso, erro a digitação
Além disso, prefiro muito mais linguagens mais próximas de frases em inglês, como Ruby, do que linguagens com muitos símbolos, como Rust, ou com muitas abreviações e operadores, como Haskell. Claro que outros desenvolvedores terão outras vias cerebrais ativadas
Código difícil de ler costuma ser difícil de processar, talvez porque o ritmo dessa narração seja quebrado e não flua naturalmente
Quando explico como algo funciona, em geral também sigo o mesmo ritmo dessa narração, e isso ajuda a explicar de forma concisa e transmitir conhecimento rapidamente
Ainda assim, é claramente diferente da voz de narração que tenho ao ler ficção. Acho que é por causa da presença ou ausência de linguagem emocional entre as duas. Talvez seja parecido com o fenômeno de algumas pessoas terem monólogo interno e outras não, ou de variarem no nível de detalhe com que conseguem imaginar objetos sem realmente vê-los
Aqui, “a mesma” quer dizer que o modo de funcionamento e a forma como ela “soa” são os mesmos; naturalmente, a gramática e o vocabulário seguem a língua de sinais usada. Na prática, as mesmas áreas cerebrais são ativadas
Isso parece indicar que a voz de narração não é apenas um “eco sonoro”, mas o próprio processo de compreensão. Assim como ao ler texto
Em especial, avaliar loops exige iterações em que altero temporariamente o código
Trabalho principalmente de casa e, quando estou programando, geralmente deixo música tocando
Gosto de cantar junto, então passo o dia inteiro sentado à mesa cantando enquanto programo
Mas, quando estou lendo alguma coisa, não consigo fazer isso de jeito nenhum. É impossível ler um texto e cantar outra música ao mesmo tempo, mas, ao programar, isso é muito fácil