QUEM SOMOS

ARTIGO

Programação, justiça e imaginação cristã

Fernando Pasquini|

21/03/2024

Screenshot-2023-04-14-at-16.40.36

Fernando Pasquini

Fernando Pasquini Santos é professor de ciência da computação na Calvin University, EUA, onde realiza pesquisas nas áreas de interação humano-computador, ciência de dados e perspectivas cristãs sobre tecnologia. Graduado em engenharia de computação, realizou doutorado em sistemas dinâmicos na Universidade de São Paulo.

Baixe e compartilhe:

Como citar

Santos, Fernando Pasquini. Programação, justiça e imaginação cristã. Unus Mundus, Belo Horizonte, n. 3, jan-jun, 2024.

Muitos de nós conhecemos o desafio de relacionar a fé cristã a áreas mais matemáticas e técnicas sem cair em propostas que soem forçadas. Com certeza seria ridículo, por exemplo, tentar estudar matemática usando livros da Bíblia ou métodos de projeto de engenharia usando as descrições do tabernáculo e do templo do Antigo Testamento. Embora muitos hoje ainda sigam um pressuposto biblicista de tentar desenvolver ciência, psicologia ou economia dessa forma, os casos da matemática e engenharia parecem mais absurdos, de forma que pouquíssimas pessoas concordariam com essa ideia. No entanto, acredito que também seria precipitado ir ao outro extremo: dizer que não há nada na fé cristã, ou mesmo na religião em geral, que diga respeito a números, engenharia ou computação. Alguém poderia dizer: “bem, números são números, algoritmos são algoritmos, e questões religiosas não tem nada a ver com isso”. Essa parece ser uma visão bastante atraente e comum, no entanto, também creio que está errada.

Mesmo para quem não está interessado especificamente em questões religiosas, há um reconhecimento de que qualquer área de estudo está profundamente ligada a questões culturais mais amplas. Trabalhos na área de ciência, tecnologia e sociedade (CTS) já vem há décadas apontando a cultura que circunda diversas disciplinas, bem como a própria influência dela na teorização e direções que essas últimas tomam. Esse certamente é o caso de disciplinas como matemática, engenharia e computação, e há uma ampla argumentação em favor da necessidade dessas reflexões fazerem parte do ensino e currículo dos alunos em todas as fases (ensino básico, superior, ou técnico).

Mesmo antes de começar minhas atividades como professor em uma universidade cristã, já percebia a necessidade disso: não basta ensinar apenas as ferramentas técnicas:  também é preciso mostrar aos alunos toda a cultura que as formaram e que também elas formam. No entanto, agora que tenho a tarefa de integrar meu ensino de ciência da computação com uma perspectiva cristã, tenho constantemente pensado em formas de tratar não apenas dessa cultura mais ampla em torno das ferramentas, mas também as suas dimensões religiosas e espirituais.

Certamente isso não quer dizer que uma aula de programação numa perspectiva cristã será necessariamente uma aula permeada de orações ou leitura de textos bíblicos. Às vezes também acho divertido usar histórias e temas bíblicos para dar exemplos de programação, mas, novamente, esse não é ponto. Como argumenta David I. Smith,¹ pode até ser que, olhando na superfície, algumas dessas aulas pareçam idênticas a outras aulas oferecidas por professores com outras orientações filosóficas ou religiosas. Na verdade, é a razão por trás da escolha de certos conteúdos, métodos e práticas que devem refletir uma convicção cristã. No caso de aulas de programação, é claro que a decisão de abordar temas culturais mais amplos, além dos conceitos técnicos, já faria dessas aulas algo diferente da grande maioria dos cursos de programação oferecidos hoje. No entanto, já é possível encontrar hoje cursos oferecidos dessa forma, mesmo por pessoas não cristãs.² Nesses casos, muitas das diferenças podem ser mais pontuais ou sutis.

