A Verdade Inconveniente sobre a Lógica de Programação - Por que Ela não Prepara os Alunos para a Orientação a Objetos
Tags: braziliandevs, beginners, discuss
Published: 2024-05-13 20:02:10

Sendo você um estudante de programação ou até mesmo um programador, é bem provável que já tenha ouvido falar da tal lógica de programação seja como uma das "coisas essências para programar", ditados populares como "a lógica de programação é a mesma em todas as linguagens, então se aprender ela, aprende qualquer linguagem", como parte do conteúdo programático de algum curso, requisito de alguma vaga de emprego, e etc.

Dessa forma definindo a importância dela, na programação, como a base para todas as outras coisas, no entanto será que isso é realmente verdade? Normalmente, ela tende a ser o primeiro passo no ensino formal de programação, seguindo essa linha de "conceitos-chaves" que todos temos que aprender, viriam coisas como estruturas de dados, e a tal da orientação a objetos, conceito esse que, curiosamente, é motivo de relato de dificuldade para muitas pessoas (não acredita em mim? Faça uma busca rápida sobre a fama do Java entre iniciantes na internet).

Naturalmente, este é um assunto bem difícil, denso, e complexo, não a toa existe muito debate mesmo hoje em dia quanto a o que, de fato, seria a orientação a objetos, interpretação de seus princípios, real valor no desenvolvimento moderno, seus mais variados usos, e etc.

Agora, o que tudo isso tem a ver com a lógica de programação? Bom, acredito que ela, para além dos motivos já expostos, é um dos princípais motivos em dificultar o aprendizado de algo que já é muito complicado, o que contribui para os vários relatos que ouvimos por ai.

## Como ela seria tão ruim assim?

Podemos começar com um problema de definição, não existe uma definição oficial para lógica de programação, apesar disso, ela, muitas vezes, é definida como: 

> O raciocínio lógico para escrever programas de computador, por meio da criação de algoritmos, ou seja, uma sequência de passos para se executar uma tarefa.

Sendo uma definição bem vaga, podendo causar várias confusões quanto ao seu significado, por exemplo, muita gente diz "lógica de programação" quando na verdade quer dizer "raciocínio lógico", e pior, muitas vezes direciona a pessoa a aprender algo completamente diferente, pois o que é ensinado quando se ensina lógica de programação não é o raciocínio lógico, mas sim princípios de programação procedural, estes sendo o que eu realmente considero como "lógica de programação".

Isso é algo que você pode confirmar por si mesmo indo pesquisar a ementa de diversos cursos, posts em blogs, e etc, só como exemplo vou deixar 3 links aqui que demonstram esse ponto:

- [Um post do InfoEscola](https://www.infoescola.com/informatica/logica-de-programacao/);
- [Ementa do curso da Unicamp](https://moocs.ggte.unicamp.br/course/logicadeprogramacao/intro);
- [Ementa de cursos da Alura](https://www.alura.com.br/cursos-online-programacao/logica);

O que um site que nem é sobre programação, uma universidade bem renomada aqui no Brasil, e uma das princípais plataformas de cursos de programação também aqui no Brasil teriam em comum nesse assunto? Justamente a presença do ensino sobre princípios de programação procedural ao invés de um treinamento sobre como desenvolver o seu raciocínio lógico, e embora isso faça sim parte do processo em alguma medida, não seria o suficiente para justificar que raciocínio lógico é a mesma coisa que lógica de programação.

Outra definição que parece colaborar mais com esse ponto seria essa dada pelo Chat-GPT:

>   A lógica de programação é a base fundamental para a criação de algoritmos e programas de computador. Ela envolve a habilidade de pensar de forma estruturada e sequencial para resolver problemas, transformando essas soluções em instruções claras e precisas que um computador pode entender e executar. Isso inclui entender os conceitos de variáveis, estruturas de controle (como loops e condicionais), operadores, funções e estruturas de dados básicas, entre outros elementos. Em essência, a lógica de programação é a capacidade de pensar logicamente e expressar esse pensamento de maneira que um computador possa seguir.

Essa diferença entre o que se fala e o que, realmente, se quer dizer seria o que resulta na diferença entre expectativa vs realidade nos conteúdos a serem aprendidos posteriormente a este assunto.

O ponto que este artigo gostaria de fazer é que não tem como tem como esperar atingir certos resultados se suas premissas iniciais estão erradas quanto aquilo.

## Ok, mas mesmo que mal interpretada, ela ainda assim é basilar para todo resto que vem depois, não é mesmo?

Este é um questionamento bem válido quanto a linha de raciocínio apresentada até aqui, entretanto os conceitos normalmente relacionados a lógica de programação não são conceitos universais de programação, eles são os conceitos que servem de base para o paradigma procedural apenas.

Ao se estudar "lógica de programação", no fim, você vai ter desenvolvido uma forma de pensar na construção de algoritmos que envolve um raciocíonio bem imperativo, pois se aprende que um algoritmo seria como uma receita de bolo, na declaração de estados mutáveis, as variáveis, no controle fino de como a execução do programa vai se dar por meio das estruturas de controle de fluxo, e, se o ensino realmente for bom, na modularização de partes reutilízaveis do programa.

Só que cada ponto disso não é válido em todas as linguagens de programação (como é comumente dito), existem linguagens baseadas no paradigma declarativo, que é o contrário do imperativo, que não possuem variáveis, como as do paradigma funcional, e que não necessariamente precisam de estruturas de controle de fluxo para expressar lógica condicional ou de repetição, como o caso da orientação a objetos.

O único ponto realmente universal seria a ideia de modularizar o programa, no entanto, cada paradigma tem os seus próprios mecanismos de abstração e, geralmente, apenas se ensina sobre as funções durante a "fase da lógica de programação", mas funções tem um significado diferente em programação funcional, e a orientação a objetos usa classes por exemplo. 

Existem sim conceitos bem universais aplicáveis a todos os paradigmas, entretanto não são eles que constituem a ideia de lógica de programação.

## Isso quer dizer que lógica de programação é ruim?

Não, programação procedural ainda é um dos principais paradigmas adotados no mercado, sendo até considerado como sinônimo de programar em si dependendo do contexto (não a toa que existe toda essa confusão em relação ao tema de lógica de programação), a maioria das linguagens mainstream tem suporte a esse paradigma em alguma medida, e etc.

O problema é que um paradigma de programação é como se fosse um sistema de "lógica de programação" por si só, ele seria um conjunto de princípios, técnicas e funcionalidades utilizados para resolver um problema, ou seja, cada paradigma é como se fosse uma escola de pensamento sobre como programar a solução de determinado problema por si só, com cada uma tendo as suas vantagens e desvantagens para cada cenário.

Então, normalmente, aprender um novo paradigma tende a ser uma das coisas mais dificeis em programação, pois para aprender ele de fato, você tem que jogar fora tudo o que aprendeu até então para começar a reconstruir sua forma de pensar e encarar problemas do zero seguindo esse novo conjunto de ferramentas e princípios.

Logo, fica claro qual o problema de tratar a lógica de programação como o centro de tudo quando ela não é, só se refere aos princípios de um paradigma em específico. Além dos desafios já citados em se trocar de paradigma, a pessoa vai se aproximar desse tema com a mentalidade completamente errada, visto que ela vai tender a encarar esse novo paradigma como uma progressão do seu aprendizado até aqui, muitas vezes como "uma forma melhor" ou complementar ao que ele entende por lógica de programação, e pior, tentar programar usando a lógica de programação num cenário onde ele deveria estar aprendendo uma "nova lógica de programação".

Resumindo, trocar de paradigma já é dificil, imagina se você tentar aprender pelo caminho contrário ao ideal para se abordar este tema.

Isso trás complicações para além da dificuldade de aprendizado, visto que a pessoa pode até absorver os novos conceitos introduzidos pelo paradigma, e até conciliar com o que ele já sabe de alguma forma (o que é bem possível visto que ambos estão no espectro de paradigmas imperativos), o problema é que por ela estar tentando jogar nas regras de um paradigma estando no outro, muitos dos princípios vão ser mal aplicados (dado o vício de já saber fazer de outra forma), ou vão parecer sem sentido, resultando em um programador que conhece os princípios mas ou não sabe aplica-los corretamente ou nem ao menos os aplica.

# Conclusão

Lógica de programação, ou melhor, a programação procedural realmente é uma parada bem importante nessa jornada rumo à aprender a programar, entretanto, ao contrário da crença popular, ela não realmente representa a base para tudo o que vem depois, e somado com as confusões associadas com o termo, isso se torna uma bola de neve que prejudica bastante o aprendizado de outros temas muito importantes no futuro como a orientação a objetos.

Então se esse artigo te trouxe uma nova perspectiva sobre esse assunto não deixe de dar o seu pitaco sobre esse assunto nos comentários, e compartilhar esse artigo para que mais pessoas possam aprender de forma mais informada também.

Até a próxima!

Ass: suporte Cansado