Do not speak Portuguese? Translate this site with Google or Bing Translator
O Cerebro do Programador

Posted on: October 27, 2021 08:44 PM

Posted by: Renato

Views: 761

# O Cérebro do Programador

- https://blog.renatolucena.net/post/neurocientistas-rede-de-demanda-multipla

Em setembro de 2021

## The Programmer's Brain: What every programmer needs to know about cognition

- https://www.amazon.com/Programmers-Brain-every-programmer-cognition/dp/1617298670
Publisher ‏ : ‎ Manning (September 7, 2021)
Cientista: Felienne Hermans
- https://en.wikipedia.org/wiki/Felienne_Hermans

A cientista 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.

# Processos Cognitivos


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.

# Programador Iniciante e o Programador Expert

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.
- https://pt.wikipedia.org/wiki/Adriaan_de_Groot

Adrianus Dingeman (Adriaan) de Groot (Santpoort, 26 de outubro de 1914 — Schiermonnikoog, 14 de agosto de 2006) foi um psicólogo e mestre de xadrez holandês que conduziu alguns dos mais famosos experimentos sobre o enxadrismo nas décadas de 40 a 60. Em 1946, De Groot escreveu sua tese Het denken van den schaker, a qual em 1965 foi traduzida para o inglês e publicada como Thought and choice in chess.
- https://stringfixer.com/pt/Adriaan_de_Groot

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

 

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:

??? no idioma Marati

 

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:

??? no idioma Polonês

??? no idioma Polonês

 

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ê:

Cachorro no idioma Português

Cachorro no idioma Português

 

# Escrevendo comentários no código


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.

Exemplo de código com muitos cometários de baixo nível, explicando linha por linha do que está sendo feito

Exemplo de código explicando em mais alto nível qual é o objetivo do código

Beacons
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.

Beacons são conhecidos como luzes de navegação

.

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)

# Memorizar a sintaxe


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


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. 😄

É 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:
https://youtu.be/twyUUQbmLQI

# Decifrando códigos em diferentes idades 

Apesar de a análise ter sido feita com participantes acima de 21 anos, uma das linguagens usadas para estudo foi a Scratch Jr, projetada para crianças de 5 a 7 anos. Ela consiste em blocos de código (com funções como “para cima”, “para a esquerda”, “pula”, “repete”) que os pequenos podem montar para fazer desenhos animados ou jogos.
- https://play.google.com/store/apps/details?id=org.scratchjr.android&hl=pt_BR&gl=US

A outra linguagem usada foi a Python, muito conhecida entre os programadores adultos. Ambas ativaram a rede de demanda múltipla, mostrando que os resultados se aplicam a uma ampla gama de linguagens de programação.
- https://www.python.org/downloads/
“Como uma das linguagens usadas foi projetada para crianças nessa faixa etária, então definitivamente há oportunidades para começar a aprender cedo”, lembra Anna Ivanova.

- https://blog.renatolucena.net/post/neurocientistas-rede-de-demanda-multipla
- https://blog.betrybe.com/noticias/estudo-mapeia-a-atividade-neuronal-de-um-programador/
- https://canaltech.com.br/comportamento/mapearam-a-atividade-neuronal-dos-programadores-veja-como-ficam-seus-cerebros-176372/
- https://fundacaotelefonicavivo.org.br/noticias/como-funciona-o-cerebro-dos-programadores/
- https://medium.com/devdevs/programadores-cuidem-do-seu-c%C3%A9rebro-16e57e407448
- https://dev.to/nitramchips/o-cerebro-do-programador-2jne
- https://www.linkedin.com/pulse/mit-o-c%C3%A9rebro-incr%C3%ADvel-dos-programadores-thiago-l-mba-/?trk=public_profile_article_view
 


6

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (16) Variados (109) PHP (133) Laravel (171) Black Hat (3) front-end (29) linux (114) postgresql (39) Docker (28) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (56) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (7) reactnative (5) collections (1) javascript (7) reactjs (8) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (2) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (12) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (5) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (3) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (43) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (2) jwt (5) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (3) Architecture (4) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (2) autorizacao (2) authentication (4) authorization (3) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1) Axios (1) Fetch (1) Deepin (1) vue (4) nuxt (1) PKCE (1) Oauth2 (2) webhook (1) TypeScript (1) tailwind (1) gource (2)

New Articles



Get Latest Updates by Email