Qual a diferença entre a Lógica dos programadores e a dos Filósofos?
Um resumo de um assunto (muito) mais complexo…
Lógica é uma palavra que facilmente se separa da ciência e se associa ao senso comum. É que ela soa como tratasse não de um campo de estudos, como a Biologia ou a Arquitetura, mas de uma propriedade das coisas, um sinal de que elas seriam racionais, geométricas ou até verdadeiras. Nesse sentido, uma frase poderia ser “lógica” ou “ter lógica”, assim como certas reflexões.
Contudo, originalmente, a Lógica não é uma noção do senso comum, porém uma ciência milenar, nascida dentro da Filosofia (lógicos são um tipo de filósofos). Ela surgiu na Grécia antiga e, embora não se saiba quem tenha sido seu inventor (ou seus primeiros formuladores), foi o filósofo Aristóteles quem deixou o registro mais bem sistematizado que temos a respeito do assunto.
Mas, afinal, o que é a Lógica? Basicamente, trata-se da ciência da argumentação. Ela estuda como podemos encadear afirmações de maneira racional, construindo argumentos válidos (*), reconhecendo os inválidos e fazendo inferências. Como todos usamos argumentos o tempo todo, essa descrição pode parecer bastante intuitiva, entretanto, dentro da Lógica, palavras como ‘argumento’, ‘premissa’ e ‘conclusão’ são termos técnicos. Isso significa que eles não possuem exatamente o mesmo sentido que aquele do senso comum, existindo critérios técnicos para considerar algo um argumento, premissa ou conclusão, por exemplo. Ainda que, neste texto, eu vá tentar evitar adentrar nas tecnicalidades envolvidas aí, é importante reconhecer a existência delas.
Além disso, é preciso dizer que, ao contrário do que possa parecer, a Lógica não é uma ciência do convencimento, ou seja, ela não se preocupa em mudar a opinião de ninguém a respeito de qualquer assunto. A bem dizer, ela busca entender as implicações envolvidas no argumentar e não em como as pessoas reagirão a ele. Em função disso, conhecê-la bem te fará argumentar e raciocinar melhor, mas não te tornará necessariamente uma pessoa mais convincente, já que o processo de convencimento envolve muito mais do que o raciocínio (como os sentimentos, as preferências etc.).
Ao longo da história, a Lógica foi tremendamente influente e serviu de fundamento para as demais ciências, que não deixam de ser saberes argumentativos. Historicamente, ela só foi sofrer uma quebra significativa de paradigma mais de um milênio depois de ser criado, com as obras de pensadores como Emmanuel Kant e Gottlob Frege. Mesmo hoje, ela continua viva, avançando e gerando contribuições para diferentes campos — nós brasileiros, inclusive, temos nomes significativos nela, como o grandioso Newton da Costa.
Dito isso, fica um tanto óbvio o interesse dos filósofos em desenvolver essa ciência. A Filosofia envolve muita argumentação, logo, é preciso aprender as formas corretas de argumentar, de construir raciocínios mais acurados e assim por diante, sendo a Lógica o garfo e a faca da Filosofia. Na computação, porém, as coisas são um pouco diferentes.
Sendo preciso, programadores não costumam estudar Lógica. Ao menos, eu nunca conheci um programador (vivo) que tivesse estudado a disciplina, nem tive notícia de uma graduação em TI que oferecesse cursos sobre ela. No dia a dia, o programador está mais para um engenheiro do que para um filósofo, digamos assim. Entretanto, essa ausência da disciplina não é propriamente uma falha formativa, porém um desvio noutro sentido. Ele ocorre porque, em vez de argumentos, os programadores produzem algoritmos, algo que, a princípio, não é contemplado pela Lógica clássica. Por isso, abrir um livro de Aristóteles pode até trazer uma porção de conhecimentos, mas não ajuda de forma direta na construção de algoritmos.
A despeito disso, os princípios da construção de algoritmos se baseiam na Lógica. Eles estão agrupados numa subárea conhecida como “Lógica aplicada à construção de algoritmos”, “Lógica Algorítmica” ou, mais informalmente, “lógica de programação”. Trata-se de uma disciplina que retira suas bases tanto dos trabalhos clássicos de Aristóteles, quanto de alguns desenvolvimentos mais modernos do campo e da Matemática.
De forma geral, a relação entre Lógica e Programação consiste no fato de certos elementos da primeira ciência permanecem dentro da segunda, algo que só ficaria bem explicado num estudo mais sério do tema, daqueles que apenas os livros técnicos podem oferecer. Contudo, ainda assim podemos aventar uma resposta introdutória, ilustrando como filósofos e programadores — mesmo sem pensar muito a respeito — dão aos mãos. Dado o tamanho da tarefa, porém, eu me restringirei a um único conceito da Lógica que permanece dentro da Programação, o conceito de necessidade lógica.
De forma simplificada, necessidade lógica é certa relação que uma conclusão mantém com as afirmações que a sustentam, ocorrendo quando, dadas certas premissas, a conclusão de um argumento não poderia ser outra senão a que é. Pois bem, definições podem soar assustadoras — a Lógica é técnica, afinal; mas garanto que esse susto pode ser superado com um breve estudo. Darei dois exemplos e explicarei a definição a partir deles.
O primeiro é um exemplo na linguagem. Consideremos o seguinte texto:
“Machado de Assis nasceu em 1839, portanto, ele é um homem do século dezenove”
Vamos à análise lógica. Pensando no significado das frases do texto, podemos separá-lo em duas partes: a primeira estabelece quando Machado nasceu e a segunda retira daí uma informação, concluindo que ele é do século dezenove. Sendo assim, a primeira parte é um motivo ou razão que valida a segunda parte, ao passo que essa última é validada ou justificada pela primeira. Nada muito complicado, certo?
Existe algo mais aí a ser ressaltado, no entanto, que é a existência de uma relação entre essas duas partes que não pode ser desfeita. Quero dizer o seguinte: se Machado nasceu em 1839, não existe a possibilidade dele não ser um homem do século dezenove. Afinal, um homem que tenha nascido em 1839 — qualquer homem — será um homem do século dezenove. Para negar essa conclusão, eu teria que levantar a possibilidade de que alguém não pertença ao próprio século em que nasceu. Um absurdo, certo?
Bem, temos nesse exemplo um caso de texto cuja conclusão — “portanto, ele é um homem do século dezenove” — não pode ser negada. Em Lógica, essa relação que faz com que uma informação seja inferida de outra sem que seja possível negá-la é o que chamamos de “necessidade lógica”. Nesse caso, dizemos que a conclusão é “necessária”. Inclusive, os filósofos prezam pela construção de argumentos desse tipo, cujas conclusões sejam inegáveis e, para tanto, estudam bastante Lógica.
Caso minha explicação tenha sido insuficiente, entretanto, vamos a mais um exemplo, ainda mais claro do que o primeiro.
Consideremos a soma “2 + 2 = 4”.
Tal soma possui um um resultado intuitivo a que chegamos de forma quase imediata. Essa imediatez ocorre não só porque escolhi um exemplo simples, mas também porque ele contém um resultado “logicamente necessário”. Em outras palavras, quando somamos dois e dois, qualquer resultado diferente de quatro consiste numa impossibilidade.
Pelo que sei, ao menos desde os trabalhos de Euclides, na Grécia Antiga, a Matemática vem buscando pelo “necessário”. Os matemáticos não almejavam chegar ao resultado de seus cálculos por acaso, porém de forma segura e estável afinal, uma ciência que juntasse valores e símbolos sem ordenamento geraria resultados aleatórios, um caos inútil o qual nunca saberíamos o que produziria. Para que ela fosse utilizável, foi preciso torná-la constante, instituindo procedimentos e princípios que eliminassem a multiplicidade de resultados e, em vez disso, tornasse-os necessários. Não é por outro motivo que as fórmulas e princípios da matemática dificilmente mudam: eles foram elaborados para serem necessários. Como consequência disso, ao longo da História, a Matemática se tornou uma espécie de ciência exemplar, um símbolo da necessidade lógica e contribuiu para que esse conceito se tornasse uma noção científica e humanística básica.
À sua maneira, a programação (**) também persegue a necessidade lógica. Como vimos pelos exemplos anteriores, a necessidade lógica aparece não só em cálculos matemáticos, como também na própria linguagem cotidiana, quando usamos certos argumentos. Assim, mesmo que um programador não produza argumentos como os filósofos, ele produz algoritmos que também podem envolver necessidade lógica. Vejamos como.
Quando um programador constrói seus algoritmos, ele transmite duas instruções ao computador: o que deseja que a máquina faça e, sobretudo, como deseja que ela faça. O objetivo final requer a instituição de um “passo a passo” — onde entram os algoritmos — o qual funciona como um mapa racional do programa ou, para retomarmos o exemplo da Matemática, como a construção de uma fórmula. Esse passo a passo existe para estabelecer um encadeamento necessário entre as partes do código, fazendo com que o computador o interprete e execute sempre da mesma maneira, uma vez que aquilo que comporta múltiplas interpretações pode gerar múltiplos resultados. Caso o computador interprete um dos passos — das “linhas de código” — do programa de um jeito imprevisto, ele realizará algo igualmente imprevisto (produzindo um erro, por exemplo). Em função disso, um bom programador refina o próprio código, eliminando ambiguidades que produzam desdobramentos indesejados e garantindo que, tal como uma fórmula ou argumento filosófico, o algoritmo produza sempre o mesmo resultado.
Em conclusão, se formos aos detalhes desse processo, seja na Filosofia, Matemática ou Programação, há muito mais o que discutir, inclusive a propósito dos exemplos que dei. Mesmo a Lógica não é uma coisa única e possui diversas outras “linhas” que resultam em programações e filosofias bastante diferentes das que estou descrevendo aqui. Ainda assim, creio que o que foi posto aqui estabelece um bom ponto de partida para quem não conhecia muito do assunto.
Quanto à relação entre Lógica e Programação, como vimos, a lógica algorítmica consiste numa aplicação específica da Lógica, consequentemente, usa só um pedacinho da mesma, porém, ainda assim, a mesma. Além disso, como o programador não se volta para a argumentação, mas para a construção de algoritmos, um bom programador não será exatamente um bom argumentador, tampouco um filósofo. Seu treinamento não se volta para isso. Não obstante, é evidente que a construção de algoritmos atinge o programador, melhorando seu raciocínio e, de igual modo, sua argumentação, mesmo que de um modo mais indireto. Algoritmos, por sinal, podem ser tão ou mais sofisticados do que qualquer argumento filosófico.
Os princípios que movem ambos, filósofos e programadores, contudo, continuam coincidindo até certo ponto, visto que os dois perseguem a necessidade lógica em suas atividades. Quando um filósofo constrói seus argumentos, ele tenta fazer com que eles sejam encadeados de maneira a se tornarem necessários. Ele quer tornar sua conclusão a única possível dentro de um determinado tema, como se quisesse chegar a conclusões tão verdadeiras quanto ‘2+2=4’ só que em temas como política, ética etc. Do mesmo modo, um programador constrói programas eliminando a possibilidade que eles gerem resultados diferentes do que ele planejou, quase como se estivesse construindo argumentos filosóficos ou fórmulas matemáticas. Para tanto, ele aproveita as mesmas ferramentas do filósofo, bebendo no mesmo manancial, mas seguindo a corrente noutra direção.
(*) Por motivos impossíveis de explicar num pequeno texto, a Lógica também não é uma ciência que busque a verdade. Mesmo quando temos um argumento “logicamente encadeado”, ele não é considerado pelos lógicos como verdadeiro, apenas como válido. Em poucas palavras, digamos que a discussão sobre a verdade abarca mais coisas do que somente a Lógica, e que a Lógica tem pouca preocupação com o conteúdo dos argumentos (o que eles querem realmente significar).
(**) Neste texto, atenho-me especificamente à programação orientada objetos, que é só uma parte da programação imperativa, que é só uma parte da programação como um todo. Ainda assim, a POO talvez abranja atualmente a maior parte das atividades envolvendo programação.