O Cérebro do Programador
Tags: programming, performance, beginners, productivity
Published: 2021-09-22 12:45:42


Em setembro deste ano foi lançado o livro 
["***The Programmer's Brain: What every programmer needs to know about cognition***"](https://www.amazon.com/Programmers-Brain-every-programmer-cognition/dp/1617298670) da cientista [**Felienne Hermans**](https://en.wikipedia.org/wiki/Felienne_Hermans) onde ela ajuda programadores a entender como o cérebro funciona e como ele pode ser utilizado de forma mais efetiva para ler e escrever código. 
![Felienne Hermans](https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Felienne.jpg/440px-Felienne.jpg)<figcaption>Felienne Hermans</figcaption>

## Conteúdo
- [Processos Cognitivos](#chapter-1)
- [Programador Iniciante e o Programador Expert](#chapter-2)
- [Escrevendo cometários no código](#chapter-3)
- [Beacons](#chapter-4)
- [Memorizar a sintaxe](#chapter-5)
- [Melhorando a memória](#chapter-6)
- [Conclusão](#chapter-7)

## Processos Cognitivos <a name="chapter-1"></a>
Entender o código alheio pode ser umas das tarefas mais difíceis e de maior peso na lista de tarefas de um programador e existem alguns fatores que dificultam o entendimento. 

Como o código foi escrito e como o projeto foi arquitetado, são fatores que influenciam, mas de uma forma geral. A autora classifica em 3 processos cognitivos:  

 - Conhecimento 
 - Informação
 - Poder de processamento
 
Tente imaginar a parte de conhecimento como tudo o que você já memorizou até hoje sobre sintaxe, estrutura de dados, Design Patterns e outros. É como se ele fosse o seu HD.
  
Já o processo cognitivo da informação seria a sua memória RAM, ou seja, são informações que são guardadas a curto prazo, como valores das variáveis que estão sendo utilizadas, o contexto daquele código e o histórico de alterações recentes no bloco de código analisado.
  
Se o processo cognitivo do conhecimento é o HD e o da informação é a sua memória RAM, então o poder de processamento é a CPU. É esse componente cognitivo que vai utilizar a memória de longo prazo e a de curto prazo para debugar o código mentalmente.

Um ponto importante é que quando a memória a longo prazo não tem informação suficiente sobre o código analisado, a memória de curto prazo precisa ser utilizada com mais frequência, porém tem uma capacidade de armazenamento menor. 

Por não ter muita "informação armazenada" na memória de longo prazo, o programador acaba levando mais tempo para entender um código.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0687ttkfo3kfuwls25j.jpg)
 

## Programador Iniciante e o Programador Expert <a name="chapter-2"></a>


Um experimento feito pelo matemático Adrian de Groot que estava interessado em entender por qual motivo algumas pessoas se tornam ótimos jogadores de xadrez enquanto outras são jogadores medianos a vida inteira.

No experimento, uma imagem de um tabuleiro com uma configuração específica de peças era mostrada para jogadores de xadrez iniciantes e experientes por um curto espaço de tempo. Os participantes tinham que tentar memorizar aquela configuração de peças e depois tenta reproduzir o mais fiel possível.

![Abertura Ruy López](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fw64uojjh7k3jbp6xn2a.jpeg)<figcaption>Abertura Ruy López</figcaption>

Como você pode imaginar, os jogadores mais experientes foram os que conseguiram reproduzir com mais facilidade. Mas por qual motivo isso acontece? Eles tem uma memória mais afiada do que os iniciantes? Não exatamente. Com muito treino e experiência, um jogador é capaz de identificar padrões de jogada, prevendo o que o adversário provavelmente tentará fazer e como se livrar daquela jogada.

Enquanto um iniciante apenas vê uma sequência de peças em um tabuleiro, o jogador experiente vê aquela configuração formando uma abertura Ruy López, por exemplo. Isso facilita bastante na memorização, pois não é necessário memorizar peça por peça. 

Quando o matemático começou a mostrar configurações de tabuleiro com peças em posições totalmente aleatórias, o jogadores experientes tiveram o mesmo desempenho que os iniciantes!

  
A mesma coisa acontece quando lemos um código. Um programador experiente vai reconhecer algumas operações, estruturas de dados ou padrões de projeto que já são familiares por já fazerem parte da memória de longo prazo dele. Mas se o código estiver mal escrito, um expert terá a mesma dificuldade que um programador iniciante.

Uma outra forma de entender esse processo é através da própria linguagem humana. A não ser que você tenha algum conhecimento em Marati, nada do que está escrito abaixo é familiar. Nem mesmo os símbolos utilizados são reconhecíveis:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7jrco8ewle7jfx9q4i9d.png)<figcaption>??? no idioma Marati</figcaption>

Nesse outro exemplo, você pode não saber Polonês, mas pelo menos já pode reconhecer os signos utilizados, apenas não consegue saber o que eles estão formando:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ez3jml75h5hfck88ig9s.png)<figcaption>??? no idioma Polonês</figcaption>

Aaaah agora sim!! Neste exemplo existem signos de um alfabeto que você conhece e eles formam um padrão que tem um significado pra você:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o126ww48hi1z9d44bvh7.png)<figcaption>Cachorro no idioma Português</figcaption>

## Escrevendo comentários no código <a name="chapter-3"></a>

Esse pode ser um assunto um pouco polêmico, pois existem pessoas que acreditam que não é uma boa prática. Códigos que possuem comentário podem levar mais tempo para serem lidos, mas isso não é necessariamente um problema.

Ter o código comentado, pode ser muito útil para programadores que acabaram de entrar no time e precisam entender o codebase.

Segundo o trabalho de Martha Elizabeth Crosby da Universidade do Hawaii, programadores iniciantes focam em ler comentários com mais frequências do que os experientes. É claro que é importante não exagerar na detalhamento dos comentários, o ideal é coloca uma descrição mais alto nível do que comentar linha por linha, caso contrário, pode mais atrapalhar do que ajudar.  
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f3sutfhfbhpnvolvk2b7.png)<figcaption>Exemplo de código com muitos cometários de baixo nível, explicando linha por linha do que está sendo feito</figcaption>

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cozu922l3o3i14ug2oji.png)<figcaption>Exemplo de código explicando em mais alto nível qual é o objetivo do código</figcaption>
 

## Beacons <a name="chapter-4"></a>

Um outro elemento importante que o livro explica, é a idéia de beacons. São pequenas partes do código que pela própria nomenclatura do código, já dão pistas do que o algoritmo faz. Colocar palavras como root ou graph, já passam para o leitor, qual é a estrutura de dados utilizado. Por isso é importante ter cuidado ao definir o nome de funções, classes ou variáveis. Programadores experientes utilizam beacons com muita frequência.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gelyodc2oefh1ze3z9r3.jpeg)
<figcaption>Beacons são conhecidos como luzes de navegação</figcaption>

  ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yjwpx05qsix0u9ks4fps.jpg)<figcaption>Exemplo de beacon utilizado para indicar para o leitor do código, que está sendo utilizado um tipo abstrato de dados chamado grafo.(Código tirado de: https://github.com/ronami/minipack/blob/master/src/minipack.js)</figcaption>

## Memorizar a sintaxe <a name="chapter-5"></a>

Do mais iniciante ao expert, é muito comum dar aquela pesquisada no google para lembrar como faz a validação de um campo de e-mail utilizando expressão regular. Todo mundo dá aquela consultada no Stack Overflow como escrever uma função específica. 

O problema que esse hábito pode fazer a diferença na produtividade, pois o desenvolvedor precisa interromper a sua linha de raciocínio para pesquisar nas páginas de discussão e filtrar o que não é importante, para assim finalmente achar o que precisa e depois voltar para o contexto que estava trabalhando. 

Uma estudo do professor Chris Parnin da Universidade da Carolina do Sul, mostra que todas as vezes que o desenvolvedor é interrompido, apenas em 10% das vezes ele consegue retomar o raciocínio em menos de 1 minuto. 

Com a memória mais afiada, suas consultas ao Google diminuem e assim o número de interrupções também diminuem.

## Melhorando a memória <a name="chapter-6"></a>

O livro recomenda o utilização de Flashcards para a memorização. Basicamente a técnica consiste em criar vários cards onde na parte da frente do card você tem a descrição do que o código faz e no verso, o código. 

A idéia e sempre pegar um o card aleatório e após ler a descrição, tentar lembrar mentalmente como é o código. Existem vários aplicativos para criar o seu baralho, mas se quiser, pode criar a versão analógica no papel mesmo. :smile:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5qrigqkliyy0eg192m4m.jpg)

É necessário fazer esse processo várias vezes por conta da curva de esquecimento citada pelo estudo feito por Ebbinghaus.

Existem diversos artigos e vídeos que explicam sobre a Curva de Esquecimento de Ebbinghaus:

{% youtube  twyUUQbmLQI%}

## Conclusão<a name="chapter-7"></a>
Esses foram só alguns dos pontos importantes do livro que ajudam a entender e a melhorar a forma que o cérebro lê e escreve código e o que pode ser feito para melhorar essas atividades.