Fala, leitor! Tudo bem? Habacuque aqui.

Tem uma cena que se repete com muita gente que decide aprender programação.

No primeiro dia, tudo parece empolgante. Você vê alguém criando um site, um aplicativo ou fazendo algumas linhas de código aparecerem na tela e pensa: “Eu consigo fazer isso”.

Você começa.

Aprende o que é uma variável. Depois aparece uma função. Logo chegam condições, laços de repetição, arrays, objetos, banco de dados, Git, APIs, frameworks...

De repente, aquela sensação de descoberta começa a mudar.

Você assiste a uma aula e entende.

Assiste à segunda e ainda acompanha.

Na terceira, abre o computador para tentar fazer sozinho e percebe que não sabe nem por onde começar.

E aí nasce uma frase perigosa:

“Acho que programação não é para mim.”

Mas será mesmo?

A ciência que estuda o ensino de programação mostra que essa dificuldade inicial é bastante real. Em cursos introdutórios, pesquisas acadêmicas já encontraram índices de reprovação ou abandono que podem chegar à faixa de 30% a 50%, dependendo do curso e do contexto analisado. Ou seja, ter dificuldade no começo está longe de ser uma experiência rara. Springer Nature Link

Então talvez a pergunta mais interessante não seja “por que algumas pessoas não conseguem aprender programação?”.

Talvez seja:

Por que aprender programação parece tão difícil no começo?

O cérebro do iniciante está tentando fazer várias coisas ao mesmo tempo

Pensa em alguém aprendendo a dirigir.

No começo, a pessoa pensa no pedal da embreagem, no freio, no acelerador, no câmbio, no retrovisor, na seta e ainda precisa prestar atenção no trânsito.

É muita coisa acontecendo ao mesmo tempo.

Depois de alguns meses, vários desses movimentos começam a acontecer quase automaticamente.

Com programação existe algo parecido.

Para escrever um código aparentemente simples, um iniciante pode precisar lembrar a sintaxe da linguagem, entender o problema, pensar na lógica, escolher uma estrutura, lembrar como funciona uma variável, acompanhar os valores armazenados e ainda tentar descobrir por que apareceu uma mensagem de erro.

Para um programador experiente, várias dessas decisões já se tornaram quase automáticas.

Para quem está começando, não.

Isso tem relação com algo estudado pela psicologia educacional chamado carga cognitiva.

Nossa memória de trabalho, aquela utilizada para lidar com informações enquanto resolvemos um problema, possui capacidade limitada. Aprender programação pode exigir que vários elementos sejam processados e relacionados ao mesmo tempo. Pesquisadores citam como exemplos o desenho de algoritmos, a lógica booleana, variáveis, funcionamento do computador e até conceitos relacionados à memória. Springer Nature Link

Agora imagine apresentar tudo isso para uma pessoa em uma única semana.

Ela pode sair com a impressão de que não tem capacidade.

Quando, na verdade, talvez tenha recebido informação demais antes de conseguir consolidar o que aprendeu.

Essa diferença é muito importante.

O programador experiente enxerga algo que o iniciante ainda não enxerga

Existe outra coisa interessante acontecendo.

Quando um iniciante observa um código, ele costuma prestar muita atenção nos detalhes visíveis daquele problema.

Um programador experiente consegue enxergar estruturas.

Pesquisas sobre ensino de programação mostram essa diferença. Um iniciante pode olhar para dois exercícios e acreditar que são completamente diferentes porque um calcula a média de notas e o outro soma preços de produtos.

O programador experiente pode olhar para os dois e perceber imediatamente:

“Os dois usam praticamente a mesma estrutura de repetição.”

Ele não está apenas enxergando o código.

Ele está reconhecendo um padrão.

Pesquisadores chamam essas estruturas mentais de esquemas de resolução de problemas. Com experiência, o programador começa a reconhecer que determinado problema pede uma repetição, uma condição, uma função ou determinado tipo de estrutura sem precisar reconstruir todo o raciocínio do zero. Springer Nature Link

É por isso que existe uma enorme diferença entre ver alguém programando e realmente saber programar.