Sendo assim, neste artigo, quero oferecer algumas direções para a integração entre conceitos e práticas de computação e uma imaginação cristã, dadas algumas experiências que já tive em sala de aula e uma pesquisa inicial em materiais de software studies, a vertente de CTS que se dedicou especificamente ao estudo social da ciência da computação.³ No entanto, para ser breve, vamos focalizar em apenas um aspecto da questão, ligada ao tema da justiça. Outros, no entanto, poderiam ser trabalhados em outros momentos.

O código de Deus

Uma das primeiras reflexões que fazemos em um curso introdutório de programação é explicar o significado de termos como “programa”, “algoritmo” e “código”. Uma consulta a um dicionário já pode fornecer a definição de programa: “um plano ou agenda de atividades ou procedimentos a ser seguido”. Gosto de chamar atenção dos alunos para o fato de que é possível discernir programas na natureza. Desde um processo de metamorfose até um mecanismo de cópia de material genético, vários processos naturais seguem um determinado passo-a-passo, pois “há tempo para tudo debaixo do sol”. Deus programou os tempos e estações (Daniel 2:21) e, à medida que criamos nossos próprios programas, podemos também refletir sua imagem e demonstrar sua sabedoria. “Isso tudo vem da parte do Senhor dos Exércitos, maravilhoso em conselhos e magnífico em sabedoria” (Isaías 28:29).

Além disso, o que é particularmente belo sobre programas é que eles têm uma poética própria, algo que os faz únicos dentro das diferentes formas de mídia.⁴ Programas podem ser textos, mas são mais especificamente textos demonstrando uma sequência lógica de operações no tempo. Essa “performatividade” do seu conteúdo pode aproximá-los mais dos scripts de teatro ou partituras musicais, mas, ainda assim, talvez sejam mais gerais do que uma realização por atores humanos ou instrumentos musicais. Há uma estética própria do escrever programas, e acho que ela reflete a sensação de prazer e diversão de muitos que hoje trabalham no desenvolvimento de software.⁵

Mas, como toda mídia, escrever programas e, particularmente, escrever programas de computador, envolve certas regras que existem para garantir sua precisão e eficácia. Um algoritmo, na verdade, pode ser definido como uma subclasse de programas, um programa que, como sugere Donald Knuth,⁶ apresenta:

  • passos precisos e não ambíguos;
  • resultados definidos;
  • são finitos;
  • generalizáveis; e
  • normalmente expressos por meio de notação matemática.
 

Um algoritmo, assim, precisa seguir estas regras para ser considerado como tal.

Além disso, programar computadores normalmente envolve utilizar uma linguagem de programação, a qual também apresenta regras: sintaxes e gramáticas. Não há espaço para descrever a importância e genialidade da invenção de linguagens de programação e dos compiladores, o feito de Grace Hopper em 1949,⁷ no entanto, sempre que utilizamos uma dessas linguagens, precisamos não apenas seguir suas regras mas também sermos bastante precisos e específicos em muitos detalhes que, para nós humanos, muitas vezes são desnecessários. Como exemplo, é muito diferente pedir a uma pessoa para desenhar um círculo em um quadro e “pedir para um computador” (ou seja, programar) desenhar um círculo em uma tela. Para uma pessoa, é possível discernir vários pontos de irrelevância nessa atividade: dependendo do contexto, não importa saber o tamanho do círculo, a posição no quadro, sua cor ou mesmo o tempo que tomamos para desenhá-lo. Qualquer coisa serve. Já os computadores não só não conseguem fazer “qualquer coisa”, como também são incapazes de detectar o que não importa em uma determinada situação social.⁸ Assim, precisamos também informar onde, como, quando, com que biblioteca etc. – o que pode tornar a ordem bastante complexa e, na verdade, é aí que reside todo o desafio da programação. Computadores são estúpidos, e programar é a arte de aprender a se comunicar com eles.

