Por Que Programar é Tão Difícil? Entenda e Vença seu Medo!

Programar é difícil porque requer uma sequência de pensamentos encadeados, onde cada etapa depende do resultado da etapa anterior.

Além da lógica, é preciso dominar os paradigmas de programação, a sintaxe da linguagem e as estruturas de dados, que são as ferramentas para a construção dessa sequência, chamada de algoritmo.

É como imaginar um mapa para chegar a algum lugar, sem nunca ter ido lá.

Espere um pouco… Então, você está dizendo que programar é mesmo difícil?

Sim. É difícil.

As pessoas que te dizem que “programar é fácil” ou não sabem o que estão falando, ou querem te vender um curso.

E não há mal nenhum em vender um curso de programação.

Se eu tivesse acesso aos cursos on-line de hoje em dia quando eu estava aprendendo a programar, com certeza teria feito vários, ainda mais com esses preços ridículos da Udemy.

O problema é usar o argumento de que “programar é fácil” para sugerir que qualquer pessoa pode aprender, mesmo sem interesse.

Nesse post eu divido o problema em tópicos, para você entender por que programar é tão difícil e o que você pode fazer para superar essa dificuldade.

Aprender Lógica de Programação é Difícil?

Sim. A lógica é a base da programação, mas também faz parte da essência do raciocínio humano. Mesmo assim, a lógica segue uma estrutura formal de pensamento que precisa ser obedecida e que por ser tão abstrata, é difícil de aprender sem bastante treino.

Mas não desanime!

Mesmo sendo difícil, isso não quer dizer que você não consiga programar.

Basta treinar o seu cérebro para isso.

A lógica demanda um raciocínio focado nos detalhes, como se você tivesse que se concentrar para conseguir fazer uma coisa que é comum do dia a dia.

Por exemplo, imagine ter que parar para pensar em cada etapa quando você vai tomar banho.

Você precisa pegar o sabonete, o condicionador… Mas antes, precisa ligar a água.

Na prática, você nem pensa em nada disso, só faz todas essas coisas de forma automática.

Assim, você não treina a lógica de forma consciente.

Mas não se preocupe, porque isso não é um defeito seu.

O cérebro representa menos de 2% da massa total do ser humano, mas demanda cerca de 20% de toda a energia do corpo.

Por isso, ele busca atalhos para economizar energia, tomando decisões com base em experiências passadas.

Quantas vezes você já ouviu uma pessoa mais velha dizendo “quando eu era mais novo, eu fazia as coisas sem pensar e dava tudo errado”?

É provável que essa pessoa continue fazendo as coisas sem pensar!

No entanto, os resultados negativos das experiências treinaram o cérebro dela para tomar uma decisão rápida, só que com mais chance de dar certo.

E como se muda isso?

É fácil. Praticando…

Você já deve ter ouvido uma pessoa chamando outra de “metódica”.

Pois é, a pessoa é chamada assim porque ela parece ter um método para fazer tudo…

Ora, um método nada mais é do que uma sequência lógica de etapas para resolver um problema.

Por isso, é comum ouvir que pessoas “metódicas” são bons programadores.

Isso não significa que essas duas coisas combinam porque ser metódico é ser chato e porque todo programador é chato.

Por sinal, esse argumento é uma falácia, ou seja, o uso da lógica de forma errada para induzir um raciocínio como se fosse verdadeiro.

Portanto, a melhor maneira de vencer a dificuldade de aprender lógica de programação é treinando o cérebro para observar as etapas das tarefas de forma consciente.

Representando a Lógica com uma Linguagem de Programação

A essa altura, você já entendeu que existe uma estrutura lógica de pensamento que precisa ser praticada para que você consiga programar.

O problema é que essa prática acontece em uma linguagem específica do computador, diferente da que você se acostumou a usar desde criança.

E ter que aprender a sintaxe de uma linguagem de programação é mais um motivo pelo qual aprender a programar é difícil.

No entanto, essa talvez seja a menor das dificuldades de aprender a programar.

Por esse motivo, é comum ver pessoas recomendando que você se esforce para aprender logo uma linguagem, mesmo sem saber muito bem o que está fazendo.

Eu também sugiro que você comece por uma linguagem de programação, mas sempre usando a linguagem para descrever as etapas lógicas que você já imaginou.

Nunca deixe de relacionar as instruções da linguagem de programação com as etapas lógicas que você já imaginou para a solução do seu problema.

Ou seja, o código sempre vem depois da solução, nunca antes dela.

Veja a seguir um exemplo simples para ilustrar essa ideia.

Imagine que você quer fazer uma viagem e tem R$2.000 para isso.

O processo de decisão é bem fácil:

  • Se a viagem custa menos de R$2.000, você arruma as malas e vai.
  • Mas se a viagem custa mais do que o dinheiro que você tem, você adia os seus planos.

