Que legal você ter respondido. E sim, já li variás coisas que você escreveu, se você usa bastante foruns de programação é bem difícil não te encontrar por aí. Seus textos sobre orientação a objetos me ajudaram muito a enriquecer minha visão sobre o paradigma. Eu achava que sabia programar orientado a objetos mas na verdade eu sabia programar em Java (vou usar isso no meu argumento). Talvez a semelhança que você notou em nossos textos seja por essa influência.
Outra coisa é que eu aprendi a programar com C. É a linguagem que se aprende na minha faculdade e até agora meus únicos projetos no github usam ela. Estou estudando Java pois pretendo ir para back-end. Também desejo aprender Rust pois gosto da área de desenvolvimento de sistemas e baixo-nível. Meu projeto de TCC será um kernel de sistema operacional (vou abordar esse projeto em um momento no texto), que estou escrevendo em C por afinidade mas pretendo reescreve-lo em Rust para estudar a linguagem.
Vi que viu meu texto, você não sabe o quanto fico feliz por ter gostado. Como já teve contato com minha tese de que lógica de programação deveria ser vista como o estudo de paradigmas. Vou poupar argumentos quanto a isso e focar em usar esta minha perspectiva para argumentar do porque acho que o estudo de lógica de programação (neste caso, paradigmas) devem ser acompanhados do estudo de uma linguagem.
Falando do meu kernel, já criei um programa de terminal que permite escrever texto na tela. A forma como este programa é feito é a seguinte: eu tenho um arquivo header (.h
) que define a interface do terminal com protótipos de função. E tenho um arquivo de implementação (.c
) que implementa essas funções, bem como outras com o modificador static
(que restringe o acesso apenas ao arquivo) que auxiliam as principais em seu trabalho. Também tem variáveis globais static
que definem o estado do terminal, como a posição do cursor. Reparou uma coisa? Isso é EXATAMENTE a estrutura de um programa tipicamente orientado a objetos, não muito diferente do que eu faria em Java, C# e principalmente C++. Eu tenho um objeto (Terminal), que possue uma interface que permite outros pontos do programa interagir com ele (funções do arquivo .h
), e variáveis que descrevem seu estado (variaveis globais no arquivo .c
) que não são acessiveis fora do objeto. Então, podemos dizer que meu programa é orientado a objetos? Eu não vejo o porque não. O mesmo programa em C++, o que teria de substancialmente diferente? Nada. As diferenças seriam apenas sintáticas, pois C++ foi projetada para ter sintaxes que auxiliam na elaboração de programas orientado a objetos, como classe, modificadores de acesso etc. Mas a linguagem não importa. O código das duas seriam diferentes, mas qualquer linguagem (inclusive as naturais) é apenas um meio de de expressar uma idea, mas o meu raciocínio, a forma como identifiquei o problema, modelei a solução, é o mesmo que usaria para escrever em C++ usando classes e objetos.
Estabelecido isso, tendo em mente que paradigmas estão além de linguagens então podemos concluir que é possível estudar programação sem depender de nenhuma linguagem correto? É aí que vem meu ponto: o ser humano pensa em linguagem. Repetindo os exemplos do meu outro texto: tente pensar em política sem pensar na palavra política. Tente pensar em somar dois números sem pensar na linguagem aritmética ou algébrica. E por fim, tente pensar em um quicksort sem pensar no código de uma linguagem de programação. Parece impossível correto? Mesmo que eu tenha dito que pensei no programa de terminal independentemente de linguagem, isso não é bem verdadade. Eu pensei em linguagem, provavelmente em várias delas de forma inconciente.
A questão é que, se você pensa em um programa, inevitavelmente você estará pensando em alguma linguagem. Ela pode ser a linguagem natural (português, inglês e até pseudo-código), uma linguagem de diagrama como fluxogramas, ou algum tipo de linguagem simbólica informal (a gente desenha grafos para explicar o funcionamente de algoritmos de árvores). Tudo isso é linguagem, mas o mais provável por motivos óbvios, é pensar em uma linguagem formal projetada para escrever programas, como C, Java, Python etc.
Mas se limitar a entender uma linguagem, faz com que conclusões erradas sobre a modelagem de programas apareçam. Por exemplo, quando comecei a aprender Java. Eu achava que sabia orientação a objetos. Afinal, nada mais é do que um paradigma que usa objetos que são instâncias de classes, e classes que são moldes para objetos. Mas lendo alguns textos na internet, inclusive os seus, mudei meu pensamento. Eu não sabia POO, eu sabia Java. Agora sei que objetos não podem ser definidos como instâncias de classes, pois eles podem ser instânciados a partir de protótipos. Mas porque cheguei a cometer esse erro? Porque estava limitado a entender os recursos que Java apresenta para facilitar a escrita de programas orientado a objetos. Após esse mudança de pensamento, dei uma olhada superficial em JavaScript, SmallTalk, Simula e na biblioteca GObject da linguagem C. Tudo isso para tentar entender diversas formas de expressar o mesmo paradigma. Mesmo possuindo diferenças sintáticas entre todas elas, elas tem um ponto em comum que só pude perceber por ter observado essas diferentes formas de expressar o mesmo conceito. Mesmo que inevitavelmente pensemos em linguagem, podemos buscar uma certa autonomia delas se estudarmos distintas formas de comunicar nossas ideias, e as linguagens de programação parecem ser a fonte ideal de estudo para isso.
Por isso falo que para estudar lógica de programação, ou seja, formas de se modelar a solução de um problema computável, deverá inevitavelmente passar pelo estudo de linguagens de programação, e quanto mais diversas elas forem, melhor será a compreensão dos conceitos que elas representam. Pois mesmo com suas diferenças sintáticas, elas vão compartilhar alguma base, por tanto algo em comum.
Fique a vontade para discordar, você diz algo: "O que mais gostaria de mudar no mundo, e sei que só conseguirei ajudar 'meia dúzia' de pessoas, é incentivar as pessoas a questionarem tudo o que aparece para elas", não poderia me identificar mais com isso. Talvez minha perspectiva esteja errada, e é bem provável estar já que só estou a dois anos na área. Mas fico feliz de ter me desenvolvido até aqui de forma a questionar e perguntar o porquê das coisas. Mesmo que isso me leve a ter opiniões impopulares e até por vezes incorretas, pelo menos eu pensei, e fiz outros pensarem. Acho isso uma boa coisa.