Com isso, podemos compreender que, como qualquer forma de comunicação, programar envolve seguir códigos, ou seja, corpos de lei. É interessante notar que a palavra utilizada para descrever as regras que orientam a escrita dos programas se tornou a própria palavra para se referir aos programas. Provavelmente programadores diziam “estou codificando (encoding) minha ideias neste algoritmo”, e o resultado disso foi chamado de código (code), embora, se tentássemos ser mais exatos, poderia ser chamado de codificação (encoding).⁹ Independentemente do uso das palavras, no entanto, temos que notar que não apenas programas, mas a criação como um todo possui um código, no sentido de corpo de lei; um código que existe não apenas para comunicação, mas para o funcionamento de todas as coisas.¹⁰ Herman Dooyeweerd, na linha da filosofia reformacional, analisou a estrutura cosmonômica da criação de Deus, ou seja, o fato de que toda a criação é regida por diversas leis, em diversos aspectos, que oferecem o sentido e habilitam o florescimento. Essa lei, ou código, é constantemente reconhecida pelos salmistas como maravilhosa, perfeita, vivificadora e justa.

Programadores, assim, são subcriadores e sub-regentes de mundos virtuais cujos sentidos derivam dos sentidos criacionais.¹¹ Ao codificar, trazemos à tona e exultamos no mar de sentidos no qual estamos imersos. Isso não deveria ficar claro à medida que ensinamos e aprendemos sobre programação? Em uma aula de programação em Python, por exemplo, utilizei noções de animais e espécies para explicar o conceito de herança e polimorfismo de classes. Criamos uma superclasse “Animal()”, e depois subclasses “Gato()”, “Cachorro()” e “Pássaro()”. A superclasse Animal() possuía um método geral “fazer_som()”, o qual era reimplementado nas subclasses de acordo com a espécie (“miau”, “au au”, “piu piu”). Não é (pelo menos) divertido notar como nosso mundo é repleto de animais, cada um conforme a sua própria espécie, no entanto com características comuns entre si? Programar, assim, pode ser uma forma de disciplina para chamar nossa atenção a aspectos (normalmente matemáticos e lógicos) da criação que não percebemos tanto. Estruturas matemáticas e lógicas desvelam sentido e ampliam nossa percepção. Dessa forma, programadores podem ter experiências únicas de louvor.

Programadores, assim, são subcriadores e sub-regentes de mundos virtuais cujos sentidos derivam dos sentidos criacionais.

Juízos e estruturas de comando

No entanto, se vamos reconhecer que a lei ou código de Deus é perfeito e justo, temos também de dizer que muitos de nossos códigos são imperfeitos e injustos. A forma na qual codificamos o mundo pode ser, e muitas vezes é, extremamente reducionista, enviesada e, por isso, nociva. Isso normalmente acontece porque ignoramos nossa finitude: toda representação (ou codificação) acaba sendo um retrato parcial e seletivo da realidade, com um alcance restrito em seus efeitos. Jamais seremos como Deus, com o conhecimento pleno do bem e do mal, ou com uma torre que alcance os céus e domine sobre toda a terra; e o resultado de toda essa hubris humana sempre tem sido uma grande confusão de línguas. Computadores foram desenvolvidos em contextos de burocracias¹² — ou seja, no meio da necessidade de automatizar o controle de grandes massas de informação — e, nesse sentido, também demonstram muito da cegueira, burrice e confusão delas.

Às vezes, faço um exercício com os alunos: pergunto que tipo de variável eles usariam para armazenar a etnicidade de uma pessoa. Quase todos sugerem uma string (conjunto de caracteres); alguns até propõem definir algumas variáveis constantes e associá-las a números (0 – BRANCO, 1 – LATINO etc). Percebe como cada decisão aqui representa uma forma limitada de entender a ideia de etnicidade? Depois de comentar algumas dificuldades, outros falam que podem representar com uma lista (array) contendo diversos termos: eu, por exemplo, poderia ser representado, em sintaxe de Python, como “[‘brasileiro’, ‘latino’, ‘italiano’]” (por causa de meu sobrenome Pasquini). No entanto, o que é exatamente um latino? Brasileiros são latinos? (Já vi discussões um tanto acaloradas sobre o assunto e não quero entrar no mérito da questão). E mais: será que sou italiano mesmo, só por causa do meu sobrenome? (Aliás, o quão italiano eu sou? Meu outro sobrenome é Santos – posso adicionar o termo ‘português’ na lista)? Perceba a complexidade do assunto. Em algum momento, o programador vai ter que se contentar com algo e excluir algumas interpretações e possibilidades. Seu código define um “código” (regra), e qualquer um que seja contemplado no sistema terá que se submeter a ele. A pergunta, no entanto, será: este código é justo?¹³