Você verifica o custo da viagem hoje e descobre que ele está em R$2.500.

Que pena, você vai ficar em casa.

Agora veja como essa lógica simples poderia ser representada na sintaxe da linguagem Python, usando um if.

saldo = 2000 custo = int(input('Quanto custa a viagem?')) if saldo >= custo : print('Boa viagem!') else : print('Saldo insuficiente!')

Mas, e nos próximos meses, será que vai dar para viajar?

Para testar isso, você usa um laço de repetição while no código:

saldo = 2000 while True: custo = int(input('Quanto custa a viagem?')) if saldo >= custo : print('Boa viagem!') break else : print('Saldo insuficiente!')

Mas espere um pouco… Você esqueceu de um detalhe.

Se o custo da viagem já é maior que o seu saldo e só vai aumentar ao longo dos meses, esse valor original de R$2.000 nunca vai ser suficiente!

Nesse momento você pode pensar: “Mas eu vou juntar um pouco mais…

Pois é. Na sua cabeça, isso é instintivo.

Mas no código, você precisa informar que o saldo original mudou!

Para fazer isso, você pode aumentar o seu saldo a cada iteração (mês), somando um valor fixo ou em percentual.

Isso depende se você vai se comprometer a juntar um valor a mais em reais ou se vai investir e buscar uma rentabilidade de X% ao mês para o seu saldo.

Então, para facilitar, imagine que você vai juntar mais R$200 por mês e que o custo de R$2.500 da viagem aumenta 3% ao mês.

Alterando o seu programa para fazer esse cálculo, você consegue saber que vai levar 5 meses para conseguir juntar o dinheiro para a viagem.

saldo = 2000 custo = 2500 meses = 0 while True: if saldo >= custo : print(f'Vai levar {meses} meses.') break saldo += 200 custo *= 1.03 meses += 1

Na prática, há muito mais variáveis a considerar e você precisa pensar em todas elas, mas esse exemplo mostra como a lógica esperada para a solução influencia na sequência de instruções do programa.

Se você tivesse começado a programar escrevendo as instruções sem pensar, seria muito mais difícil chegar ao resultado, ainda mais se o programa usasse instruções mais complicadas.

Portanto, o segredo para conseguir aprender a sintaxe de uma linguagem de programação é praticar bastante e sempre relacionar o código que estiver escrevendo com a lógica esperada do programa.

A Dificuldade dos Paradigmas de Programação

Dentro de um computador, um programa é só um monte de dígitos 0 e 1 sendo somados em sequências de operações.

Mas para que os programas não precisem ser escritos nesse código binário, foram criadas as linguagens de programação, que também são conjuntos de instruções sequenciais.

Com o passar do tempo, as linguagens foram evoluindo e incluindo abstrações, na tentativa de aumentar a produtividade do programador.

Por exemplo, o paradigma Orientado a Objetos tenta aproximar a estrutura do programa aos objetos do mundo real.

Assim, o sistema de uma clínica veterinária pode ter uma classe concreta chamada Atendimento e uma classe abstrata chamada Animal, com as subclasses Cachorro, Gato e Ave.

Ora, transformar bichos que você conhece em linhas de código?

Isso é genial!

Toda essa semelhança com o mundo real facilita a vida do programador, mas tem um preço alto.

A curva de aprendizagem para entender essas abstrações do paradigma OO é longa.

É preciso entender como traduzir objetos do mundo real para expressões lógicas, usando só a sintaxe restrita de uma linguagem de programação para descrever esses objetos.

Esse é um exercício complexo.

Não é à toa que o ensino de programação começa pelo paradigma procedural, onde as instruções são dadas de maneira sequencial.

Além disso ainda é preciso conhecer os frameworks e ambientes computacionais.

Na programação Web, por exemplo, o processamento acontece quase todo no servidor e o cliente só é responsável pela camada de apresentação.

Nesse cenário, o programador precisa entender o fluxo dos dados e os diferentes componentes envolvidos no desenvolvimento de um sistema Web.

Para facilitar, você pode usar Padrões de Projeto, que são apenas maneiras pré-definidas de resolver problemas em situações semelhantes.

No entanto, o custo de aplicar os padrões de projeto é o mesmo dos outros tópicos desse post: o esforço para aprender como aplicar cada um deles à situação correta.

Mais uma vez, esse conhecimento vem com o tempo e para dominar os paradigmas de programação são necessárias muitas horas de prática.

O Papel das Estruturas de Dados

Toda linguagem de programação inclui tipos primitivos como números, caracteres e valores booleanos.

Além desses tipos, as linguagens disponibilizam abstrações eficientes chamadas estruturas de dados, que determinam como os dados internos se relacionam e como são executadas as operações sobre eles.