Você pode assistir a alguém construir um sistema inteiro e pensar:

“Entendi tudo.”

Aí abre uma tela vazia.

E trava.

Isso não significa necessariamente que você não aprendeu nada.

Significa que reconhecer uma solução pronta é diferente de construir uma solução sozinho.

É aqui que nasce a famosa dependência de tutorial

Talvez você já tenha vivido isso.

Você encontra um vídeo chamado:

“Crie seu primeiro aplicativo em 30 minutos.”

Segue o professor.

Digita exatamente o que ele digita.

O aplicativo funciona.

Sensação maravilhosa.

No dia seguinte você tenta criar outro aplicativo sem o vídeo.

Não consegue.

Então procura outro tutorial.

Depois outro.

E mais outro.

Esse comportamento às vezes é chamado informalmente pela comunidade de programação de “tutorial hell”, ou seja, quando a pessoa consegue acompanhar inúmeros tutoriais, mas sente dificuldade para construir algo sem eles.

O problema não é assistir a exemplos.

Muito pelo contrário.

Existe bastante evidência de que exemplos resolvidos passo a passo podem ser extremamente úteis para iniciantes.

A diferença está em como esses exemplos são utilizados.

Estudos sobre aprendizagem baseada em exemplos mostram que, para quem ainda possui pouco conhecimento, observar uma solução estruturada pode consumir menos esforço mental do que ser jogado diretamente em um problema completamente aberto. Isso permite que o aluno concentre sua atenção no raciocínio usado para chegar à solução. Springer Nature Link

Só que existe um próximo passo.

Depois de entender o exemplo, é preciso começar a retirar as rodinhas da bicicleta.

Primeiro você observa.

Depois modifica.

Depois completa uma parte.

Depois resolve algo semelhante.

Até chegar ao momento em que consegue construir sozinho.

Aprender programação não deveria ser um salto.

Deveria ser uma escada.

E existe pesquisa mostrando que essa escada funciona

Um estudo publicado no International Journal of STEM Education acompanhou estudantes de uma disciplina introdutória de programação durante um semestre.

Os pesquisadores utilizaram uma estratégia chamada subgoal labeling, que podemos traduzir de maneira simples como dividir a solução em pequenos objetivos.

Em vez de apresentar apenas um grande problema e dizer “resolva”, o processo ajuda o estudante a identificar etapas menores da solução.

O resultado foi interessante.

Os estudantes que receberam esse tipo de orientação tiveram melhor desempenho nas avaliações realizadas logo após aprender novos procedimentos. A média das provas finais não apresentou melhora estatisticamente significativa, o que é importante deixar claro, mas o grupo apresentou menos reprovações e abandonos do curso. Springer Nature Link

Isso nos ensina alguma coisa importante.

Às vezes o iniciante não precisa que alguém torne a programação “fácil”.

Ele precisa que alguém torne o próximo passo visível.

Existe uma enorme diferença entre essas duas coisas.

O erro também assusta mais quem está começando

Tem outro momento clássico.

Você escreve algumas linhas.

Executa.

E aparece uma tela cheia de palavras que você nunca viu na vida.

SyntaxError

Undefined

Null

Exception

Unexpected token

Para um programador experiente, uma mensagem de erro é informação.

Para um iniciante, muitas vezes parece que alguma coisa explodiu.

Pesquisadores que estudaram estudantes iniciantes aprendendo Python observaram justamente esse problema. Mensagens de erro podem ser difíceis de interpretar para quem ainda está começando e podem aumentar frustração e insegurança. O estudo avaliou maneiras de tornar essas mensagens mais compreensíveis para auxiliar o estudante a identificar e corrigir problemas. Springer Nature Link

E aqui aparece outra diferença importante entre ensinar programação e simplesmente disponibilizar conteúdo de programação.

Quando alguém recebe um erro, aquele momento pode virar duas experiências completamente diferentes.

Na primeira:

“Deu erro. Eu não sei fazer isso.”

Na segunda:

“Deu erro. Vamos descobrir por quê.”

A segunda experiência ensina uma das habilidades mais importantes da profissão.