Nosso exemplo toca no caso de uma representação de dados, no entanto, algoritmos também representam inteligência ou raciocínio por intermédio de suas sintaxes de controle de execução, as quais nos referimos como condicionais (if-else) e loops (while, for, repeat). Como mostra Amy Ko em diversos exemplos,¹⁴ uma simples estrutura de if-else divide o mundo (os “inputs”) em um “sim” e “não” de acordo com critérios que são codificados pelo programador. No entanto, sabemos que muitas situações podem ser mais complexas que isso: às vezes, os critérios considerados não são suficientes para essa conclusão (uma situação que poderia ser mais facilmente detectada por uma pessoa em carne e osso, por exemplo), ou às vezes “sim ou não” nem mesmo são a melhor resposta – a resposta pode ser um “provavelmente”, ou “talvez”, ou “depende”. No entanto, na necessidade de conseguir uma discriminação rápida e automática por meio dos algoritmos, muitos desenvolvedores de software acabam realmente criando mecanismos rígidos e injustos, ou, como coloca Cathy O’Neil, “algoritmos de destruição em massa”.¹⁵

Assim, decisões simples como o fluxo lógico de um algoritmo refletem profundos juízos de valor, e estes podem ser justos ou injustos. Perceber isso depende fundamentalmente do que podemos chamar de uma imaginação moral da parte de quem codifica, e é aí que entra nossa cultura, nossa formação, nossas práticas e nossa fé religiosa. À medida que um programador traduz ideias em construtos técnicos, matemáticos e lógicos, ele reproduz uma certa forma de enxergar o mundo e as ações possíveis nele, bem como aquilo que Charles Taylor chama de avaliações fortes, ou seja, aquilo que tem mais valor e aquilo que não tem dentro de uma visão da boa vida. Para isso, como Taylor mesmo coloca, ele sempre fará referência a um imaginário social, e esse imaginário nem sempre opera de forma consciente: muitas vezes o programador foi formado em um contexto no qual aprendeu a achar que está só lidando com conceitos técnicos, ignorando seus valores e juízos; no entanto, isso não significa que eles não estejam lá.

Assim, decisões simples como o fluxo lógico de um algoritmo refletem profundos juízos de valor, e estes podem ser justos ou injustos.

A tabela a seguir sugere brevemente alguns dos juízos de valor que podem ser encontrados durante a codificação. Costumamos trabalhar alguns desses temas em sala de aula, observando isso tanto em aplicações de software em domínios de humanidades como de ciências naturais. Repare que alguém poderia dizer que tais juízos de valor estariam presentes apenas quando os softwares estão lidando com aspectos mais humanos e sociais, como dados pessoais ou políticas públicas. No entanto, se atentarmos para toda a linha de estudos ligando valores sociais à pesquisa em ciências naturais,¹⁶ poderemos notar que a impressão é falsa. Teorias científicas e, consequentemente, ciências computacionais, também são carregadas de valor.¹⁷

Estrutura de programação

Juízos de valor

variáveis

pode ser fielmente representado de forma numérica, discreta ou textual

condicionais (if-else)

discriminação

loops (while, for)

repetibilidade, escalonamento

funções

o que pode ser abstraído (caixas-pretas) e o que são entradas (inputs) e saídas (outputs)

listas/arrays

comparabilidade, ordenabilidade¹⁸