Assim como a lógica, estruturas de dados são um conceito abstrato, o que faz com que elas não sejam simples de entender.

Então, para facilitar, vou dar um exemplo usando duas das estruturas de dados mais comuns: a fila e a pilha.

Imagine a fila de um banco.

Se todo mundo chegasse no banco e quisesse ser atendido primeiro, isso seria o caos.

É por isso que existe a fila.

A ideia da fila é simples: quem chega primeiro, é atendido primeiro, até que todos na fila tenham sido atendidos.

É claro que a fila tem a prioridade para maiores de 60 e de 80 anos, mas vou deixar isso de lado para não complicar o exemplo.

O propósito da fila é tratar os elementos na ordem em que eles chegaram.

Esse é o conceito de first in, first out.

Você usa esse mesmo conceito quando abre a geladeira e consome os produtos que estão mais próximos do fim da validade.

A pilha é diferente, porque ela não precisa ser ordenada.

Não importa qual elemento da pilha você vai pegar, desde que exista algum disponível.

Por exemplo, em uma pilha de dinheiro com notas iguais, não importa se você pega a nota de baixo ou a de cima.

E já que não importa qual elemento você vai usar, é muito mais eficiente pegar logo o de cima.

Esse é o conceito de last in, first out, ou seja, o último elemento colocado na pilha é o primeiro a sair.

A fila e a pilha são dois bons exemplos de estruturas de dados, mas há várias outras que podem ser aplicadas a muitas situações.

Nesse caso, a dificuldade para quem está aprendendo é saber quando usar cada uma.

Mais uma vez, esse conhecimento vem com a prática e com o entendimento do problema que está sendo tratado.

Programar é uma Habilidade

Você já deve ter percebido que a solução para vencer as dificuldades da programação é…

Praticar!

É claro que livros, vídeos do YouTube e cursos on-line vão te ajudar a começar, mas a fluência em programação só vem com a prática, porque programar é uma habilidade.

Além disso, só a teoria no “Tutorial Hell” não vai te ajudar, porque quanto mais tempo você levar estudando programação, mais vai demorar para entrar no mercado de trabalho.

Pense em outra coisa que você já estudou ao longo da vida, como matemática.

O conhecimento de matemática é construído ano a ano na escola e cada conceito evolui sobre os anteriores, durante mais de 10 anos.

Esse longo tempo para aprender com calma funciona no sistema educacional, mas programar é como trocar o pneu com o carro andando.

Isso porque programação é uma profissão.

E como em toda profissão, você investe algum tempo para aprender, mas precisa começar a produzir logo.

Por exemplo, durante a faculdade você só tem duas ou três disciplinas de programação, ou seja, a responsabilidade por correr atrás e aprender é sua, se você quiser um emprego no final do curso.

Por causa disso tudo, para vencer a dificuldade de programar, é preciso praticar bastante e ter uma vontade constante de aprender mais.

Se você só estiver nessa pelo dinheiro, é provável que nunca consiga ser um bom programador, ou até que desista no meio do caminho.

Já ajuda muito se você é do tipo de pessoa que está esperando atendimento em algum lugar e pensa: “tenho um tempinho antes da minha vez, vou aproveitar pra dar uma olhada naquele assunto que eu quero entender melhor”.

Mas se você usa o seu tempo livre criando programas para resolver problemas e para aplicar o que estuda, o seu sucesso é só uma questão de tempo.

Ou seja, tudo depende do seu foco, da quantidade de esforço que você coloca e do quanto você valoriza o resultado.

Eu já programei um sistema que executou mais de 2 bilhões de transações financeiras para uma grande empresa que tem milhões de clientes.

É muito gratificante ver que o seu produto foi usado tantas vezes e fez diferença na vida de muitas pessoas.

Conclusão

Eu espero que você tenha entendido que programar o básico é difícil e programar coisas complexas é mais difícil ainda, mas a diferenciação na carreira está em vencer essa dificuldade.

Portanto, se você encontrar um programador que reclama da carreira, é provável que ele só tenha entendido o mínimo necessário para chegar até aquele ponto.

E nisso o nosso cérebro é muito bom.

Qual é a sua maior dificuldade para aprender a programar? Comente aí embaixo e veja se outras pessoas têm o mesmo problema!

Guilherme Brügger D Amato - Audiência Pública na Comissão Senado do Futuro

Guilherme Brügger D’Amato é servidor concursado de TI na Câmara dos Deputados, onde ocupou o cargo de Diretor de Informática entre 2015 e 2016. Com mais de 25 anos de experiência como programador e executivo de TI, já desenvolveu sites e sistemas usados por dezenas de milhões de pessoas. Conecte-se com ele no LinkedIn.

Deixe um comentário