Debugging.

Programadores profissionais também erram.

A diferença é que, com experiência, aprendem a investigar o erro.

Então não existe uma pessoa que “nasceu para programar”?

Não é tão simples.

Pessoas possuem experiências anteriores, interesses, formas de aprender e diferentes níveis de familiaridade com tecnologia. Tudo isso pode influenciar o começo.

Mas existe um problema quando transformamos a dificuldade inicial em um teste de talento.

“Se entendeu rápido, serve para programação.”

“Se teve dificuldade, não serve.”

As pesquisas não sustentam uma visão tão simples.

Um estudo publicado em 2024 analisou fatores relacionados à intenção de estudantes universitários continuarem cursando disciplinas de programação. Entre aqueles que responderam por que não pretendiam continuar, a dificuldade do curso apareceu como o motivo mais citado, presente em 37% das respostas analisadas para essa questão. Também apareceram falta de interesse, custo percebido em tempo e esforço e baixa expectativa de sucesso. Springer Nature Link

Isso é particularmente interessante porque desempenho e persistência não são exatamente a mesma coisa.

Uma pessoa pode ter dificuldade e continuar.

Outra pode ter capacidade acadêmica e desistir porque perdeu interesse, confiança ou não encontrou sentido no que estava estudando.

Aprender programação envolve conhecimento, mas também envolve percepção de progresso.

Se toda vez que você senta para estudar sente que não sabe absolutamente nada, continuar fica muito mais difícil.

E no Brasil?

Esse problema também aparece em pesquisas brasileiras.

Um estudo publicado no Journal of the Brazilian Computer Society investigou evasão em cursos de Computação, incluindo um estudo de caso na Universidade de Brasília.

Entre os estudantes que haviam abandonado os cursos analisados, a maior parte havia saído ainda nos quatro primeiros períodos. Dependendo do curso, o percentual ficou aproximadamente entre 59% e 64% dos respondentes que haviam evadido.

Os pesquisadores identificaram fatores institucionais, vocacionais e socioeconômicos e também encontraram influência de dificuldades relacionadas à abstração algorítmica e conhecimentos matemáticos. Springer Nature Link

É importante não transformar esse resultado em uma conclusão sobre todos os cursos ou todos os estudantes brasileiros.

Mas ele chama atenção para um momento crítico:

o começo.

É justamente quando a pessoa sabe menos que muitas vezes exigimos que ela entenda mais coisas ao mesmo tempo.

Talvez o problema esteja na ordem

Imagine ensinar alguém a tocar violão desta maneira:

No primeiro dia, acordes.

No segundo, escalas.

No terceiro, teoria musical.

No quarto, improvisação.

No quinto, composição.

Na sexta-feira você entrega um violão e diz:

“Agora componha uma música.”

Provavelmente não funcionaria muito bem.

Mas algo parecido acontece quando alguém tenta aprender programação.

HTML hoje.

JavaScript amanhã.

React na quarta.

Node na quinta.

Banco de dados na sexta.

Git no sábado.

Inteligência artificial no domingo.

Na segunda-feira a pessoa pensa:

“Eu estudei a semana inteira e continuo sem saber programar.”

Talvez porque ela tenha aprendido muitos nomes e construído poucas conexões.

É por isso que uma formação de programadores precisa ter sequência.

Antes de uma tecnologia, existe um conceito.

Antes de um framework, existe uma lógica.

Antes de criar sistemas complexos, existem pequenos problemas que ensinam como pensar.

Afinal, qual é a melhor forma de aprender programação?

A ciência da aprendizagem não oferece uma única receita que funcione para todas as pessoas.

Mas alguns princípios aparecem com bastante força nas pesquisas.

Para quem está começando, faz sentido reduzir complexidade desnecessária, apresentar exemplos claros, dividir problemas em etapas menores, permitir prática progressiva e oferecer feedback enquanto o estudante ainda consegue relacionar aquele retorno ao problema que acabou de enfrentar. Springer Nature Link

Em português simples:

Entenda uma coisa.

Use essa coisa.

Erre.

Descubra por que errou.

Tente novamente.