Abençoando o mundo da programação

Dado o papel da imaginação moral na codificação, poderíamos começar a perguntar, portanto, como uma imaginação cristã faria diferença na programação. Talvez muitas das reflexões surjam na prática à medida que lidamos com domínios e aplicações específicos; no entanto, acredito que sempre devemos nos lembrar de que nossa tarefa como sub-regentes e “codificadores” destes pequenos mundos sobre os quais somos colocados como responsáveis é uma tarefa de justiça e fidelidade (a Deus e à sua lei). Conectados a Cristo, nosso Rei, podemos orar por nós mesmos: “Reveste o rei da tua justiça, ó Deus, e da tua retidão, o filho do rei, para que ele julgue com retidão e com justiça os teus que sofrem opressão (Salmos 72.1)” (e creio você pode ler todo o salmo como uma oração para engenheiros e programadores).

acredito que sempre devemos nos lembrar de que nossa tarefa como sub-regentes e “codificadores” destes pequenos mundos sobre os quais somos colocados como responsáveis é uma tarefa de justiça e fidelidade (a Deus e à sua lei).

Este, como dissemos, ainda é apenas um aspecto de uma perspectiva cristã à programação; um aspecto que poderia chamar de normativo. Outras reflexões poderiam ser desenvolvidas, por exemplo, a partir de um aspecto situacional – observando o papel do programador cristão no meio da indústria de software de hoje – ou de um aspecto existencial – com um foco maior na promoção de virtudes individuais e comunitárias na prática de programação.

Como cristãos, também é importante nos assegurarmos contra uma atitude triunfalista de acreditar que temos a solução para todos os problemas. Pelo contrário: muitas vezes, também iremos sofrer junto com a cultura quebrada em que habitamos e todas as suas injustiças. No entanto, a partir de nossa convicção central da beleza divina que se revela a nós diariamente, que é a adoção pelo Pai, a união mística ao Filho e o poder capacitador do Espírito Santo, certamente podemos orar para que façamos alguma diferença – “sê tu uma bênção”, como o próprio Deus diz a Abraão. Como coloca Andrew Basden, nosso papel nessa cultura se manifesta em quatro atitudes fundamentais: ouvir, afirmar, criticar e enriquecer.¹⁹ Isso significa que, para cada elemento e aspecto da prática de programação, podemos, primeiro, ouvir com atenção o que está sendo feito e qual o sentido disso; em seguida, afirmar sua beleza e seu valor; depois, proceder criticamente (ou, até diríamos, profeticamente) com relação aos aspectos falsos, injustos ou inúteis; e, por fim, enriquecer a ideia ou prática por meio de uma imaginação moral treinada nas virtudes da fé, da esperança e do amor. 


Os conteúdos das publicações da revista digital Unus Mundus são de inteira responsabilidade de seus autores e não refletem, necessariamente, a visão da Academia ABC².

1. David I. Smith, Pedagogia Cristã: Como Praticar a Fé Em Sala de Aula, 2022.

2. Amy J. Vide Ko et al.Critically Conscious Computing: Methods for Secondary Education, 2022; Winnie Soon e Geoff Cox, Aesthetic Programming: A Handbook of Software Studies, 2022.

3. Matthew Vide Fuller, Software Studies: A Lexicon, 2008; Mark C. Marino, Critical Code Studies, 2020.

4. Marino, 2020.

5. Samantha Breslin, “01010000 01001100 01000001 01011001: Play Elements in Computer Programming”, American Journal of Play, v. 5, n. 3, 2013.

6. Donald Ervin Knuth, The Art of Computer Programming, 2005.

7. Uma apresentação mais detalhada dessa história se encontra em: Ko et al, 2022, capítulo 10.

8. Essa distinção é analisada por Harry Collins e Martin Kusch, A Forma Das Ações: o Que Seres Humanos e Máquinas Podem Fazer, 2010. A distinção é feita com os termos ação mimeomórfica (uma ação que pode ser simplesmente reproduzida sem perda de sentido) e ação polimórficas (cujo sentido e realização depende de um contexto). No nosso caso, simplesmente pedir para desenhar um círculo representa uma ação polimórfica.

9. Vide uma discussão sobre o uso da palavra em programação em Fuller, 2020, “Code”.

10. Note-se que hoje usamos mais a palavra “código” em contextos de comunicação, ou seja, regras para representar conteúdos e transmiti-los. Isso se harmoniza com o que Dooyeweerd reconhece como as leis que regem o aspecto lingual/simbólico da realidade (e Andrew Basden, The Foundations of Information Systems: Research and Practice, 2017, por exemplo, identifica os sistemas de informação como qualificados primariamente por este aspecto lingual). No entanto, podemos ampliar a noção e estendê-la para os outros aspectos: existem “códigos”, no sentido de corpo de lei, regendo a física, a química e a biologia, por exemplo.

11. Ibidem. Basden sugere que programas computacionais apresentam o que ele chama de “lado da lei virtual” (virtual law side), em contraste ao “lado da lei” criacional, conceito proposto por Herman Dooyeweerd.

12. Solon Barocas, Moritz Hardt e Arvind Narayanan,, Fairness and Machine Learning: Limitations and Opportunities, 2023, cap. 2.

13. Alguém, no entanto, poderia dizer que essa não é a responsabilidade do programador, e que decisões assim são tomadas em um nível mais alto, no contexto de engenharia de requisitos, em reuniões com gestores e stakeholders. Certamente é verdade que grandes decisões são tomadas nesse nível; no entanto, o programador tem que reconhecer que 1) ele é parte da equipe, e portanto, de certa forma, é cúmplice no que está sendo combinado, e 2) ainda podem aparecer situações não combinadas que dependam de possibilidades técnicas que apenas ele pode contemplar e decidir a partir de seu conhecimento e posição de expert. “Traduzir” ideias em especificações técnicas e algoritmos é o cerne do trabalho do programador (bem como engenheiros e técnicos, em geral). Por isso se tornam importantes metodologias de ética como o Value Sensitive Design (VSD), por exemplo, e suas variações nas áreas de engenharia de software e programação.

14. Ko et al., 2022, cap. 6, “Encoding Intelligence”.

15. Cathy O’Neil, Algoritmos de Destruição Em Massa,  2021.

16. Vide, por exemplo: Bruno Latour, Ciência Em Ação,, 2012. Veja também: Hugh Lacey, Valores e Atividade Científica 1, 2010.

17. Uma linha interessante que vem sendo desenvolvida nos últimos anos têm girado em torno das questões filosóficas e sociais das ciências computacionais e simulações computacionais. Vide, por exemplo, as obras: Margaret Morrison, Reconstructing Reality: Models, Mathematics, and Simulations, 2015; e Johannes Lenhard, Calculated Surprises: A Philosophy of Computer Simulation, 2019.

18. Vide a excelente discussão sobre a lista como um artefato cultural importante na transição da cultura oral para a cultura escrita e seus impactos na sociedade desde então em: Fuller, 2020, “Lists”.

19. Basden, 2017, cap. 3.

Outros artigos [n. 3]

pexels-tima-miroshnichenko-8327876
lilartsy-8xjk7Rjpvko-unsplash
pexels-mikhail-nilov-8846404
O indivíduo justifica o Estado
petar-avramoski-JTVmS0yFKoU-unsplash
Finalidade e ordem natural
joshua-coleman-FYev7eaTcRE-unsplash
Screenshot 2024-04-05 at 10.05
O dilúvio aconteceu
bruno-van-der-kraan-v2HgNzRDfII-unsplash
BibleVizArc7WiderOTNTmedium
A conversa mais antiga do mundo
Screenshot 2024-02-23 at 13.28
Das pedras para as telas
greg-rosenke-GOWz0zTf_vY-unsplash

Junte-se à comunidade da revista Unus Mundus!