Depois aumente um pouco a dificuldade.

Parece menos emocionante do que prometer que alguém vai “virar programador em sete dias”.

Mas provavelmente é muito mais próximo de como habilidades complexas realmente são construídas.

E onde entra a inteligência artificial nisso tudo?

Esse assunto merece uma matéria inteira, mas existe uma mudança importante acontecendo.

Hoje um iniciante pode perguntar para uma inteligência artificial por que determinado código não funciona e receber uma explicação em segundos.

Isso pode ser extremamente útil.

Mas existe uma diferença enorme entre usar IA para entender um código e usar IA para evitar entender o código.

Se você copia uma solução pronta, executa e parte para o próximo exercício, pode até chegar ao resultado.

Só que resultado e aprendizado não são necessariamente a mesma coisa.

A IA pode se transformar em professor, colega de estudo, ferramenta de debugging e explicador de conceitos.

Ou pode se transformar em uma máquina de copiar respostas.

A diferença continua dependendo da forma como estudamos.

É aqui que a iiSoul quer participar dessa conversa

Na iiSoul, existe uma ideia que consideramos essencial para quem quer aprender programação:

formar um programador é diferente de ensinar alguém a copiar código.

Uma boa formação precisa ajudar a pessoa a construir raciocínio.

Precisa mostrar o que está acontecendo.

Precisa permitir que ela experimente.

Precisa permitir que erre.

E, principalmente, precisa aumentar a complexidade no momento certo.

Porque um programador não é alguém que decorou todas as respostas.

É alguém que aprendeu a encontrar respostas para problemas que ainda não conhece.

Talvez essa seja uma das habilidades mais importantes para quem deseja construir uma carreira em tecnologia.

Linguagens mudam.

Frameworks mudam.

Ferramentas mudam.

Hoje estamos aprendendo a trabalhar com inteligência artificial.

Amanhã provavelmente teremos ferramentas que ainda nem existem.

Mas a capacidade de entender um problema, dividi-lo em partes, testar hipóteses, encontrar erros e construir uma solução continua no centro da programação.

Então, se você começou a estudar e em algum momento pensou:

“Por que todo mundo parece entender isso menos eu?”

Talvez exista uma pergunta melhor:

Estou tentando aprender programação na sequência certa?

Porque aprender programação exige esforço.

Mas esforço não precisa significar confusão permanente.

Quando existe sequência, prática e compreensão, aquelas coisas que no começo pareciam impossíveis começam a virar padrões.

E um dia acontece algo curioso.

Você olha para um código que alguns meses antes parecia outra língua...

e entende.

Talvez seja exatamente nesse momento que alguém começa, de verdade, a se tornar programador.

Fontes consultadas

  • Reducing withdrawal and failure rates in introductory programming with subgoal labeled worked examples, International Journal of STEM Education. O estudo discute dificuldades em disciplinas introdutórias e avaliou o ensino dividido em subobjetivos ao longo de um semestre. Acessar o estudo
  • Differentiated measurement of cognitive loads in computer programming, Journal of Computing in Higher Education. Analisa carga cognitiva, autoeficácia e interesse durante o aprendizado inicial de programação. Acessar o estudo
  • Predictors of university students’ intentions to enroll in computer programming courses, Discover Education. Investiga dificuldade percebida, interesse, expectativa de sucesso e persistência no estudo de programação. Acessar o estudo
  • Influence of algorithmic abstraction and mathematical knowledge on rates of dropout from Computing degree courses, Journal of the Brazilian Computer Society. Pesquisa brasileira sobre evasão em cursos da área de Computação. Acessar o estudo
  • The Effect of Automated Error Message Feedback on Undergraduate Physics Students Learning Python, Journal for STEM Education Research. Investiga como mensagens de erro afetam iniciantes e como explicações mais claras podem auxiliar o aprendizado. Acessar o estudo
  • Cognitive Load Theory: Advances in Research on Worked Examples, Animations, and Cognitive Load Measurement, Educational Psychology Review. Revisão sobre carga cognitiva e o uso de exemplos resolvidos na aprendizagem de iniciantes. Acessar o estudo